@bitgo-beta/sdk-coin-sol 7.6.4-beta.708 → 7.6.4-beta.709

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 (25) hide show
  1. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +10 -0
  2. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -1
  3. package/dist/cjs/src/lib/serialization/codecs/v1/message.js +129 -1
  4. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
  5. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  6. package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
  7. package/dist/cjs/src/sol.d.ts.map +1 -1
  8. package/dist/cjs/src/sol.js +22 -2
  9. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
  10. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
  11. package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
  12. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
  13. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
  14. package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
  15. package/dist/cjs/test/unit/sol.js +77 -1
  16. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  17. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +10 -0
  18. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -1
  19. package/dist/esm/lib/serialization/codecs/v1/message.js +129 -2
  20. package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
  21. package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  22. package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
  23. package/dist/esm/sol.d.ts.map +1 -1
  24. package/dist/esm/sol.js +22 -2
  25. package/package.json +7 -7
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=decodeV1Message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decodeV1Message.d.ts","sourceRoot":"","sources":["../../../../../test/unit/serialization/decodeV1Message.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("should");
4
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
5
+ const message_1 = require("../../../src/lib/serialization/codecs/v1/message");
6
+ const config_1 = require("../../../src/lib/serialization/codecs/v1/config");
7
+ const A = '3h1zGmCwsRJn5kU4LdYD8QfUoXjW8YqZcZsRsYxVvNpq';
8
+ const B = '9xQeWvGcCvsftH8sN4jWQcBpkT2yLdMfZqNpVxKjRwSb';
9
+ const BLOCKHASH = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
10
+ function sampleMessage() {
11
+ const config = (0, config_1.encodeConfigMaskAndValues)({
12
+ computeUnitLimit: 200000,
13
+ heapSize: 32768,
14
+ loadedAccountsDataSizeLimit: 65536,
15
+ priorityFee: 5000,
16
+ });
17
+ return (0, message_1.encodeV1Message)({
18
+ header: { numSignerAccounts: 1, numReadonlySignerAccounts: 0, numReadonlyNonSignerAccounts: 1 },
19
+ configMask: config.mask,
20
+ configValues: config.values,
21
+ blockhash: BLOCKHASH,
22
+ staticAccounts: [A, B],
23
+ compiledInstructions: [{ programAddressIndex: 1, accountIndices: [0, 1], data: new Uint8Array([1, 2, 3]) }],
24
+ });
25
+ }
26
+ describe('decodeV1Message', () => {
27
+ it('round-trips an encoded v1 message', () => {
28
+ const bytes = sampleMessage();
29
+ const decoded = (0, message_1.decodeV1Message)(bytes);
30
+ decoded.header.numSignerAccounts.should.equal(1);
31
+ decoded.header.numReadonlySignerAccounts.should.equal(0);
32
+ decoded.header.numReadonlyNonSignerAccounts.should.equal(1);
33
+ decoded.configMask.should.equal(0b11 | 0b100 | 0b1000 | 0b10000);
34
+ decoded.configValues.should.eql([
35
+ { kind: 'u64', value: 5000n },
36
+ { kind: 'u32', value: 200000 },
37
+ { kind: 'u32', value: 65536 },
38
+ { kind: 'u32', value: 32768 },
39
+ ]);
40
+ decoded.blockhash.should.equal(BLOCKHASH);
41
+ decoded.staticAccounts.should.eql([A, B]);
42
+ decoded.compiledInstructions.should.eql([
43
+ { programAddressIndex: 1, accountIndices: [0, 1], data: new Uint8Array([1, 2, 3]) },
44
+ ]);
45
+ decoded.byteLength.should.equal(bytes.length);
46
+ });
47
+ it('rejects an unknown config mask bit', () => {
48
+ const bytes = sampleMessage();
49
+ bytes[4] = 0xff;
50
+ (() => (0, message_1.decodeV1Message)(bytes)).should.throw(sdk_core_1.BuildTransactionError, { message: /Unknown config mask/ });
51
+ });
52
+ it('rejects an out-of-range program index', () => {
53
+ const bytes = sampleMessage();
54
+ const programIdxByte = 42 + 2 * 32 + 4 + 8 + 4 + 4;
55
+ bytes[programIdxByte] = 0xff;
56
+ (() => (0, message_1.decodeV1Message)(bytes)).should.throw(sdk_core_1.BuildTransactionError, { message: /program index/ });
57
+ });
58
+ it('rejects a truncated message', () => {
59
+ const bytes = sampleMessage();
60
+ (() => (0, message_1.decodeV1Message)(bytes.subarray(0, bytes.length - 1))).should.throw(sdk_core_1.BuildTransactionError);
61
+ });
62
+ });
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2RlVjFNZXNzYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3NlcmlhbGl6YXRpb24vZGVjb2RlVjFNZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0JBQWdCO0FBQ2hCLG1EQUE2RDtBQUM3RCw4RUFBb0c7QUFDcEcsNEVBQTRGO0FBRTVGLE1BQU0sQ0FBQyxHQUFHLDhDQUE4QyxDQUFDO0FBQ3pELE1BQU0sQ0FBQyxHQUFHLDhDQUE4QyxDQUFDO0FBQ3pELE1BQU0sU0FBUyxHQUFHLDhDQUE4QyxDQUFDO0FBRWpFLFNBQVMsYUFBYTtJQUNwQixNQUFNLE1BQU0sR0FBRyxJQUFBLGtDQUF5QixFQUFDO1FBQ3ZDLGdCQUFnQixFQUFFLE1BQU87UUFDekIsUUFBUSxFQUFFLEtBQU07UUFDaEIsMkJBQTJCLEVBQUUsS0FBTTtRQUNuQyxXQUFXLEVBQUUsSUFBSztLQUNuQixDQUFDLENBQUM7SUFDSCxPQUFPLElBQUEseUJBQWUsRUFBQztRQUNyQixNQUFNLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxFQUFFLDRCQUE0QixFQUFFLENBQUMsRUFBRTtRQUMvRixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDdkIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQzNCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDNUcsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFFBQVEs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QUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtRQUNyQyxNQUFNLEtBQUssR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUM5QixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEseUJBQWUsRUFBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFxQixDQUFDLENBQUM7SUFDbkcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGRlY29kZVYxTWVzc2FnZSwgZW5jb2RlVjFNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL2NvZGVjcy92MS9tZXNzYWdlJztcbmltcG9ydCB7IGVuY29kZUNvbmZpZ01hc2tBbmRWYWx1ZXMgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3NlcmlhbGl6YXRpb24vY29kZWNzL3YxL2NvbmZpZyc7XG5cbmNvbnN0IEEgPSAnM2gxekdtQ3dzUkpuNWtVNExkWUQ4UWZVb1hqVzhZcVpjWnNSc1l4VnZOcHEnO1xuY29uc3QgQiA9ICc5eFFlV3ZHY0N2c2Z0SDhzTjRqV1FjQnBrVDJ5TGRNZlpxTnBWeEtqUndTYic7XG5jb25zdCBCTE9DS0hBU0ggPSAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknO1xuXG5mdW5jdGlvbiBzYW1wbGVNZXNzYWdlKCk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBjb25maWcgPSBlbmNvZGVDb25maWdNYXNrQW5kVmFsdWVzKHtcbiAgICBjb21wdXRlVW5pdExpbWl0OiAyMDBfMDAwLFxuICAgIGhlYXBTaXplOiAzMl83NjgsXG4gICAgbG9hZGVkQWNjb3VudHNEYXRhU2l6ZUxpbWl0OiA2NV81MzYsXG4gICAgcHJpb3JpdHlGZWU6IDVfMDAwLFxuICB9KTtcbiAgcmV0dXJuIGVuY29kZVYxTWVzc2FnZSh7XG4gICAgaGVhZGVyOiB7IG51bVNpZ25lckFjY291bnRzOiAxLCBudW1SZWFkb25seVNpZ25lckFjY291bnRzOiAwLCBudW1SZWFkb25seU5vblNpZ25lckFjY291bnRzOiAxIH0sXG4gICAgY29uZmlnTWFzazogY29uZmlnLm1hc2ssXG4gICAgY29uZmlnVmFsdWVzOiBjb25maWcudmFsdWVzLFxuICAgIGJsb2NraGFzaDogQkxPQ0tIQVNILFxuICAgIHN0YXRpY0FjY291bnRzOiBbQSwgQl0sXG4gICAgY29tcGlsZWRJbnN0cnVjdGlvbnM6IFt7IHByb2dyYW1BZGRyZXNzSW5kZXg6IDEsIGFjY291bnRJbmRpY2VzOiBbMCwgMV0sIGRhdGE6IG5ldyBVaW50OEFycmF5KFsxLCAyLCAzXSkgfV0sXG4gIH0pO1xufVxuXG5kZXNjcmliZSgnZGVjb2RlVjFNZXNzYWdlJywgKCkgPT4ge1xuICBpdCgncm91bmQtdHJpcHMgYW4gZW5jb2RlZCB2MSBtZXNzYWdlJywgKCkgPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gc2FtcGxlTWVzc2FnZSgpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVWMU1lc3NhZ2UoYnl0ZXMpO1xuICAgIGRlY29kZWQuaGVhZGVyLm51bVNpZ25lckFjY291bnRzLnNob3VsZC5lcXVhbCgxKTtcbiAgICBkZWNvZGVkLmhlYWRlci5udW1SZWFkb25seVNpZ25lckFjY291bnRzLnNob3VsZC5lcXVhbCgwKTtcbiAgICBkZWNvZGVkLmhlYWRlci5udW1SZWFkb25seU5vblNpZ25lckFjY291bnRzLnNob3VsZC5lcXVhbCgxKTtcbiAgICBkZWNvZGVkLmNvbmZpZ01hc2suc2hvdWxkLmVxdWFsKDBiMTEgfCAwYjEwMCB8IDBiMTAwMCB8IDBiMTAwMDApO1xuICAgIGRlY29kZWQuY29uZmlnVmFsdWVzLnNob3VsZC5lcWwoW1xuICAgICAgeyBraW5kOiAndTY0JywgdmFsdWU6IDVfMDAwbiB9LFxuICAgICAgeyBraW5kOiAndTMyJywgdmFsdWU6IDIwMF8wMDAgfSxcbiAgICAgIHsga2luZDogJ3UzMicsIHZhbHVlOiA2NV81MzYgfSxcbiAgICAgIHsga2luZDogJ3UzMicsIHZhbHVlOiAzMl83NjggfSxcbiAgICBdKTtcbiAgICBkZWNvZGVkLmJsb2NraGFzaC5zaG91bGQuZXF1YWwoQkxPQ0tIQVNIKTtcbiAgICBkZWNvZGVkLnN0YXRpY0FjY291bnRzLnNob3VsZC5lcWwoW0EsIEJdKTtcbiAgICBkZWNvZGVkLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLnNob3VsZC5lcWwoW1xuICAgICAgeyBwcm9ncmFtQWRkcmVzc0luZGV4OiAxLCBhY2NvdW50SW5kaWNlczogWzAsIDFdLCBkYXRhOiBuZXcgVWludDhBcnJheShbMSwgMiwgM10pIH0sXG4gICAgXSk7XG4gICAgZGVjb2RlZC5ieXRlTGVuZ3RoLnNob3VsZC5lcXVhbChieXRlcy5sZW5ndGgpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhbiB1bmtub3duIGNvbmZpZyBtYXNrIGJpdCcsICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IHNhbXBsZU1lc3NhZ2UoKTtcbiAgICBieXRlc1s0XSA9IDB4ZmY7XG4gICAgKCgpID0+IGRlY29kZVYxTWVzc2FnZShieXRlcykpLnNob3VsZC50aHJvdyhCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIHsgbWVzc2FnZTogL1Vua25vd24gY29uZmlnIG1hc2svIH0pO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhbiBvdXQtb2YtcmFuZ2UgcHJvZ3JhbSBpbmRleCcsICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IHNhbXBsZU1lc3NhZ2UoKTtcbiAgICBjb25zdCBwcm9ncmFtSWR4Qnl0ZSA9IDQyICsgMiAqIDMyICsgNCArIDggKyA0ICsgNDtcbiAgICBieXRlc1twcm9ncmFtSWR4Qnl0ZV0gPSAweGZmO1xuICAgICgoKSA9PiBkZWNvZGVWMU1lc3NhZ2UoYnl0ZXMpKS5zaG91bGQudGhyb3coQnVpbGRUcmFuc2FjdGlvbkVycm9yLCB7IG1lc3NhZ2U6IC9wcm9ncmFtIGluZGV4LyB9KTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSB0cnVuY2F0ZWQgbWVzc2FnZScsICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IHNhbXBsZU1lc3NhZ2UoKTtcbiAgICAoKCkgPT4gZGVjb2RlVjFNZXNzYWdlKGJ5dGVzLnN1YmFycmF5KDAsIGJ5dGVzLmxlbmd0aCAtIDEpKSkuc2hvdWxkLnRocm93KEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=parseWireTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseWireTransaction.d.ts","sourceRoot":"","sources":["../../../../../test/unit/serialization/parseWireTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ require("should");
7
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
8
+ const bs58_1 = __importDefault(require("bs58"));
9
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
10
+ const parseWireTransaction_1 = require("../../../src/lib/serialization/parseWireTransaction");
11
+ const message_1 = require("../../../src/lib/serialization/codecs/v1/message");
12
+ const config_1 = require("../../../src/lib/serialization/codecs/v1/config");
13
+ const wire_transaction_1 = require("../../../src/lib/serialization/wire-transaction");
14
+ const BLOCKHASH = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
15
+ const kp = tweetnacl_1.default.sign.keyPair();
16
+ const A = bs58_1.default.encode(kp.publicKey);
17
+ const B = bs58_1.default.encode(tweetnacl_1.default.sign.keyPair().publicKey);
18
+ function sampleMessage() {
19
+ const config = (0, config_1.encodeConfigMaskAndValues)({
20
+ computeUnitLimit: 200000,
21
+ heapSize: null,
22
+ loadedAccountsDataSizeLimit: null,
23
+ priorityFee: 5000,
24
+ });
25
+ return (0, message_1.encodeV1Message)({
26
+ header: { numSignerAccounts: 1, numReadonlySignerAccounts: 0, numReadonlyNonSignerAccounts: 1 },
27
+ configMask: config.mask,
28
+ configValues: config.values,
29
+ blockhash: BLOCKHASH,
30
+ staticAccounts: [A, B],
31
+ compiledInstructions: [{ programAddressIndex: 1, accountIndices: [0, 1], data: new Uint8Array([1]) }],
32
+ });
33
+ }
34
+ function sign(messageBytes) {
35
+ return [tweetnacl_1.default.sign.detached(messageBytes, kp.secretKey)];
36
+ }
37
+ describe('parseWireTransaction', () => {
38
+ it('splits a signed v1 transaction into message + signatures + signer pubkeys', () => {
39
+ const messageBytes = sampleMessage();
40
+ const signatures = sign(messageBytes);
41
+ const wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, signatures);
42
+ const parsed = (0, parseWireTransaction_1.parseWireTransaction)(wire);
43
+ parsed.messageBytes.should.eql(messageBytes);
44
+ parsed.signatures.length.should.equal(1);
45
+ parsed.signatures[0].should.eql(signatures[0]);
46
+ parsed.signerPublicKeys.should.eql([A]);
47
+ });
48
+ it('rejects a wire tx whose tail is not the expected number of signatures', () => {
49
+ const messageBytes = sampleMessage();
50
+ const wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, sign(messageBytes));
51
+ const truncated = wire.subarray(0, wire.length - 1);
52
+ (() => (0, parseWireTransaction_1.parseWireTransaction)(truncated)).should.throw(sdk_core_1.BuildTransactionError);
53
+ });
54
+ it('rejects a non-v1 wire tx', () => {
55
+ const bytes = new Uint8Array([0x00, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
56
+ (() => (0, parseWireTransaction_1.parseWireTransaction)(bytes)).should.throw(sdk_core_1.BuildTransactionError, { message: /version prefix/ });
57
+ });
58
+ });
59
+ describe('validateRawTransactionV1', () => {
60
+ it('accepts a fully signed, valid v1 transaction', () => {
61
+ const messageBytes = sampleMessage();
62
+ const wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, sign(messageBytes));
63
+ (() => (0, parseWireTransaction_1.validateRawTransactionV1)(wire)).should.not.throw();
64
+ });
65
+ it('rejects a tampered signature', () => {
66
+ const messageBytes = sampleMessage();
67
+ const wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, sign(messageBytes));
68
+ const tampered = new Uint8Array(wire);
69
+ tampered[tampered.length - 1] ^= 0xff;
70
+ (() => (0, parseWireTransaction_1.validateRawTransactionV1)(tampered)).should.throw(sdk_core_1.BuildTransactionError, { message: /verification failed/ });
71
+ });
72
+ it('rejects when a required signature is missing', () => {
73
+ const config = (0, config_1.encodeConfigMaskAndValues)({
74
+ computeUnitLimit: 200000,
75
+ heapSize: null,
76
+ loadedAccountsDataSizeLimit: null,
77
+ priorityFee: 5000,
78
+ });
79
+ const msg = (0, message_1.encodeV1Message)({
80
+ header: { numSignerAccounts: 1, numReadonlySignerAccounts: 0, numReadonlyNonSignerAccounts: 1 },
81
+ configMask: config.mask,
82
+ configValues: config.values,
83
+ blockhash: BLOCKHASH,
84
+ staticAccounts: [A, B],
85
+ compiledInstructions: [{ programAddressIndex: 1, accountIndices: [0, 1], data: new Uint8Array([1]) }],
86
+ });
87
+ (() => (0, parseWireTransaction_1.validateRawTransactionV1)(msg)).should.throw(sdk_core_1.BuildTransactionError, { message: /signature bytes/ });
88
+ });
89
+ });
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VXaXJlVHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvc2VyaWFsaXphdGlvbi9wYXJzZVdpcmVUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtCQUFnQjtBQUNoQiwwREFBNkI7QUFDN0IsZ0RBQXdCO0FBQ3hCLG1EQUE2RDtBQUM3RCw4RkFBcUg7QUFDckgsOEVBQW1GO0FBQ25GLDRFQUE0RjtBQUM1RixzRkFBMkY7QUFFM0YsTUFBTSxTQUFTLEdBQUcsOENBQThDLENBQUM7QUFDakUsTUFBTSxFQUFFLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDL0IsTUFBTSxDQUFDLEdBQUcsY0FBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDcEMsTUFBTSxDQUFDLEdBQUcsY0FBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUVyRCxTQUFTLGFBQWE7SUFDcEIsTUFBTSxNQUFNLEdBQUcsSUFBQSxrQ0FBeUIsRUFBQztRQUN2QyxnQkFBZ0IsRUFBRSxNQUFPO1FBQ3pCLFFBQVEsRUFBRSxJQUFJO1FBQ2QsMkJBQTJCLEVBQUUsSUFBSTtRQUNqQyxXQUFXLEVBQUUsSUFBSztLQUNuQixDQUFDLENBQUM7SUFDSCxPQUFPLElBQUEseUJBQWUsRUFBQztRQUNyQixNQUFNLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxFQUFFLDRCQUE0QixFQUFFLENBQUMsRUFBRTtRQUMvRixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDdkIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQzNCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFB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QU07WUFDM0IsU0FBUyxFQUFFLFNBQVM7WUFDcEIsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0QixvQkFBb0IsRUFBRSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDdEcsQ0FBQyxDQUFDO1FBQ0gsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLCtDQUF3QixFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQ0FBcUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IHBhcnNlV2lyZVRyYW5zYWN0aW9uLCB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uVjEgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3NlcmlhbGl6YXRpb24vcGFyc2VXaXJlVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZW5jb2RlVjFNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL2NvZGVjcy92MS9tZXNzYWdlJztcbmltcG9ydCB7IGVuY29kZUNvbmZpZ01hc2tBbmRWYWx1ZXMgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3NlcmlhbGl6YXRpb24vY29kZWNzL3YxL2NvbmZpZyc7XG5pbXBvcnQgeyBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3NlcmlhbGl6YXRpb24vd2lyZS10cmFuc2FjdGlvbic7XG5cbmNvbnN0IEJMT0NLSEFTSCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG5jb25zdCBrcCA9IG5hY2wuc2lnbi5rZXlQYWlyKCk7XG5jb25zdCBBID0gYnM1OC5lbmNvZGUoa3AucHVibGljS2V5KTtcbmNvbnN0IEIgPSBiczU4LmVuY29kZShuYWNsLnNpZ24ua2V5UGFpcigpLnB1YmxpY0tleSk7XG5cbmZ1bmN0aW9uIHNhbXBsZU1lc3NhZ2UoKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGNvbmZpZyA9IGVuY29kZUNvbmZpZ01hc2tBbmRWYWx1ZXMoe1xuICAgIGNvbXB1dGVVbml0TGltaXQ6IDIwMF8wMDAsXG4gICAgaGVhcFNpemU6IG51bGwsXG4gICAgbG9hZGVkQWNjb3VudHNEYXRhU2l6ZUxpbWl0OiBudWxsLFxuICAgIHByaW9yaXR5RmVlOiA1XzAwMCxcbiAgfSk7XG4gIHJldHVybiBlbmNvZGVWMU1lc3NhZ2Uoe1xuICAgIGhlYWRlcjogeyBudW1TaWduZXJBY2NvdW50czogMSwgbnVtUmVhZG9ubHlTaWduZXJBY2NvdW50czogMCwgbnVtUmVhZG9ubHlOb25TaWduZXJBY2NvdW50czogMSB9LFxuICAgIGNvbmZpZ01hc2s6IGNvbmZpZy5tYXNrLFxuICAgIGNvbmZpZ1ZhbHVlczogY29uZmlnLnZhbHVlcyxcbiAgICBibG9ja2hhc2g6IEJMT0NLSEFTSCxcbiAgICBzdGF0aWNBY2NvdW50czogW0EsIEJdLFxuICAgIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zOiBbeyBwcm9ncmFtQWRkcmVzc0luZGV4OiAxLCBhY2NvdW50SW5kaWNlczogWzAsIDFdLCBkYXRhOiBuZXcgVWludDhBcnJheShbMV0pIH1dLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2lnbihtZXNzYWdlQnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5W10ge1xuICByZXR1cm4gW25hY2wuc2lnbi5kZXRhY2hlZChtZXNzYWdlQnl0ZXMsIGtwLnNlY3JldEtleSldO1xufVxuXG5kZXNjcmliZSgncGFyc2VXaXJlVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGl0KCdzcGxpdHMgYSBzaWduZWQgdjEgdHJhbnNhY3Rpb24gaW50byBtZXNzYWdlICsgc2lnbmF0dXJlcyArIHNpZ25lciBwdWJrZXlzJywgKCkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VCeXRlcyA9IHNhbXBsZU1lc3NhZ2UoKTtcbiAgICBjb25zdCBzaWduYXR1cmVzID0gc2lnbihtZXNzYWdlQnl0ZXMpO1xuICAgIGNvbnN0IHdpcmUgPSBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb24obWVzc2FnZUJ5dGVzLCBzaWduYXR1cmVzKTtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVdpcmVUcmFuc2FjdGlvbih3aXJlKTtcbiAgICBwYXJzZWQubWVzc2FnZUJ5dGVzLnNob3VsZC5lcWwobWVzc2FnZUJ5dGVzKTtcbiAgICBwYXJzZWQuc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHBhcnNlZC5zaWduYXR1cmVzWzBdLnNob3VsZC5lcWwoc2lnbmF0dXJlc1swXSk7XG4gICAgcGFyc2VkLnNpZ25lclB1YmxpY0tleXMuc2hvdWxkLmVxbChbQV0pO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIHdpcmUgdHggd2hvc2UgdGFpbCBpcyBub3QgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBzaWduYXR1cmVzJywgKCkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VCeXRlcyA9IHNhbXBsZU1lc3NhZ2UoKTtcbiAgICBjb25zdCB3aXJlID0gc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uKG1lc3NhZ2VCeXRlcywgc2lnbihtZXNzYWdlQnl0ZXMpKTtcbiAgICBjb25zdCB0cnVuY2F0ZWQgPSB3aXJlLnN1YmFycmF5KDAsIHdpcmUubGVuZ3RoIC0gMSk7XG4gICAgKCgpID0+IHBhcnNlV2lyZVRyYW5zYWN0aW9uKHRydW5jYXRlZCkpLnNob3VsZC50aHJvdyhCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIG5vbi12MSB3aXJlIHR4JywgKCkgPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzB4MDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldKTtcbiAgICAoKCkgPT4gcGFyc2VXaXJlVHJhbnNhY3Rpb24oYnl0ZXMpKS5zaG91bGQudGhyb3coQnVpbGRUcmFuc2FjdGlvbkVycm9yLCB7IG1lc3NhZ2U6IC92ZXJzaW9uIHByZWZpeC8gfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uVjEnLCAoKSA9PiB7XG4gIGl0KCdhY2NlcHRzIGEgZnVsbHkgc2lnbmVkLCB2YWxpZCB2MSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlQnl0ZXMgPSBzYW1wbGVNZXNzYWdlKCk7XG4gICAgY29uc3Qgd2lyZSA9IHNlcmlhbGl6ZVdpcmVUcmFuc2FjdGlvbihtZXNzYWdlQnl0ZXMsIHNpZ24obWVzc2FnZUJ5dGVzKSk7XG4gICAgKCgpID0+IHZhbGlkYXRlUmF3VHJhbnNhY3Rpb25WMSh3aXJlKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIHRhbXBlcmVkIHNpZ25hdHVyZScsICgpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlQnl0ZXMgPSBzYW1wbGVNZXNzYWdlKCk7XG4gICAgY29uc3Qgd2lyZSA9IHNlcmlhbGl6ZVdpcmVUcmFuc2FjdGlvbihtZXNzYWdlQnl0ZXMsIHNpZ24obWVzc2FnZUJ5dGVzKSk7XG4gICAgY29uc3QgdGFtcGVyZWQgPSBuZXcgVWludDhBcnJheSh3aXJlKTtcbiAgICB0YW1wZXJlZFt0YW1wZXJlZC5sZW5ndGggLSAxXSBePSAweGZmO1xuICAgICgoKSA9PiB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uVjEodGFtcGVyZWQpKS5zaG91bGQudGhyb3coQnVpbGRUcmFuc2FjdGlvbkVycm9yLCB7IG1lc3NhZ2U6IC92ZXJpZmljYXRpb24gZmFpbGVkLyB9KTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgd2hlbiBhIHJlcXVpcmVkIHNpZ25hdHVyZSBpcyBtaXNzaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGVuY29kZUNvbmZpZ01hc2tBbmRWYWx1ZXMoe1xuICAgICAgY29tcHV0ZVVuaXRMaW1pdDogMjAwXzAwMCxcbiAgICAgIGhlYXBTaXplOiBudWxsLFxuICAgICAgbG9hZGVkQWNjb3VudHNEYXRhU2l6ZUxpbWl0OiBudWxsLFxuICAgICAgcHJpb3JpdHlGZWU6IDVfMDAwLFxuICAgIH0pO1xuICAgIGNvbnN0IG1zZyA9IGVuY29kZVYxTWVzc2FnZSh7XG4gICAgICBoZWFkZXI6IHsgbnVtU2lnbmVyQWNjb3VudHM6IDEsIG51bVJlYWRvbmx5U2lnbmVyQWNjb3VudHM6IDAsIG51bVJlYWRvbmx5Tm9uU2lnbmVyQWNjb3VudHM6IDEgfSxcbiAgICAgIGNvbmZpZ01hc2s6IGNvbmZpZy5tYXNrLFxuICAgICAgY29uZmlnVmFsdWVzOiBjb25maWcudmFsdWVzLFxuICAgICAgYmxvY2toYXNoOiBCTE9DS0hBU0gsXG4gICAgICBzdGF0aWNBY2NvdW50czogW0EsIEJdLFxuICAgICAgY29tcGlsZWRJbnN0cnVjdGlvbnM6IFt7IHByb2dyYW1BZGRyZXNzSW5kZXg6IDEsIGFjY291bnRJbmRpY2VzOiBbMCwgMV0sIGRhdGE6IG5ldyBVaW50OEFycmF5KFsxXSkgfV0sXG4gICAgfSk7XG4gICAgKCgpID0+IHZhbGlkYXRlUmF3VHJhbnNhY3Rpb25WMShtc2cpKS5zaG91bGQudGhyb3coQnVpbGRUcmFuc2FjdGlvbkVycm9yLCB7IG1lc3NhZ2U6IC9zaWduYXR1cmUgYnl0ZXMvIH0pO1xuICB9KTtcbn0pO1xuIl19