@bitgo/abstract-utxo 13.0.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.
- package/dist/cjs/src/impl/zec/index.d.ts +1 -0
- package/dist/cjs/src/impl/zec/index.d.ts.map +1 -1
- package/dist/cjs/src/impl/zec/index.js +2 -1
- package/dist/cjs/src/impl/zec/shieldedAddress.d.ts +36 -0
- package/dist/cjs/src/impl/zec/shieldedAddress.d.ts.map +1 -0
- package/dist/cjs/src/impl/zec/shieldedAddress.js +51 -0
- package/dist/cjs/src/impl/zec/signIronwoodTransaction.d.ts +29 -0
- package/dist/cjs/src/impl/zec/signIronwoodTransaction.d.ts.map +1 -0
- package/dist/cjs/src/impl/zec/signIronwoodTransaction.js +57 -0
- package/dist/cjs/src/impl/zec/zec.d.ts +16 -2
- package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -1
- package/dist/cjs/src/impl/zec/zec.js +38 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +7 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +32 -20
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +9 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signTransaction.js +18 -9
- package/dist/cjs/src/transaction/signTransaction.d.ts +12 -0
- package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/signTransaction.js +16 -7
- package/dist/cjs/test/unit/impl/zec/shieldedPrebuildAndSign.js +142 -1
- package/dist/cjs/test/unit/impl/zec/unit/shieldedAddress.d.ts +2 -0
- package/dist/cjs/test/unit/impl/zec/unit/shieldedAddress.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/zec/unit/shieldedAddress.js +57 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/impl/zec/index.d.ts +1 -0
- package/dist/esm/impl/zec/index.d.ts.map +1 -1
- package/dist/esm/impl/zec/index.js +2 -1
- package/dist/esm/impl/zec/shieldedAddress.d.ts +36 -0
- package/dist/esm/impl/zec/shieldedAddress.d.ts.map +1 -0
- package/dist/esm/impl/zec/shieldedAddress.js +48 -0
- package/dist/esm/impl/zec/signIronwoodTransaction.d.ts +29 -0
- package/dist/esm/impl/zec/signIronwoodTransaction.d.ts.map +1 -0
- package/dist/esm/impl/zec/signIronwoodTransaction.js +50 -0
- package/dist/esm/impl/zec/zec.d.ts +16 -2
- package/dist/esm/impl/zec/zec.d.ts.map +1 -1
- package/dist/esm/impl/zec/zec.js +36 -2
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +7 -0
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtWasm.js +30 -20
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts +9 -0
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signTransaction.js +17 -9
- package/dist/esm/transaction/signTransaction.d.ts +12 -0
- package/dist/esm/transaction/signTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/signTransaction.js +15 -8
- package/package.json +6 -6
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
8
|
+
const zec_1 = require("../../../../../src/impl/zec");
|
|
9
|
+
// ZIP-316 unified-address test vector, copied from
|
|
10
|
+
// BitGoWASM/packages/wasm-utxo/test/fixtures/zcash/unified_address.json so
|
|
11
|
+
// both repos test against the same known-good data.
|
|
12
|
+
const testnetWallet = {
|
|
13
|
+
unified: 'utest1w5m0qcnp8egl8qa296n70n8nvj0tqnzk90p7f48v7mjhhdrdqs8vgqydslg5plmzefawefnpmgmlm6hcy38m972erwxs04s02cq2prhguz8kqly75m6zjy56m08d5jnycgtpqtjeprte576gkmrxyszepgx76yzuwhh7m4lfz9jaq7unjk0x5ant46juxz73hsc6q4v3dqtzww00vps',
|
|
14
|
+
transparentAddress: 'tmM4DvLVJKXZt5ydn1tqYTHvahpKSwgjuRk',
|
|
15
|
+
};
|
|
16
|
+
const toHex = (bytes) => Buffer.from(bytes).toString('hex');
|
|
17
|
+
/** Wallet-platform style `coinSpecific.shielded` derived from the UA itself. */
|
|
18
|
+
function shieldedCoinSpecificFor(address, network) {
|
|
19
|
+
const orchard = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.parse(address, network).orchardReceiver;
|
|
20
|
+
return {
|
|
21
|
+
shielded: {
|
|
22
|
+
type: 'ironwood',
|
|
23
|
+
diversifier: toHex(orchard.slice(0, 11)),
|
|
24
|
+
pkD: toHex(orchard.slice(11)),
|
|
25
|
+
diversifierIndex: 0,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
describe('assertShieldedWalletAddress', function () {
|
|
30
|
+
const coinSpecific = shieldedCoinSpecificFor(testnetWallet.unified, 'tzec');
|
|
31
|
+
it('accepts a unified address whose Orchard receiver matches the reported diversifier/pkD', function () {
|
|
32
|
+
(0, zec_1.assertShieldedWalletAddress)('tzec', { address: testnetWallet.unified, coinSpecific });
|
|
33
|
+
});
|
|
34
|
+
it('rejects a unified address whose Orchard receiver does not match the reported pkD', function () {
|
|
35
|
+
strict_1.default.throws(() => (0, zec_1.assertShieldedWalletAddress)('tzec', {
|
|
36
|
+
address: testnetWallet.unified,
|
|
37
|
+
coinSpecific: { shielded: { ...coinSpecific.shielded, pkD: '00'.repeat(32) } },
|
|
38
|
+
}), /Orchard receiver does not match/);
|
|
39
|
+
});
|
|
40
|
+
it('rejects when shielded coinSpecific is missing', function () {
|
|
41
|
+
strict_1.default.throws(() => (0, zec_1.assertShieldedWalletAddress)('tzec', { address: testnetWallet.unified }), /missing diversifier/);
|
|
42
|
+
});
|
|
43
|
+
it('rejects malformed diversifier/pkD lengths', function () {
|
|
44
|
+
strict_1.default.throws(() => (0, zec_1.assertShieldedWalletAddress)('tzec', {
|
|
45
|
+
address: testnetWallet.unified,
|
|
46
|
+
coinSpecific: { shielded: { ...coinSpecific.shielded, diversifier: '00' } },
|
|
47
|
+
}), /invalid diversifier length/);
|
|
48
|
+
strict_1.default.throws(() => (0, zec_1.assertShieldedWalletAddress)('tzec', {
|
|
49
|
+
address: testnetWallet.unified,
|
|
50
|
+
coinSpecific: { shielded: { ...coinSpecific.shielded, pkD: '00' } },
|
|
51
|
+
}), /invalid pkD length/);
|
|
52
|
+
});
|
|
53
|
+
it('rejects an address that is not a unified address', function () {
|
|
54
|
+
strict_1.default.throws(() => (0, zec_1.assertShieldedWalletAddress)('tzec', { address: testnetWallet.transparentAddress, coinSpecific }), /not a valid unified address/);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpZWxkZWRBZGRyZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2ltcGwvemVjL3VuaXQvc2hpZWxkZWRBZGRyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsZ0VBQXdDO0FBRXhDLGdEQUFxRDtBQUVyRCxxREFBMEU7QUFFMUUsbURBQW1EO0FBQ25ELDJFQUEyRTtBQUMzRSxvREFBb0Q7QUFDcEQsTUFBTSxhQUFhLEdBQUc7SUFDcEIsT0FBTyxFQUNMLDJOQUEyTjtJQUM3TixrQkFBa0IsRUFBRSxxQ0FBcUM7Q0FDMUQsQ0FBQztBQUVGLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBaUIsRUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFaEYsZ0ZBQWdGO0FBQ2hGLFNBQVMsdUJBQXVCLENBQUMsT0FBZSxFQUFFLE9BQTJDO0lBQzNGLE1BQU0sT0FBTyxHQUFHLDZCQUFpQixDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsZUFBZ0IsQ0FBQztJQUMvRixPQUFPO1FBQ0wsUUFBUSxFQUFFO1lBQ1IsSUFBSSxFQUFFLFVBQVU7WUFDaEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4QyxHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsZ0JBQWdCLEVBQUUsQ0FBQztTQUNwQjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsUUFBUSxDQUFDLDZCQUE2QixFQUFFO0lBQ3RDLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFNUUsRUFBRSxDQUFDLHVGQUF1RixFQUFFO1FBQzFGLElBQUEsaUNBQTJCLEVBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrRkFBa0YsRUFBRTtRQUNyRixnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FDSCxJQUFBLGlDQUEyQixFQUFDLE1BQU0sRUFBRTtZQUNsQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDOUIsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7U0FDL0UsQ0FBQyxFQUNKLGlDQUFpQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUU7UUFDbEQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxpQ0FBMkIsRUFBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUN0SCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtRQUM5QyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FDSCxJQUFBLGlDQUEyQixFQUFDLE1BQU0sRUFBRTtZQUNsQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDOUIsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRTtTQUM1RSxDQUFDLEVBQ0osNEJBQTRCLENBQzdCLENBQUM7UUFDRixnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FDSCxJQUFBLGlDQUEyQixFQUFDLE1BQU0sRUFBRTtZQUNsQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87WUFDOUIsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtTQUNwRSxDQUFDLEVBQ0osb0JBQW9CLENBQ3JCLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrREFBa0QsRUFBRTtRQUNyRCxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxJQUFBLGlDQUEyQixFQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFDdEcsNkJBQTZCLENBQzlCLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydC9zdHJpY3QnO1xuXG5pbXBvcnQgeyBmaXhlZFNjcmlwdFdhbGxldCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBhc3NlcnRTaGllbGRlZFdhbGxldEFkZHJlc3MgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zcmMvaW1wbC96ZWMnO1xuXG4vLyBaSVAtMzE2IHVuaWZpZWQtYWRkcmVzcyB0ZXN0IHZlY3RvciwgY29waWVkIGZyb21cbi8vIEJpdEdvV0FTTS9wYWNrYWdlcy93YXNtLXV0eG8vdGVzdC9maXh0dXJlcy96Y2FzaC91bmlmaWVkX2FkZHJlc3MuanNvbiBzb1xuLy8gYm90aCByZXBvcyB0ZXN0IGFnYWluc3QgdGhlIHNhbWUga25vd24tZ29vZCBkYXRhLlxuY29uc3QgdGVzdG5ldFdhbGxldCA9IHtcbiAgdW5pZmllZDpcbiAgICAndXRlc3QxdzVtMHFjbnA4ZWdsOHFhMjk2bjcwbjhudmowdHFuems5MHA3ZjQ4djdtamhoZHJkcXM4dmdxeWRzbGc1cGxtemVmYXdlZm5wbWdtbG02aGN5MzhtOTcyZXJ3eHMwNHMwMmNxMnByaGd1ejhrcWx5NzVtNnpqeTU2bTA4ZDVqbnljZ3RwcXRqZXBydGU1NzZna21yeHlzemVwZ3g3Nnl6dXdoaDdtNGxmejlqYXE3dW5qazB4NWFudDQ2anV4ejczaHNjNnE0djNkcXR6d3cwMHZwcycsXG4gIHRyYW5zcGFyZW50QWRkcmVzczogJ3RtTTREdkxWSktYWnQ1eWRuMXRxWVRIdmFocEtTd2dqdVJrJyxcbn07XG5cbmNvbnN0IHRvSGV4ID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IEJ1ZmZlci5mcm9tKGJ5dGVzKS50b1N0cmluZygnaGV4Jyk7XG5cbi8qKiBXYWxsZXQtcGxhdGZvcm0gc3R5bGUgYGNvaW5TcGVjaWZpYy5zaGllbGRlZGAgZGVyaXZlZCBmcm9tIHRoZSBVQSBpdHNlbGYuICovXG5mdW5jdGlvbiBzaGllbGRlZENvaW5TcGVjaWZpY0ZvcihhZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoTmV0d29ya05hbWUpIHtcbiAgY29uc3Qgb3JjaGFyZCA9IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MucGFyc2UoYWRkcmVzcywgbmV0d29yaykub3JjaGFyZFJlY2VpdmVyITtcbiAgcmV0dXJuIHtcbiAgICBzaGllbGRlZDoge1xuICAgICAgdHlwZTogJ2lyb253b29kJyxcbiAgICAgIGRpdmVyc2lmaWVyOiB0b0hleChvcmNoYXJkLnNsaWNlKDAsIDExKSksXG4gICAgICBwa0Q6IHRvSGV4KG9yY2hhcmQuc2xpY2UoMTEpKSxcbiAgICAgIGRpdmVyc2lmaWVySW5kZXg6IDAsXG4gICAgfSxcbiAgfTtcbn1cblxuZGVzY3JpYmUoJ2Fzc2VydFNoaWVsZGVkV2FsbGV0QWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pblNwZWNpZmljID0gc2hpZWxkZWRDb2luU3BlY2lmaWNGb3IodGVzdG5ldFdhbGxldC51bmlmaWVkLCAndHplYycpO1xuXG4gIGl0KCdhY2NlcHRzIGEgdW5pZmllZCBhZGRyZXNzIHdob3NlIE9yY2hhcmQgcmVjZWl2ZXIgbWF0Y2hlcyB0aGUgcmVwb3J0ZWQgZGl2ZXJzaWZpZXIvcGtEJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydFNoaWVsZGVkV2FsbGV0QWRkcmVzcygndHplYycsIHsgYWRkcmVzczogdGVzdG5ldFdhbGxldC51bmlmaWVkLCBjb2luU3BlY2lmaWMgfSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgdW5pZmllZCBhZGRyZXNzIHdob3NlIE9yY2hhcmQgcmVjZWl2ZXIgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcG9ydGVkIHBrRCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT5cbiAgICAgICAgYXNzZXJ0U2hpZWxkZWRXYWxsZXRBZGRyZXNzKCd0emVjJywge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3RuZXRXYWxsZXQudW5pZmllZCxcbiAgICAgICAgICBjb2luU3BlY2lmaWM6IHsgc2hpZWxkZWQ6IHsgLi4uY29pblNwZWNpZmljLnNoaWVsZGVkLCBwa0Q6ICcwMCcucmVwZWF0KDMyKSB9IH0sXG4gICAgICAgIH0pLFxuICAgICAgL09yY2hhcmQgcmVjZWl2ZXIgZG9lcyBub3QgbWF0Y2gvXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgd2hlbiBzaGllbGRlZCBjb2luU3BlY2lmaWMgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGFzc2VydFNoaWVsZGVkV2FsbGV0QWRkcmVzcygndHplYycsIHsgYWRkcmVzczogdGVzdG5ldFdhbGxldC51bmlmaWVkIH0pLCAvbWlzc2luZyBkaXZlcnNpZmllci8pO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBtYWxmb3JtZWQgZGl2ZXJzaWZpZXIvcGtEIGxlbmd0aHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+XG4gICAgICAgIGFzc2VydFNoaWVsZGVkV2FsbGV0QWRkcmVzcygndHplYycsIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0bmV0V2FsbGV0LnVuaWZpZWQsXG4gICAgICAgICAgY29pblNwZWNpZmljOiB7IHNoaWVsZGVkOiB7IC4uLmNvaW5TcGVjaWZpYy5zaGllbGRlZCwgZGl2ZXJzaWZpZXI6ICcwMCcgfSB9LFxuICAgICAgICB9KSxcbiAgICAgIC9pbnZhbGlkIGRpdmVyc2lmaWVyIGxlbmd0aC9cbiAgICApO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PlxuICAgICAgICBhc3NlcnRTaGllbGRlZFdhbGxldEFkZHJlc3MoJ3R6ZWMnLCB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdG5ldFdhbGxldC51bmlmaWVkLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzogeyBzaGllbGRlZDogeyAuLi5jb2luU3BlY2lmaWMuc2hpZWxkZWQsIHBrRDogJzAwJyB9IH0sXG4gICAgICAgIH0pLFxuICAgICAgL2ludmFsaWQgcGtEIGxlbmd0aC9cbiAgICApO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhbiBhZGRyZXNzIHRoYXQgaXMgbm90IGEgdW5pZmllZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiBhc3NlcnRTaGllbGRlZFdhbGxldEFkZHJlc3MoJ3R6ZWMnLCB7IGFkZHJlc3M6IHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzLCBjb2luU3BlY2lmaWMgfSksXG4gICAgICAvbm90IGEgdmFsaWQgdW5pZmllZCBhZGRyZXNzL1xuICAgICk7XG4gIH0pO1xufSk7XG4iXX0=
|