@bitgo-beta/sdk-coin-flrp 1.0.0-alpha.5 → 1.0.0-alpha.50

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 (119) hide show
  1. package/dist/src/flrp.d.ts +9 -16
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +49 -75
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +51 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +188 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +327 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +242 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +245 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -76
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +169 -215
  25. package/dist/src/lib/iface.d.ts +38 -61
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +13 -14
  28. package/dist/src/lib/index.d.ts +5 -0
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +12 -2
  31. package/dist/src/lib/keyPair.d.ts +5 -5
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +17 -9
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +43 -0
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +132 -0
  37. package/dist/src/lib/transaction.d.ts +25 -65
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +336 -199
  40. package/dist/src/lib/transactionBuilder.d.ts +107 -0
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  42. package/dist/src/lib/transactionBuilder.js +210 -0
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +50 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +129 -72
  46. package/dist/src/lib/utils.d.ts +75 -147
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +237 -324
  49. package/dist/test/resources/account.d.ts +51 -0
  50. package/dist/test/resources/account.d.ts.map +1 -0
  51. package/dist/test/resources/account.js +54 -0
  52. package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
  53. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  54. package/dist/test/resources/transactionData/exportInC.js +34 -0
  55. package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
  56. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
  57. package/dist/test/resources/transactionData/exportInP.js +140 -0
  58. package/dist/test/resources/transactionData/importInC.d.ts +27 -0
  59. package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInC.js +44 -0
  61. package/dist/test/resources/transactionData/importInP.d.ts +35 -0
  62. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  63. package/dist/test/resources/transactionData/importInP.js +58 -0
  64. package/dist/test/unit/flrp.js +449 -68
  65. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
  66. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
  67. package/dist/test/unit/lib/exportInCTxBuilder.js +166 -0
  68. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
  69. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
  70. package/dist/test/unit/lib/exportInPTxBuilder.js +157 -0
  71. package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
  72. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
  73. package/dist/test/unit/lib/importInCTxBuilder.js +47 -0
  74. package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
  75. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
  76. package/dist/test/unit/lib/importInPTxBuilder.js +107 -0
  77. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  78. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  79. package/dist/test/unit/lib/keyPair.js +158 -0
  80. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  81. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  82. package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
  83. package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
  84. package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
  85. package/dist/test/unit/lib/transactionBuilderFactory.js +60 -0
  86. package/dist/test/unit/lib/utils.js +507 -207
  87. package/dist/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +18 -10
  89. package/.eslintignore +0 -5
  90. package/.eslintrc.json +0 -7
  91. package/.mocharc.yml +0 -8
  92. package/CHANGELOG.md +0 -0
  93. package/dist/src/iface.d.ts +0 -25
  94. package/dist/src/iface.d.ts.map +0 -1
  95. package/dist/src/iface.js +0 -3
  96. package/dist/src/lib/constants.d.ts +0 -11
  97. package/dist/src/lib/constants.d.ts.map +0 -1
  98. package/dist/src/lib/constants.js +0 -17
  99. package/dist/src/lib/errors.d.ts +0 -8
  100. package/dist/src/lib/errors.d.ts.map +0 -1
  101. package/dist/src/lib/errors.js +0 -19
  102. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  103. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  104. package/dist/src/lib/exportInCTxBuilder.js +0 -170
  105. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  106. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  107. package/dist/src/lib/exportInPTxBuilder.js +0 -56
  108. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  109. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  110. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  111. package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
  112. package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
  113. package/dist/test/unit/lib/exportTxBuilder.js +0 -45
  114. package/dist/test/unit/lib/transaction.d.ts +0 -2
  115. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  116. package/dist/test/unit/lib/transaction.js +0 -460
  117. package/dist/test/unit/smoke.d.ts +0 -2
  118. package/dist/test/unit/smoke.d.ts.map +0 -1
  119. package/dist/test/unit/smoke.js +0 -23
@@ -1 +1 @@
1
- {"version":3,"file":"atomicTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/atomicTransactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAa,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAKjE;;;;GAIG;AACH,8BAAsB,wBAAwB;IAC5C,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAErD,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/C,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,CAAM;IAExC,SAAS,CAAC,WAAW,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,GAAG,EAAE,MAAM,EAAE,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACvD,cAAc,EAAE,OAAO,CAAC;QACxB,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,cAAc,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;KACvC,CAcC;gBAEU,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI5C,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAE1D,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMpC;;;OAGG;IACH,SAAS,CAAC,mBAAmB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI;IAY9D;;;;;;;;;OASG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;QAC1C,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;KAC3B;IAmED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAKpC;;;;;;;OAOG;IACH,SAAS,CAAC,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU;IAmDxF;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI/B;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAOpC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAuCvC;;;OAGG;IACH,kBAAkB,IAAI,sBAAsB;CAe7C"}
1
+ {"version":3,"file":"atomicTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/atomicTransactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAwB,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAW5F,8BAAsB,wBAAyB,SAAQ,kBAAkB;IACvE,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;IACnC,SAAS,CAAC,aAAa,UAAS;gBAEpB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM7C;;;;;;;;;OASG;IACH,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;QAC3C,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAC7B,WAAW,EAAE,UAAU,EAAE,CAAC;KAC3B;IAqJD,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAY3D;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,qBAAqB,IAAI,IAAI;IAEhD,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAE1D;;;;;OAKG;IACH,SAAS,KAAK,QAAQ,IAAI,MAAM,CAE/B;IAED;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAO/C;;;;OAIG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAKrC"}
@@ -1,252 +1,206 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.AtomicTransactionBuilder = void 0;
4
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
7
+ const transactionBuilder_1 = require("./transactionBuilder");
8
+ const transaction_1 = require("./transaction");
5
9
  const flarejs_1 = require("@flarenetwork/flarejs");
6
- // Constants for signature handling
7
- const SECP256K1_SIGNATURE_LENGTH = 65;
8
- /**
9
- * Flare P-chain atomic transaction builder with FlareJS credential support.
10
- * This provides the foundation for building Flare P-chain transactions with proper
11
- * credential handling using FlareJS Credential and Signature classes.
12
- */
13
- class AtomicTransactionBuilder {
14
- constructor(coinConfig) {
15
- this._utxos = [];
16
- this.transaction = {
17
- _network: {},
18
- _networkID: 0,
19
- _blockchainID: Buffer.alloc(0),
20
- _assetId: Buffer.alloc(0),
21
- _fromAddresses: [],
22
- _to: [],
23
- _locktime: 0n,
24
- _threshold: 1,
25
- _fee: { fee: '0' },
26
- hasCredentials: false,
27
- setTransaction: function (_tx) {
28
- this._tx = _tx;
29
- },
30
- };
31
- this._coinConfig = coinConfig;
32
- }
33
- validateAmount(amount) {
34
- if (amount <= 0n) {
35
- throw new sdk_core_1.BuildTransactionError('Amount must be positive');
36
- }
10
+ const utils_1 = __importDefault(require("./utils"));
11
+ class AtomicTransactionBuilder extends transactionBuilder_1.TransactionBuilder {
12
+ constructor(_coinConfig) {
13
+ super(_coinConfig);
14
+ this.recoverSigner = false;
15
+ this.transaction = new transaction_1.Transaction(_coinConfig);
16
+ this.transaction._fee.fee = this.fixedFee;
37
17
  }
38
18
  /**
39
- * Validates that credentials array is properly formed
40
- * @param credentials - Array of credentials to validate
19
+ * Create inputs and outputs from UTXOs
20
+ * @param {bigint} amount Amount to transfer
21
+ * @return {
22
+ * inputs: TransferableInput[];
23
+ * outputs: TransferableInput[];
24
+ * credentials: Credential[];
25
+ * }
26
+ * @protected
41
27
  */
42
- validateCredentials(credentials) {
43
- if (!Array.isArray(credentials)) {
44
- throw new sdk_core_1.BuildTransactionError('Credentials must be an array');
45
- }
46
- credentials.forEach((credential, index) => {
47
- if (!(credential instanceof flarejs_1.Credential)) {
48
- throw new sdk_core_1.BuildTransactionError(`Invalid credential at index ${index}`);
28
+ createInputOutput(amount) {
29
+ const sender = this.transaction._fromAddresses.slice();
30
+ if (this.recoverSigner) {
31
+ // switch first and last signer
32
+ const tmp = sender.pop();
33
+ sender.push(sender[0]);
34
+ if (tmp) {
35
+ sender[0] = tmp;
49
36
  }
50
- });
51
- }
52
- /**
53
- * Creates inputs, outputs, and credentials for Flare P-chain atomic transactions.
54
- * Based on AVAX P-chain implementation adapted for FlareJS.
55
- *
56
- * Note: This is a simplified implementation that creates the core structure.
57
- * The FlareJS type system integration will be refined in future iterations.
58
- *
59
- * @param total - Total amount needed including fees
60
- * @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
61
- */
62
- createInputOutput(total) {
63
- if (!this._utxos || this._utxos.length === 0) {
64
- throw new sdk_core_1.BuildTransactionError('UTXOs are required for creating inputs and outputs');
65
37
  }
38
+ let totalAmount = BigInt(0);
66
39
  const inputs = [];
67
40
  const outputs = [];
68
41
  const credentials = [];
69
- let inputSum = 0n;
70
- const addressIndices = {};
71
- let nextAddressIndex = 0;
72
- // Sort UTXOs by amount in descending order for optimal coin selection
73
- const sortedUtxos = [...this._utxos].sort((a, b) => {
74
- const amountA = BigInt(a.amount);
75
- const amountB = BigInt(b.amount);
76
- if (amountA > amountB)
77
- return -1;
78
- if (amountA < amountB)
79
- return 1;
80
- return 0;
81
- });
82
- // Process UTXOs to create inputs and credentials
83
- for (const utxo of sortedUtxos) {
42
+ this.transaction._utxos.forEach((utxo) => {
84
43
  const utxoAmount = BigInt(utxo.amount);
85
- if (inputSum >= total) {
86
- break; // We have enough inputs
44
+ totalAmount += utxoAmount;
45
+ // Create input
46
+ const input = {
47
+ _type: flarejs_1.TypeSymbols.Input,
48
+ amount: () => utxoAmount,
49
+ sigIndices: sender.map((_, i) => i),
50
+ toBytes: () => new Uint8Array(),
51
+ };
52
+ // Create asset with Amounter interface
53
+ const assetId = {
54
+ _type: flarejs_1.TypeSymbols.BaseTx,
55
+ amount: () => utxoAmount,
56
+ toBytes: () => {
57
+ const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
58
+ return bytes;
59
+ },
60
+ };
61
+ // Create TransferableInput
62
+ const transferableInput = new flarejs_1.TransferableInput({
63
+ _type: flarejs_1.TypeSymbols.UTXOID,
64
+ txID: new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.txid, 'hex'))),
65
+ outputIdx: new flarejs_1.Int(Number(utxo.outputidx)),
66
+ ID: () => utxo.txid,
67
+ toBytes: () => {
68
+ const txIdBytes = new Uint8Array(Buffer.from(utxo.txid, 'hex'));
69
+ const outputIdxBytes = new Uint8Array(4);
70
+ new DataView(outputIdxBytes.buffer).setInt32(0, Number(utxo.outputidx), true);
71
+ return Buffer.concat([txIdBytes, outputIdxBytes]);
72
+ },
73
+ }, new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.outputidx.toString()))), assetId);
74
+ // Set input properties
75
+ Object.assign(transferableInput, { input });
76
+ inputs.push(transferableInput);
77
+ // Create credential with empty signatures for slot identification
78
+ // Match avaxp behavior: dynamic ordering based on addressesIndex from UTXO
79
+ const hasAddresses = sender && sender.length >= this.transaction._threshold;
80
+ if (!hasAddresses) {
81
+ // If addresses not available, use all zeros
82
+ const emptySignatures = sender.map(() => utils_1.default.createNewSig(''));
83
+ credentials.push(new flarejs_1.Credential(emptySignatures));
87
84
  }
88
- // TODO: Create proper FlareJS TransferableInput once type issues are resolved
89
- // For now, we create a placeholder that demonstrates the structure
90
- // The actual FlareJS integration will need proper UTXOID handling
91
- // Track input sum
92
- inputSum += utxoAmount;
93
- // Track address indices for signature ordering (mimics AVAX pattern)
94
- const addressIndexArray = [];
95
- for (const address of utxo.addresses) {
96
- if (!(address in addressIndices)) {
97
- addressIndices[address] = nextAddressIndex++;
85
+ else {
86
+ // Compute addressesIndex: position of each _fromAddresses in UTXO's address list
87
+ const utxoAddresses = utxo.addresses.map((a) => utils_1.default.parseAddress(a));
88
+ const addressesIndex = sender.map((a) => utxoAddresses.findIndex((u) => Buffer.compare(Buffer.from(u), Buffer.from(a)) === 0));
89
+ // either user (0) or recovery (2)
90
+ const firstIndex = this.recoverSigner ? 2 : 0;
91
+ const bitgoIndex = 1;
92
+ // Dynamic ordering based on addressesIndex
93
+ let emptySignatures;
94
+ if (addressesIndex[bitgoIndex] < addressesIndex[firstIndex]) {
95
+ // Bitgo comes first in signature order: [zeros, userAddress]
96
+ emptySignatures = [
97
+ utils_1.default.createNewSig(''),
98
+ utils_1.default.createEmptySigWithAddress(Buffer.from(sender[firstIndex]).toString('hex')),
99
+ ];
100
+ }
101
+ else {
102
+ // User comes first in signature order: [userAddress, zeros]
103
+ emptySignatures = [
104
+ utils_1.default.createEmptySigWithAddress(Buffer.from(sender[firstIndex]).toString('hex')),
105
+ utils_1.default.createNewSig(''),
106
+ ];
98
107
  }
99
- addressIndexArray.push(addressIndices[address]);
108
+ credentials.push(new flarejs_1.Credential(emptySignatures));
100
109
  }
101
- // Store address indices on the UTXO for credential creation
102
- utxo.addressesIndex = addressIndexArray;
103
- // Create credential with placeholder signatures
104
- // In a real implementation, these would be actual signatures
105
- const signatures = Array.from({ length: utxo.threshold }, () => '');
106
- const credential = this.createFlareCredential(0, signatures);
107
- credentials.push(credential);
110
+ });
111
+ // Create output if there is change
112
+ if (totalAmount > amount) {
113
+ const changeAmount = totalAmount - amount;
114
+ const output = {
115
+ _type: flarejs_1.TypeSymbols.BaseTx,
116
+ amount: () => changeAmount,
117
+ addresses: sender,
118
+ locktime: this.transaction._locktime,
119
+ threshold: this.transaction._threshold,
120
+ toBytes: () => new Uint8Array(),
121
+ };
122
+ // Create asset with Amounter interface
123
+ const assetId = {
124
+ _type: flarejs_1.TypeSymbols.BaseTx,
125
+ amount: () => changeAmount,
126
+ toBytes: () => {
127
+ const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
128
+ return bytes;
129
+ },
130
+ };
131
+ // Create TransferableOutput
132
+ const transferableOutput = new flarejs_1.TransferableInput({
133
+ _type: flarejs_1.TypeSymbols.UTXOID,
134
+ txID: new flarejs_1.Id(new Uint8Array(32)),
135
+ outputIdx: new flarejs_1.Int(0),
136
+ ID: () => '',
137
+ toBytes: () => {
138
+ const txIdBytes = new Uint8Array(32);
139
+ const outputIdxBytes = new Uint8Array(4);
140
+ return Buffer.concat([txIdBytes, outputIdxBytes]);
141
+ },
142
+ }, new flarejs_1.Id(new Uint8Array([0])), assetId);
143
+ // Set output properties
144
+ Object.assign(transferableOutput, { output });
145
+ outputs.push(transferableOutput);
108
146
  }
109
- // Verify we have enough inputs
110
- if (inputSum < total) {
111
- throw new sdk_core_1.BuildTransactionError(`Insufficient funds: need ${total}, have ${inputSum}`);
147
+ return {
148
+ inputs,
149
+ outputs,
150
+ credentials,
151
+ };
152
+ }
153
+ /** @inheritdoc */
154
+ async buildImplementation() {
155
+ this.buildFlareTransaction();
156
+ this.setTransactionType(this.transactionType);
157
+ if (this.hasSigner()) {
158
+ // Sign sequentially to ensure proper order
159
+ for (const keyPair of this._signer) {
160
+ await this.transaction.sign(keyPair);
161
+ }
112
162
  }
113
- // TODO: Create change output if we have excess input
114
- // The TransferableOutput creation will be implemented once FlareJS types are resolved
115
- return { inputs, outputs, credentials };
163
+ return this.transaction;
116
164
  }
117
165
  /**
118
- * Set UTXOs for the transaction. This is required for creating inputs and outputs.
166
+ * Fee is fix for AVM atomic tx.
119
167
  *
120
- * @param utxos - Array of decoded UTXO objects
121
- * @returns this builder instance for chaining
168
+ * @returns network.txFee
169
+ * @protected
122
170
  */
123
- utxos(utxos) {
124
- this._utxos = utxos;
125
- return this;
171
+ get fixedFee() {
172
+ return this.transaction._network.txFee;
126
173
  }
127
174
  /**
128
- * Flare equivalent of Avalanche's SelectCredentialClass
129
- * Creates a credential with the provided signatures
175
+ * Set the transaction type
130
176
  *
131
- * @param credentialId - The credential ID (not used in FlareJS but kept for compatibility)
132
- * @param signatures - Array of signature hex strings or empty strings for placeholders
133
- * @returns Credential instance
177
+ * @param {TransactionType} transactionType The transaction type to be set
134
178
  */
135
- createFlareCredential(_credentialId, signatures) {
136
- if (!Array.isArray(signatures)) {
137
- throw new sdk_core_1.BuildTransactionError('Signatures must be an array');
138
- }
139
- if (signatures.length === 0) {
140
- throw new sdk_core_1.BuildTransactionError('Signatures array cannot be empty');
141
- }
142
- const sigs = signatures.map((sig, index) => {
143
- // Handle empty/placeholder signatures
144
- if (!sig || sig.length === 0) {
145
- return new flarejs_1.Signature(new Uint8Array(SECP256K1_SIGNATURE_LENGTH));
146
- }
147
- // Validate hex string format
148
- const cleanSig = sig.startsWith('0x') ? sig.slice(2) : sig;
149
- if (!/^[0-9a-fA-F]*$/.test(cleanSig)) {
150
- throw new sdk_core_1.BuildTransactionError(`Invalid hex signature at index ${index}: contains non-hex characters`);
151
- }
152
- // Convert to buffer and validate length
153
- const sigBuffer = Buffer.from(cleanSig, 'hex');
154
- if (sigBuffer.length > SECP256K1_SIGNATURE_LENGTH) {
155
- throw new sdk_core_1.BuildTransactionError(`Signature too long at index ${index}: ${sigBuffer.length} bytes (max ${SECP256K1_SIGNATURE_LENGTH})`);
156
- }
157
- // Create fixed-length buffer and copy signature data
158
- const fixedLengthBuffer = Buffer.alloc(SECP256K1_SIGNATURE_LENGTH);
159
- sigBuffer.copy(fixedLengthBuffer);
160
- try {
161
- return new flarejs_1.Signature(new Uint8Array(fixedLengthBuffer));
162
- }
163
- catch (error) {
164
- throw new sdk_core_1.BuildTransactionError(`Failed to create signature at index ${index}: ${error instanceof Error ? error.message : 'unknown error'}`);
165
- }
166
- });
167
- try {
168
- return new flarejs_1.Credential(sigs);
169
- }
170
- catch (error) {
171
- throw new sdk_core_1.BuildTransactionError(`Failed to create credential: ${error instanceof Error ? error.message : 'unknown error'}`);
172
- }
179
+ setTransactionType(transactionType) {
180
+ this.transaction._type = transactionType;
173
181
  }
174
182
  /**
175
- * Base initBuilder used by concrete builders. For now just returns this so fluent API works.
183
+ * The internal chain is the one set for the coin in coinConfig.network. The external chain is the other chain involved.
184
+ * The external chain id is the source on import and the destination on export.
185
+ *
186
+ * @param {string} chainId - id of the external chain
176
187
  */
177
- initBuilder(_tx) {
188
+ externalChainId(chainId) {
189
+ const newTargetChainId = typeof chainId === 'string' ? utils_1.default.cb58Decode(chainId) : Buffer.from(chainId);
190
+ this.validateChainId(newTargetChainId);
191
+ this._externalChainId = newTargetChainId;
178
192
  return this;
179
193
  }
180
194
  /**
181
- * Sign transaction with private key (placeholder implementation)
182
- * TODO: Implement proper FlareJS signing
195
+ * Set the transaction fee
196
+ *
197
+ * @param {string | bigint} feeValue - the fee value
183
198
  */
184
- sign(_params) {
185
- // TODO: Implement FlareJS signing
186
- // For now, just mark as having credentials
187
- this.transaction.hasCredentials = true;
199
+ fee(feeValue) {
200
+ const fee = typeof feeValue === 'string' ? feeValue : feeValue.toString();
201
+ this.transaction._fee.fee = fee;
188
202
  return this;
189
203
  }
190
- /**
191
- * Build the transaction (placeholder implementation)
192
- * TODO: Implement proper FlareJS transaction building
193
- */
194
- async build() {
195
- // TODO: Create actual FlareJS UnsignedTx
196
- // For now, return a mock transaction that satisfies the interface
197
- const mockTransaction = {
198
- _id: 'mock-transaction-id',
199
- _inputs: [],
200
- _outputs: [],
201
- _type: this.transactionType,
202
- signature: [],
203
- toBroadcastFormat: () => 'mock-tx-hex',
204
- toJson: () => ({}),
205
- explainTransaction: () => ({
206
- type: this.transactionType,
207
- inputs: [],
208
- outputs: [],
209
- outputAmount: '0',
210
- rewardAddresses: [],
211
- id: 'mock-transaction-id',
212
- changeOutputs: [],
213
- changeAmount: '0',
214
- fee: { fee: '0' },
215
- }),
216
- isTransactionForCChain: false,
217
- fromAddresses: [],
218
- validationErrors: [],
219
- loadInputsAndOutputs: () => {
220
- /* placeholder */
221
- },
222
- inputs: () => [],
223
- outputs: () => [],
224
- fee: () => ({ fee: '0' }),
225
- feeRate: () => 0,
226
- id: () => 'mock-transaction-id',
227
- type: this.transactionType,
228
- };
229
- return mockTransaction;
230
- }
231
- /**
232
- * Parse and explain a transaction from hex (placeholder implementation)
233
- * TODO: Implement proper FlareJS transaction parsing
234
- */
235
- explainTransaction() {
236
- // TODO: Parse actual FlareJS transaction
237
- // For now, return basic explanation
238
- return {
239
- type: this.transactionType,
240
- inputs: [],
241
- outputs: [],
242
- outputAmount: '0',
243
- rewardAddresses: [],
244
- id: 'mock-transaction-id',
245
- changeOutputs: [],
246
- changeAmount: '0',
247
- fee: { fee: '0' },
248
- };
249
- }
250
204
  }
251
205
  exports.AtomicTransactionBuilder = AtomicTransactionBuilder;
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQStGO0FBQy9GLG1EQUFxRztBQUdyRyxtQ0FBbUM7QUFDbkMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILE1BQXNCLHdCQUF3QjtJQW9DNUMsWUFBWSxVQUFnQztRQS9CbEMsV0FBTSxHQUFxQixFQUFFLENBQUM7UUFFOUIsZ0JBQVcsR0FhakI7WUFDRixRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxDQUFDO1lBQ2IsYUFBYSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlCLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6QixjQUFjLEVBQUUsRUFBRTtZQUNsQixHQUFHLEVBQUUsRUFBRTtZQUNQLFNBQVMsRUFBRSxFQUFFO1lBQ2IsVUFBVSxFQUFFLENBQUM7WUFDYixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1lBQ2xCLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLGNBQWMsRUFBRSxVQUFVLEdBQVk7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ2pCLENBQUM7U0FDRixDQUFDO1FBR0EsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7SUFDaEMsQ0FBQztJQUlELGNBQWMsQ0FBQyxNQUFjO1FBQzNCLElBQUksTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sbUJBQW1CLENBQUMsV0FBeUI7UUFDckQsSUFBSSxDQUFDLEtBQUss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RyxFQUFFO2FBQ2xCLENBQUM7WUFDRixzQkFBc0IsRUFBRSxLQUFLO1lBQzdCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO2dCQUN6QixpQkFBaUI7WUFDbkIsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1lBQ2pCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2hCLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUI7WUFDL0IsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQ0csQ0FBQztRQUVoQyxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2hCLHlDQUF5QztRQUN6QyxvQ0FBb0M7UUFDcEMsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZTtZQUMxQixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxFQUFFO1lBQ1gsWUFBWSxFQUFFLEdBQUc7WUFDakIsZUFBZSxFQUFFLEVBQUU7WUFDbkIsRUFBRSxFQUFFLHFCQUFxQjtZQUN6QixhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsR0FBRztZQUNqQixHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1NBQ2xCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF2U0QsNERBdVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUsIEJhc2VUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IENyZWRlbnRpYWwsIFNpZ25hdHVyZSwgVHJhbnNmZXJhYmxlSW5wdXQsIFRyYW5zZmVyYWJsZU91dHB1dCB9IGZyb20gJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4vaWZhY2UnO1xuXG4vLyBDb25zdGFudHMgZm9yIHNpZ25hdHVyZSBoYW5kbGluZ1xuY29uc3QgU0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEggPSA2NTtcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbiBidWlsZGVyIHdpdGggRmxhcmVKUyBjcmVkZW50aWFsIHN1cHBvcnQuXG4gKiBUaGlzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9ucyB3aXRoIHByb3BlclxuICogY3JlZGVudGlhbCBoYW5kbGluZyB1c2luZyBGbGFyZUpTIENyZWRlbnRpYWwgYW5kIFNpZ25hdHVyZSBjbGFzc2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPjtcbiAgLy8gRXh0ZXJuYWwgY2hhaW4gaWQgKGRlc3RpbmF0aW9uKSBmb3IgZXhwb3J0IHRyYW5zYWN0aW9uc1xuICBwcm90ZWN0ZWQgX2V4dGVybmFsQ2hhaW5JZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IHtcbiAgICBfbmV0d29yazogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgX25ldHdvcmtJRDogbnVtYmVyO1xuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlcjtcbiAgICBfYXNzZXRJZDogQnVmZmVyO1xuICAgIF9mcm9tQWRkcmVzc2VzOiBzdHJpbmdbXTtcbiAgICBfdG86IHN0cmluZ1tdO1xuICAgIF9sb2NrdGltZTogYmlnaW50O1xuICAgIF90aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBfZmVlOiB7IGZlZTogc3RyaW5nOyBmZWVSYXRlPzogc3RyaW5nOyBzaXplPzogbnVtYmVyIH07XG4gICAgaGFzQ3JlZGVudGlhbHM6IGJvb2xlYW47XG4gICAgX3R4PzogdW5rbm93bjtcbiAgICBzZXRUcmFuc2FjdGlvbjogKHR4OiB1bmtub3duKSA9PiB2b2lkO1xuICB9ID0ge1xuICAgIF9uZXR3b3JrOiB7fSxcbiAgICBfbmV0d29ya0lEOiAwLFxuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlci5hbGxvYygwKSxcbiAgICBfYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLFxuICAgIF9mcm9tQWRkcmVzc2VzOiBbXSxcbiAgICBfdG86IFtdLFxuICAgIF9sb2NrdGltZTogMG4sXG4gICAgX3RocmVzaG9sZDogMSxcbiAgICBfZmVlOiB7IGZlZTogJzAnIH0sXG4gICAgaGFzQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgIHNldFRyYW5zYWN0aW9uOiBmdW5jdGlvbiAoX3R4OiB1bmtub3duKSB7XG4gICAgICB0aGlzLl90eCA9IF90eDtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgdGhpcy5fY29pbkNvbmZpZyA9IGNvaW5Db25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGU7XG5cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAoYW1vdW50IDw9IDBuKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBjcmVkZW50aWFscyBhcnJheSBpcyBwcm9wZXJseSBmb3JtZWRcbiAgICogQHBhcmFtIGNyZWRlbnRpYWxzIC0gQXJyYXkgb2YgY3JlZGVudGlhbHMgdG8gdmFsaWRhdGVcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10pOiB2b2lkIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3JlZGVudGlhbHMpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdDcmVkZW50aWFscyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgY3JlZGVudGlhbHMuZm9yRWFjaCgoY3JlZGVudGlhbCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghKGNyZWRlbnRpYWwgaW5zdGFuY2VvZiBDcmVkZW50aWFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGNyZWRlbnRpYWwgYXQgaW5kZXggJHtpbmRleH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGlucHV0cywgb3V0cHV0cywgYW5kIGNyZWRlbnRpYWxzIGZvciBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbnMuXG4gICAqIEJhc2VkIG9uIEFWQVggUC1jaGFpbiBpbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZvciBGbGFyZUpTLlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIGNvcmUgc3RydWN0dXJlLlxuICAgKiBUaGUgRmxhcmVKUyB0eXBlIHN5c3RlbSBpbnRlZ3JhdGlvbiB3aWxsIGJlIHJlZmluZWQgaW4gZnV0dXJlIGl0ZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB0b3RhbCAtIFRvdGFsIGFtb3VudCBuZWVkZWQgaW5jbHVkaW5nIGZlZXNcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgVHJhbnNmZXJhYmxlSW5wdXRbXSwgVHJhbnNmZXJhYmxlT3V0cHV0W10sIGFuZCBDcmVkZW50aWFsW11cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dE91dHB1dCh0b3RhbDogYmlnaW50KToge1xuICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICB9IHtcbiAgICBpZiAoIXRoaXMuX3V0eG9zIHx8IHRoaXMuX3V0eG9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVVRYT3MgYXJlIHJlcXVpcmVkIGZvciBjcmVhdGluZyBpbnB1dHMgYW5kIG91dHB1dHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIGxldCBpbnB1dFN1bSA9IDBuO1xuICAgIGNvbnN0IGFkZHJlc3NJbmRpY2VzOiB7IFthZGRyZXNzOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGxldCBuZXh0QWRkcmVzc0luZGV4ID0gMDtcblxuICAgIC8vIFNvcnQgVVRYT3MgYnkgYW1vdW50IGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIG9wdGltYWwgY29pbiBzZWxlY3Rpb25cbiAgICBjb25zdCBzb3J0ZWRVdHhvcyA9IFsuLi50aGlzLl91dHhvc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYW1vdW50QSA9IEJpZ0ludChhLmFtb3VudCk7XG4gICAgICBjb25zdCBhbW91bnRCID0gQmlnSW50KGIuYW1vdW50KTtcbiAgICAgIGlmIChhbW91bnRBID4gYW1vdW50QikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGFtb3VudEEgPCBhbW91bnRCKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBVVFhPcyB0byBjcmVhdGUgaW5wdXRzIGFuZCBjcmVkZW50aWFsc1xuICAgIGZvciAoY29uc3QgdXR4byBvZiBzb3J0ZWRVdHhvcykge1xuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG5cbiAgICAgIGlmIChpbnB1dFN1bSA+PSB0b3RhbCkge1xuICAgICAgICBicmVhazsgLy8gV2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IENyZWF0ZSBwcm9wZXIgRmxhcmVKUyBUcmFuc2ZlcmFibGVJbnB1dCBvbmNlIHR5cGUgaXNzdWVzIGFyZSByZXNvbHZlZFxuICAgICAgLy8gRm9yIG5vdywgd2UgY3JlYXRlIGEgcGxhY2Vob2xkZXIgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIHN0cnVjdHVyZVxuICAgICAgLy8gVGhlIGFjdHVhbCBGbGFyZUpTIGludGVncmF0aW9uIHdpbGwgbmVlZCBwcm9wZXIgVVRYT0lEIGhhbmRsaW5nXG5cbiAgICAgIC8vIFRyYWNrIGlucHV0IHN1bVxuICAgICAgaW5wdXRTdW0gKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gVHJhY2sgYWRkcmVzcyBpbmRpY2VzIGZvciBzaWduYXR1cmUgb3JkZXJpbmcgKG1pbWljcyBBVkFYIHBhdHRlcm4pXG4gICAgICBjb25zdCBhZGRyZXNzSW5kZXhBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB1dHhvLmFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIShhZGRyZXNzIGluIGFkZHJlc3NJbmRpY2VzKSkge1xuICAgICAgICAgIGFkZHJlc3NJbmRpY2VzW2FkZHJlc3NdID0gbmV4dEFkZHJlc3NJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NJbmRleEFycmF5LnB1c2goYWRkcmVzc0luZGljZXNbYWRkcmVzc10pO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBhZGRyZXNzIGluZGljZXMgb24gdGhlIFVUWE8gZm9yIGNyZWRlbnRpYWwgY3JlYXRpb25cbiAgICAgIHV0eG8uYWRkcmVzc2VzSW5kZXggPSBhZGRyZXNzSW5kZXhBcnJheTtcblxuICAgICAgLy8gQ3JlYXRlIGNyZWRlbnRpYWwgd2l0aCBwbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoZXNlIHdvdWxkIGJlIGFjdHVhbCBzaWduYXR1cmVzXG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdXR4by50aHJlc2hvbGQgfSwgKCkgPT4gJycpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IHRoaXMuY3JlYXRlRmxhcmVDcmVkZW50aWFsKDAsIHNpZ25hdHVyZXMpO1xuICAgICAgY3JlZGVudGlhbHMucHVzaChjcmVkZW50aWFsKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgd2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgaWYgKGlucHV0U3VtIDwgdG90YWwpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEluc3VmZmljaWVudCBmdW5kczogbmVlZCAke3RvdGFsfSwgaGF2ZSAke2lucHV0U3VtfWApO1xuICAgIH1cblxuICAgIC8vIFRPRE86IENyZWF0ZSBjaGFuZ2Ugb3V0cHV0IGlmIHdlIGhhdmUgZXhjZXNzIGlucHV0XG4gICAgLy8gVGhlIFRyYW5zZmVyYWJsZU91dHB1dCBjcmVhdGlvbiB3aWxsIGJlIGltcGxlbWVudGVkIG9uY2UgRmxhcmVKUyB0eXBlcyBhcmUgcmVzb2x2ZWRcblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgVVRYT3MgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdXR4b3MgLSBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICB1dHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIHRoaXMuX3V0eG9zID0gdXR4b3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmUgZXF1aXZhbGVudCBvZiBBdmFsYW5jaGUncyBTZWxlY3RDcmVkZW50aWFsQ2xhc3NcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgd2l0aCB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlc1xuICAgKlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbElkIC0gVGhlIGNyZWRlbnRpYWwgSUQgKG5vdCB1c2VkIGluIEZsYXJlSlMgYnV0IGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gICAqIEBwYXJhbSBzaWduYXR1cmVzIC0gQXJyYXkgb2Ygc2lnbmF0dXJlIGhleCBzdHJpbmdzIG9yIGVtcHR5IHN0cmluZ3MgZm9yIHBsYWNlaG9sZGVyc1xuICAgKiBAcmV0dXJucyBDcmVkZW50aWFsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRmxhcmVDcmVkZW50aWFsKF9jcmVkZW50aWFsSWQ6IG51bWJlciwgc2lnbmF0dXJlczogc3RyaW5nW10pOiBDcmVkZW50aWFsIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1NpZ25hdHVyZXMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChzaWduYXR1cmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU2lnbmF0dXJlcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWdzID0gc2lnbmF0dXJlcy5tYXAoKHNpZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIEhhbmRsZSBlbXB0eS9wbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICBpZiAoIXNpZyB8fCBzaWcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGhleCBzdHJpbmcgZm9ybWF0XG4gICAgICBjb25zdCBjbGVhblNpZyA9IHNpZy5zdGFydHNXaXRoKCcweCcpID8gc2lnLnNsaWNlKDIpIDogc2lnO1xuICAgICAgaWYgKCEvXlswLTlhLWZBLUZdKiQvLnRlc3QoY2xlYW5TaWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgaGV4IHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogY29udGFpbnMgbm9uLWhleCBjaGFyYWN0ZXJzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gYnVmZmVyIGFuZCB2YWxpZGF0ZSBsZW5ndGhcbiAgICAgIGNvbnN0IHNpZ0J1ZmZlciA9IEJ1ZmZlci5mcm9tKGNsZWFuU2lnLCAnaGV4Jyk7XG4gICAgICBpZiAoc2lnQnVmZmVyLmxlbmd0aCA+IFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYFNpZ25hdHVyZSB0b28gbG9uZyBhdCBpbmRleCAke2luZGV4fTogJHtzaWdCdWZmZXIubGVuZ3RofSBieXRlcyAobWF4ICR7U0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEh9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGZpeGVkLWxlbmd0aCBidWZmZXIgYW5kIGNvcHkgc2lnbmF0dXJlIGRhdGFcbiAgICAgIGNvbnN0IGZpeGVkTGVuZ3RoQnVmZmVyID0gQnVmZmVyLmFsbG9jKFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKTtcbiAgICAgIHNpZ0J1ZmZlci5jb3B5KGZpeGVkTGVuZ3RoQnVmZmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUobmV3IFVpbnQ4QXJyYXkoZml4ZWRMZW5ndGhCdWZmZXIpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgc2lnbmF0dXJlIGF0IGluZGV4ICR7aW5kZXh9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IENyZWRlbnRpYWwoc2lncyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIGNyZWRlbnRpYWw6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZSBpbml0QnVpbGRlciB1c2VkIGJ5IGNvbmNyZXRlIGJ1aWxkZXJzLiBGb3Igbm93IGp1c3QgcmV0dXJucyB0aGlzIHNvIGZsdWVudCBBUEkgd29ya3MuXG4gICAqL1xuICBpbml0QnVpbGRlcihfdHg6IHVua25vd24pOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXkgKHBsYWNlaG9sZGVyIGltcGxlbWVudGF0aW9uKVxuICAgKiBUT0RPOiBJbXBsZW1lbnQgcHJvcGVyIEZsYXJlSlMgc2lnbmluZ1xuICAgKi9cbiAgc2lnbihfcGFyYW1zOiB7IGtleTogc3RyaW5nIH0pOiB0aGlzIHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgRmxhcmVKUyBzaWduaW5nXG4gICAgLy8gRm9yIG5vdywganVzdCBtYXJrIGFzIGhhdmluZyBjcmVkZW50aWFsc1xuICAgIHRoaXMudHJhbnNhY3Rpb24uaGFzQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSB0cmFuc2FjdGlvbiAocGxhY2Vob2xkZXIgaW1wbGVtZW50YXRpb24pXG4gICAqIFRPRE86IEltcGxlbWVudCBwcm9wZXIgRmxhcmVKUyB0cmFuc2FjdGlvbiBidWlsZGluZ1xuICAgKi9cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICAvLyBUT0RPOiBDcmVhdGUgYWN0dWFsIEZsYXJlSlMgVW5zaWduZWRUeFxuICAgIC8vIEZvciBub3csIHJldHVybiBhIG1vY2sgdHJhbnNhY3Rpb24gdGhhdCBzYXRpc2ZpZXMgdGhlIGludGVyZmFjZVxuICAgIGNvbnN0IG1vY2tUcmFuc2FjdGlvbiA9IHtcbiAgICAgIF9pZDogJ21vY2stdHJhbnNhY3Rpb24taWQnLFxuICAgICAgX2lucHV0czogW10sXG4gICAgICBfb3V0cHV0czogW10sXG4gICAgICBfdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICBzaWduYXR1cmU6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgdG9Ccm9hZGNhc3RGb3JtYXQ6ICgpID0+ICdtb2NrLXR4LWhleCcsXG4gICAgICB0b0pzb246ICgpID0+ICh7fSksXG4gICAgICBleHBsYWluVHJhbnNhY3Rpb246ICgpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0+ICh7XG4gICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICBpbnB1dHM6IFtdLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICAgIHJld2FyZEFkZHJlc3NlczogW10sXG4gICAgICAgIGlkOiAnbW9jay10cmFuc2FjdGlvbi1pZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgZmVlOiB7IGZlZTogJzAnIH0sXG4gICAgICB9KSxcbiAgICAgIGlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW46IGZhbHNlLFxuICAgICAgZnJvbUFkZHJlc3NlczogW10sXG4gICAgICB2YWxpZGF0aW9uRXJyb3JzOiBbXSxcbiAgICAgIGxvYWRJbnB1dHNBbmRPdXRwdXRzOiAoKSA9PiB7XG4gICAgICAgIC8qIHBsYWNlaG9sZGVyICovXG4gICAgICB9LFxuICAgICAgaW5wdXRzOiAoKSA9PiBbXSxcbiAgICAgIG91dHB1dHM6ICgpID0+IFtdLFxuICAgICAgZmVlOiAoKSA9PiAoeyBmZWU6ICcwJyB9KSxcbiAgICAgIGZlZVJhdGU6ICgpID0+IDAsXG4gICAgICBpZDogKCkgPT4gJ21vY2stdHJhbnNhY3Rpb24taWQnLFxuICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgfSBhcyB1bmtub3duIGFzIEJhc2VUcmFuc2FjdGlvbjtcblxuICAgIHJldHVybiBtb2NrVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYW5kIGV4cGxhaW4gYSB0cmFuc2FjdGlvbiBmcm9tIGhleCAocGxhY2Vob2xkZXIgaW1wbGVtZW50YXRpb24pXG4gICAqIFRPRE86IEltcGxlbWVudCBwcm9wZXIgRmxhcmVKUyB0cmFuc2FjdGlvbiBwYXJzaW5nXG4gICAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgLy8gVE9ETzogUGFyc2UgYWN0dWFsIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gYmFzaWMgZXhwbGFuYXRpb25cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICBpbnB1dHM6IFtdLFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBvdXRwdXRBbW91bnQ6ICcwJyxcbiAgICAgIHJld2FyZEFkZHJlc3NlczogW10sXG4gICAgICBpZDogJ21vY2stdHJhbnNhY3Rpb24taWQnLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgIGZlZTogeyBmZWU6ICcwJyB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsNkRBQTBEO0FBQzFELCtDQUE0QztBQUM1QyxtREFBNEY7QUFFNUYsb0RBQTRCO0FBUzVCLE1BQXNCLHdCQUF5QixTQUFRLHVDQUFrQjtJQUl2RSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUhYLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBSTlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDTyxpQkFBaUIsQ0FBQyxNQUFjO1FBS3hDLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxXQUEyQixDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4RSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QiwrQkFBK0I7WUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztR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QztJQUNkLENBQUM7Q0FDRjtBQTNPRCw0REEyT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNmZXJhYmxlSW5wdXQsIEludCwgSWQsIFR5cGVTeW1ib2xzLCBDcmVkZW50aWFsIH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8vIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGNhbiBwcm92aWRlIGFuIGFtb3VudFxuaW50ZXJmYWNlIEFtb3VudGVyIHtcbiAgX3R5cGU6IFR5cGVTeW1ib2xzO1xuICBhbW91bnQ6ICgpID0+IGJpZ2ludDtcbiAgdG9CeXRlczogKCkgPT4gVWludDhBcnJheTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfZXh0ZXJuYWxDaGFpbklkOiBCdWZmZXI7XG4gIHByb3RlY3RlZCByZWNvdmVyU2lnbmVyID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgPSB0aGlzLmZpeGVkRmVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpbnB1dHMgYW5kIG91dHB1dHMgZnJvbSBVVFhPc1xuICAgKiBAcGFyYW0ge2JpZ2ludH0gYW1vdW50IEFtb3VudCB0byB0cmFuc2ZlclxuICAgKiBAcmV0dXJuIHtcbiAgICogICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICogICAgIG91dHB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAqICAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICAgKiB9XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dE91dHB1dChhbW91bnQ6IGJpZ2ludCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgb3V0cHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICB9IHtcbiAgICBjb25zdCBzZW5kZXIgPSAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2Zyb21BZGRyZXNzZXMuc2xpY2UoKTtcbiAgICBpZiAodGhpcy5yZWNvdmVyU2lnbmVyKSB7XG4gICAgICAvLyBzd2l0Y2ggZmlyc3QgYW5kIGxhc3Qgc2lnbmVyXG4gICAgICBjb25zdCB0bXAgPSBzZW5kZXIucG9wKCk7XG4gICAgICBzZW5kZXIucHVzaChzZW5kZXJbMF0pO1xuICAgICAgaWYgKHRtcCkge1xuICAgICAgICBzZW5kZXJbMF0gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRvdGFsQW1vdW50ID0gQmlnSW50KDApO1xuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdID0gW107XG5cbiAgICAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX3V0eG9zLmZvckVhY2goKHV0eG86IERlY29kZWRVdHhvT2JqKSA9PiB7XG4gICAgICBjb25zdCB1dHhvQW1vdW50ID0gQmlnSW50KHV0eG8uYW1vdW50KTtcbiAgICAgIHRvdGFsQW1vdW50ICs9IHV0eG9BbW91bnQ7XG5cbiAgICAgIC8vIENyZWF0ZSBpbnB1dFxuICAgICAgY29uc3QgaW5wdXQgPSB7XG4gICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5JbnB1dCxcbiAgICAgICAgYW1vdW50OiAoKSA9PiB1dHhvQW1vdW50LFxuICAgICAgICBzaWdJbmRpY2VzOiBzZW5kZXIubWFwKChfLCBpKSA9PiBpKSxcbiAgICAgICAgdG9CeXRlczogKCkgPT4gbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBhc3NldCB3aXRoIEFtb3VudGVyIGludGVyZmFjZVxuICAgICAgY29uc3QgYXNzZXRJZDogQW1vdW50ZXIgPSB7XG4gICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5CYXNlVHgsXG4gICAgICAgIGFtb3VudDogKCkgPT4gdXR4b0Ftb3VudCxcbiAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl9hc3NldElkLCAnaGV4JykpO1xuICAgICAgICAgIHJldHVybiBieXRlcztcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBUcmFuc2ZlcmFibGVJbnB1dFxuICAgICAgY29uc3QgdHJhbnNmZXJhYmxlSW5wdXQgPSBuZXcgVHJhbnNmZXJhYmxlSW5wdXQoXG4gICAgICAgIHtcbiAgICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuVVRYT0lELFxuICAgICAgICAgIHR4SUQ6IG5ldyBJZChuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh1dHhvLnR4aWQsICdoZXgnKSkpLFxuICAgICAgICAgIG91dHB1dElkeDogbmV3IEludChOdW1iZXIodXR4by5vdXRwdXRpZHgpKSxcbiAgICAgICAgICBJRDogKCkgPT4gdXR4by50eGlkLFxuICAgICAgICAgIHRvQnl0ZXM6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR4SWRCeXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHV0eG8udHhpZCwgJ2hleCcpKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dElkeEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgICAgICBuZXcgRGF0YVZpZXcob3V0cHV0SWR4Qnl0ZXMuYnVmZmVyKS5zZXRJbnQzMigwLCBOdW1iZXIodXR4by5vdXRwdXRpZHgpLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFt0eElkQnl0ZXMsIG91dHB1dElkeEJ5dGVzXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHV0eG8ub3V0cHV0aWR4LnRvU3RyaW5nKCkpKSksXG4gICAgICAgIGFzc2V0SWRcbiAgICAgICk7XG5cbiAgICAgIC8vIFNldCBpbnB1dCBwcm9wZXJ0aWVzXG4gICAgICBPYmplY3QuYXNzaWduKHRyYW5zZmVyYWJsZUlucHV0LCB7IGlucHV0IH0pO1xuICAgICAgaW5wdXRzLnB1c2godHJhbnNmZXJhYmxlSW5wdXQpO1xuXG4gICAgICAvLyBDcmVhdGUgY3JlZGVudGlhbCB3aXRoIGVtcHR5IHNpZ25hdHVyZXMgZm9yIHNsb3QgaWRlbnRpZmljYXRpb25cbiAgICAgIC8vIE1hdGNoIGF2YXhwIGJlaGF2aW9yOiBkeW5hbWljIG9yZGVyaW5nIGJhc2VkIG9uIGFkZHJlc3Nlc0luZGV4IGZyb20gVVRYT1xuICAgICAgY29uc3QgaGFzQWRkcmVzc2VzID0gc2VuZGVyICYmIHNlbmRlci5sZW5ndGggPj0gKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl90aHJlc2hvbGQ7XG5cbiAgICAgIGlmICghaGFzQWRkcmVzc2VzKSB7XG4gICAgICAgIC8vIElmIGFkZHJlc3NlcyBub3QgYXZhaWxhYmxlLCB1c2UgYWxsIHplcm9zXG4gICAgICAgIGNvbnN0IGVtcHR5U2lnbmF0dXJlcyA9IHNlbmRlci5tYXAoKCkgPT4gdXRpbHMuY3JlYXRlTmV3U2lnKCcnKSk7XG4gICAgICAgIGNyZWRlbnRpYWxzLnB1c2gobmV3IENyZWRlbnRpYWwoZW1wdHlTaWduYXR1cmVzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDb21wdXRlIGFkZHJlc3Nlc0luZGV4OiBwb3NpdGlvbiBvZiBlYWNoIF9mcm9tQWRkcmVzc2VzIGluIFVUWE8ncyBhZGRyZXNzIGxpc3RcbiAgICAgICAgY29uc3QgdXR4b0FkZHJlc3NlcyA9IHV0eG8uYWRkcmVzc2VzLm1hcCgoYTogc3RyaW5nKSA9PiB1dGlscy5wYXJzZUFkZHJlc3MoYSkpO1xuICAgICAgICBjb25zdCBhZGRyZXNzZXNJbmRleCA9IHNlbmRlci5tYXAoKGEpID0+XG4gICAgICAgICAgdXR4b0FkZHJlc3Nlcy5maW5kSW5kZXgoKHUpID0+IEJ1ZmZlci5jb21wYXJlKEJ1ZmZlci5mcm9tKHUpLCBCdWZmZXIuZnJvbShhKSkgPT09IDApXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gZWl0aGVyIHVzZXIgKDApIG9yIHJlY292ZXJ5ICgyKVxuICAgICAgICBjb25zdCBmaXJzdEluZGV4ID0gdGhpcy5yZWNvdmVyU2lnbmVyID8gMiA6IDA7XG4gICAgICAgIGNvbnN0IGJpdGdvSW5kZXggPSAxO1xuXG4gICAgICAgIC8vIER5bmFtaWMgb3JkZXJpbmcgYmFzZWQgb24gYWRkcmVzc2VzSW5kZXhcbiAgICAgICAgbGV0IGVtcHR5U2lnbmF0dXJlczogUmV0dXJuVHlwZTx0eXBlb2YgdXRpbHMuY3JlYXRlTmV3U2lnPltdO1xuICAgICAgICBpZiAoYWRkcmVzc2VzSW5kZXhbYml0Z29JbmRleF0gPCBhZGRyZXNzZXNJbmRleFtmaXJzdEluZGV4XSkge1xuICAgICAgICAgIC8vIEJpdGdvIGNvbWVzIGZpcnN0IGluIHNpZ25hdHVyZSBvcmRlcjogW3plcm9zLCB1c2VyQWRkcmVzc11cbiAgICAgICAgICBlbXB0eVNpZ25hdHVyZXMgPSBbXG4gICAgICAgICAgICB1dGlscy5jcmVhdGVOZXdTaWcoJycpLFxuICAgICAgICAgICAgdXRpbHMuY3JlYXRlRW1wdHlTaWdXaXRoQWRkcmVzcyhCdWZmZXIuZnJvbShzZW5kZXJbZmlyc3RJbmRleF0pLnRvU3RyaW5nKCdoZXgnKSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBVc2VyIGNvbWVzIGZpcnN0IGluIHNpZ25hdHVyZSBvcmRlcjogW3VzZXJBZGRyZXNzLCB6ZXJvc11cbiAgICAgICAgICBlbXB0eVNpZ25hdHVyZXMgPSBbXG4gICAgICAgICAgICB1dGlscy5jcmVhdGVFbXB0eVNpZ1dpdGhBZGRyZXNzKEJ1ZmZlci5mcm9tKHNlbmRlcltmaXJzdEluZGV4XSkudG9TdHJpbmcoJ2hleCcpKSxcbiAgICAgICAgICAgIHV0aWxzLmNyZWF0ZU5ld1NpZygnJyksXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBjcmVkZW50aWFscy5wdXNoKG5ldyBDcmVkZW50aWFsKGVtcHR5U2lnbmF0dXJlcykpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIG91dHB1dCBpZiB0aGVyZSBpcyBjaGFuZ2VcbiAgICBpZiAodG90YWxBbW91bnQgPiBhbW91bnQpIHtcbiAgICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IHRvdGFsQW1vdW50IC0gYW1vdW50O1xuICAgICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuQmFzZVR4LFxuICAgICAgICBhbW91bnQ6ICgpID0+IGNoYW5nZUFtb3VudCxcbiAgICAgICAgYWRkcmVzc2VzOiBzZW5kZXIsXG4gICAgICAgIGxvY2t0aW1lOiAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2xvY2t0aW1lLFxuICAgICAgICB0aHJlc2hvbGQ6ICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fdGhyZXNob2xkLFxuICAgICAgICB0b0J5dGVzOiAoKSA9PiBuZXcgVWludDhBcnJheSgpLFxuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIGFzc2V0IHdpdGggQW1vdW50ZXIgaW50ZXJmYWNlXG4gICAgICBjb25zdCBhc3NldElkOiBBbW91bnRlciA9IHtcbiAgICAgICAgX3R5cGU6IFR5cGVTeW1ib2xzLkJhc2VUeCxcbiAgICAgICAgYW1vdW50OiAoKSA9PiBjaGFuZ2VBbW91bnQsXG4gICAgICAgIHRvQnl0ZXM6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKCh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fYXNzZXRJZCwgJ2hleCcpKTtcbiAgICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBDcmVhdGUgVHJhbnNmZXJhYmxlT3V0cHV0XG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVPdXRwdXQgPSBuZXcgVHJhbnNmZXJhYmxlSW5wdXQoXG4gICAgICAgIHtcbiAgICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuVVRYT0lELFxuICAgICAgICAgIHR4SUQ6IG5ldyBJZChuZXcgVWludDhBcnJheSgzMikpLFxuICAgICAgICAgIG91dHB1dElkeDogbmV3IEludCgwKSxcbiAgICAgICAgICBJRDogKCkgPT4gJycsXG4gICAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHhJZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SWR4Qnl0ZXMgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFt0eElkQnl0ZXMsIG91dHB1dElkeEJ5dGVzXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KFswXSkpLFxuICAgICAgICBhc3NldElkXG4gICAgICApO1xuXG4gICAgICAvLyBTZXQgb3V0cHV0IHByb3BlcnRpZXNcbiAgICAgIE9iamVjdC5hc3NpZ24odHJhbnNmZXJhYmxlT3V0cHV0LCB7IG91dHB1dCB9KTtcbiAgICAgIG91dHB1dHMucHVzaCh0cmFuc2ZlcmFibGVPdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHMsXG4gICAgICBvdXRwdXRzLFxuICAgICAgY3JlZGVudGlhbHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgdGhpcy5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZSh0aGlzLnRyYW5zYWN0aW9uVHlwZSk7XG4gICAgaWYgKHRoaXMuaGFzU2lnbmVyKCkpIHtcbiAgICAgIC8vIFNpZ24gc2VxdWVudGlhbGx5IHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJcbiAgICAgIGZvciAoY29uc3Qga2V5UGFpciBvZiB0aGlzLl9zaWduZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbi5zaWduKGtleVBhaXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIEZsYXJlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbiBmaWVsZCBpcyBjaGFuZ2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogRmVlIGlzIGZpeCBmb3IgQVZNIGF0b21pYyB0eC5cbiAgICpcbiAgICogQHJldHVybnMgbmV0d29yay50eEZlZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGZpeGVkRmVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsudHhGZWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBjaGFpbiBpcyB0aGUgb25lIHNldCBmb3IgdGhlIGNvaW4gaW4gY29pbkNvbmZpZy5uZXR3b3JrLiBUaGUgZXh0ZXJuYWwgY2hhaW4gaXMgdGhlIG90aGVyIGNoYWluIGludm9sdmVkLlxuICAgKiBUaGUgZXh0ZXJuYWwgY2hhaW4gaWQgaXMgdGhlIHNvdXJjZSBvbiBpbXBvcnQgYW5kIHRoZSBkZXN0aW5hdGlvbiBvbiBleHBvcnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFpbklkIC0gaWQgb2YgdGhlIGV4dGVybmFsIGNoYWluXG4gICAqL1xuICBleHRlcm5hbENoYWluSWQoY2hhaW5JZDogc3RyaW5nIHwgQnVmZmVyKTogdGhpcyB7XG4gICAgY29uc3QgbmV3VGFyZ2V0Q2hhaW5JZCA9IHR5cGVvZiBjaGFpbklkID09PSAnc3RyaW5nJyA/IHV0aWxzLmNiNThEZWNvZGUoY2hhaW5JZCkgOiBCdWZmZXIuZnJvbShjaGFpbklkKTtcbiAgICB0aGlzLnZhbGlkYXRlQ2hhaW5JZChuZXdUYXJnZXRDaGFpbklkKTtcbiAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSBuZXdUYXJnZXRDaGFpbklkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gZmVlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgYmlnaW50fSBmZWVWYWx1ZSAtIHRoZSBmZWUgdmFsdWVcbiAgICovXG4gIGZlZShmZWVWYWx1ZTogc3RyaW5nIHwgYmlnaW50KTogdGhpcyB7XG4gICAgY29uc3QgZmVlID0gdHlwZW9mIGZlZVZhbHVlID09PSAnc3RyaW5nJyA/IGZlZVZhbHVlIDogZmVlVmFsdWUudG9TdHJpbmcoKTtcbiAgICAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2ZlZS5mZWUgPSBmZWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiJdfQ==