@bitgo-beta/utxo-core 1.8.1-beta.80 → 1.8.1-beta.82
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/src/paygo/index.d.ts +1 -1
- package/dist/src/paygo/index.d.ts.map +1 -1
- package/dist/src/paygo/index.js +2 -2
- package/dist/src/paygo/{ExtractAddressPayGoAttestation.d.ts → parsePayGoAttestation.d.ts} +6 -2
- package/dist/src/paygo/parsePayGoAttestation.d.ts.map +1 -0
- package/dist/src/paygo/parsePayGoAttestation.js +46 -0
- package/package.json +4 -4
- package/dist/src/paygo/ExtractAddressPayGoAttestation.d.ts.map +0 -1
- package/dist/src/paygo/ExtractAddressPayGoAttestation.js +0 -44
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/paygo/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/paygo/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,QAAQ,CAAC"}
|
package/dist/src/paygo/index.js
CHANGED
|
@@ -14,6 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
17
|
+
__exportStar(require("./parsePayGoAttestation"), exports);
|
|
18
18
|
__exportStar(require("./psbt"), exports);
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGF5Z28vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBEQUF3QztBQUN4Qyx5Q0FBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3BhcnNlUGF5R29BdHRlc3RhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3BzYnQnO1xuIl19
|
|
@@ -7,5 +7,9 @@
|
|
|
7
7
|
* @param message
|
|
8
8
|
* @param adressProofLength
|
|
9
9
|
*/
|
|
10
|
-
export declare function
|
|
11
|
-
|
|
10
|
+
export declare function parsePayGoAttestation(message: Buffer): {
|
|
11
|
+
entropy: Buffer;
|
|
12
|
+
address: Buffer;
|
|
13
|
+
uuid: Buffer;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=parsePayGoAttestation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsePayGoAttestation.d.ts","sourceRoot":"","sources":["../../../src/paygo/parsePayGoAttestation.ts"],"names":[],"mappings":"AAcA;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAuBA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
exports.parsePayGoAttestation = parsePayGoAttestation;
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
9
|
+
// The signed address will always have the following structure:
|
|
10
|
+
// 0x18Bitcoin Signed Message:\n<varint_length><ENTROPY><ADDRESS><UUID>
|
|
11
|
+
const PrefixLength = Buffer.from([0x18]).length + Buffer.from('Bitcoin Signed Message:\n').length;
|
|
12
|
+
// UUID has the structure 00000000-0000-0000-0000-000000000000, and after
|
|
13
|
+
// we Buffer.from and get it's length its 36.
|
|
14
|
+
const UuidBufferLength = 36;
|
|
15
|
+
// The entropy will always be 64 bytes
|
|
16
|
+
const EntropyLen = 64;
|
|
17
|
+
/**
|
|
18
|
+
* This function takes in the attestation proof of a PayGo address of the from
|
|
19
|
+
* 0x18Bitcoin Signed Message:\n<varint_length><ENTROPY><ADDRESS><UUID> and returns
|
|
20
|
+
* the address given its length. It is assumed that the ENTROPY is 64 bytes in the Buffer
|
|
21
|
+
* so if not given an address proof length we can still extract the address from the proof.
|
|
22
|
+
*
|
|
23
|
+
* @param message
|
|
24
|
+
* @param adressProofLength
|
|
25
|
+
*/
|
|
26
|
+
function parsePayGoAttestation(message) {
|
|
27
|
+
if (message.length <= PrefixLength + EntropyLen + UuidBufferLength) {
|
|
28
|
+
throw new Error('PayGo attestation proof is too short to contain a valid address');
|
|
29
|
+
}
|
|
30
|
+
// This generates the first part before the varint length so that we can
|
|
31
|
+
// determine how many bytes this is and iterate through the Buffer.
|
|
32
|
+
let offset = PrefixLength;
|
|
33
|
+
// we decode the varint of the message which is uint32
|
|
34
|
+
// https://en.bitcoin.it/wiki/Protocol_documentation
|
|
35
|
+
const varInt = utxo_lib_1.bufferutils.varuint.decode(message, offset);
|
|
36
|
+
(0, assert_1.default)(varInt);
|
|
37
|
+
offset += utxo_lib_1.bufferutils.varuint.decode.bytes;
|
|
38
|
+
const entropy = message.subarray(offset, offset + EntropyLen);
|
|
39
|
+
offset += EntropyLen;
|
|
40
|
+
const address = message.subarray(offset, message.length - UuidBufferLength);
|
|
41
|
+
offset += address.length;
|
|
42
|
+
const uuid = message.subarray(message.length - UuidBufferLength);
|
|
43
|
+
// we break up the original message and retuen the entropy, address and uuid in their buffers
|
|
44
|
+
return { entropy, address, uuid };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VQYXlHb0F0dGVzdGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BheWdvL3BhcnNlUGF5R29BdHRlc3RhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXVCQSxzREEyQkM7QUFsREQsb0RBQTRCO0FBRTVCLG1EQUFtRDtBQUVuRCwrREFBK0Q7QUFDL0QsdUVBQXVFO0FBRXZFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ2xHLHlFQUF5RTtBQUN6RSw2Q0FBNkM7QUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsc0NBQXNDO0FBQ3RDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUV0Qjs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLE9BQWU7SUFLbkQsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLFlBQVksR0FBRyxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNuRSxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSxtRUFBbUU7SUFDbkUsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDO0lBRTFCLHNEQUFzRDtJQUN0RCxvREFBb0Q7SUFDcEQsTUFBTSxNQUFNLEdBQUcsc0JBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxJQUFBLGdCQUFNLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDZixNQUFNLElBQUksc0JBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUUzQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDOUQsTUFBTSxJQUFJLFVBQVUsQ0FBQztJQUNyQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLENBQUM7SUFDNUUsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDekIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLENBQUM7SUFFakUsNkZBQTZGO0lBQzdGLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IGJ1ZmZlcnV0aWxzIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG4vLyBUaGUgc2lnbmVkIGFkZHJlc3Mgd2lsbCBhbHdheXMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbi8vIDB4MThCaXRjb2luIFNpZ25lZCBNZXNzYWdlOlxcbjx2YXJpbnRfbGVuZ3RoPjxFTlRST1BZPjxBRERSRVNTPjxVVUlEPlxuXG5jb25zdCBQcmVmaXhMZW5ndGggPSBCdWZmZXIuZnJvbShbMHgxOF0pLmxlbmd0aCArIEJ1ZmZlci5mcm9tKCdCaXRjb2luIFNpZ25lZCBNZXNzYWdlOlxcbicpLmxlbmd0aDtcbi8vIFVVSUQgaGFzIHRoZSBzdHJ1Y3R1cmUgMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwLCBhbmQgYWZ0ZXJcbi8vIHdlIEJ1ZmZlci5mcm9tIGFuZCBnZXQgaXQncyBsZW5ndGggaXRzIDM2LlxuY29uc3QgVXVpZEJ1ZmZlckxlbmd0aCA9IDM2O1xuLy8gVGhlIGVudHJvcHkgd2lsbCBhbHdheXMgYmUgNjQgYnl0ZXNcbmNvbnN0IEVudHJvcHlMZW4gPSA2NDtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGluIHRoZSBhdHRlc3RhdGlvbiBwcm9vZiBvZiBhIFBheUdvIGFkZHJlc3Mgb2YgdGhlIGZyb21cbiAqIDB4MThCaXRjb2luIFNpZ25lZCBNZXNzYWdlOlxcbjx2YXJpbnRfbGVuZ3RoPjxFTlRST1BZPjxBRERSRVNTPjxVVUlEPiBhbmQgcmV0dXJuc1xuICogdGhlIGFkZHJlc3MgZ2l2ZW4gaXRzIGxlbmd0aC4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBFTlRST1BZIGlzIDY0IGJ5dGVzIGluIHRoZSBCdWZmZXJcbiAqIHNvIGlmIG5vdCBnaXZlbiBhbiBhZGRyZXNzIHByb29mIGxlbmd0aCB3ZSBjYW4gc3RpbGwgZXh0cmFjdCB0aGUgYWRkcmVzcyBmcm9tIHRoZSBwcm9vZi5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZVxuICogQHBhcmFtIGFkcmVzc1Byb29mTGVuZ3RoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBheUdvQXR0ZXN0YXRpb24obWVzc2FnZTogQnVmZmVyKToge1xuICBlbnRyb3B5OiBCdWZmZXI7XG4gIGFkZHJlc3M6IEJ1ZmZlcjtcbiAgdXVpZDogQnVmZmVyO1xufSB7XG4gIGlmIChtZXNzYWdlLmxlbmd0aCA8PSBQcmVmaXhMZW5ndGggKyBFbnRyb3B5TGVuICsgVXVpZEJ1ZmZlckxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGF5R28gYXR0ZXN0YXRpb24gcHJvb2YgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4gYSB2YWxpZCBhZGRyZXNzJyk7XG4gIH1cblxuICAvLyBUaGlzIGdlbmVyYXRlcyB0aGUgZmlyc3QgcGFydCBiZWZvcmUgdGhlIHZhcmludCBsZW5ndGggc28gdGhhdCB3ZSBjYW5cbiAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoaXMgaXMgYW5kIGl0ZXJhdGUgdGhyb3VnaCB0aGUgQnVmZmVyLlxuICBsZXQgb2Zmc2V0ID0gUHJlZml4TGVuZ3RoO1xuXG4gIC8vIHdlIGRlY29kZSB0aGUgdmFyaW50IG9mIHRoZSBtZXNzYWdlIHdoaWNoIGlzIHVpbnQzMlxuICAvLyBodHRwczovL2VuLmJpdGNvaW4uaXQvd2lraS9Qcm90b2NvbF9kb2N1bWVudGF0aW9uXG4gIGNvbnN0IHZhckludCA9IGJ1ZmZlcnV0aWxzLnZhcnVpbnQuZGVjb2RlKG1lc3NhZ2UsIG9mZnNldCk7XG4gIGFzc2VydCh2YXJJbnQpO1xuICBvZmZzZXQgKz0gYnVmZmVydXRpbHMudmFydWludC5kZWNvZGUuYnl0ZXM7XG5cbiAgY29uc3QgZW50cm9weSA9IG1lc3NhZ2Uuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBFbnRyb3B5TGVuKTtcbiAgb2Zmc2V0ICs9IEVudHJvcHlMZW47XG4gIGNvbnN0IGFkZHJlc3MgPSBtZXNzYWdlLnN1YmFycmF5KG9mZnNldCwgbWVzc2FnZS5sZW5ndGggLSBVdWlkQnVmZmVyTGVuZ3RoKTtcbiAgb2Zmc2V0ICs9IGFkZHJlc3MubGVuZ3RoO1xuICBjb25zdCB1dWlkID0gbWVzc2FnZS5zdWJhcnJheShtZXNzYWdlLmxlbmd0aCAtIFV1aWRCdWZmZXJMZW5ndGgpO1xuXG4gIC8vIHdlIGJyZWFrIHVwIHRoZSBvcmlnaW5hbCBtZXNzYWdlIGFuZCByZXR1ZW4gdGhlIGVudHJvcHksIGFkZHJlc3MgYW5kIHV1aWQgaW4gdGhlaXIgYnVmZmVyc1xuICByZXR1cm4geyBlbnRyb3B5LCBhZGRyZXNzLCB1dWlkIH07XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/utxo-core",
|
|
3
|
-
"version": "1.8.1-beta.
|
|
3
|
+
"version": "1.8.1-beta.82",
|
|
4
4
|
"description": "BitGo UTXO Core types",
|
|
5
5
|
"main": "./dist/src/index.js",
|
|
6
6
|
"types": "./dist/src/index.d.ts",
|
|
@@ -51,8 +51,8 @@
|
|
|
51
51
|
]
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@bitgo-beta/unspents": "0.13.2-beta.
|
|
55
|
-
"@bitgo-beta/utxo-lib": "8.0.3-beta.
|
|
54
|
+
"@bitgo-beta/unspents": "0.13.2-beta.965",
|
|
55
|
+
"@bitgo-beta/utxo-lib": "8.0.3-beta.966",
|
|
56
56
|
"@bitgo/wasm-miniscript": "2.0.0-beta.7",
|
|
57
57
|
"bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4",
|
|
58
58
|
"bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.3",
|
|
@@ -61,5 +61,5 @@
|
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@types/lodash": "^4.14.151"
|
|
63
63
|
},
|
|
64
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "7431ae0e68e3829f834ccbde4b45daa2fe064753"
|
|
65
65
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ExtractAddressPayGoAttestation.d.ts","sourceRoot":"","sources":["../../../src/paygo/ExtractAddressPayGoAttestation.ts"],"names":[],"mappings":"AAcA;;;;;;;;GAQG;AACH,wBAAgB,6CAA6C,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAqBrF"}
|
|
@@ -1,44 +0,0 @@
|
|
|
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
|
-
exports.extractAddressBufferFromPayGoAttestationProof = extractAddressBufferFromPayGoAttestationProof;
|
|
7
|
-
const assert_1 = __importDefault(require("assert"));
|
|
8
|
-
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
9
|
-
// The signed address will always have the following structure:
|
|
10
|
-
// 0x18Bitcoin Signed Message:\n<varint_length><ENTROPY><ADDRESS><UUID>
|
|
11
|
-
const PrefixLength = Buffer.from([0x18]).length + Buffer.from('Bitcoin Signed Message:\n').length;
|
|
12
|
-
// UUID has the structure 00000000-0000-0000-0000-000000000000, and after
|
|
13
|
-
// we Buffer.from and get it's length its 36.
|
|
14
|
-
const UuidBufferLength = 36;
|
|
15
|
-
// The entropy will always be 64 bytes
|
|
16
|
-
const EntropyLen = 64;
|
|
17
|
-
/**
|
|
18
|
-
* This function takes in the attestation proof of a PayGo address of the from
|
|
19
|
-
* 0x18Bitcoin Signed Message:\n<varint_length><ENTROPY><ADDRESS><UUID> and returns
|
|
20
|
-
* the address given its length. It is assumed that the ENTROPY is 64 bytes in the Buffer
|
|
21
|
-
* so if not given an address proof length we can still extract the address from the proof.
|
|
22
|
-
*
|
|
23
|
-
* @param message
|
|
24
|
-
* @param adressProofLength
|
|
25
|
-
*/
|
|
26
|
-
function extractAddressBufferFromPayGoAttestationProof(message) {
|
|
27
|
-
if (message.length <= PrefixLength + EntropyLen + UuidBufferLength) {
|
|
28
|
-
throw new Error('PayGo attestation proof is too short to contain a valid address');
|
|
29
|
-
}
|
|
30
|
-
// This generates the first part before the varint length so that we can
|
|
31
|
-
// determine how many bytes this is and iterate through the Buffer.
|
|
32
|
-
let offset = PrefixLength;
|
|
33
|
-
// we decode the varint of the message which is uint32
|
|
34
|
-
// https://en.bitcoin.it/wiki/Protocol_documentation
|
|
35
|
-
const varInt = utxo_lib_1.bufferutils.varuint.decode(message, offset);
|
|
36
|
-
(0, assert_1.default)(varInt);
|
|
37
|
-
offset += 1;
|
|
38
|
-
const addressLength = varInt - EntropyLen - UuidBufferLength;
|
|
39
|
-
offset += EntropyLen;
|
|
40
|
-
// we return what the Buffer subarray from the offset (beginning of address)
|
|
41
|
-
// to the end of the address index in the buffer.
|
|
42
|
-
return message.subarray(offset, offset + addressLength);
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXh0cmFjdEFkZHJlc3NQYXlHb0F0dGVzdGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BheWdvL0V4dHJhY3RBZGRyZXNzUGF5R29BdHRlc3RhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXVCQSxzR0FxQkM7QUE1Q0Qsb0RBQTRCO0FBRTVCLG1EQUFtRDtBQUVuRCwrREFBK0Q7QUFDL0QsdUVBQXVFO0FBRXZFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ2xHLHlFQUF5RTtBQUN6RSw2Q0FBNkM7QUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsc0NBQXNDO0FBQ3RDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUV0Qjs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLDZDQUE2QyxDQUFDLE9BQWU7SUFDM0UsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLFlBQVksR0FBRyxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNuRSxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSxtRUFBbUU7SUFDbkUsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDO0lBRTFCLHNEQUFzRDtJQUN0RCxvREFBb0Q7SUFDcEQsTUFBTSxNQUFNLEdBQUcsc0JBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxJQUFBLGdCQUFNLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDZixNQUFNLElBQUksQ0FBQyxDQUFDO0lBRVosTUFBTSxhQUFhLEdBQUcsTUFBTSxHQUFHLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztJQUM3RCxNQUFNLElBQUksVUFBVSxDQUFDO0lBRXJCLDRFQUE0RTtJQUM1RSxpREFBaUQ7SUFDakQsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsYUFBYSxDQUFDLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgYnVmZmVydXRpbHMgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbi8vIFRoZSBzaWduZWQgYWRkcmVzcyB3aWxsIGFsd2F5cyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuLy8gMHgxOEJpdGNvaW4gU2lnbmVkIE1lc3NhZ2U6XFxuPHZhcmludF9sZW5ndGg+PEVOVFJPUFk+PEFERFJFU1M+PFVVSUQ+XG5cbmNvbnN0IFByZWZpeExlbmd0aCA9IEJ1ZmZlci5mcm9tKFsweDE4XSkubGVuZ3RoICsgQnVmZmVyLmZyb20oJ0JpdGNvaW4gU2lnbmVkIE1lc3NhZ2U6XFxuJykubGVuZ3RoO1xuLy8gVVVJRCBoYXMgdGhlIHN0cnVjdHVyZSAwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAsIGFuZCBhZnRlclxuLy8gd2UgQnVmZmVyLmZyb20gYW5kIGdldCBpdCdzIGxlbmd0aCBpdHMgMzYuXG5jb25zdCBVdWlkQnVmZmVyTGVuZ3RoID0gMzY7XG4vLyBUaGUgZW50cm9weSB3aWxsIGFsd2F5cyBiZSA2NCBieXRlc1xuY29uc3QgRW50cm9weUxlbiA9IDY0O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gdGhlIGF0dGVzdGF0aW9uIHByb29mIG9mIGEgUGF5R28gYWRkcmVzcyBvZiB0aGUgZnJvbVxuICogMHgxOEJpdGNvaW4gU2lnbmVkIE1lc3NhZ2U6XFxuPHZhcmludF9sZW5ndGg+PEVOVFJPUFk+PEFERFJFU1M+PFVVSUQ+IGFuZCByZXR1cm5zXG4gKiB0aGUgYWRkcmVzcyBnaXZlbiBpdHMgbGVuZ3RoLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIEVOVFJPUFkgaXMgNjQgYnl0ZXMgaW4gdGhlIEJ1ZmZlclxuICogc28gaWYgbm90IGdpdmVuIGFuIGFkZHJlc3MgcHJvb2YgbGVuZ3RoIHdlIGNhbiBzdGlsbCBleHRyYWN0IHRoZSBhZGRyZXNzIGZyb20gdGhlIHByb29mLlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlXG4gKiBAcGFyYW0gYWRyZXNzUHJvb2ZMZW5ndGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RBZGRyZXNzQnVmZmVyRnJvbVBheUdvQXR0ZXN0YXRpb25Qcm9vZihtZXNzYWdlOiBCdWZmZXIpOiBCdWZmZXIge1xuICBpZiAobWVzc2FnZS5sZW5ndGggPD0gUHJlZml4TGVuZ3RoICsgRW50cm9weUxlbiArIFV1aWRCdWZmZXJMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BheUdvIGF0dGVzdGF0aW9uIHByb29mIGlzIHRvbyBzaG9ydCB0byBjb250YWluIGEgdmFsaWQgYWRkcmVzcycpO1xuICB9XG5cbiAgLy8gVGhpcyBnZW5lcmF0ZXMgdGhlIGZpcnN0IHBhcnQgYmVmb3JlIHRoZSB2YXJpbnQgbGVuZ3RoIHNvIHRoYXQgd2UgY2FuXG4gIC8vIGRldGVybWluZSBob3cgbWFueSBieXRlcyB0aGlzIGlzIGFuZCBpdGVyYXRlIHRocm91Z2ggdGhlIEJ1ZmZlci5cbiAgbGV0IG9mZnNldCA9IFByZWZpeExlbmd0aDtcblxuICAvLyB3ZSBkZWNvZGUgdGhlIHZhcmludCBvZiB0aGUgbWVzc2FnZSB3aGljaCBpcyB1aW50MzJcbiAgLy8gaHR0cHM6Ly9lbi5iaXRjb2luLml0L3dpa2kvUHJvdG9jb2xfZG9jdW1lbnRhdGlvblxuICBjb25zdCB2YXJJbnQgPSBidWZmZXJ1dGlscy52YXJ1aW50LmRlY29kZShtZXNzYWdlLCBvZmZzZXQpO1xuICBhc3NlcnQodmFySW50KTtcbiAgb2Zmc2V0ICs9IDE7XG5cbiAgY29uc3QgYWRkcmVzc0xlbmd0aCA9IHZhckludCAtIEVudHJvcHlMZW4gLSBVdWlkQnVmZmVyTGVuZ3RoO1xuICBvZmZzZXQgKz0gRW50cm9weUxlbjtcblxuICAvLyB3ZSByZXR1cm4gd2hhdCB0aGUgQnVmZmVyIHN1YmFycmF5IGZyb20gdGhlIG9mZnNldCAoYmVnaW5uaW5nIG9mIGFkZHJlc3MpXG4gIC8vIHRvIHRoZSBlbmQgb2YgdGhlIGFkZHJlc3MgaW5kZXggaW4gdGhlIGJ1ZmZlci5cbiAgcmV0dXJuIG1lc3NhZ2Uuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBhZGRyZXNzTGVuZ3RoKTtcbn1cbiJdfQ==
|