@bitgo/abstract-utxo 12.7.0 → 13.1.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 (103) hide show
  1. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
  2. package/dist/cjs/src/abstractUtxoCoin.js +3 -3
  3. package/dist/cjs/src/impl/zec/address.d.ts +6 -0
  4. package/dist/cjs/src/impl/zec/address.d.ts.map +1 -1
  5. package/dist/cjs/src/impl/zec/address.js +38 -1
  6. package/dist/cjs/src/impl/zec/index.d.ts +1 -0
  7. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -1
  8. package/dist/cjs/src/impl/zec/index.js +2 -1
  9. package/dist/cjs/src/impl/zec/recipients.d.ts +2 -1
  10. package/dist/cjs/src/impl/zec/recipients.d.ts.map +1 -1
  11. package/dist/cjs/src/impl/zec/recipients.js +7 -3
  12. package/dist/cjs/src/impl/zec/shieldedAddress.d.ts +36 -0
  13. package/dist/cjs/src/impl/zec/shieldedAddress.d.ts.map +1 -0
  14. package/dist/cjs/src/impl/zec/shieldedAddress.js +51 -0
  15. package/dist/cjs/src/impl/zec/signIronwoodTransaction.d.ts +29 -0
  16. package/dist/cjs/src/impl/zec/signIronwoodTransaction.d.ts.map +1 -0
  17. package/dist/cjs/src/impl/zec/signIronwoodTransaction.js +57 -0
  18. package/dist/cjs/src/impl/zec/types.d.ts +5 -0
  19. package/dist/cjs/src/impl/zec/types.d.ts.map +1 -1
  20. package/dist/cjs/src/impl/zec/types.js +1 -1
  21. package/dist/cjs/src/impl/zec/zec.d.ts +35 -2
  22. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -1
  23. package/dist/cjs/src/impl/zec/zec.js +94 -1
  24. package/dist/cjs/src/transaction/explainTransaction.d.ts +2 -1
  25. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -1
  26. package/dist/cjs/src/transaction/explainTransaction.js +3 -2
  27. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +2 -0
  28. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -1
  29. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +4 -1
  30. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  31. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +9 -3
  32. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +7 -0
  33. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
  34. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +32 -20
  35. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +9 -0
  36. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -1
  37. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +18 -9
  38. package/dist/cjs/src/transaction/recipient.d.ts +24 -1
  39. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -1
  40. package/dist/cjs/src/transaction/recipient.js +32 -4
  41. package/dist/cjs/src/transaction/signTransaction.d.ts +12 -0
  42. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -1
  43. package/dist/cjs/src/transaction/signTransaction.js +16 -7
  44. package/dist/cjs/test/unit/bip322.js +14 -4
  45. package/dist/cjs/test/unit/customChangeWallet.js +3 -1
  46. package/dist/cjs/test/unit/impl/zec/psbtDecode.d.ts +2 -0
  47. package/dist/cjs/test/unit/impl/zec/psbtDecode.d.ts.map +1 -0
  48. package/dist/cjs/test/unit/impl/zec/psbtDecode.js +69 -0
  49. package/dist/cjs/test/unit/impl/zec/shieldedPrebuildAndSign.d.ts +2 -0
  50. package/dist/cjs/test/unit/impl/zec/shieldedPrebuildAndSign.d.ts.map +1 -0
  51. package/dist/cjs/test/unit/impl/zec/shieldedPrebuildAndSign.js +470 -0
  52. package/dist/cjs/test/unit/impl/zec/unit/address.js +23 -1
  53. package/dist/cjs/test/unit/impl/zec/unit/resolvePsbtRecipients.js +7 -5
  54. package/dist/cjs/test/unit/impl/zec/unit/shieldedAddress.d.ts +2 -0
  55. package/dist/cjs/test/unit/impl/zec/unit/shieldedAddress.d.ts.map +1 -0
  56. package/dist/cjs/test/unit/impl/zec/unit/shieldedAddress.js +57 -0
  57. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +9 -1
  58. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +2 -1
  59. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  60. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
  61. package/dist/esm/abstractUtxoCoin.js +3 -3
  62. package/dist/esm/impl/zec/address.d.ts +6 -0
  63. package/dist/esm/impl/zec/address.d.ts.map +1 -1
  64. package/dist/esm/impl/zec/address.js +38 -1
  65. package/dist/esm/impl/zec/index.d.ts +1 -0
  66. package/dist/esm/impl/zec/index.d.ts.map +1 -1
  67. package/dist/esm/impl/zec/index.js +2 -1
  68. package/dist/esm/impl/zec/recipients.d.ts +2 -1
  69. package/dist/esm/impl/zec/recipients.d.ts.map +1 -1
  70. package/dist/esm/impl/zec/recipients.js +7 -3
  71. package/dist/esm/impl/zec/shieldedAddress.d.ts +36 -0
  72. package/dist/esm/impl/zec/shieldedAddress.d.ts.map +1 -0
  73. package/dist/esm/impl/zec/shieldedAddress.js +48 -0
  74. package/dist/esm/impl/zec/signIronwoodTransaction.d.ts +29 -0
  75. package/dist/esm/impl/zec/signIronwoodTransaction.d.ts.map +1 -0
  76. package/dist/esm/impl/zec/signIronwoodTransaction.js +50 -0
  77. package/dist/esm/impl/zec/types.d.ts +5 -0
  78. package/dist/esm/impl/zec/types.d.ts.map +1 -1
  79. package/dist/esm/impl/zec/types.js +1 -1
  80. package/dist/esm/impl/zec/zec.d.ts +35 -2
  81. package/dist/esm/impl/zec/zec.d.ts.map +1 -1
  82. package/dist/esm/impl/zec/zec.js +92 -2
  83. package/dist/esm/transaction/explainTransaction.d.ts +2 -1
  84. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -1
  85. package/dist/esm/transaction/explainTransaction.js +3 -2
  86. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +2 -0
  87. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -1
  88. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +4 -1
  89. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  90. package/dist/esm/transaction/fixedScript/parseTransaction.js +9 -3
  91. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +7 -0
  92. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
  93. package/dist/esm/transaction/fixedScript/signPsbtWasm.js +30 -20
  94. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +9 -0
  95. package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -1
  96. package/dist/esm/transaction/fixedScript/signTransaction.js +17 -9
  97. package/dist/esm/transaction/recipient.d.ts +24 -1
  98. package/dist/esm/transaction/recipient.d.ts.map +1 -1
  99. package/dist/esm/transaction/recipient.js +32 -4
  100. package/dist/esm/transaction/signTransaction.d.ts +12 -0
  101. package/dist/esm/transaction/signTransaction.d.ts.map +1 -1
  102. package/dist/esm/transaction/signTransaction.js +15 -8
  103. package/package.json +6 -6
@@ -1,5 +1,6 @@
1
1
  import { fixedScriptWallet } from '@bitgo/wasm-utxo';
2
2
  import type { UnifiedRecipientPreference } from '@bitgo/sdk-core';
3
+ import type { AddressCodec } from '../../transaction/recipient';
3
4
  import { ZcashCoinName } from './types';
4
5
  /**
5
6
  * How a recipient parsed from a Zcash PSBT is spent.
@@ -61,7 +62,7 @@ export interface PsbtRecipient {
61
62
  * and `unifiedAddress` report it verbatim. Opaque outputs with no address (e.g. OP_RETURN) are
62
63
  * skipped, as they carry no recipient.
63
64
  */
64
- export declare function resolvePsbtRecipients(psbt: fixedScriptWallet.ZcashBitGoPsbt, walletKeys: fixedScriptWallet.RootWalletKeys): PsbtRecipient[];
65
+ export declare function resolvePsbtRecipients(psbt: fixedScriptWallet.ZcashBitGoPsbt, walletKeys: fixedScriptWallet.RootWalletKeys, addressCodec: AddressCodec): PsbtRecipient[];
65
66
  /**
66
67
  * Infer the Unified-Address recipient preference for a Zcash transaction when the caller did
67
68
  * not pass one — the counterpart of wallet-platform's utxo-core `buildTransaction`
@@ -1 +1 @@
1
- {"version":3,"file":"recipients.d.ts","sourceRoot":"","sources":["../../../../src/impl/zec/recipients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAgB,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAIlE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;;;GAQG;AACH,MAAM,MAAM,wBAAwB,GAChC;IACE,IAAI,EAAE,eAAe,CAAC;IACtB;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB,GACD;IACE,IAAI,EAAE,yBAAyB,CAAC;IAChC,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;CACxB,GACD;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAE5B,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,wBAAwB,CAAC;CACvC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,iBAAiB,CAAC,cAAc,EACtC,UAAU,EAAE,iBAAiB,CAAC,cAAc,GAC3C,aAAa,EAAE,CAgCjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAAE,GAC5C,0BAA0B,GAAG,SAAS,CA0BxC"}
1
+ {"version":3,"file":"recipients.d.ts","sourceRoot":"","sources":["../../../../src/impl/zec/recipients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAgB,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAGlE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;;;GAQG;AACH,MAAM,MAAM,wBAAwB,GAChC;IACE,IAAI,EAAE,eAAe,CAAC;IACtB;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB,GACD;IACE,IAAI,EAAE,yBAAyB,CAAC;IAChC,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;CACxB,GACD;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAE5B,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,wBAAwB,CAAC;CACvC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,iBAAiB,CAAC,cAAc,EACtC,UAAU,EAAE,iBAAiB,CAAC,cAAc,EAC5C,YAAY,EAAE,YAAY,GACzB,aAAa,EAAE,CAoCjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAAE,GAC5C,0BAA0B,GAAG,SAAS,CA0BxC"}
@@ -11,7 +11,7 @@ import { getReplayProtectionPubkeys } from '../../transaction/fixedScript/replay
11
11
  * and `unifiedAddress` report it verbatim. Opaque outputs with no address (e.g. OP_RETURN) are
12
12
  * skipped, as they carry no recipient.
13
13
  */
14
- export function resolvePsbtRecipients(psbt, walletKeys) {
14
+ export function resolvePsbtRecipients(psbt, walletKeys, addressCodec) {
15
15
  const parsed = psbt.parseTransactionWithWalletKeys(walletKeys, {
16
16
  replayProtection: { publicKeys: getReplayProtectionPubkeys('zec') },
17
17
  });
@@ -25,8 +25,12 @@ export function resolvePsbtRecipients(psbt, walletKeys) {
25
25
  if (output.address === null) {
26
26
  return;
27
27
  }
28
+ // The raw parsed receiver/script is authoritative; proprietary Unified Address metadata
29
+ // must match it before it is exposed to callers.
30
+ if (!addressCodec.isMatchingScript(output)) {
31
+ throw new Error(`Output ${i} address ${output.address} does not match its raw recipient`);
32
+ }
28
33
  // The original client-passed Unified Address, stored verbatim in the PSBT's key-value
29
- // pairs: the orchard PCZT for a shielded output (parsed `address` reports it in full), the
30
34
  // transparent-output proprietary map for a v4 transparent output.
31
35
  const unifiedAddress = output.isShielded ? output.address : psbt.transparentOutputUnifiedAddress(i) ?? undefined;
32
36
  recipients.push({
@@ -87,4 +91,4 @@ export function getUnifiedRecipientPreference(name, recipients) {
87
91
  }
88
92
  return hasShielded ? 'shielded' : undefined;
89
93
  }
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBpZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbXBsL3plYy9yZWNpcGllbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUduRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQXdENUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsSUFBc0MsRUFDdEMsVUFBNEM7SUFFNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFVBQVUsRUFBRTtRQUM3RCxnQkFBZ0IsRUFBRSxFQUFFLFVBQVUsRUFBRSwwQkFBMEIsQ0FBQyxLQUFLLENBQUMsRUFBRTtLQUNwRSxDQUFDLENBQUM7SUFFSCxNQUFNLFVBQVUsR0FBb0IsRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLGlDQUFpQztRQUNqQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFDRCw4REFBOEQ7UUFDOUQsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBQ0Qsc0ZBQXNGO1FBQ3RGLDJGQUEyRjtRQUMzRixrRUFBa0U7UUFDbEUsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUNqSCxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2QsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLO1lBQ3BCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsY0FBYztZQUNkLFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDNUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDM0QsQ0FBQyxDQUFDLGNBQWM7b0JBQ2hCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxjQUFjLEVBQUU7b0JBQ3JELENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLElBQW1CLEVBQ25CLFVBQTZDO0lBRTdDLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUNoRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEMscUNBQXFDO1lBQ3JDLE9BQU8sYUFBc0IsQ0FBQztRQUNoQyxDQUFDO1FBQ0Qsc0ZBQXNGO1FBQ3RGLHVGQUF1RjtRQUN2RixJQUFJLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakUsT0FBTyxhQUFzQixDQUFDO1FBQ2hDLENBQUM7UUFDRCxzRkFBc0Y7UUFDdEYsbUZBQW1GO1FBQ25GLHNCQUFzQjtRQUN0QixNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRixJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9CLE9BQU8sVUFBbUIsQ0FBQztRQUM3QixDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLFNBQVMsQ0FBQyxPQUFPLDZDQUE2QyxDQUFDLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUQsSUFBSSxXQUFXLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFDRCxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpeGVkU2NyaXB0V2FsbGV0LCB6Y2FzaEFkZHJlc3MgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB0eXBlIHsgVW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2UgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyB9IGZyb20gJy4uLy4uL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3JlcGxheVByb3RlY3Rpb24nO1xuXG5pbXBvcnQgeyBaY2FzaENvaW5OYW1lIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogSG93IGEgcmVjaXBpZW50IHBhcnNlZCBmcm9tIGEgWmNhc2ggUFNCVCBpcyBzcGVudC5cbiAqXG4gKiBUaGUgZGVjb2RlLXNpZGUgY291bnRlcnBhcnQgb2YgdXR4by1jb3JlJ3MgYGJ1aWxkVHJhbnNhY3Rpb24vemNhc2gudHNgIGBaY2FzaERlc3RpbmF0aW9uYCBvblxuICogdGhlIGJ1aWxkIHNpZGU6IGEgc2hpZWxkZWQgcmVjaXBpZW50IGlzIGFuIE9yY2hhcmQvSXJvbndvb2Qgb3V0cHV0IHN0b3JlZCBpbiB0aGUgdjYgKElyb253b29kKVxuICogUFNCVCdzIG9yY2hhcmQgUENaVCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpcyBhbiBvcmRpbmFyeSB0cmFuc3BhcmVudCBvdXRwdXQuIEEgdHJhbnNwYXJlbnRcbiAqIG91dHB1dCByZXNvbHZlZCBmcm9tIGEgVW5pZmllZCBBZGRyZXNzIGNhcnJpZXMgdGhhdCBvcmlnaW5hbCBVQSAoYHpjYXNoVW5pZmllZFRyYW5zcGFyZW50YCksIGFcbiAqIHBsYWluIGFkZHJlc3MgZG9lcyBub3QuXG4gKi9cbmV4cG9ydCB0eXBlIFBzYnRSZWNpcGllbnREZXN0aW5hdGlvbiA9XG4gIHwge1xuICAgICAga2luZDogJ3pjYXNoU2hpZWxkZWQnO1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgVW5pZmllZCBBZGRyZXNzIHRoZSBvdXRwdXQgd2FzIGFkZHJlc3NlZCB0byDigJQgdGhlIG9yaWdpbmFsIG11bHRpLXJlY2VpdmVyIFVBIHRoZVxuICAgICAgICogY2xpZW50IHBhc3NlZCB3aGVuIHRoZSBQU0JUIHN0b3JlcyBvbmUgdmVyYmF0aW0sIG90aGVyd2lzZSBhIHJlLWVuY29kZWQgc2luZ2xlLXJlY2VpdmVyXG4gICAgICAgKiBPcmNoYXJkIFVBLlxuICAgICAgICovXG4gICAgICB1bmlmaWVkQWRkcmVzczogc3RyaW5nO1xuICAgIH1cbiAgfCB7XG4gICAgICBraW5kOiAnemNhc2hVbmlmaWVkVHJhbnNwYXJlbnQnO1xuICAgICAgLyoqIFRoZSBvcmlnaW5hbCBVbmlmaWVkIEFkZHJlc3MgdGhlIHRyYW5zcGFyZW50IHJlY2VpdmVyIHdhcyByZXNvbHZlZCBmcm9tLiAqL1xuICAgICAgdW5pZmllZEFkZHJlc3M6IHN0cmluZztcbiAgICB9XG4gIHwgeyBraW5kOiAndHJhbnNwYXJlbnQnIH07XG5cbi8qKiBBIHJlY2lwaWVudCByZXNvbHZlZCBmcm9tIGEgZGVjb2RlZCBaY2FzaCBQU0JUJ3MgZXh0ZXJuYWwgb3V0cHV0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHNidFJlY2lwaWVudCB7XG4gIC8qKiBBbW91bnQgaW4gc2F0b3NoaXMuICovXG4gIGFtb3VudDogYmlnaW50O1xuICAvKipcbiAgICogVGhlIHJlY2lwaWVudCBhZGRyZXNzLiBGb3IgYSBzaGllbGRlZCBvdXRwdXQgdGhpcyBpcyB0aGUgVW5pZmllZCBBZGRyZXNzIHRoZSBvdXRwdXQgd2FzXG4gICAqIGFkZHJlc3NlZCB0byDigJQgdGhlIG9yaWdpbmFsIG11bHRpLXJlY2VpdmVyIFVBIHdoZW4gdGhlIFBTQlQgc3RvcmVzIG9uZSB2ZXJiYXRpbSwgb3RoZXJ3aXNlIGFcbiAgICogcmUtZW5jb2RlZCBzaW5nbGUtcmVjZWl2ZXIgT3JjaGFyZCBVQS4gRm9yIGEgdHJhbnNwYXJlbnQgb3V0cHV0IGl0IGlzIHRoZSBvcmlnaW5hbCBVbmlmaWVkXG4gICAqIEFkZHJlc3Mgd2hlbiBvbmUgd2FzIHN0b3JlZCwgZWxzZSB0aGUgZGVjb2RlZCB0cmFuc3BhcmVudCBhZGRyZXNzLlxuICAgKi9cbiAgYWRkcmVzczogc3RyaW5nO1xuICAvKipcbiAgICogUmF3IHJlY2VpdmVyIGJ5dGVzOiB0aGUgNDMtYnl0ZSBPcmNoYXJkL0lyb253b29kIHJlY2VpdmVyIGZvciBhIHNoaWVsZGVkIG91dHB1dCwgdGhlXG4gICAqIHNjcmlwdFB1YktleSBmb3IgYSB0cmFuc3BhcmVudCBvbmUuXG4gICAqL1xuICBzY3JpcHQ6IFVpbnQ4QXJyYXk7XG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgVW5pZmllZCBBZGRyZXNzIHRoZSBjbGllbnQgc3VwcGxpZWQgZm9yIHRoaXMgcmVjaXBpZW50LCB3aGVuIHRoZSBQU0JUIHN0b3Jlc1xuICAgKiBvbmU6IHRoZSB2NiAoSXJvbndvb2QpIFBDWlQgZm9yIGEgc2hpZWxkZWQgb3V0cHV0LCB0aGUgdHJhbnNwYXJlbnQtb3V0cHV0IHByb3ByaWV0YXJ5XG4gICAqIGtleS12YWx1ZSBtYXAgZm9yIGEgdjQgdHJhbnNwYXJlbnQgb3V0cHV0LiBgdW5kZWZpbmVkYCB3aGVuIHRoZSByZWNpcGllbnQgd2FzIGJ1aWx0IGZyb20gYVxuICAgKiBwbGFpbiBhZGRyZXNzLlxuICAgKi9cbiAgdW5pZmllZEFkZHJlc3M/OiBzdHJpbmc7XG4gIGRlc3RpbmF0aW9uOiBQc2J0UmVjaXBpZW50RGVzdGluYXRpb247XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcmVjaXBpZW50IGxpc3Qgb2YgYSBkZWNvZGVkIFpjYXNoIFBTQlQgKHY0IFNhcGxpbmctc2hhcGVkIG9yIHY2IElyb253b29kKS5cbiAqXG4gKiBNaXJyb3JzIHRoZSByZWNpcGllbnQgcmVzb2x1dGlvbiBvZiB3YWxsZXQtcGxhdGZvcm0ncyB1dHhvLWNvcmUgYGJ1aWxkVHJhbnNhY3Rpb25gIGluIHRoZVxuICogZGVjb2RlIGRpcmVjdGlvbjogZXZlcnkgbm9uLXdhbGxldCBvdXRwdXQgd2l0aCBhIHJlc29sdmFibGUgYWRkcmVzcyBpcyBhIHJlY2lwaWVudC4gQVxuICogc2hpZWxkZWQgb3V0cHV0IHBhcnNlcyB3aXRoIGBpc1NoaWVsZGVkOiB0cnVlYCwgaXRzIGBzY3JpcHRgIGJlaW5nIHRoZSByYXcgNDMtYnl0ZSByZWNlaXZlcjtcbiAqIHdoZW4gdGhlIGJ1aWxkIHN0b3JlZCB0aGUgY2xpZW50J3Mgb3JpZ2luYWwgVW5pZmllZCBBZGRyZXNzICh0aGUgdjYgUENaVCBmb3Igc2hpZWxkZWRcbiAqIG91dHB1dHMsIHRoZSB0cmFuc3BhcmVudC1vdXRwdXQgcHJvcHJpZXRhcnkga2V5LXZhbHVlIG1hcCBmb3IgdjQpLCBib3RoIHRoZSBwYXJzZWQgYWRkcmVzc1xuICogYW5kIGB1bmlmaWVkQWRkcmVzc2AgcmVwb3J0IGl0IHZlcmJhdGltLiBPcGFxdWUgb3V0cHV0cyB3aXRoIG5vIGFkZHJlc3MgKGUuZy4gT1BfUkVUVVJOKSBhcmVcbiAqIHNraXBwZWQsIGFzIHRoZXkgY2Fycnkgbm8gcmVjaXBpZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBzYnRSZWNpcGllbnRzKFxuICBwc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaEJpdEdvUHNidCxcbiAgd2FsbGV0S2V5czogZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXNcbik6IFBzYnRSZWNpcGllbnRbXSB7XG4gIGNvbnN0IHBhcnNlZCA9IHBzYnQucGFyc2VUcmFuc2FjdGlvbldpdGhXYWxsZXRLZXlzKHdhbGxldEtleXMsIHtcbiAgICByZXBsYXlQcm90ZWN0aW9uOiB7IHB1YmxpY0tleXM6IGdldFJlcGxheVByb3RlY3Rpb25QdWJrZXlzKCd6ZWMnKSB9LFxuICB9KTtcblxuICBjb25zdCByZWNpcGllbnRzOiBQc2J0UmVjaXBpZW50W10gPSBbXTtcbiAgcGFyc2VkLm91dHB1dHMuZm9yRWFjaCgob3V0cHV0LCBpKSA9PiB7XG4gICAgLy8gV2FsbGV0LW93bmVkIChjaGFuZ2UpIG91dHB1dHMuXG4gICAgaWYgKG91dHB1dC5zY3JpcHRJZCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBPcGFxdWUgb3V0cHV0cyAoZS5nLiBPUF9SRVRVUk4pIGNhcnJ5IG5vIHJlY2lwaWVudCBhZGRyZXNzLlxuICAgIGlmIChvdXRwdXQuYWRkcmVzcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgb3JpZ2luYWwgY2xpZW50LXBhc3NlZCBVbmlmaWVkIEFkZHJlc3MsIHN0b3JlZCB2ZXJiYXRpbSBpbiB0aGUgUFNCVCdzIGtleS12YWx1ZVxuICAgIC8vIHBhaXJzOiB0aGUgb3JjaGFyZCBQQ1pUIGZvciBhIHNoaWVsZGVkIG91dHB1dCAocGFyc2VkIGBhZGRyZXNzYCByZXBvcnRzIGl0IGluIGZ1bGwpLCB0aGVcbiAgICAvLyB0cmFuc3BhcmVudC1vdXRwdXQgcHJvcHJpZXRhcnkgbWFwIGZvciBhIHY0IHRyYW5zcGFyZW50IG91dHB1dC5cbiAgICBjb25zdCB1bmlmaWVkQWRkcmVzcyA9IG91dHB1dC5pc1NoaWVsZGVkID8gb3V0cHV0LmFkZHJlc3MgOiBwc2J0LnRyYW5zcGFyZW50T3V0cHV0VW5pZmllZEFkZHJlc3MoaSkgPz8gdW5kZWZpbmVkO1xuICAgIHJlY2lwaWVudHMucHVzaCh7XG4gICAgICBhbW91bnQ6IG91dHB1dC52YWx1ZSxcbiAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgc2NyaXB0OiBvdXRwdXQuc2NyaXB0LFxuICAgICAgdW5pZmllZEFkZHJlc3MsXG4gICAgICBkZXN0aW5hdGlvbjogb3V0cHV0LmlzU2hpZWxkZWRcbiAgICAgICAgPyB7IGtpbmQ6ICd6Y2FzaFNoaWVsZGVkJywgdW5pZmllZEFkZHJlc3M6IG91dHB1dC5hZGRyZXNzIH1cbiAgICAgICAgOiB1bmlmaWVkQWRkcmVzc1xuICAgICAgICA/IHsga2luZDogJ3pjYXNoVW5pZmllZFRyYW5zcGFyZW50JywgdW5pZmllZEFkZHJlc3MgfVxuICAgICAgICA6IHsga2luZDogJ3RyYW5zcGFyZW50JyB9LFxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHJlY2lwaWVudHM7XG59XG5cbi8qKlxuICogSW5mZXIgdGhlIFVuaWZpZWQtQWRkcmVzcyByZWNpcGllbnQgcHJlZmVyZW5jZSBmb3IgYSBaY2FzaCB0cmFuc2FjdGlvbiB3aGVuIHRoZSBjYWxsZXIgZGlkXG4gKiBub3QgcGFzcyBvbmUg4oCUIHRoZSBjb3VudGVycGFydCBvZiB3YWxsZXQtcGxhdGZvcm0ncyB1dHhvLWNvcmUgYGJ1aWxkVHJhbnNhY3Rpb25gXG4gKiBgY2xhc3NpZnlSZWNpcGllbnRTaGllbGRlZG5lc3NgLlxuICpcbiAqIEEgcmVjaXBpZW50IHRoYXQgcmVzb2x2ZXMgdG8gYSB0cmFuc3BhcmVudCBvdXRwdXQg4oCUIGFuIG9yZGluYXJ5IHRyYW5zcGFyZW50IGFkZHJlc3MsIG9yIGFcbiAqIFVuaWZpZWQgQWRkcmVzcyBjYXJyeWluZyBhIHRyYW5zcGFyZW50IHJlY2VpdmVyIOKAlCBpcyBjbGFzc2lmaWVkIGAndHJhbnNwYXJlbnQnYDsgYSBVbmlmaWVkXG4gKiBBZGRyZXNzIGNhcnJ5aW5nIG9ubHkgYW4gT3JjaGFyZC9Jcm9ud29vZCByZWNlaXZlciBpcyBjbGFzc2lmaWVkIGAnc2hpZWxkZWQnYC4gQSBtaXggb2ZcbiAqIHNoaWVsZGVkIGFuZCB0cmFuc3BhcmVudCByZWNpcGllbnRzIGlzIHJlamVjdGVkLiBBbiBhZGRyZXNzIHRoYXQgaXMgbmVpdGhlciBhIHRyYW5zcGFyZW50XG4gKiBhZGRyZXNzIG5vciBhIFVuaWZpZWQgQWRkcmVzcyBwcm9wYWdhdGVzIHRoZSBVbmlmaWVkLUFkZHJlc3MgcGFyc2UgZXJyb3Ig4oCUIGl0IGlzIG5vdFxuICogc2lsZW50bHkgZGVmYXVsdGVkIHRvIGAndHJhbnNwYXJlbnQnYC5cbiAqXG4gKiBAcmV0dXJucyBgJ3NoaWVsZGVkJ2Agd2hlbiBldmVyeSByZWNpcGllbnQgcmVzb2x2ZXMgc2hpZWxkZWQsIGB1bmRlZmluZWRgIHdoZW4gZXZlcnlcbiAqICAgcmVjaXBpZW50IHJlc29sdmVzIHRyYW5zcGFyZW50ICh0aGUgYnVpbGQncyBkZWZhdWx0KS4gVGhlIGAndHJhbnNwYXJlbnQnYCBhcm0gb2YgdGhlXG4gKiAgIHJldHVybiB0eXBlIGV4aXN0cyBzbyBjYWxsZXJzIGNhbiBwYXNzIHRoZSBleHBsaWNpdCBwcmVmZXJlbmNlIHRocm91Z2ggdW5jaGFuZ2VkOyB0aGlzXG4gKiAgIGZ1bmN0aW9uIGl0c2VsZiBuZXZlciByZXR1cm5zIGAndHJhbnNwYXJlbnQnYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlKFxuICBuYW1lOiBaY2FzaENvaW5OYW1lLFxuICByZWNpcGllbnRzOiB7IGFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZCB9W11cbik6IFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2hpZWxkZWRuZXNzID0gcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4ge1xuICAgIGlmIChyZWNpcGllbnQuYWRkcmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSYXcgc2NyaXB0IGluaGVyZW50bHkgdHJhbnNwYXJlbnQuXG4gICAgICByZXR1cm4gJ3RyYW5zcGFyZW50JyBhcyBjb25zdDtcbiAgICB9XG4gICAgLy8gT3JkaW5hcnkgdHJhbnNwYXJlbnQgYWRkcmVzcywgb3IgYSBVbmlmaWVkIEFkZHJlc3MgY2FycnlpbmcgYSB0cmFuc3BhcmVudCByZWNlaXZlcjpcbiAgICAvLyByZXNvbHZlcyB0cmFuc3BhcmVudGx5IGVpdGhlciB3YXkgKHRoZSBidWlsZCdzIGRlZmF1bHQgd2hlbiBubyBwcmVmZXJlbmNlIGlzIGdpdmVuKS5cbiAgICBpZiAoemNhc2hBZGRyZXNzLmhhc1RyYW5zcGFyZW50UmVjZWl2ZXIocmVjaXBpZW50LmFkZHJlc3MsIG5hbWUpKSB7XG4gICAgICByZXR1cm4gJ3RyYW5zcGFyZW50JyBhcyBjb25zdDtcbiAgICB9XG4gICAgLy8gQSBzaGllbGRlZCAoT3JjaGFyZC9Jcm9ud29vZC1vbmx5KSBVbmlmaWVkIEFkZHJlc3MgaXMgdGhlIG9ubHkgcmVtYWluaW5nIHJlc29sdmFibGVcbiAgICAvLyBmb3JtLiBBbiBhZGRyZXNzIHRoYXQgaXMgbm9uZSBvZiB0aGUgYWJvdmUgcHJvcGFnYXRlcyB0aGUgcGFyc2UgZXJyb3IgaW5zdGVhZCBvZlxuICAgIC8vIGFzc3VtaW5nIGEgZGVmYXVsdC5cbiAgICBjb25zdCB1bmlmaWVkID0gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hVbmlmaWVkQWRkcmVzcy5wYXJzZShyZWNpcGllbnQuYWRkcmVzcywgbmFtZSk7XG4gICAgaWYgKHVuaWZpZWQuaGFzT3JjaGFyZFJlY2VpdmVyKSB7XG4gICAgICByZXR1cm4gJ3NoaWVsZGVkJyBhcyBjb25zdDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzICR7cmVjaXBpZW50LmFkZHJlc3N9IGNhcnJpZXMgbm8gdHJhbnNwYXJlbnQgb3IgT3JjaGFyZCByZWNlaXZlcmApO1xuICB9KTtcbiAgY29uc3QgaGFzU2hpZWxkZWQgPSBzaGllbGRlZG5lc3MuaW5jbHVkZXMoJ3NoaWVsZGVkJyk7XG4gIGNvbnN0IGhhc1RyYW5zcGFyZW50ID0gc2hpZWxkZWRuZXNzLmluY2x1ZGVzKCd0cmFuc3BhcmVudCcpO1xuICBpZiAoaGFzU2hpZWxkZWQgJiYgaGFzVHJhbnNwYXJlbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01peGVkIHNoaWVsZGVkIGFuZCB0cmFuc3BhcmVudCByZWNpcGllbnRzIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgcmV0dXJuIGhhc1NoaWVsZGVkID8gJ3NoaWVsZGVkJyA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBpZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbXBsL3plYy9yZWNpcGllbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUduRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQXlENUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsSUFBc0MsRUFDdEMsVUFBNEMsRUFDNUMsWUFBMEI7SUFFMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFVBQVUsRUFBRTtRQUM3RCxnQkFBZ0IsRUFBRSxFQUFFLFVBQVUsRUFBRSwwQkFBMEIsQ0FBQyxLQUFLLENBQUMsRUFBRTtLQUNwRSxDQUFDLENBQUM7SUFFSCxNQUFNLFVBQVUsR0FBb0IsRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLGlDQUFpQztRQUNqQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFDRCw4REFBOEQ7UUFDOUQsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBQ0Qsd0ZBQXdGO1FBQ3hGLGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsWUFBWSxNQUFNLENBQUMsT0FBTyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxzRkFBc0Y7UUFDdEYsa0VBQWtFO1FBQ2xFLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDakgsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNkLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSztZQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLGNBQWM7WUFDZCxXQUFXLEVBQUUsTUFBTSxDQUFDLFVBQVU7Z0JBQzVCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQzNELENBQUMsQ0FBQyxjQUFjO29CQUNoQixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsY0FBYyxFQUFFO29CQUNyRCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUMzQyxJQUFtQixFQUNuQixVQUE2QztJQUU3QyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7UUFDaEQsSUFBSSxTQUFTLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLHFDQUFxQztZQUNyQyxPQUFPLGFBQXNCLENBQUM7UUFDaEMsQ0FBQztRQUNELHNGQUFzRjtRQUN0Rix1RkFBdUY7UUFDdkYsSUFBSSxZQUFZLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pFLE9BQU8sYUFBc0IsQ0FBQztRQUNoQyxDQUFDO1FBQ0Qsc0ZBQXNGO1FBQ3RGLG1GQUFtRjtRQUNuRixzQkFBc0I7UUFDdEIsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckYsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMvQixPQUFPLFVBQW1CLENBQUM7UUFDN0IsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxTQUFTLENBQUMsT0FBTyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQzdGLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0RCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVELElBQUksV0FBVyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaXhlZFNjcmlwdFdhbGxldCwgemNhc2hBZGRyZXNzIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgdHlwZSB7IFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMgfSBmcm9tICcuLi8uLi90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9yZXBsYXlQcm90ZWN0aW9uJztcbmltcG9ydCB0eXBlIHsgQWRkcmVzc0NvZGVjIH0gZnJvbSAnLi4vLi4vdHJhbnNhY3Rpb24vcmVjaXBpZW50JztcblxuaW1wb3J0IHsgWmNhc2hDb2luTmFtZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEhvdyBhIHJlY2lwaWVudCBwYXJzZWQgZnJvbSBhIFpjYXNoIFBTQlQgaXMgc3BlbnQuXG4gKlxuICogVGhlIGRlY29kZS1zaWRlIGNvdW50ZXJwYXJ0IG9mIHV0eG8tY29yZSdzIGBidWlsZFRyYW5zYWN0aW9uL3pjYXNoLnRzYCBgWmNhc2hEZXN0aW5hdGlvbmAgb25cbiAqIHRoZSBidWlsZCBzaWRlOiBhIHNoaWVsZGVkIHJlY2lwaWVudCBpcyBhbiBPcmNoYXJkL0lyb253b29kIG91dHB1dCBzdG9yZWQgaW4gdGhlIHY2IChJcm9ud29vZClcbiAqIFBTQlQncyBvcmNoYXJkIFBDWlQsIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgYW4gb3JkaW5hcnkgdHJhbnNwYXJlbnQgb3V0cHV0LiBBIHRyYW5zcGFyZW50XG4gKiBvdXRwdXQgcmVzb2x2ZWQgZnJvbSBhIFVuaWZpZWQgQWRkcmVzcyBjYXJyaWVzIHRoYXQgb3JpZ2luYWwgVUEgKGB6Y2FzaFVuaWZpZWRUcmFuc3BhcmVudGApLCBhXG4gKiBwbGFpbiBhZGRyZXNzIGRvZXMgbm90LlxuICovXG5leHBvcnQgdHlwZSBQc2J0UmVjaXBpZW50RGVzdGluYXRpb24gPVxuICB8IHtcbiAgICAgIGtpbmQ6ICd6Y2FzaFNoaWVsZGVkJztcbiAgICAgIC8qKlxuICAgICAgICogVGhlIFVuaWZpZWQgQWRkcmVzcyB0aGUgb3V0cHV0IHdhcyBhZGRyZXNzZWQgdG8g4oCUIHRoZSBvcmlnaW5hbCBtdWx0aS1yZWNlaXZlciBVQSB0aGVcbiAgICAgICAqIGNsaWVudCBwYXNzZWQgd2hlbiB0aGUgUFNCVCBzdG9yZXMgb25lIHZlcmJhdGltLCBvdGhlcndpc2UgYSByZS1lbmNvZGVkIHNpbmdsZS1yZWNlaXZlclxuICAgICAgICogT3JjaGFyZCBVQS5cbiAgICAgICAqL1xuICAgICAgdW5pZmllZEFkZHJlc3M6IHN0cmluZztcbiAgICB9XG4gIHwge1xuICAgICAga2luZDogJ3pjYXNoVW5pZmllZFRyYW5zcGFyZW50JztcbiAgICAgIC8qKiBUaGUgb3JpZ2luYWwgVW5pZmllZCBBZGRyZXNzIHRoZSB0cmFuc3BhcmVudCByZWNlaXZlciB3YXMgcmVzb2x2ZWQgZnJvbS4gKi9cbiAgICAgIHVuaWZpZWRBZGRyZXNzOiBzdHJpbmc7XG4gICAgfVxuICB8IHsga2luZDogJ3RyYW5zcGFyZW50JyB9O1xuXG4vKiogQSByZWNpcGllbnQgcmVzb2x2ZWQgZnJvbSBhIGRlY29kZWQgWmNhc2ggUFNCVCdzIGV4dGVybmFsIG91dHB1dHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRSZWNpcGllbnQge1xuICAvKiogQW1vdW50IGluIHNhdG9zaGlzLiAqL1xuICBhbW91bnQ6IGJpZ2ludDtcbiAgLyoqXG4gICAqIFRoZSByZWNpcGllbnQgYWRkcmVzcy4gRm9yIGEgc2hpZWxkZWQgb3V0cHV0IHRoaXMgaXMgdGhlIFVuaWZpZWQgQWRkcmVzcyB0aGUgb3V0cHV0IHdhc1xuICAgKiBhZGRyZXNzZWQgdG8g4oCUIHRoZSBvcmlnaW5hbCBtdWx0aS1yZWNlaXZlciBVQSB3aGVuIHRoZSBQU0JUIHN0b3JlcyBvbmUgdmVyYmF0aW0sIG90aGVyd2lzZSBhXG4gICAqIHJlLWVuY29kZWQgc2luZ2xlLXJlY2VpdmVyIE9yY2hhcmQgVUEuIEZvciBhIHRyYW5zcGFyZW50IG91dHB1dCBpdCBpcyB0aGUgb3JpZ2luYWwgVW5pZmllZFxuICAgKiBBZGRyZXNzIHdoZW4gb25lIHdhcyBzdG9yZWQsIGVsc2UgdGhlIGRlY29kZWQgdHJhbnNwYXJlbnQgYWRkcmVzcy5cbiAgICovXG4gIGFkZHJlc3M6IHN0cmluZztcbiAgLyoqXG4gICAqIFJhdyByZWNlaXZlciBieXRlczogdGhlIDQzLWJ5dGUgT3JjaGFyZC9Jcm9ud29vZCByZWNlaXZlciBmb3IgYSBzaGllbGRlZCBvdXRwdXQsIHRoZVxuICAgKiBzY3JpcHRQdWJLZXkgZm9yIGEgdHJhbnNwYXJlbnQgb25lLlxuICAgKi9cbiAgc2NyaXB0OiBVaW50OEFycmF5O1xuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIFVuaWZpZWQgQWRkcmVzcyB0aGUgY2xpZW50IHN1cHBsaWVkIGZvciB0aGlzIHJlY2lwaWVudCwgd2hlbiB0aGUgUFNCVCBzdG9yZXNcbiAgICogb25lOiB0aGUgdjYgKElyb253b29kKSBQQ1pUIGZvciBhIHNoaWVsZGVkIG91dHB1dCwgdGhlIHRyYW5zcGFyZW50LW91dHB1dCBwcm9wcmlldGFyeVxuICAgKiBrZXktdmFsdWUgbWFwIGZvciBhIHY0IHRyYW5zcGFyZW50IG91dHB1dC4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgcmVjaXBpZW50IHdhcyBidWlsdCBmcm9tIGFcbiAgICogcGxhaW4gYWRkcmVzcy5cbiAgICovXG4gIHVuaWZpZWRBZGRyZXNzPzogc3RyaW5nO1xuICBkZXN0aW5hdGlvbjogUHNidFJlY2lwaWVudERlc3RpbmF0aW9uO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHJlY2lwaWVudCBsaXN0IG9mIGEgZGVjb2RlZCBaY2FzaCBQU0JUICh2NCBTYXBsaW5nLXNoYXBlZCBvciB2NiBJcm9ud29vZCkuXG4gKlxuICogTWlycm9ycyB0aGUgcmVjaXBpZW50IHJlc29sdXRpb24gb2Ygd2FsbGV0LXBsYXRmb3JtJ3MgdXR4by1jb3JlIGBidWlsZFRyYW5zYWN0aW9uYCBpbiB0aGVcbiAqIGRlY29kZSBkaXJlY3Rpb246IGV2ZXJ5IG5vbi13YWxsZXQgb3V0cHV0IHdpdGggYSByZXNvbHZhYmxlIGFkZHJlc3MgaXMgYSByZWNpcGllbnQuIEFcbiAqIHNoaWVsZGVkIG91dHB1dCBwYXJzZXMgd2l0aCBgaXNTaGllbGRlZDogdHJ1ZWAsIGl0cyBgc2NyaXB0YCBiZWluZyB0aGUgcmF3IDQzLWJ5dGUgcmVjZWl2ZXI7XG4gKiB3aGVuIHRoZSBidWlsZCBzdG9yZWQgdGhlIGNsaWVudCdzIG9yaWdpbmFsIFVuaWZpZWQgQWRkcmVzcyAodGhlIHY2IFBDWlQgZm9yIHNoaWVsZGVkXG4gKiBvdXRwdXRzLCB0aGUgdHJhbnNwYXJlbnQtb3V0cHV0IHByb3ByaWV0YXJ5IGtleS12YWx1ZSBtYXAgZm9yIHY0KSwgYm90aCB0aGUgcGFyc2VkIGFkZHJlc3NcbiAqIGFuZCBgdW5pZmllZEFkZHJlc3NgIHJlcG9ydCBpdCB2ZXJiYXRpbS4gT3BhcXVlIG91dHB1dHMgd2l0aCBubyBhZGRyZXNzIChlLmcuIE9QX1JFVFVSTikgYXJlXG4gKiBza2lwcGVkLCBhcyB0aGV5IGNhcnJ5IG5vIHJlY2lwaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQc2J0UmVjaXBpZW50cyhcbiAgcHNidDogZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hCaXRHb1BzYnQsXG4gIHdhbGxldEtleXM6IGZpeGVkU2NyaXB0V2FsbGV0LlJvb3RXYWxsZXRLZXlzLFxuICBhZGRyZXNzQ29kZWM6IEFkZHJlc3NDb2RlY1xuKTogUHNidFJlY2lwaWVudFtdIHtcbiAgY29uc3QgcGFyc2VkID0gcHNidC5wYXJzZVRyYW5zYWN0aW9uV2l0aFdhbGxldEtleXMod2FsbGV0S2V5cywge1xuICAgIHJlcGxheVByb3RlY3Rpb246IHsgcHVibGljS2V5czogZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMoJ3plYycpIH0sXG4gIH0pO1xuXG4gIGNvbnN0IHJlY2lwaWVudHM6IFBzYnRSZWNpcGllbnRbXSA9IFtdO1xuICBwYXJzZWQub3V0cHV0cy5mb3JFYWNoKChvdXRwdXQsIGkpID0+IHtcbiAgICAvLyBXYWxsZXQtb3duZWQgKGNoYW5nZSkgb3V0cHV0cy5cbiAgICBpZiAob3V0cHV0LnNjcmlwdElkICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE9wYXF1ZSBvdXRwdXRzIChlLmcuIE9QX1JFVFVSTikgY2Fycnkgbm8gcmVjaXBpZW50IGFkZHJlc3MuXG4gICAgaWYgKG91dHB1dC5hZGRyZXNzID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSByYXcgcGFyc2VkIHJlY2VpdmVyL3NjcmlwdCBpcyBhdXRob3JpdGF0aXZlOyBwcm9wcmlldGFyeSBVbmlmaWVkIEFkZHJlc3MgbWV0YWRhdGFcbiAgICAvLyBtdXN0IG1hdGNoIGl0IGJlZm9yZSBpdCBpcyBleHBvc2VkIHRvIGNhbGxlcnMuXG4gICAgaWYgKCFhZGRyZXNzQ29kZWMuaXNNYXRjaGluZ1NjcmlwdChvdXRwdXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCAke2l9IGFkZHJlc3MgJHtvdXRwdXQuYWRkcmVzc30gZG9lcyBub3QgbWF0Y2ggaXRzIHJhdyByZWNpcGllbnRgKTtcbiAgICB9XG4gICAgLy8gVGhlIG9yaWdpbmFsIGNsaWVudC1wYXNzZWQgVW5pZmllZCBBZGRyZXNzLCBzdG9yZWQgdmVyYmF0aW0gaW4gdGhlIFBTQlQncyBrZXktdmFsdWVcbiAgICAvLyB0cmFuc3BhcmVudC1vdXRwdXQgcHJvcHJpZXRhcnkgbWFwIGZvciBhIHY0IHRyYW5zcGFyZW50IG91dHB1dC5cbiAgICBjb25zdCB1bmlmaWVkQWRkcmVzcyA9IG91dHB1dC5pc1NoaWVsZGVkID8gb3V0cHV0LmFkZHJlc3MgOiBwc2J0LnRyYW5zcGFyZW50T3V0cHV0VW5pZmllZEFkZHJlc3MoaSkgPz8gdW5kZWZpbmVkO1xuICAgIHJlY2lwaWVudHMucHVzaCh7XG4gICAgICBhbW91bnQ6IG91dHB1dC52YWx1ZSxcbiAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgc2NyaXB0OiBvdXRwdXQuc2NyaXB0LFxuICAgICAgdW5pZmllZEFkZHJlc3MsXG4gICAgICBkZXN0aW5hdGlvbjogb3V0cHV0LmlzU2hpZWxkZWRcbiAgICAgICAgPyB7IGtpbmQ6ICd6Y2FzaFNoaWVsZGVkJywgdW5pZmllZEFkZHJlc3M6IG91dHB1dC5hZGRyZXNzIH1cbiAgICAgICAgOiB1bmlmaWVkQWRkcmVzc1xuICAgICAgICA/IHsga2luZDogJ3pjYXNoVW5pZmllZFRyYW5zcGFyZW50JywgdW5pZmllZEFkZHJlc3MgfVxuICAgICAgICA6IHsga2luZDogJ3RyYW5zcGFyZW50JyB9LFxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHJlY2lwaWVudHM7XG59XG5cbi8qKlxuICogSW5mZXIgdGhlIFVuaWZpZWQtQWRkcmVzcyByZWNpcGllbnQgcHJlZmVyZW5jZSBmb3IgYSBaY2FzaCB0cmFuc2FjdGlvbiB3aGVuIHRoZSBjYWxsZXIgZGlkXG4gKiBub3QgcGFzcyBvbmUg4oCUIHRoZSBjb3VudGVycGFydCBvZiB3YWxsZXQtcGxhdGZvcm0ncyB1dHhvLWNvcmUgYGJ1aWxkVHJhbnNhY3Rpb25gXG4gKiBgY2xhc3NpZnlSZWNpcGllbnRTaGllbGRlZG5lc3NgLlxuICpcbiAqIEEgcmVjaXBpZW50IHRoYXQgcmVzb2x2ZXMgdG8gYSB0cmFuc3BhcmVudCBvdXRwdXQg4oCUIGFuIG9yZGluYXJ5IHRyYW5zcGFyZW50IGFkZHJlc3MsIG9yIGFcbiAqIFVuaWZpZWQgQWRkcmVzcyBjYXJyeWluZyBhIHRyYW5zcGFyZW50IHJlY2VpdmVyIOKAlCBpcyBjbGFzc2lmaWVkIGAndHJhbnNwYXJlbnQnYDsgYSBVbmlmaWVkXG4gKiBBZGRyZXNzIGNhcnJ5aW5nIG9ubHkgYW4gT3JjaGFyZC9Jcm9ud29vZCByZWNlaXZlciBpcyBjbGFzc2lmaWVkIGAnc2hpZWxkZWQnYC4gQSBtaXggb2ZcbiAqIHNoaWVsZGVkIGFuZCB0cmFuc3BhcmVudCByZWNpcGllbnRzIGlzIHJlamVjdGVkLiBBbiBhZGRyZXNzIHRoYXQgaXMgbmVpdGhlciBhIHRyYW5zcGFyZW50XG4gKiBhZGRyZXNzIG5vciBhIFVuaWZpZWQgQWRkcmVzcyBwcm9wYWdhdGVzIHRoZSBVbmlmaWVkLUFkZHJlc3MgcGFyc2UgZXJyb3Ig4oCUIGl0IGlzIG5vdFxuICogc2lsZW50bHkgZGVmYXVsdGVkIHRvIGAndHJhbnNwYXJlbnQnYC5cbiAqXG4gKiBAcmV0dXJucyBgJ3NoaWVsZGVkJ2Agd2hlbiBldmVyeSByZWNpcGllbnQgcmVzb2x2ZXMgc2hpZWxkZWQsIGB1bmRlZmluZWRgIHdoZW4gZXZlcnlcbiAqICAgcmVjaXBpZW50IHJlc29sdmVzIHRyYW5zcGFyZW50ICh0aGUgYnVpbGQncyBkZWZhdWx0KS4gVGhlIGAndHJhbnNwYXJlbnQnYCBhcm0gb2YgdGhlXG4gKiAgIHJldHVybiB0eXBlIGV4aXN0cyBzbyBjYWxsZXJzIGNhbiBwYXNzIHRoZSBleHBsaWNpdCBwcmVmZXJlbmNlIHRocm91Z2ggdW5jaGFuZ2VkOyB0aGlzXG4gKiAgIGZ1bmN0aW9uIGl0c2VsZiBuZXZlciByZXR1cm5zIGAndHJhbnNwYXJlbnQnYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlKFxuICBuYW1lOiBaY2FzaENvaW5OYW1lLFxuICByZWNpcGllbnRzOiB7IGFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZCB9W11cbik6IFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2hpZWxkZWRuZXNzID0gcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4ge1xuICAgIGlmIChyZWNpcGllbnQuYWRkcmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSYXcgc2NyaXB0IGluaGVyZW50bHkgdHJhbnNwYXJlbnQuXG4gICAgICByZXR1cm4gJ3RyYW5zcGFyZW50JyBhcyBjb25zdDtcbiAgICB9XG4gICAgLy8gT3JkaW5hcnkgdHJhbnNwYXJlbnQgYWRkcmVzcywgb3IgYSBVbmlmaWVkIEFkZHJlc3MgY2FycnlpbmcgYSB0cmFuc3BhcmVudCByZWNlaXZlcjpcbiAgICAvLyByZXNvbHZlcyB0cmFuc3BhcmVudGx5IGVpdGhlciB3YXkgKHRoZSBidWlsZCdzIGRlZmF1bHQgd2hlbiBubyBwcmVmZXJlbmNlIGlzIGdpdmVuKS5cbiAgICBpZiAoemNhc2hBZGRyZXNzLmhhc1RyYW5zcGFyZW50UmVjZWl2ZXIocmVjaXBpZW50LmFkZHJlc3MsIG5hbWUpKSB7XG4gICAgICByZXR1cm4gJ3RyYW5zcGFyZW50JyBhcyBjb25zdDtcbiAgICB9XG4gICAgLy8gQSBzaGllbGRlZCAoT3JjaGFyZC9Jcm9ud29vZC1vbmx5KSBVbmlmaWVkIEFkZHJlc3MgaXMgdGhlIG9ubHkgcmVtYWluaW5nIHJlc29sdmFibGVcbiAgICAvLyBmb3JtLiBBbiBhZGRyZXNzIHRoYXQgaXMgbm9uZSBvZiB0aGUgYWJvdmUgcHJvcGFnYXRlcyB0aGUgcGFyc2UgZXJyb3IgaW5zdGVhZCBvZlxuICAgIC8vIGFzc3VtaW5nIGEgZGVmYXVsdC5cbiAgICBjb25zdCB1bmlmaWVkID0gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hVbmlmaWVkQWRkcmVzcy5wYXJzZShyZWNpcGllbnQuYWRkcmVzcywgbmFtZSk7XG4gICAgaWYgKHVuaWZpZWQuaGFzT3JjaGFyZFJlY2VpdmVyKSB7XG4gICAgICByZXR1cm4gJ3NoaWVsZGVkJyBhcyBjb25zdDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzICR7cmVjaXBpZW50LmFkZHJlc3N9IGNhcnJpZXMgbm8gdHJhbnNwYXJlbnQgb3IgT3JjaGFyZCByZWNlaXZlcmApO1xuICB9KTtcbiAgY29uc3QgaGFzU2hpZWxkZWQgPSBzaGllbGRlZG5lc3MuaW5jbHVkZXMoJ3NoaWVsZGVkJyk7XG4gIGNvbnN0IGhhc1RyYW5zcGFyZW50ID0gc2hpZWxkZWRuZXNzLmluY2x1ZGVzKCd0cmFuc3BhcmVudCcpO1xuICBpZiAoaGFzU2hpZWxkZWQgJiYgaGFzVHJhbnNwYXJlbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01peGVkIHNoaWVsZGVkIGFuZCB0cmFuc3BhcmVudCByZWNpcGllbnRzIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgcmV0dXJuIGhhc1NoaWVsZGVkID8gJ3NoaWVsZGVkJyA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -0,0 +1,36 @@
1
+ import type { UtxoCoinName } from '../../names';
2
+ /**
3
+ * Platform-reported shielded address details (wallet-platform
4
+ * `coinSpecific.shielded` for Zcash Orchard/Ironwood addresses).
5
+ */
6
+ export interface ShieldedAddressDetails {
7
+ /** Receiver type, e.g. 'ironwood'. */
8
+ type?: string;
9
+ /** 11-byte hex diversifier. */
10
+ diversifier?: string;
11
+ /** 32-byte hex `pk_d`. */
12
+ pkD?: string;
13
+ /** Wallet address index the diversifier was derived from. */
14
+ diversifierIndex?: number;
15
+ }
16
+ /**
17
+ * Verify a Zcash shielded (Orchard/Ironwood) wallet address returned by the platform.
18
+ *
19
+ * Shielded custodial wallets use RedPallas threshold keys whose keychains carry no
20
+ * secp256k1 xpubs, so the address cannot be locally rederived the way fixed-script
21
+ * (transparent) addresses are (`assertFixedScriptWalletAddress` would throw reading
22
+ * `pub`). Instead, this checks the address is a well-formed Orchard Unified Address
23
+ * whose 43-byte receiver matches the diversifier and `pk_d` the platform reports in
24
+ * `coinSpecific.shielded` — i.e. the UA really encodes the reported shielded receiver.
25
+ *
26
+ * @throws {UnexpectedAddressError} if the address is not a valid Orchard UA, the
27
+ * platform-reported data is missing/malformed, or the UA's Orchard receiver does
28
+ * not match the reported diversifier/`pk_d`
29
+ */
30
+ export declare function assertShieldedWalletAddress(coinName: UtxoCoinName, params: {
31
+ address: string;
32
+ coinSpecific?: {
33
+ shielded?: ShieldedAddressDetails;
34
+ };
35
+ }): void;
36
+ //# sourceMappingURL=shieldedAddress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shieldedAddress.d.ts","sourceRoot":"","sources":["../../../../src/impl/zec/shieldedAddress.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE;IACN,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,sBAAsB,CAAA;KAAE,CAAC;CACtD,GACA,IAAI,CAoCN"}
@@ -0,0 +1,48 @@
1
+ import { fixedScriptWallet } from '@bitgo/wasm-utxo';
2
+ import { UnexpectedAddressError } from '@bitgo/sdk-core';
3
+ /**
4
+ * Verify a Zcash shielded (Orchard/Ironwood) wallet address returned by the platform.
5
+ *
6
+ * Shielded custodial wallets use RedPallas threshold keys whose keychains carry no
7
+ * secp256k1 xpubs, so the address cannot be locally rederived the way fixed-script
8
+ * (transparent) addresses are (`assertFixedScriptWalletAddress` would throw reading
9
+ * `pub`). Instead, this checks the address is a well-formed Orchard Unified Address
10
+ * whose 43-byte receiver matches the diversifier and `pk_d` the platform reports in
11
+ * `coinSpecific.shielded` — i.e. the UA really encodes the reported shielded receiver.
12
+ *
13
+ * @throws {UnexpectedAddressError} if the address is not a valid Orchard UA, the
14
+ * platform-reported data is missing/malformed, or the UA's Orchard receiver does
15
+ * not match the reported diversifier/`pk_d`
16
+ */
17
+ export function assertShieldedWalletAddress(coinName, params) {
18
+ const shielded = params.coinSpecific?.shielded;
19
+ if (!shielded?.diversifier || !shielded.pkD) {
20
+ throw new UnexpectedAddressError('address validation failure: shielded address missing diversifier or pkD');
21
+ }
22
+ const diversifier = Buffer.from(shielded.diversifier, 'hex');
23
+ const pkD = Buffer.from(shielded.pkD, 'hex');
24
+ if (diversifier.length !== 11) {
25
+ throw new UnexpectedAddressError(`address validation failure: invalid diversifier length ${diversifier.length}`);
26
+ }
27
+ if (pkD.length !== 32) {
28
+ throw new UnexpectedAddressError(`address validation failure: invalid pkD length ${pkD.length}`);
29
+ }
30
+ // Only zec/tzec produce shielded addresses, so the name is always a valid ZcashNetworkName.
31
+ const network = coinName;
32
+ let ua;
33
+ try {
34
+ ua = fixedScriptWallet.ZcashUnifiedAddress.parse(params.address, network);
35
+ }
36
+ catch (e) {
37
+ throw new UnexpectedAddressError(`address validation failure: not a valid unified address: ${params.address}`);
38
+ }
39
+ const orchard = ua.orchardReceiver;
40
+ if (!orchard || orchard.length !== 43) {
41
+ throw new UnexpectedAddressError('address validation failure: unified address carries no Orchard receiver');
42
+ }
43
+ const expectedReceiver = Buffer.concat([diversifier, pkD]);
44
+ if (!Buffer.from(orchard).equals(expectedReceiver)) {
45
+ throw new UnexpectedAddressError('address validation failure: unified address Orchard receiver does not match shielded coinSpecific');
46
+ }
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpZWxkZWRBZGRyZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ltcGwvemVjL3NoaWVsZGVkQWRkcmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQW1CekQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsUUFBc0IsRUFDdEIsTUFHQztJQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDO0lBQy9DLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO0lBQzlHLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksc0JBQXNCLENBQUMsMERBQTBELFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ25ILENBQUM7SUFDRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLHNCQUFzQixDQUFDLGtEQUFrRCxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQsNEZBQTRGO0lBQzVGLE1BQU0sT0FBTyxHQUFHLFFBQThDLENBQUM7SUFFL0QsSUFBSSxFQUF5QyxDQUFDO0lBQzlDLElBQUksQ0FBQztRQUNILEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyw0REFBNEQsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDakgsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDbkMsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO0lBQzlHLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQ25ELE1BQU0sSUFBSSxzQkFBc0IsQ0FDOUIsbUdBQW1HLENBQ3BHLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpeGVkU2NyaXB0V2FsbGV0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBVdHhvQ29pbk5hbWUgfSBmcm9tICcuLi8uLi9uYW1lcyc7XG5cbi8qKlxuICogUGxhdGZvcm0tcmVwb3J0ZWQgc2hpZWxkZWQgYWRkcmVzcyBkZXRhaWxzICh3YWxsZXQtcGxhdGZvcm1cbiAqIGBjb2luU3BlY2lmaWMuc2hpZWxkZWRgIGZvciBaY2FzaCBPcmNoYXJkL0lyb253b29kIGFkZHJlc3NlcykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hpZWxkZWRBZGRyZXNzRGV0YWlscyB7XG4gIC8qKiBSZWNlaXZlciB0eXBlLCBlLmcuICdpcm9ud29vZCcuICovXG4gIHR5cGU/OiBzdHJpbmc7XG4gIC8qKiAxMS1ieXRlIGhleCBkaXZlcnNpZmllci4gKi9cbiAgZGl2ZXJzaWZpZXI/OiBzdHJpbmc7XG4gIC8qKiAzMi1ieXRlIGhleCBgcGtfZGAuICovXG4gIHBrRD86IHN0cmluZztcbiAgLyoqIFdhbGxldCBhZGRyZXNzIGluZGV4IHRoZSBkaXZlcnNpZmllciB3YXMgZGVyaXZlZCBmcm9tLiAqL1xuICBkaXZlcnNpZmllckluZGV4PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIFpjYXNoIHNoaWVsZGVkIChPcmNoYXJkL0lyb253b29kKSB3YWxsZXQgYWRkcmVzcyByZXR1cm5lZCBieSB0aGUgcGxhdGZvcm0uXG4gKlxuICogU2hpZWxkZWQgY3VzdG9kaWFsIHdhbGxldHMgdXNlIFJlZFBhbGxhcyB0aHJlc2hvbGQga2V5cyB3aG9zZSBrZXljaGFpbnMgY2Fycnkgbm9cbiAqIHNlY3AyNTZrMSB4cHVicywgc28gdGhlIGFkZHJlc3MgY2Fubm90IGJlIGxvY2FsbHkgcmVkZXJpdmVkIHRoZSB3YXkgZml4ZWQtc2NyaXB0XG4gKiAodHJhbnNwYXJlbnQpIGFkZHJlc3NlcyBhcmUgKGBhc3NlcnRGaXhlZFNjcmlwdFdhbGxldEFkZHJlc3NgIHdvdWxkIHRocm93IHJlYWRpbmdcbiAqIGBwdWJgKS4gSW5zdGVhZCwgdGhpcyBjaGVja3MgdGhlIGFkZHJlc3MgaXMgYSB3ZWxsLWZvcm1lZCBPcmNoYXJkIFVuaWZpZWQgQWRkcmVzc1xuICogd2hvc2UgNDMtYnl0ZSByZWNlaXZlciBtYXRjaGVzIHRoZSBkaXZlcnNpZmllciBhbmQgYHBrX2RgIHRoZSBwbGF0Zm9ybSByZXBvcnRzIGluXG4gKiBgY29pblNwZWNpZmljLnNoaWVsZGVkYCDigJQgaS5lLiB0aGUgVUEgcmVhbGx5IGVuY29kZXMgdGhlIHJlcG9ydGVkIHNoaWVsZGVkIHJlY2VpdmVyLlxuICpcbiAqIEB0aHJvd3Mge1VuZXhwZWN0ZWRBZGRyZXNzRXJyb3J9IGlmIHRoZSBhZGRyZXNzIGlzIG5vdCBhIHZhbGlkIE9yY2hhcmQgVUEsIHRoZVxuICogICBwbGF0Zm9ybS1yZXBvcnRlZCBkYXRhIGlzIG1pc3NpbmcvbWFsZm9ybWVkLCBvciB0aGUgVUEncyBPcmNoYXJkIHJlY2VpdmVyIGRvZXNcbiAqICAgbm90IG1hdGNoIHRoZSByZXBvcnRlZCBkaXZlcnNpZmllci9gcGtfZGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNoaWVsZGVkV2FsbGV0QWRkcmVzcyhcbiAgY29pbk5hbWU6IFV0eG9Db2luTmFtZSxcbiAgcGFyYW1zOiB7XG4gICAgYWRkcmVzczogc3RyaW5nO1xuICAgIGNvaW5TcGVjaWZpYz86IHsgc2hpZWxkZWQ/OiBTaGllbGRlZEFkZHJlc3NEZXRhaWxzIH07XG4gIH1cbik6IHZvaWQge1xuICBjb25zdCBzaGllbGRlZCA9IHBhcmFtcy5jb2luU3BlY2lmaWM/LnNoaWVsZGVkO1xuICBpZiAoIXNoaWVsZGVkPy5kaXZlcnNpZmllciB8fCAhc2hpZWxkZWQucGtEKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoJ2FkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBzaGllbGRlZCBhZGRyZXNzIG1pc3NpbmcgZGl2ZXJzaWZpZXIgb3IgcGtEJyk7XG4gIH1cblxuICBjb25zdCBkaXZlcnNpZmllciA9IEJ1ZmZlci5mcm9tKHNoaWVsZGVkLmRpdmVyc2lmaWVyLCAnaGV4Jyk7XG4gIGNvbnN0IHBrRCA9IEJ1ZmZlci5mcm9tKHNoaWVsZGVkLnBrRCwgJ2hleCcpO1xuICBpZiAoZGl2ZXJzaWZpZXIubGVuZ3RoICE9PSAxMSkge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogaW52YWxpZCBkaXZlcnNpZmllciBsZW5ndGggJHtkaXZlcnNpZmllci5sZW5ndGh9YCk7XG4gIH1cbiAgaWYgKHBrRC5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBpbnZhbGlkIHBrRCBsZW5ndGggJHtwa0QubGVuZ3RofWApO1xuICB9XG5cbiAgLy8gT25seSB6ZWMvdHplYyBwcm9kdWNlIHNoaWVsZGVkIGFkZHJlc3Nlcywgc28gdGhlIG5hbWUgaXMgYWx3YXlzIGEgdmFsaWQgWmNhc2hOZXR3b3JrTmFtZS5cbiAgY29uc3QgbmV0d29yayA9IGNvaW5OYW1lIGFzIGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoTmV0d29ya05hbWU7XG5cbiAgbGV0IHVhOiBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaFVuaWZpZWRBZGRyZXNzO1xuICB0cnkge1xuICAgIHVhID0gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hVbmlmaWVkQWRkcmVzcy5wYXJzZShwYXJhbXMuYWRkcmVzcywgbmV0d29yayk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcihgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6IG5vdCBhIHZhbGlkIHVuaWZpZWQgYWRkcmVzczogJHtwYXJhbXMuYWRkcmVzc31gKTtcbiAgfVxuXG4gIGNvbnN0IG9yY2hhcmQgPSB1YS5vcmNoYXJkUmVjZWl2ZXI7XG4gIGlmICghb3JjaGFyZCB8fCBvcmNoYXJkLmxlbmd0aCAhPT0gNDMpIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcignYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6IHVuaWZpZWQgYWRkcmVzcyBjYXJyaWVzIG5vIE9yY2hhcmQgcmVjZWl2ZXInKTtcbiAgfVxuXG4gIGNvbnN0IGV4cGVjdGVkUmVjZWl2ZXIgPSBCdWZmZXIuY29uY2F0KFtkaXZlcnNpZmllciwgcGtEXSk7XG4gIGlmICghQnVmZmVyLmZyb20ob3JjaGFyZCkuZXF1YWxzKGV4cGVjdGVkUmVjZWl2ZXIpKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoXG4gICAgICAnYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6IHVuaWZpZWQgYWRkcmVzcyBPcmNoYXJkIHJlY2VpdmVyIGRvZXMgbm90IG1hdGNoIHNoaWVsZGVkIGNvaW5TcGVjaWZpYydcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,29 @@
1
+ import { BIP32, fixedScriptWallet } from '@bitgo/wasm-utxo';
2
+ import { SignTransactionOptions } from '../../abstractUtxoCoin';
3
+ import { ReplayProtectionKeys } from '../../transaction/fixedScript/signPsbtWasm';
4
+ import type { Zec } from './zec';
5
+ /**
6
+ * Sign all transparent inputs of a v6 (Ironwood) Zcash PSBT and verify the signatures.
7
+ *
8
+ * v6 PSBTs override `sign(key)` to require the wallet root keys: on the first signing round —
9
+ * which the wasm enforces to be the user's root key — they derive the wallet ovk (the ECDH
10
+ * agreement of `rootWalletKeys.bitgoKey()` and the user root key) and finalize the shielded
11
+ * output's out_ciphertext before computing any transparent sighash. Later rounds no-op that
12
+ * step, so rootWalletKeys is passed unconditionally. Transparent inputs are signed with
13
+ * ordinary ECDSA over the ZIP-244 sighash either way.
14
+ *
15
+ * The generic `signAndVerifyPsbtWasm` cannot provide this: its `tx.sign(wasmSigner)` call does
16
+ * not satisfy the v6 override's rootWalletKeys requirement. Verification and signed-with
17
+ * metadata are shared with the generic path.
18
+ */
19
+ export declare function signAndVerifyIronwoodPsbt(tx: fixedScriptWallet.ZcashIronwoodBitGoPsbt, signerKeychain: BIP32, rootWalletKeys: fixedScriptWallet.RootWalletKeys, replayProtection: ReplayProtectionKeys, { writeSignedWith }?: {
20
+ writeSignedWith?: boolean;
21
+ }): fixedScriptWallet.ZcashIronwoodBitGoPsbt;
22
+ /**
23
+ * Sign a v6 (Ironwood) Zcash prebuild. Called from `Zec.signTransaction` once the decoded
24
+ * prebuild is known to be an Ironwood PSBT; every other prebuild keeps the generic path.
25
+ */
26
+ export declare function signIronwoodTransaction<TNumber extends number | bigint = number>(coin: Zec, tx: fixedScriptWallet.ZcashIronwoodBitGoPsbt, params: SignTransactionOptions<TNumber>): {
27
+ txHex: string;
28
+ };
29
+ //# sourceMappingURL=signIronwoodTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signIronwoodTransaction.d.ts","sourceRoot":"","sources":["../../../../src/impl/zec/signIronwoodTransaction.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAIhE,OAAO,EACL,oBAAoB,EAGrB,MAAM,4CAA4C,CAAC;AAGpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,iBAAiB,CAAC,sBAAsB,EAC5C,cAAc,EAAE,KAAK,EACrB,cAAc,EAAE,iBAAiB,CAAC,cAAc,EAChD,gBAAgB,EAAE,oBAAoB,EACtC,EAAE,eAAuB,EAAE,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,iBAAiB,CAAC,sBAAsB,CAc1C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAC9E,IAAI,EAAE,GAAG,EACT,EAAE,EAAE,iBAAiB,CAAC,sBAAsB,EAC5C,MAAM,EAAE,sBAAsB,CAAC,OAAO,CAAC,GACtC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAkBnB"}
@@ -0,0 +1,50 @@
1
+ import assert from 'assert';
2
+ import { isTriple } from '@bitgo/sdk-core';
3
+ import { fixedScriptWallet } from '@bitgo/wasm-utxo';
4
+ import { getReplayProtectionPubkeys } from '../../transaction/fixedScript/replayProtection';
5
+ import { BulkSigningError } from '../../transaction/fixedScript/SigningError';
6
+ import { finalizeSignedPsbt } from '../../transaction/fixedScript/signTransaction';
7
+ import { verifyPsbtSignaturesWasm, writeWasmUtxoSignedWithKv, } from '../../transaction/fixedScript/signPsbtWasm';
8
+ import { getSignerKeychain, toSignTransactionResult } from '../../transaction/signTransaction';
9
+ /**
10
+ * Sign all transparent inputs of a v6 (Ironwood) Zcash PSBT and verify the signatures.
11
+ *
12
+ * v6 PSBTs override `sign(key)` to require the wallet root keys: on the first signing round —
13
+ * which the wasm enforces to be the user's root key — they derive the wallet ovk (the ECDH
14
+ * agreement of `rootWalletKeys.bitgoKey()` and the user root key) and finalize the shielded
15
+ * output's out_ciphertext before computing any transparent sighash. Later rounds no-op that
16
+ * step, so rootWalletKeys is passed unconditionally. Transparent inputs are signed with
17
+ * ordinary ECDSA over the ZIP-244 sighash either way.
18
+ *
19
+ * The generic `signAndVerifyPsbtWasm` cannot provide this: its `tx.sign(wasmSigner)` call does
20
+ * not satisfy the v6 override's rootWalletKeys requirement. Verification and signed-with
21
+ * metadata are shared with the generic path.
22
+ */
23
+ export function signAndVerifyIronwoodPsbt(tx, signerKeychain, rootWalletKeys, replayProtection, { writeSignedWith = false } = {}) {
24
+ try {
25
+ tx.sign(signerKeychain, rootWalletKeys);
26
+ }
27
+ catch (e) {
28
+ throw new BulkSigningError(e);
29
+ }
30
+ verifyPsbtSignaturesWasm(tx, signerKeychain, rootWalletKeys, replayProtection);
31
+ if (writeSignedWith) {
32
+ writeWasmUtxoSignedWithKv(tx);
33
+ }
34
+ return tx;
35
+ }
36
+ /**
37
+ * Sign a v6 (Ironwood) Zcash prebuild. Called from `Zec.signTransaction` once the decoded
38
+ * prebuild is known to be an Ironwood PSBT; every other prebuild keeps the generic path.
39
+ */
40
+ export function signIronwoodTransaction(coin, tx, params) {
41
+ const signerKeychain = getSignerKeychain('prv' in params ? params.prv : undefined);
42
+ assert(signerKeychain, 'missing signer keychain');
43
+ assert(params.pubs, 'pubs are required for fixed script signing');
44
+ assert(isTriple(params.pubs), 'pubs must be a triple');
45
+ const rootWalletKeys = fixedScriptWallet.RootWalletKeys.fromXpubs(params.pubs);
46
+ const signedPsbt = signAndVerifyIronwoodPsbt(tx, signerKeychain, rootWalletKeys, { publicKeys: getReplayProtectionPubkeys(coin.wasmName) }, { writeSignedWith: params.writeSignedWith });
47
+ const signedTx = finalizeSignedPsbt(signedPsbt, params);
48
+ return toSignTransactionResult(signedTx, params);
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbklyb253b29kVHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW1wbC96ZWMvc2lnbklyb253b29kVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQVMsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc1RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUM1RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNuRixPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHlCQUF5QixHQUMxQixNQUFNLDRDQUE0QyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSS9GOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLEVBQTRDLEVBQzVDLGNBQXFCLEVBQ3JCLGNBQWdELEVBQ2hELGdCQUFzQyxFQUN0QyxFQUFFLGVBQWUsR0FBRyxLQUFLLEtBQW9DLEVBQUU7SUFFL0QsSUFBSSxDQUFDO1FBQ0gsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELHdCQUF3QixDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFL0UsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQix5QkFBeUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxJQUFTLEVBQ1QsRUFBNEMsRUFDNUMsTUFBdUM7SUFFdkMsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkYsTUFBTSxDQUFDLGNBQWMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0lBRWxELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLDRDQUE0QyxDQUFDLENBQUM7SUFDbEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUN2RCxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUUvRSxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FDMUMsRUFBRSxFQUNGLGNBQWMsRUFDZCxjQUFjLEVBQ2QsRUFBRSxVQUFVLEVBQUUsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQ3pELEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FDNUMsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RCxPQUFPLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBpc1RyaXBsZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCSVAzMiwgZml4ZWRTY3JpcHRXYWxsZXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuaW1wb3J0IHsgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuaW1wb3J0IHsgZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMgfSBmcm9tICcuLi8uLi90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9yZXBsYXlQcm90ZWN0aW9uJztcbmltcG9ydCB7IEJ1bGtTaWduaW5nRXJyb3IgfSBmcm9tICcuLi8uLi90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9TaWduaW5nRXJyb3InO1xuaW1wb3J0IHsgZmluYWxpemVTaWduZWRQc2J0IH0gZnJvbSAnLi4vLi4vdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvc2lnblRyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIFJlcGxheVByb3RlY3Rpb25LZXlzLFxuICB2ZXJpZnlQc2J0U2lnbmF0dXJlc1dhc20sXG4gIHdyaXRlV2FzbVV0eG9TaWduZWRXaXRoS3YsXG59IGZyb20gJy4uLy4uL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3NpZ25Qc2J0V2FzbSc7XG5pbXBvcnQgeyBnZXRTaWduZXJLZXljaGFpbiwgdG9TaWduVHJhbnNhY3Rpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90cmFuc2FjdGlvbi9zaWduVHJhbnNhY3Rpb24nO1xuXG5pbXBvcnQgdHlwZSB7IFplYyB9IGZyb20gJy4vemVjJztcblxuLyoqXG4gKiBTaWduIGFsbCB0cmFuc3BhcmVudCBpbnB1dHMgb2YgYSB2NiAoSXJvbndvb2QpIFpjYXNoIFBTQlQgYW5kIHZlcmlmeSB0aGUgc2lnbmF0dXJlcy5cbiAqXG4gKiB2NiBQU0JUcyBvdmVycmlkZSBgc2lnbihrZXkpYCB0byByZXF1aXJlIHRoZSB3YWxsZXQgcm9vdCBrZXlzOiBvbiB0aGUgZmlyc3Qgc2lnbmluZyByb3VuZCDigJRcbiAqIHdoaWNoIHRoZSB3YXNtIGVuZm9yY2VzIHRvIGJlIHRoZSB1c2VyJ3Mgcm9vdCBrZXkg4oCUIHRoZXkgZGVyaXZlIHRoZSB3YWxsZXQgb3ZrICh0aGUgRUNESFxuICogYWdyZWVtZW50IG9mIGByb290V2FsbGV0S2V5cy5iaXRnb0tleSgpYCBhbmQgdGhlIHVzZXIgcm9vdCBrZXkpIGFuZCBmaW5hbGl6ZSB0aGUgc2hpZWxkZWRcbiAqIG91dHB1dCdzIG91dF9jaXBoZXJ0ZXh0IGJlZm9yZSBjb21wdXRpbmcgYW55IHRyYW5zcGFyZW50IHNpZ2hhc2guIExhdGVyIHJvdW5kcyBuby1vcCB0aGF0XG4gKiBzdGVwLCBzbyByb290V2FsbGV0S2V5cyBpcyBwYXNzZWQgdW5jb25kaXRpb25hbGx5LiBUcmFuc3BhcmVudCBpbnB1dHMgYXJlIHNpZ25lZCB3aXRoXG4gKiBvcmRpbmFyeSBFQ0RTQSBvdmVyIHRoZSBaSVAtMjQ0IHNpZ2hhc2ggZWl0aGVyIHdheS5cbiAqXG4gKiBUaGUgZ2VuZXJpYyBgc2lnbkFuZFZlcmlmeVBzYnRXYXNtYCBjYW5ub3QgcHJvdmlkZSB0aGlzOiBpdHMgYHR4LnNpZ24od2FzbVNpZ25lcilgIGNhbGwgZG9lc1xuICogbm90IHNhdGlzZnkgdGhlIHY2IG92ZXJyaWRlJ3Mgcm9vdFdhbGxldEtleXMgcmVxdWlyZW1lbnQuIFZlcmlmaWNhdGlvbiBhbmQgc2lnbmVkLXdpdGhcbiAqIG1ldGFkYXRhIGFyZSBzaGFyZWQgd2l0aCB0aGUgZ2VuZXJpYyBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbkFuZFZlcmlmeUlyb253b29kUHNidChcbiAgdHg6IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoSXJvbndvb2RCaXRHb1BzYnQsXG4gIHNpZ25lcktleWNoYWluOiBCSVAzMixcbiAgcm9vdFdhbGxldEtleXM6IGZpeGVkU2NyaXB0V2FsbGV0LlJvb3RXYWxsZXRLZXlzLFxuICByZXBsYXlQcm90ZWN0aW9uOiBSZXBsYXlQcm90ZWN0aW9uS2V5cyxcbiAgeyB3cml0ZVNpZ25lZFdpdGggPSBmYWxzZSB9OiB7IHdyaXRlU2lnbmVkV2l0aD86IGJvb2xlYW4gfSA9IHt9XG4pOiBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaElyb253b29kQml0R29Qc2J0IHtcbiAgdHJ5IHtcbiAgICB0eC5zaWduKHNpZ25lcktleWNoYWluLCByb290V2FsbGV0S2V5cyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgQnVsa1NpZ25pbmdFcnJvcihlKTtcbiAgfVxuXG4gIHZlcmlmeVBzYnRTaWduYXR1cmVzV2FzbSh0eCwgc2lnbmVyS2V5Y2hhaW4sIHJvb3RXYWxsZXRLZXlzLCByZXBsYXlQcm90ZWN0aW9uKTtcblxuICBpZiAod3JpdGVTaWduZWRXaXRoKSB7XG4gICAgd3JpdGVXYXNtVXR4b1NpZ25lZFdpdGhLdih0eCk7XG4gIH1cblxuICByZXR1cm4gdHg7XG59XG5cbi8qKlxuICogU2lnbiBhIHY2IChJcm9ud29vZCkgWmNhc2ggcHJlYnVpbGQuIENhbGxlZCBmcm9tIGBaZWMuc2lnblRyYW5zYWN0aW9uYCBvbmNlIHRoZSBkZWNvZGVkXG4gKiBwcmVidWlsZCBpcyBrbm93biB0byBiZSBhbiBJcm9ud29vZCBQU0JUOyBldmVyeSBvdGhlciBwcmVidWlsZCBrZWVwcyB0aGUgZ2VuZXJpYyBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbklyb253b29kVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGNvaW46IFplYyxcbiAgdHg6IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoSXJvbndvb2RCaXRHb1BzYnQsXG4gIHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuKTogeyB0eEhleDogc3RyaW5nIH0ge1xuICBjb25zdCBzaWduZXJLZXljaGFpbiA9IGdldFNpZ25lcktleWNoYWluKCdwcnYnIGluIHBhcmFtcyA/IHBhcmFtcy5wcnYgOiB1bmRlZmluZWQpO1xuICBhc3NlcnQoc2lnbmVyS2V5Y2hhaW4sICdtaXNzaW5nIHNpZ25lciBrZXljaGFpbicpO1xuXG4gIGFzc2VydChwYXJhbXMucHVicywgJ3B1YnMgYXJlIHJlcXVpcmVkIGZvciBmaXhlZCBzY3JpcHQgc2lnbmluZycpO1xuICBhc3NlcnQoaXNUcmlwbGUocGFyYW1zLnB1YnMpLCAncHVicyBtdXN0IGJlIGEgdHJpcGxlJyk7XG4gIGNvbnN0IHJvb3RXYWxsZXRLZXlzID0gZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMuZnJvbVhwdWJzKHBhcmFtcy5wdWJzKTtcblxuICBjb25zdCBzaWduZWRQc2J0ID0gc2lnbkFuZFZlcmlmeUlyb253b29kUHNidChcbiAgICB0eCxcbiAgICBzaWduZXJLZXljaGFpbixcbiAgICByb290V2FsbGV0S2V5cyxcbiAgICB7IHB1YmxpY0tleXM6IGdldFJlcGxheVByb3RlY3Rpb25QdWJrZXlzKGNvaW4ud2FzbU5hbWUpIH0sXG4gICAgeyB3cml0ZVNpZ25lZFdpdGg6IHBhcmFtcy53cml0ZVNpZ25lZFdpdGggfVxuICApO1xuXG4gIGNvbnN0IHNpZ25lZFR4ID0gZmluYWxpemVTaWduZWRQc2J0KHNpZ25lZFBzYnQsIHBhcmFtcyk7XG4gIHJldHVybiB0b1NpZ25UcmFuc2FjdGlvblJlc3VsdChzaWduZWRUeCwgcGFyYW1zKTtcbn1cbiJdfQ==
@@ -1,3 +1,8 @@
1
+ import type { AddressCodecOutput } from '../../transaction/recipient';
1
2
  /** A Zcash coin name — the only UTXO coins with shielded (Orchard/Ironwood) support. */
2
3
  export type ZcashCoinName = 'zec' | 'tzec';
4
+ /** Parsed output metadata used to distinguish Zcash transparent and shielded receivers. */
5
+ export interface ZecAddressCodecOutput extends AddressCodecOutput {
6
+ isShielded?: boolean;
7
+ }
3
8
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/impl/zec/types.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/impl/zec/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,wFAAwF;AACxF,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C,2FAA2F;AAC3F,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW1wbC96ZWMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBBIFpjYXNoIGNvaW4gbmFtZSDigJQgdGhlIG9ubHkgVVRYTyBjb2lucyB3aXRoIHNoaWVsZGVkIChPcmNoYXJkL0lyb253b29kKSBzdXBwb3J0LiAqL1xuZXhwb3J0IHR5cGUgWmNhc2hDb2luTmFtZSA9ICd6ZWMnIHwgJ3R6ZWMnO1xuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW1wbC96ZWMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWRkcmVzc0NvZGVjT3V0cHV0IH0gZnJvbSAnLi4vLi4vdHJhbnNhY3Rpb24vcmVjaXBpZW50JztcblxuLyoqIEEgWmNhc2ggY29pbiBuYW1lIOKAlCB0aGUgb25seSBVVFhPIGNvaW5zIHdpdGggc2hpZWxkZWQgKE9yY2hhcmQvSXJvbndvb2QpIHN1cHBvcnQuICovXG5leHBvcnQgdHlwZSBaY2FzaENvaW5OYW1lID0gJ3plYycgfCAndHplYyc7XG5cbi8qKiBQYXJzZWQgb3V0cHV0IG1ldGFkYXRhIHVzZWQgdG8gZGlzdGluZ3Vpc2ggWmNhc2ggdHJhbnNwYXJlbnQgYW5kIHNoaWVsZGVkIHJlY2VpdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWmVjQWRkcmVzc0NvZGVjT3V0cHV0IGV4dGVuZHMgQWRkcmVzc0NvZGVjT3V0cHV0IHtcbiAgaXNTaGllbGRlZD86IGJvb2xlYW47XG59XG4iXX0=
@@ -1,10 +1,13 @@
1
1
  /**
2
2
  * @prettier
3
3
  */
4
- import { BitGoBase, MPCAlgorithm } from '@bitgo/sdk-core';
5
- import { AbstractUtxoCoin } from '../../abstractUtxoCoin';
4
+ import { fixedScriptWallet } from '@bitgo/wasm-utxo';
5
+ import { BitGoBase, ExtraPrebuildParamsOptions, HalfSignedUtxoTransaction, IWallet, MPCAlgorithm, SignedTransaction, Wallet } from '@bitgo/sdk-core';
6
+ import { AbstractUtxoCoin, ParseTransactionOptions, SignTransactionOptions, UtxoCoinSpecific, VerifyAddressOptions } from '../../abstractUtxoCoin';
7
+ import type { ParsedTransaction } from '../../transaction/types';
6
8
  import { UtxoCoinName } from '../../names';
7
9
  import { ZecAddressCodec } from './address';
10
+ import { PsbtRecipient } from './recipients';
8
11
  export declare class Zec extends AbstractUtxoCoin {
9
12
  readonly name: UtxoCoinName;
10
13
  constructor(bitgo: BitGoBase);
@@ -17,9 +20,39 @@ export declare class Zec extends AbstractUtxoCoin {
17
20
  getMPCAlgorithm(): MPCAlgorithm;
18
21
  static createInstance(bitgo: BitGoBase): Zec;
19
22
  get addressCodec(): ZecAddressCodec;
23
+ /**
24
+ * Shielded (Orchard/Ironwood) addresses are returned with `coinSpecific.shielded` and
25
+ * cannot be locally rederived from secp256k1 xpubs (RedPallas keychains carry none), so
26
+ * verify them against the platform-reported diversifier/pkD instead of the fixed-script
27
+ * transparent derivation the base class performs.
28
+ * @inheritdoc
29
+ */
30
+ isWalletAddress(params: VerifyAddressOptions<UtxoCoinSpecific>, wallet?: IWallet): Promise<boolean>;
20
31
  isValidAddress(address: string, param?: {
21
32
  anyFormat?: boolean;
22
33
  allowLightning?: boolean;
23
34
  } | boolean): boolean;
35
+ private inferUnifiedRecipientPreference;
36
+ parseTransaction<TNumber extends number | bigint = number>(params: ParseTransactionOptions<TNumber>): Promise<ParsedTransaction<TNumber>>;
37
+ getExtraPrebuildParams(buildParams: ExtraPrebuildParamsOptions & {
38
+ wallet: Wallet;
39
+ }): Promise<{
40
+ txFormat?: import("../..").TxFormat;
41
+ changeAddressType?: ("p2sh" | "p2wsh" | "p2shP2wsh" | "p2trMusig2" | "p2tr")[] | ("p2sh" | "p2wsh" | "p2shP2wsh" | "p2trMusig2" | "p2tr");
42
+ allowedInputScriptTypes?: ("p2sh" | "p2wsh" | "p2shP2wsh" | "p2trMusig2" | "p2tr")[];
43
+ } | {
44
+ unifiedRecipientPreference: "shielded" | "transparent";
45
+ txFormat?: import("../..").TxFormat;
46
+ changeAddressType?: ("p2sh" | "p2wsh" | "p2shP2wsh" | "p2trMusig2" | "p2tr")[] | ("p2sh" | "p2wsh" | "p2shP2wsh" | "p2trMusig2" | "p2tr");
47
+ allowedInputScriptTypes?: ("p2sh" | "p2wsh" | "p2shP2wsh" | "p2trMusig2" | "p2tr")[];
48
+ }>;
49
+ decodeTransaction(input: Buffer | string): fixedScriptWallet.BitGoPsbt;
50
+ /**
51
+ * Route v6 (Ironwood) prebuilds to the Ironwood signing path — its `sign` override requires
52
+ * the wallet root keys to derive the ovk on the user's first signing round — and keep every
53
+ * other prebuild (v4 and non-PSBT) on the generic path.
54
+ */
55
+ signTransaction<TNumber extends number | bigint = number>(params: SignTransactionOptions<TNumber>): Promise<SignedTransaction | HalfSignedUtxoTransaction>;
56
+ resolveRecipientsFromPsbt(input: Buffer | string, walletKeys: fixedScriptWallet.RootWalletKeys): PsbtRecipient[];
24
57
  }
25
58
  //# sourceMappingURL=zec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"zec.d.ts","sourceRoot":"","sources":["../../../../src/impl/zec/zec.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,qBAAa,GAAI,SAAQ,gBAAgB;IACvC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAS;gBAExB,KAAK,EAAE,SAAS;IAI5B;;;;;OAKG;IACH,eAAe,IAAI,YAAY;IAI/B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG;IAI5C,IAAa,YAAY,IAAI,eAAe,CAE3C;IAED,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,GAAG,OAAO;CAG9G"}
1
+ {"version":3,"file":"zec.d.ts","sourceRoot":"","sources":["../../../../src/impl/zec/zec.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAA8B,MAAM,kBAAkB,CAAC;AACjF,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,yBAAyB,EACzB,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,MAAM,EAEP,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAyB,aAAa,EAAE,MAAM,cAAc,CAAC;AAIpE,qBAAa,GAAI,SAAQ,gBAAgB;IACvC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAS;gBAExB,KAAK,EAAE,SAAS;IAI5B;;;;;OAKG;IACH,eAAe,IAAI,YAAY;IAI/B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG;IAI5C,IAAa,YAAY,IAAI,eAAe,CAE3C;IAED;;;;;;OAMG;IACY,eAAe,CAAC,MAAM,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAQlH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,GAAG,OAAO;IAI7G,OAAO,CAAC,+BAA+B;IAyBxB,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EACtE,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IASvB,sBAAsB,CAAC,WAAW,EAAE,0BAA0B,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;IASzF,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAAC,SAAS;IAQ/E;;;;OAIG;IACY,eAAe,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EACrE,MAAM,EAAE,sBAAsB,CAAC,OAAO,CAAC,GACtC,OAAO,CAAC,iBAAiB,GAAG,yBAAyB,CAAC;IAYzD,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,iBAAiB,CAAC,cAAc,GAAG,aAAa,EAAE;CAOjH"}
@@ -1,5 +1,16 @@
1
- import { AbstractUtxoCoin } from '../../abstractUtxoCoin';
1
+ /**
2
+ * @prettier
3
+ */
4
+ import { fixedScriptWallet, hasPsbtMagic, zcashAddress } from '@bitgo/wasm-utxo';
5
+ import _ from 'lodash';
6
+ import { AbstractUtxoCoin, } from '../../abstractUtxoCoin';
7
+ import { stringToBufferTryFormats } from '../../transaction/decode';
8
+ import { toWasmUtxoCoinName } from '../../names';
9
+ import { AddressCodec } from '../../transaction/recipient';
2
10
  import { ZecAddressCodec } from './address';
11
+ import { signIronwoodTransaction } from './signIronwoodTransaction';
12
+ import { resolvePsbtRecipients } from './recipients';
13
+ import { assertShieldedWalletAddress } from './shieldedAddress';
3
14
  export class Zec extends AbstractUtxoCoin {
4
15
  constructor(bitgo) {
5
16
  super(bitgo);
@@ -20,8 +31,87 @@ export class Zec extends AbstractUtxoCoin {
20
31
  get addressCodec() {
21
32
  return new ZecAddressCodec(this.name, this.wasmName);
22
33
  }
34
+ /**
35
+ * Shielded (Orchard/Ironwood) addresses are returned with `coinSpecific.shielded` and
36
+ * cannot be locally rederived from secp256k1 xpubs (RedPallas keychains carry none), so
37
+ * verify them against the platform-reported diversifier/pkD instead of the fixed-script
38
+ * transparent derivation the base class performs.
39
+ * @inheritdoc
40
+ */
41
+ async isWalletAddress(params, wallet) {
42
+ if (params.coinSpecific?.shielded) {
43
+ assertShieldedWalletAddress(this.name, params);
44
+ return true;
45
+ }
46
+ return super.isWalletAddress(params, wallet);
47
+ }
23
48
  isValidAddress(address, param) {
24
49
  return this.addressCodec.isValidAddress(address);
25
50
  }
51
+ inferUnifiedRecipientPreference(recipients) {
52
+ const shieldedness = (recipients ?? []).map((recipient) => {
53
+ const address = recipient.address;
54
+ if (address === undefined) {
55
+ return 'transparent';
56
+ }
57
+ if (AddressCodec.isScriptRecipient(address)) {
58
+ return 'transparent';
59
+ }
60
+ const hasTransparentReceiver = zcashAddress.hasTransparentReceiver(address, this.wasmName);
61
+ const hasOrchardReceiver = zcashAddress.hasOrchardReceiver(address, this.wasmName);
62
+ return hasOrchardReceiver && !hasTransparentReceiver
63
+ ? 'shielded'
64
+ : hasTransparentReceiver
65
+ ? 'transparent'
66
+ : undefined;
67
+ });
68
+ if (shieldedness.includes('shielded') && shieldedness.includes('transparent')) {
69
+ throw new Error('Mixed shielded and transparent recipients are not supported');
70
+ }
71
+ return shieldedness.includes('shielded') ? 'shielded' : undefined;
72
+ }
73
+ async parseTransaction(params) {
74
+ const preference = params.txParams.unifiedRecipientPreference ?? this.inferUnifiedRecipientPreference(params.txParams.recipients);
75
+ return this.parseTransactionWithAddressCodec(params, new ZecAddressCodec(this.name, this.wasmName, preference ?? 'transparent'));
76
+ }
77
+ async getExtraPrebuildParams(buildParams) {
78
+ const extraParams = await super.getExtraPrebuildParams(buildParams);
79
+ const { unifiedRecipientPreference } = buildParams;
80
+ if (unifiedRecipientPreference === undefined) {
81
+ return extraParams;
82
+ }
83
+ return { ...extraParams, unifiedRecipientPreference };
84
+ }
85
+ decodeTransaction(input) {
86
+ const buffer = typeof input === 'string' ? stringToBufferTryFormats(input, ['hex', 'base64']) : input;
87
+ if (!hasPsbtMagic(buffer)) {
88
+ return super.decodeTransaction(input);
89
+ }
90
+ return fixedScriptWallet.ZcashPsbt.fromBytes(buffer, toWasmUtxoCoinName(this.name));
91
+ }
92
+ /**
93
+ * Route v6 (Ironwood) prebuilds to the Ironwood signing path — its `sign` override requires
94
+ * the wallet root keys to derive the ovk on the user's first signing round — and keep every
95
+ * other prebuild (v4 and non-PSBT) on the generic path.
96
+ */
97
+ async signTransaction(params) {
98
+ const txPrebuild = params?.txPrebuild;
99
+ if (!_.isObject(txPrebuild)) {
100
+ // Defer to the base path for its standard missing/malformed-prebuild validation errors.
101
+ return super.signTransaction(params);
102
+ }
103
+ const tx = this.decodeTransactionFromPrebuild(txPrebuild);
104
+ if (!(tx instanceof fixedScriptWallet.ZcashIronwoodBitGoPsbt)) {
105
+ return super.signTransaction(params);
106
+ }
107
+ return signIronwoodTransaction(this, tx, params);
108
+ }
109
+ resolveRecipientsFromPsbt(input, walletKeys) {
110
+ const psbt = this.decodeTransaction(input);
111
+ if (!(psbt instanceof fixedScriptWallet.ZcashBitGoPsbt)) {
112
+ throw new Error('expected a Zcash PSBT');
113
+ }
114
+ return resolvePsbtRecipients(psbt, walletKeys, this.addressCodec);
115
+ }
26
116
  }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ltcGwvemVjL3plYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUcxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTVDLE1BQU0sT0FBTyxHQUFJLFNBQVEsZ0JBQWdCO0lBR3ZDLFlBQVksS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBSE4sU0FBSSxHQUFpQixLQUFLLENBQUM7SUFJcEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCO1FBQ3BDLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQWEsWUFBWTtRQUN2QixPQUFPLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxjQUFjLENBQUMsT0FBZSxFQUFFLEtBQW1FO1FBQ2pHLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgQml0R29CYXNlLCBNUENBbGdvcml0aG0gfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luIH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5pbXBvcnQgeyBVdHhvQ29pbk5hbWUgfSBmcm9tICcuLi8uLi9uYW1lcyc7XG5cbmltcG9ydCB7IFplY0FkZHJlc3NDb2RlYyB9IGZyb20gJy4vYWRkcmVzcyc7XG5cbmV4cG9ydCBjbGFzcyBaZWMgZXh0ZW5kcyBBYnN0cmFjdFV0eG9Db2luIHtcbiAgcmVhZG9ubHkgbmFtZTogVXR4b0NvaW5OYW1lID0gJ3plYyc7XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSkge1xuICAgIHN1cGVyKGJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBaRUMgc2hpZWxkZWQgKE9yY2hhcmQvSXJvbndvb2QpIGN1c3RvZGlhbCB3YWxsZXRzIHVzZSBSZWRQYWxsYXMgdGhyZXNob2xkIGtleXMuXG4gICAqIFRyYW5zcGFyZW50IChzZWNwMjU2azEgbXVsdGlzaWcpIGZsb3dzIGFyZSB1bmFmZmVjdGVkOiBNUENBbGdvcml0aG0gaXMgb25seVxuICAgKiBjb25zdWx0ZWQgb24gdGhlIFRTUyBjdXN0b2RpYWwgd2FsbGV0LWNyZWF0aW9uIHBhdGguXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ3JlZHBhbGxhcyc7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSk6IFplYyB7XG4gICAgcmV0dXJuIG5ldyBaZWMoYml0Z28pO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0IGFkZHJlc3NDb2RlYygpOiBaZWNBZGRyZXNzQ29kZWMge1xuICAgIHJldHVybiBuZXcgWmVjQWRkcmVzc0NvZGVjKHRoaXMubmFtZSwgdGhpcy53YXNtTmFtZSk7XG4gIH1cblxuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIHBhcmFtPzogeyBhbnlGb3JtYXQ/OiBib29sZWFuOyBhbGxvd0xpZ2h0bmluZz86IGJvb2xlYW4gfSB8IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzQ29kZWMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cbn1cbiJdfQ==
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ltcGwvemVjL3plYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFXakYsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxnQkFBZ0IsR0FLakIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBaUIsTUFBTSxjQUFjLENBQUM7QUFDcEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEUsTUFBTSxPQUFPLEdBQUksU0FBUSxnQkFBZ0I7SUFHdkMsWUFBWSxLQUFnQjtRQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFITixTQUFJLEdBQWlCLEtBQUssQ0FBQztJQUlwQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlO1FBQ2IsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0I7UUFDcEMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBYSxZQUFZO1FBQ3ZCLE9BQU8sSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBOEMsRUFBRSxNQUFnQjtRQUM3RixJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDbEMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxjQUFjLENBQUMsT0FBZSxFQUFFLEtBQW1FO1FBQ2pHLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLCtCQUErQixDQUNyQyxVQUF5RDtRQUV6RCxNQUFNLFlBQVksR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQTBDLEVBQUU7WUFDaEcsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUNsQyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUNELElBQUksWUFBWSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxNQUFNLHNCQUFzQixHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNGLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkYsT0FBTyxrQkFBa0IsSUFBSSxDQUFDLHNCQUFzQjtnQkFDbEQsQ0FBQyxDQUFDLFVBQVU7Z0JBQ1osQ0FBQyxDQUFDLHNCQUFzQjtvQkFDeEIsQ0FBQyxDQUFDLGFBQWE7b0JBQ2YsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDOUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BFLENBQUM7SUFFUSxLQUFLLENBQUMsZ0JBQWdCLENBQzdCLE1BQXdDO1FBRXhDLE1BQU0sVUFBVSxHQUNkLE1BQU0sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLElBQUksSUFBSSxDQUFDLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakgsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLENBQzFDLE1BQU0sRUFDTixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxJQUFJLGFBQWEsQ0FBQyxDQUMzRSxDQUFDO0lBQ0osQ0FBQztJQUVRLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxXQUE0RDtRQUNoRyxNQUFNLFdBQVcsR0FBRyxNQUFNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRSxNQUFNLEVBQUUsMEJBQTBCLEVBQUUsR0FBRyxXQUFXLENBQUM7UUFDbkQsSUFBSSwwQkFBMEIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QyxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBQ0QsT0FBTyxFQUFFLEdBQUcsV0FBVyxFQUFFLDBCQUEwQixFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVRLGlCQUFpQixDQUFDLEtBQXNCO1FBQy9DLE1BQU0sTUFBTSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN0RyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8saUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBa0IsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFRDs7OztPQUlHO0lBQ00sS0FBSyxDQUFDLGVBQWUsQ0FDNUIsTUFBdUM7UUFFdkMsTUFBTSxVQUFVLEdBQUcsTUFBTSxFQUFFLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzVCLHdGQUF3RjtZQUN4RixPQUFPLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsQ0FBQyxFQUFFLFlBQVksaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1lBQzlELE9BQU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsT0FBTyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCx5QkFBeUIsQ0FBQyxLQUFzQixFQUFFLFVBQTRDO1FBQzVGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksaUJBQWlCLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELE9BQU8scUJBQXFCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgZml4ZWRTY3JpcHRXYWxsZXQsIGhhc1BzYnRNYWdpYywgemNhc2hBZGRyZXNzIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQge1xuICBCaXRHb0Jhc2UsXG4gIEV4dHJhUHJlYnVpbGRQYXJhbXNPcHRpb25zLFxuICBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICBJV2FsbGV0LFxuICBNUENBbGdvcml0aG0sXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBXYWxsZXQsXG4gIFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHtcbiAgQWJzdHJhY3RVdHhvQ29pbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFV0eG9Db2luU3BlY2lmaWMsXG4gIFZlcmlmeUFkZHJlc3NPcHRpb25zLFxufSBmcm9tICcuLi8uLi9hYnN0cmFjdFV0eG9Db2luJztcbmltcG9ydCB0eXBlIHsgUGFyc2VkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi90cmFuc2FjdGlvbi90eXBlcyc7XG5pbXBvcnQgeyBzdHJpbmdUb0J1ZmZlclRyeUZvcm1hdHMgfSBmcm9tICcuLi8uLi90cmFuc2FjdGlvbi9kZWNvZGUnO1xuaW1wb3J0IHsgVXR4b0NvaW5OYW1lLCB0b1dhc21VdHhvQ29pbk5hbWUgfSBmcm9tICcuLi8uLi9uYW1lcyc7XG5pbXBvcnQgeyBBZGRyZXNzQ29kZWMgfSBmcm9tICcuLi8uLi90cmFuc2FjdGlvbi9yZWNpcGllbnQnO1xuXG5pbXBvcnQgeyBaZWNBZGRyZXNzQ29kZWMgfSBmcm9tICcuL2FkZHJlc3MnO1xuaW1wb3J0IHsgc2lnbklyb253b29kVHJhbnNhY3Rpb24gfSBmcm9tICcuL3NpZ25Jcm9ud29vZFRyYW5zYWN0aW9uJztcbmltcG9ydCB7IHJlc29sdmVQc2J0UmVjaXBpZW50cywgUHNidFJlY2lwaWVudCB9IGZyb20gJy4vcmVjaXBpZW50cyc7XG5pbXBvcnQgeyBhc3NlcnRTaGllbGRlZFdhbGxldEFkZHJlc3MgfSBmcm9tICcuL3NoaWVsZGVkQWRkcmVzcyc7XG5pbXBvcnQgdHlwZSB7IFpjYXNoQ29pbk5hbWUgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFplYyBleHRlbmRzIEFic3RyYWN0VXR4b0NvaW4ge1xuICByZWFkb25seSBuYW1lOiBVdHhvQ29pbk5hbWUgPSAnemVjJztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlKSB7XG4gICAgc3VwZXIoYml0Z28pO1xuICB9XG5cbiAgLyoqXG4gICAqIFpFQyBzaGllbGRlZCAoT3JjaGFyZC9Jcm9ud29vZCkgY3VzdG9kaWFsIHdhbGxldHMgdXNlIFJlZFBhbGxhcyB0aHJlc2hvbGQga2V5cy5cbiAgICogVHJhbnNwYXJlbnQgKHNlY3AyNTZrMSBtdWx0aXNpZykgZmxvd3MgYXJlIHVuYWZmZWN0ZWQ6IE1QQ0FsZ29yaXRobSBpcyBvbmx5XG4gICAqIGNvbnN1bHRlZCBvbiB0aGUgVFNTIGN1c3RvZGlhbCB3YWxsZXQtY3JlYXRpb24gcGF0aC5cbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAncmVkcGFsbGFzJztcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlKTogWmVjIHtcbiAgICByZXR1cm4gbmV3IFplYyhiaXRnbyk7XG4gIH1cblxuICBvdmVycmlkZSBnZXQgYWRkcmVzc0NvZGVjKCk6IFplY0FkZHJlc3NDb2RlYyB7XG4gICAgcmV0dXJuIG5ldyBaZWNBZGRyZXNzQ29kZWModGhpcy5uYW1lLCB0aGlzLndhc21OYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGllbGRlZCAoT3JjaGFyZC9Jcm9ud29vZCkgYWRkcmVzc2VzIGFyZSByZXR1cm5lZCB3aXRoIGBjb2luU3BlY2lmaWMuc2hpZWxkZWRgIGFuZFxuICAgKiBjYW5ub3QgYmUgbG9jYWxseSByZWRlcml2ZWQgZnJvbSBzZWNwMjU2azEgeHB1YnMgKFJlZFBhbGxhcyBrZXljaGFpbnMgY2Fycnkgbm9uZSksIHNvXG4gICAqIHZlcmlmeSB0aGVtIGFnYWluc3QgdGhlIHBsYXRmb3JtLXJlcG9ydGVkIGRpdmVyc2lmaWVyL3BrRCBpbnN0ZWFkIG9mIHRoZSBmaXhlZC1zY3JpcHRcbiAgICogdHJhbnNwYXJlbnQgZGVyaXZhdGlvbiB0aGUgYmFzZSBjbGFzcyBwZXJmb3Jtcy5cbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zPFV0eG9Db2luU3BlY2lmaWM+LCB3YWxsZXQ/OiBJV2FsbGV0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHBhcmFtcy5jb2luU3BlY2lmaWM/LnNoaWVsZGVkKSB7XG4gICAgICBhc3NlcnRTaGllbGRlZFdhbGxldEFkZHJlc3ModGhpcy5uYW1lLCBwYXJhbXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5pc1dhbGxldEFkZHJlc3MocGFyYW1zLCB3YWxsZXQpO1xuICB9XG5cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBwYXJhbT86IHsgYW55Rm9ybWF0PzogYm9vbGVhbjsgYWxsb3dMaWdodG5pbmc/OiBib29sZWFuIH0gfCBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRkcmVzc0NvZGVjLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmZlclVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlKFxuICAgIHJlY2lwaWVudHM6IHsgYWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkIH1bXSB8IHVuZGVmaW5lZFxuICApOiBVbmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2hpZWxkZWRuZXNzID0gKHJlY2lwaWVudHMgPz8gW10pLm1hcCgocmVjaXBpZW50KTogVW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2UgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHJlY2lwaWVudC5hZGRyZXNzO1xuICAgICAgaWYgKGFkZHJlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gJ3RyYW5zcGFyZW50JztcbiAgICAgIH1cbiAgICAgIGlmIChBZGRyZXNzQ29kZWMuaXNTY3JpcHRSZWNpcGllbnQoYWRkcmVzcykpIHtcbiAgICAgICAgcmV0dXJuICd0cmFuc3BhcmVudCc7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNUcmFuc3BhcmVudFJlY2VpdmVyID0gemNhc2hBZGRyZXNzLmhhc1RyYW5zcGFyZW50UmVjZWl2ZXIoYWRkcmVzcywgdGhpcy53YXNtTmFtZSk7XG4gICAgICBjb25zdCBoYXNPcmNoYXJkUmVjZWl2ZXIgPSB6Y2FzaEFkZHJlc3MuaGFzT3JjaGFyZFJlY2VpdmVyKGFkZHJlc3MsIHRoaXMud2FzbU5hbWUpO1xuICAgICAgcmV0dXJuIGhhc09yY2hhcmRSZWNlaXZlciAmJiAhaGFzVHJhbnNwYXJlbnRSZWNlaXZlclxuICAgICAgICA/ICdzaGllbGRlZCdcbiAgICAgICAgOiBoYXNUcmFuc3BhcmVudFJlY2VpdmVyXG4gICAgICAgID8gJ3RyYW5zcGFyZW50J1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpZiAoc2hpZWxkZWRuZXNzLmluY2x1ZGVzKCdzaGllbGRlZCcpICYmIHNoaWVsZGVkbmVzcy5pbmNsdWRlcygndHJhbnNwYXJlbnQnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXhlZCBzaGllbGRlZCBhbmQgdHJhbnNwYXJlbnQgcmVjaXBpZW50cyBhcmUgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gc2hpZWxkZWRuZXNzLmluY2x1ZGVzKCdzaGllbGRlZCcpID8gJ3NoaWVsZGVkJyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+PiB7XG4gICAgY29uc3QgcHJlZmVyZW5jZSA9XG4gICAgICBwYXJhbXMudHhQYXJhbXMudW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2UgPz8gdGhpcy5pbmZlclVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlKHBhcmFtcy50eFBhcmFtcy5yZWNpcGllbnRzKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVRyYW5zYWN0aW9uV2l0aEFkZHJlc3NDb2RlYyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIG5ldyBaZWNBZGRyZXNzQ29kZWModGhpcy5uYW1lLCB0aGlzLndhc21OYW1lLCBwcmVmZXJlbmNlID8/ICd0cmFuc3BhcmVudCcpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGdldEV4dHJhUHJlYnVpbGRQYXJhbXMoYnVpbGRQYXJhbXM6IEV4dHJhUHJlYnVpbGRQYXJhbXNPcHRpb25zICYgeyB3YWxsZXQ6IFdhbGxldCB9KSB7XG4gICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCBzdXBlci5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKGJ1aWxkUGFyYW1zKTtcbiAgICBjb25zdCB7IHVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlIH0gPSBidWlsZFBhcmFtcztcbiAgICBpZiAodW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dHJhUGFyYW1zO1xuICAgIH1cbiAgICByZXR1cm4geyAuLi5leHRyYVBhcmFtcywgdW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2UgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRlY29kZVRyYW5zYWN0aW9uKGlucHV0OiBCdWZmZXIgfCBzdHJpbmcpOiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBzdHJpbmdUb0J1ZmZlclRyeUZvcm1hdHMoaW5wdXQsIFsnaGV4JywgJ2Jhc2U2NCddKSA6IGlucHV0O1xuICAgIGlmICghaGFzUHNidE1hZ2ljKGJ1ZmZlcikpIHtcbiAgICAgIHJldHVybiBzdXBlci5kZWNvZGVUcmFuc2FjdGlvbihpbnB1dCk7XG4gICAgfVxuICAgIHJldHVybiBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaFBzYnQuZnJvbUJ5dGVzKGJ1ZmZlciwgdG9XYXNtVXR4b0NvaW5OYW1lKHRoaXMubmFtZSkgYXMgWmNhc2hDb2luTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgdjYgKElyb253b29kKSBwcmVidWlsZHMgdG8gdGhlIElyb253b29kIHNpZ25pbmcgcGF0aCDigJQgaXRzIGBzaWduYCBvdmVycmlkZSByZXF1aXJlc1xuICAgKiB0aGUgd2FsbGV0IHJvb3Qga2V5cyB0byBkZXJpdmUgdGhlIG92ayBvbiB0aGUgdXNlcidzIGZpcnN0IHNpZ25pbmcgcm91bmQg4oCUIGFuZCBrZWVwIGV2ZXJ5XG4gICAqIG90aGVyIHByZWJ1aWxkICh2NCBhbmQgbm9uLVBTQlQpIG9uIHRoZSBnZW5lcmljIHBhdGguXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzaWduVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24gfCBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IHBhcmFtcz8udHhQcmVidWlsZDtcbiAgICBpZiAoIV8uaXNPYmplY3QodHhQcmVidWlsZCkpIHtcbiAgICAgIC8vIERlZmVyIHRvIHRoZSBiYXNlIHBhdGggZm9yIGl0cyBzdGFuZGFyZCBtaXNzaW5nL21hbGZvcm1lZC1wcmVidWlsZCB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICAgIHJldHVybiBzdXBlci5zaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG4gICAgY29uc3QgdHggPSB0aGlzLmRlY29kZVRyYW5zYWN0aW9uRnJvbVByZWJ1aWxkKHR4UHJlYnVpbGQpO1xuICAgIGlmICghKHR4IGluc3RhbmNlb2YgZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hJcm9ud29vZEJpdEdvUHNidCkpIHtcbiAgICAgIHJldHVybiBzdXBlci5zaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpZ25Jcm9ud29vZFRyYW5zYWN0aW9uKHRoaXMsIHR4LCBwYXJhbXMpO1xuICB9XG4gIHJlc29sdmVSZWNpcGllbnRzRnJvbVBzYnQoaW5wdXQ6IEJ1ZmZlciB8IHN0cmluZywgd2FsbGV0S2V5czogZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMpOiBQc2J0UmVjaXBpZW50W10ge1xuICAgIGNvbnN0IHBzYnQgPSB0aGlzLmRlY29kZVRyYW5zYWN0aW9uKGlucHV0KTtcbiAgICBpZiAoIShwc2J0IGluc3RhbmNlb2YgZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hCaXRHb1BzYnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGEgWmNhc2ggUFNCVCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZVBzYnRSZWNpcGllbnRzKHBzYnQsIHdhbGxldEtleXMsIHRoaXMuYWRkcmVzc0NvZGVjKTtcbiAgfVxufVxuIl19
@@ -3,6 +3,7 @@ import { IWallet, Triple } from '@bitgo/sdk-core';
3
3
  import { UtxoCoinName, WasmUtxoCoinName } from '../names';
4
4
  import type { Unspent } from '../unspent';
5
5
  import type { TransactionExplanationUtxolibPsbt, TransactionExplanationWasm } from './fixedScript/explainTransaction';
6
+ import type { AddressCodec } from './recipient';
6
7
  /**
7
8
  * Decompose a raw transaction into useful information, such as the total amounts,
8
9
  * change amounts, and transaction outputs.
@@ -14,5 +15,5 @@ export declare function explainTx<TNumber extends number | bigint>(tx: fixedScri
14
15
  txInfo?: {
15
16
  unspents?: Unspent<TNumber>[];
16
17
  };
17
- }, coinName: UtxoCoinName | WasmUtxoCoinName): TransactionExplanationUtxolibPsbt | TransactionExplanationWasm;
18
+ }, coinName: UtxoCoinName | WasmUtxoCoinName, addressCodec: AddressCodec): TransactionExplanationUtxolibPsbt | TransactionExplanationWasm;
18
19
  //# sourceMappingURL=explainTransaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"explainTransaction.d.ts","sourceRoot":"","sources":["../../../src/transaction/explainTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAY,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAK5D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,KAAK,EAAE,iCAAiC,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAItH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACvD,EAAE,EAAE,iBAAiB,CAAC,SAAS,GAAG,QAAQ,EAC1C,MAAM,EAAE;IACN,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC;CAC5C,EACD,QAAQ,EAAE,YAAY,GAAG,gBAAgB,GACxC,iCAAiC,GAAG,0BAA0B,CAgChE"}
1
+ {"version":3,"file":"explainTransaction.d.ts","sourceRoot":"","sources":["../../../src/transaction/explainTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAY,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAK5D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,KAAK,EAAE,iCAAiC,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAGtH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACvD,EAAE,EAAE,iBAAiB,CAAC,SAAS,GAAG,QAAQ,EAC1C,MAAM,EAAE;IACN,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC;CAC5C,EACD,QAAQ,EAAE,YAAY,GAAG,gBAAgB,EACzC,YAAY,EAAE,YAAY,GACzB,iCAAiC,GAAG,0BAA0B,CAiChE"}
@@ -10,7 +10,7 @@ import * as descriptor from './descriptor';
10
10
  * Decompose a raw transaction into useful information, such as the total amounts,
11
11
  * change amounts, and transaction outputs.
12
12
  */
13
- export function explainTx(tx, params, coinName) {
13
+ export function explainTx(tx, params, coinName, addressCodec) {
14
14
  if (params.wallet && isDescriptorWallet(params.wallet)) {
15
15
  if (!(tx instanceof WasmPsbt)) {
16
16
  throw new Error('descriptor wallets require PSBT format transactions');
@@ -32,6 +32,7 @@ export function explainTx(tx, params, coinName) {
32
32
  throw new Error('pub triple must be valid triple or RootWalletKeys');
33
33
  }
34
34
  return fixedScript.explainPsbtWasm(tx, walletXpubs, {
35
+ addressCodec,
35
36
  replayProtection: {
36
37
  publicKeys: getReplayProtectionPubkeys(coinName),
37
38
  },
@@ -45,4 +46,4 @@ export function explainTx(tx, params, coinName) {
45
46
  throw new Error('unsupported transaction type');
46
47
  }
47
48
  }
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2V4cGxhaW5UcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFFNUQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSS9ELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTVFLE9BQU8sS0FBSyxXQUFXLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sS0FBSyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBRTNDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3ZCLEVBQTBDLEVBQzFDLE1BS0MsRUFDRCxRQUF5QztJQUV6QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksa0JBQWtCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLENBQUMsRUFBRSxZQUFZLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxXQUFXLEdBQUcsMEJBQTBCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEgsT0FBTyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNELElBQUksRUFBRSxZQUFZLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBK0IsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBRSxJQUF1QixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUU7WUFDbEQsZ0JBQWdCLEVBQUU7Z0JBQ2hCLFVBQVUsRUFBRSwwQkFBMEIsQ0FBQyxRQUFRLENBQUM7YUFDakQ7WUFDRCx1QkFBdUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO1NBQ2xELENBQUMsQ0FBQztJQUNMLENBQUM7U0FBTSxJQUFJLEVBQUUsWUFBWSxRQUFRLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDbEQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaXhlZFNjcmlwdFdhbGxldCwgUHNidCBhcyBXYXNtUHNidCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgaXNUcmlwbGUsIElXYWxsZXQsIFRyaXBsZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7IGdldERlc2NyaXB0b3JNYXBGcm9tV2FsbGV0LCBpc0Rlc2NyaXB0b3JXYWxsZXQgfSBmcm9tICcuLi9kZXNjcmlwdG9yJztcbmltcG9ydCB7IHRvQmlwMzJUcmlwbGUgfSBmcm9tICcuLi9rZXljaGFpbnMnO1xuaW1wb3J0IHsgZ2V0UG9saWN5Rm9yRW52IH0gZnJvbSAnLi4vZGVzY3JpcHRvci92YWxpZGF0ZVBvbGljeSc7XG5pbXBvcnQgeyBVdHhvQ29pbk5hbWUsIFdhc21VdHhvQ29pbk5hbWUgfSBmcm9tICcuLi9uYW1lcyc7XG5pbXBvcnQgdHlwZSB7IFVuc3BlbnQgfSBmcm9tICcuLi91bnNwZW50JztcblxuaW1wb3J0IHsgZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMgfSBmcm9tICcuL2ZpeGVkU2NyaXB0L3JlcGxheVByb3RlY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uVXR4b2xpYlBzYnQsIFRyYW5zYWN0aW9uRXhwbGFuYXRpb25XYXNtIH0gZnJvbSAnLi9maXhlZFNjcmlwdC9leHBsYWluVHJhbnNhY3Rpb24nO1xuaW1wb3J0ICogYXMgZml4ZWRTY3JpcHQgZnJvbSAnLi9maXhlZFNjcmlwdCc7XG5pbXBvcnQgKiBhcyBkZXNjcmlwdG9yIGZyb20gJy4vZGVzY3JpcHRvcic7XG5cbi8qKlxuICogRGVjb21wb3NlIGEgcmF3IHRyYW5zYWN0aW9uIGludG8gdXNlZnVsIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB0b3RhbCBhbW91bnRzLFxuICogY2hhbmdlIGFtb3VudHMsIGFuZCB0cmFuc2FjdGlvbiBvdXRwdXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwbGFpblR4PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eDogZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0IHwgV2FzbVBzYnQsXG4gIHBhcmFtczoge1xuICAgIHdhbGxldD86IElXYWxsZXQ7XG4gICAgcHVicz86IHN0cmluZ1tdO1xuICAgIGN1c3RvbUNoYW5nZVhwdWJzPzogVHJpcGxlPHN0cmluZz47XG4gICAgdHhJbmZvPzogeyB1bnNwZW50cz86IFVuc3BlbnQ8VE51bWJlcj5bXSB9O1xuICB9LFxuICBjb2luTmFtZTogVXR4b0NvaW5OYW1lIHwgV2FzbVV0eG9Db2luTmFtZVxuKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvblV0eG9saWJQc2J0IHwgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbldhc20ge1xuICBpZiAocGFyYW1zLndhbGxldCAmJiBpc0Rlc2NyaXB0b3JXYWxsZXQocGFyYW1zLndhbGxldCkpIHtcbiAgICBpZiAoISh0eCBpbnN0YW5jZW9mIFdhc21Qc2J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXNjcmlwdG9yIHdhbGxldHMgcmVxdWlyZSBQU0JUIGZvcm1hdCB0cmFuc2FjdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMucHVicyB8fCAhaXNUcmlwbGUocGFyYW1zLnB1YnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1YiB0cmlwbGUgaXMgcmVxdWlyZWQgZm9yIGRlc2NyaXB0b3Igd2FsbGV0cycpO1xuICAgIH1cbiAgICBjb25zdCB3YWxsZXRLZXlzID0gdG9CaXAzMlRyaXBsZShwYXJhbXMucHVicyk7XG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBnZXREZXNjcmlwdG9yTWFwRnJvbVdhbGxldChwYXJhbXMud2FsbGV0LCB3YWxsZXRLZXlzLCBnZXRQb2xpY3lGb3JFbnYocGFyYW1zLndhbGxldC5iaXRnby5lbnYpKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvci5leHBsYWluUHNidCh0eCwgZGVzY3JpcHRvcnMsIGNvaW5OYW1lKTtcbiAgfVxuICBpZiAodHggaW5zdGFuY2VvZiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQpIHtcbiAgICBjb25zdCBwdWJzID0gcGFyYW1zLnB1YnM7XG4gICAgaWYgKCFwdWJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1YiB0cmlwbGUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgY29uc3Qgd2FsbGV0WHB1YnM6IFRyaXBsZTxzdHJpbmc+IHwgdW5kZWZpbmVkID0gaXNUcmlwbGUocHVicykgPyAocHVicyBhcyBUcmlwbGU8c3RyaW5nPikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF3YWxsZXRYcHVicykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWIgdHJpcGxlIG11c3QgYmUgdmFsaWQgdHJpcGxlIG9yIFJvb3RXYWxsZXRLZXlzJyk7XG4gICAgfVxuICAgIHJldHVybiBmaXhlZFNjcmlwdC5leHBsYWluUHNidFdhc20odHgsIHdhbGxldFhwdWJzLCB7XG4gICAgICByZXBsYXlQcm90ZWN0aW9uOiB7XG4gICAgICAgIHB1YmxpY0tleXM6IGdldFJlcGxheVByb3RlY3Rpb25QdWJrZXlzKGNvaW5OYW1lKSxcbiAgICAgIH0sXG4gICAgICBjdXN0b21DaGFuZ2VXYWxsZXRYcHViczogcGFyYW1zLmN1c3RvbUNoYW5nZVhwdWJzLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR4IGluc3RhbmNlb2YgV2FzbVBzYnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlc2NyaXB0b3IgUHNidCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgZGVzY3JpcHRvciB3YWxsZXRzJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gIH1cbn1cbiJdfQ==
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2V4cGxhaW5UcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFFNUQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSS9ELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTVFLE9BQU8sS0FBSyxXQUFXLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sS0FBSyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBRTNDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3ZCLEVBQTBDLEVBQzFDLE1BS0MsRUFDRCxRQUF5QyxFQUN6QyxZQUEwQjtJQUUxQixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksa0JBQWtCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLENBQUMsRUFBRSxZQUFZLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxXQUFXLEdBQUcsMEJBQTBCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEgsT0FBTyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNELElBQUksRUFBRSxZQUFZLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBK0IsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBRSxJQUF1QixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUU7WUFDbEQsWUFBWTtZQUNaLGdCQUFnQixFQUFFO2dCQUNoQixVQUFVLEVBQUUsMEJBQTBCLENBQUMsUUFBUSxDQUFDO2FBQ2pEO1lBQ0QsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtTQUNsRCxDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sSUFBSSxFQUFFLFlBQVksUUFBUSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO0lBQzlFLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZml4ZWRTY3JpcHRXYWxsZXQsIFBzYnQgYXMgV2FzbVBzYnQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IGlzVHJpcGxlLCBJV2FsbGV0LCBUcmlwbGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBnZXREZXNjcmlwdG9yTWFwRnJvbVdhbGxldCwgaXNEZXNjcmlwdG9yV2FsbGV0IH0gZnJvbSAnLi4vZGVzY3JpcHRvcic7XG5pbXBvcnQgeyB0b0JpcDMyVHJpcGxlIH0gZnJvbSAnLi4va2V5Y2hhaW5zJztcbmltcG9ydCB7IGdldFBvbGljeUZvckVudiB9IGZyb20gJy4uL2Rlc2NyaXB0b3IvdmFsaWRhdGVQb2xpY3knO1xuaW1wb3J0IHsgVXR4b0NvaW5OYW1lLCBXYXNtVXR4b0NvaW5OYW1lIH0gZnJvbSAnLi4vbmFtZXMnO1xuaW1wb3J0IHR5cGUgeyBVbnNwZW50IH0gZnJvbSAnLi4vdW5zcGVudCc7XG5cbmltcG9ydCB7IGdldFJlcGxheVByb3RlY3Rpb25QdWJrZXlzIH0gZnJvbSAnLi9maXhlZFNjcmlwdC9yZXBsYXlQcm90ZWN0aW9uJztcbmltcG9ydCB0eXBlIHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvblV0eG9saWJQc2J0LCBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uV2FzbSB9IGZyb20gJy4vZml4ZWRTY3JpcHQvZXhwbGFpblRyYW5zYWN0aW9uJztcbmltcG9ydCAqIGFzIGZpeGVkU2NyaXB0IGZyb20gJy4vZml4ZWRTY3JpcHQnO1xuaW1wb3J0ICogYXMgZGVzY3JpcHRvciBmcm9tICcuL2Rlc2NyaXB0b3InO1xuaW1wb3J0IHR5cGUgeyBBZGRyZXNzQ29kZWMgfSBmcm9tICcuL3JlY2lwaWVudCc7XG4vKipcbiAqIERlY29tcG9zZSBhIHJhdyB0cmFuc2FjdGlvbiBpbnRvIHVzZWZ1bCBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdG90YWwgYW1vdW50cyxcbiAqIGNoYW5nZSBhbW91bnRzLCBhbmQgdHJhbnNhY3Rpb24gb3V0cHV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGxhaW5UeDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdHg6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB8IFdhc21Qc2J0LFxuICBwYXJhbXM6IHtcbiAgICB3YWxsZXQ/OiBJV2FsbGV0O1xuICAgIHB1YnM/OiBzdHJpbmdbXTtcbiAgICBjdXN0b21DaGFuZ2VYcHVicz86IFRyaXBsZTxzdHJpbmc+O1xuICAgIHR4SW5mbz86IHsgdW5zcGVudHM/OiBVbnNwZW50PFROdW1iZXI+W10gfTtcbiAgfSxcbiAgY29pbk5hbWU6IFV0eG9Db2luTmFtZSB8IFdhc21VdHhvQ29pbk5hbWUsXG4gIGFkZHJlc3NDb2RlYzogQWRkcmVzc0NvZGVjXG4pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uVXR4b2xpYlBzYnQgfCBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uV2FzbSB7XG4gIGlmIChwYXJhbXMud2FsbGV0ICYmIGlzRGVzY3JpcHRvcldhbGxldChwYXJhbXMud2FsbGV0KSkge1xuICAgIGlmICghKHR4IGluc3RhbmNlb2YgV2FzbVBzYnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlc2NyaXB0b3Igd2FsbGV0cyByZXF1aXJlIFBTQlQgZm9ybWF0IHRyYW5zYWN0aW9ucycpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5wdWJzIHx8ICFpc1RyaXBsZShwYXJhbXMucHVicykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHViIHRyaXBsZSBpcyByZXF1aXJlZCBmb3IgZGVzY3JpcHRvciB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHdhbGxldEtleXMgPSB0b0JpcDMyVHJpcGxlKHBhcmFtcy5wdWJzKTtcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IGdldERlc2NyaXB0b3JNYXBGcm9tV2FsbGV0KHBhcmFtcy53YWxsZXQsIHdhbGxldEtleXMsIGdldFBvbGljeUZvckVudihwYXJhbXMud2FsbGV0LmJpdGdvLmVudikpO1xuICAgIHJldHVybiBkZXNjcmlwdG9yLmV4cGxhaW5Qc2J0KHR4LCBkZXNjcmlwdG9ycywgY29pbk5hbWUpO1xuICB9XG4gIGlmICh0eCBpbnN0YW5jZW9mIGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCkge1xuICAgIGNvbnN0IHB1YnMgPSBwYXJhbXMucHVicztcbiAgICBpZiAoIXB1YnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHViIHRyaXBsZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBjb25zdCB3YWxsZXRYcHViczogVHJpcGxlPHN0cmluZz4gfCB1bmRlZmluZWQgPSBpc1RyaXBsZShwdWJzKSA/IChwdWJzIGFzIFRyaXBsZTxzdHJpbmc+KSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXdhbGxldFhwdWJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1YiB0cmlwbGUgbXVzdCBiZSB2YWxpZCB0cmlwbGUgb3IgUm9vdFdhbGxldEtleXMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpeGVkU2NyaXB0LmV4cGxhaW5Qc2J0V2FzbSh0eCwgd2FsbGV0WHB1YnMsIHtcbiAgICAgIGFkZHJlc3NDb2RlYyxcbiAgICAgIHJlcGxheVByb3RlY3Rpb246IHtcbiAgICAgICAgcHVibGljS2V5czogZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMoY29pbk5hbWUpLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbUNoYW5nZVdhbGxldFhwdWJzOiBwYXJhbXMuY3VzdG9tQ2hhbmdlWHB1YnMsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHggaW5zdGFuY2VvZiBXYXNtUHNidCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZGVzY3JpcHRvciBQc2J0IGlzIG9ubHkgc3VwcG9ydGVkIGZvciBkZXNjcmlwdG9yIHdhbGxldHMnKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgfVxufVxuIl19