Implement incremental Merkle tree
This commit is contained in:
parent
1f087f72d8
commit
c9594b7a12
|
@ -26,6 +26,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bs58check": "2.0.2",
|
"bs58check": "2.0.2",
|
||||||
"libsodium-wrappers-sumo": "0.5.1",
|
"libsodium-wrappers-sumo": "0.5.1",
|
||||||
"typeforce": "1.11.1"
|
"typeforce": "1.11.1",
|
||||||
|
"varuint-bitcoin": "1.0.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,328 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
var varuint = require('varuint-bitcoin')
|
||||||
|
|
||||||
|
var SHA256Compress = require('./sha256compress')
|
||||||
|
|
||||||
|
var INCREMENTAL_MERKLE_TREE_DEPTH = 29
|
||||||
|
|
||||||
|
function combine (left, right) {
|
||||||
|
var blob = Buffer.alloc(64)
|
||||||
|
left.copy(blob, 0)
|
||||||
|
right.copy(blob, 32)
|
||||||
|
|
||||||
|
var hasher = new SHA256Compress()
|
||||||
|
hasher.update(blob)
|
||||||
|
return hasher.hash()
|
||||||
|
}
|
||||||
|
|
||||||
|
function ZCIncrementalMerkleTree (depth) {
|
||||||
|
this.depth = depth || INCREMENTAL_MERKLE_TREE_DEPTH
|
||||||
|
this.emptyRoots = ZCIncrementalMerkleTree._generateEmptyRoots(this.depth + 1)
|
||||||
|
this.left = null
|
||||||
|
this.right = null
|
||||||
|
this.parents = []
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private, exposed for testing
|
||||||
|
ZCIncrementalMerkleTree._generateEmptyRoots = function (depth) {
|
||||||
|
var roots = []
|
||||||
|
roots.push(Buffer.alloc(32))
|
||||||
|
while (roots.length <= depth) {
|
||||||
|
roots.push(combine(roots[roots.length - 1], roots[roots.length - 1]))
|
||||||
|
}
|
||||||
|
return roots
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalMerkleTree.fromBuffer = function (buffer, __noStrict, __depth) {
|
||||||
|
var offset = 0
|
||||||
|
function readSlice (n) {
|
||||||
|
offset += n
|
||||||
|
return buffer.slice(offset - n, offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
function readUInt8 () {
|
||||||
|
var i = buffer.readUInt8(offset)
|
||||||
|
offset += 1
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
|
||||||
|
function readVarInt () {
|
||||||
|
var vi = varuint.decode(buffer, offset)
|
||||||
|
offset += varuint.decode.bytes
|
||||||
|
return vi
|
||||||
|
}
|
||||||
|
|
||||||
|
function readOptionalSlice (n) {
|
||||||
|
var i = readUInt8()
|
||||||
|
if (i === 1) {
|
||||||
|
return readSlice(n)
|
||||||
|
} else if (i === 0) {
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
throw new Error('Invalid optional')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tree = new ZCIncrementalMerkleTree(__depth)
|
||||||
|
tree.left = readOptionalSlice(32)
|
||||||
|
tree.right = readOptionalSlice(32)
|
||||||
|
|
||||||
|
var parentsLen = readVarInt()
|
||||||
|
for (var i = 0; i < parentsLen; ++i) {
|
||||||
|
tree.parents.push(readOptionalSlice(32))
|
||||||
|
}
|
||||||
|
|
||||||
|
tree.wfcheck()
|
||||||
|
|
||||||
|
if (__noStrict && offset <= buffer.length) return tree
|
||||||
|
if (offset !== buffer.length) throw new Error('ZCIncrementalMerkleTree has unexpected data')
|
||||||
|
|
||||||
|
return tree
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalMerkleTree.prototype.wfcheck = function () {
|
||||||
|
if (this.parents.length >= this.depth) {
|
||||||
|
throw new Error('tree has too many parents')
|
||||||
|
}
|
||||||
|
|
||||||
|
// The last parent cannot be null.
|
||||||
|
if (this.parents.length > 0 && !(this.parents[this.parents.length - 1])) {
|
||||||
|
throw new Error('tree has non-canonical representation of parent')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Left cannot be empty when right exists.
|
||||||
|
if (!this.left && this.right) {
|
||||||
|
throw new Error('tree has non-canonical representation; right should not exist')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Left cannot be empty when parents is nonempty.
|
||||||
|
if (!this.left && this.parents.length > 0) {
|
||||||
|
throw new Error('tree has non-canonical representation; parents should not be unempty')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalMerkleTree.prototype.byteLength = function () {
|
||||||
|
return (
|
||||||
|
(this.left ? 33 : 1) +
|
||||||
|
(this.right ? 33 : 1) +
|
||||||
|
varuint.encodingLength(this.parents.length) +
|
||||||
|
this.parents.reduce(function (sum, hash) { return sum + (hash ? 33 : 1) }, 0)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalMerkleTree.prototype.clone = function () {
|
||||||
|
var newTree = new ZCIncrementalMerkleTree(this.depth)
|
||||||
|
newTree.left = this.left
|
||||||
|
newTree.right = this.right
|
||||||
|
|
||||||
|
newTree.parents = this.parents.map(function (parent) {
|
||||||
|
return parent
|
||||||
|
})
|
||||||
|
|
||||||
|
return newTree
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalMerkleTree.prototype.toBuffer = function () {
|
||||||
|
var buffer = Buffer.alloc(this.byteLength())
|
||||||
|
|
||||||
|
var offset = 0
|
||||||
|
function writeSlice (slice) {
|
||||||
|
slice.copy(buffer, offset)
|
||||||
|
offset += slice.length
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeUInt8 (i) {
|
||||||
|
buffer.writeUInt8(i, offset)
|
||||||
|
offset += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeVarInt (i) {
|
||||||
|
varuint.encode(i, buffer, offset)
|
||||||
|
offset += varuint.encode.bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeOptionalSlice (val) {
|
||||||
|
if (val) {
|
||||||
|
writeUInt8(1)
|
||||||
|
writeSlice(val)
|
||||||
|
} else {
|
||||||
|
writeUInt8(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
writeOptionalSlice(this.left)
|
||||||
|
writeOptionalSlice(this.right)
|
||||||
|
|
||||||
|
writeVarInt(this.parents.length)
|
||||||
|
this.parents.forEach(function (hash) {
|
||||||
|
writeOptionalSlice(hash)
|
||||||
|
})
|
||||||
|
|
||||||
|
return buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalMerkleTree.prototype.last = function () {
|
||||||
|
if (this.right) {
|
||||||
|
return this.right
|
||||||
|
} else if (this.left) {
|
||||||
|
return this.left
|
||||||
|
} else {
|
||||||
|
throw new Error('tree has no cursor')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalMerkleTree.prototype.size = function () {
|
||||||
|
var ret = 0
|
||||||
|
if (this.left) {
|
||||||
|
ret++
|
||||||
|
}
|
||||||
|
if (this.right) {
|
||||||
|
ret++
|
||||||
|
}
|
||||||
|
// Treat occupation of parents array as a binary number
|
||||||
|
// (right-shifted by 1)
|
||||||
|
this.parents.forEach(function (parent, i) {
|
||||||
|
if (parent) {
|
||||||
|
ret += (1 << (i + 1))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalMerkleTree.prototype.append = function (obj) {
|
||||||
|
if (this.is_complete(this.depth)) {
|
||||||
|
throw new Error('tree is full')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.left) {
|
||||||
|
// Set the left leaf
|
||||||
|
this.left = obj
|
||||||
|
} else if (!this.right) {
|
||||||
|
// Set the right leaf
|
||||||
|
this.right = obj
|
||||||
|
} else {
|
||||||
|
// Combine the leaves and propagate it up the tree
|
||||||
|
var combined = combine(this.left, this.right)
|
||||||
|
|
||||||
|
// Set the "left" leaf to the object and make the "right" leaf null
|
||||||
|
this.left = obj
|
||||||
|
this.right = null
|
||||||
|
|
||||||
|
for (var i = 0; i < this.depth; i++) {
|
||||||
|
if (i < this.parents.length) {
|
||||||
|
if (this.parents[i]) {
|
||||||
|
combined = combine(this.parents[i], combined)
|
||||||
|
this.parents[i] = null
|
||||||
|
} else {
|
||||||
|
this.parents[i] = combined
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.parents.push(combined)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is for allowing the witness to determine if a subtree has filled
|
||||||
|
// to a particular depth, or for append() to ensure we're not appending
|
||||||
|
// to a full tree.
|
||||||
|
ZCIncrementalMerkleTree.prototype.is_complete = function (depth) {
|
||||||
|
if (!this.left || !this.right) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.parents.length !== (depth - 1)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.parents.every(function (parent) { return parent })) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// This finds the next "depth" of an unfilled subtree, given that we've filled
|
||||||
|
// `skip` uncles/subtrees.
|
||||||
|
ZCIncrementalMerkleTree.prototype.next_depth = function (skip) {
|
||||||
|
if (!this.left) {
|
||||||
|
if (skip) {
|
||||||
|
skip--
|
||||||
|
} else {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.right) {
|
||||||
|
if (skip) {
|
||||||
|
skip--
|
||||||
|
} else {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var d = 1
|
||||||
|
|
||||||
|
// Use every() for its side-effect of executing a function on every element
|
||||||
|
// up to and including the first element that returns false.
|
||||||
|
if (!this.parents.every(function (parent) {
|
||||||
|
if (!parent) {
|
||||||
|
if (skip) {
|
||||||
|
skip--
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
d++
|
||||||
|
return true
|
||||||
|
})) {
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
return d + skip
|
||||||
|
}
|
||||||
|
|
||||||
|
// This calculates the root of the tree.
|
||||||
|
ZCIncrementalMerkleTree.prototype.root = function (depth, fillerHashes) {
|
||||||
|
depth = depth || this.depth
|
||||||
|
|
||||||
|
var self = this
|
||||||
|
var nextFilled = function (d) {
|
||||||
|
if (fillerHashes && fillerHashes.length > 0) {
|
||||||
|
return fillerHashes.shift()
|
||||||
|
} else {
|
||||||
|
return self.emptyRoots[d]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var combineLeft = this.left ? this.left : nextFilled(0)
|
||||||
|
var combineRight = this.right ? this.right : nextFilled(0)
|
||||||
|
var root = combine(combineLeft, combineRight)
|
||||||
|
|
||||||
|
var d = 1
|
||||||
|
|
||||||
|
this.parents.forEach(function (parent) {
|
||||||
|
if (parent) {
|
||||||
|
root = combine(parent, root)
|
||||||
|
} else {
|
||||||
|
root = combine(root, nextFilled(d))
|
||||||
|
}
|
||||||
|
d++
|
||||||
|
})
|
||||||
|
|
||||||
|
while (d < depth) {
|
||||||
|
root = combine(root, nextFilled(d))
|
||||||
|
d++
|
||||||
|
}
|
||||||
|
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalMerkleTree.prototype.empty_root = function () {
|
||||||
|
return this.emptyRoots[this.depth]
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ZCIncrementalMerkleTree
|
|
@ -0,0 +1,165 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
var varuint = require('varuint-bitcoin')
|
||||||
|
|
||||||
|
var ZCIncrementalMerkleTree = require('./incremental_merkle_tree')
|
||||||
|
|
||||||
|
function ZCIncrementalWitness () {
|
||||||
|
this.tree = new ZCIncrementalMerkleTree()
|
||||||
|
this.filled = []
|
||||||
|
this.cursor = null
|
||||||
|
this.cursor_depth = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalWitness.fromTree = function (tree) {
|
||||||
|
var witness = new ZCIncrementalWitness()
|
||||||
|
witness.tree = tree.clone()
|
||||||
|
return witness
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalWitness.fromBuffer = function (buffer, __noStrict, __depth) {
|
||||||
|
var offset = 0
|
||||||
|
function readSlice (n) {
|
||||||
|
offset += n
|
||||||
|
return buffer.slice(offset - n, offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
function readUInt8 () {
|
||||||
|
var i = buffer.readUInt8(offset)
|
||||||
|
offset += 1
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
|
||||||
|
function readVarInt () {
|
||||||
|
var vi = varuint.decode(buffer, offset)
|
||||||
|
offset += varuint.decode.bytes
|
||||||
|
return vi
|
||||||
|
}
|
||||||
|
|
||||||
|
function readOptional (func) {
|
||||||
|
var i = readUInt8()
|
||||||
|
if (i === 1) {
|
||||||
|
return func()
|
||||||
|
} else if (i === 0) {
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
throw new Error('Invalid optional')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function readZCIncrementalMerkleTree () {
|
||||||
|
var tree = ZCIncrementalMerkleTree.fromBuffer(buffer.slice(offset), true, __depth)
|
||||||
|
offset += tree.byteLength()
|
||||||
|
return tree
|
||||||
|
}
|
||||||
|
|
||||||
|
var witness = new ZCIncrementalWitness()
|
||||||
|
witness.tree = readZCIncrementalMerkleTree()
|
||||||
|
|
||||||
|
var filledLen = readVarInt()
|
||||||
|
for (var i = 0; i < filledLen; ++i) {
|
||||||
|
witness.filled.push(readSlice(32))
|
||||||
|
}
|
||||||
|
|
||||||
|
witness.cursor = readOptional(readZCIncrementalMerkleTree)
|
||||||
|
|
||||||
|
if (__noStrict && offset <= buffer.length) return witness
|
||||||
|
if (offset !== buffer.length) throw new Error('ZCIncrementalWitness has unexpected data')
|
||||||
|
|
||||||
|
return witness
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalWitness.prototype.byteLength = function () {
|
||||||
|
return (
|
||||||
|
this.tree.byteLength() +
|
||||||
|
varuint.encodingLength(this.filled.length) +
|
||||||
|
this.filled.length * 32 +
|
||||||
|
(this.cursor ? this.cursor.byteLength() + 1 : 1)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalWitness.prototype.toBuffer = function () {
|
||||||
|
var buffer = Buffer.alloc(this.byteLength())
|
||||||
|
|
||||||
|
var offset = 0
|
||||||
|
function writeSlice (slice) {
|
||||||
|
slice.copy(buffer, offset)
|
||||||
|
offset += slice.length
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeUInt8 (i) {
|
||||||
|
buffer.writeUInt8(i, offset)
|
||||||
|
offset += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeVarInt (i) {
|
||||||
|
varuint.encode(i, buffer, offset)
|
||||||
|
offset += varuint.encode.bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeOptional (val, func) {
|
||||||
|
if (val) {
|
||||||
|
writeUInt8(1)
|
||||||
|
func(val)
|
||||||
|
} else {
|
||||||
|
writeUInt8(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeZCIncrementalMerkleTree (tree) {
|
||||||
|
writeSlice(tree.toBuffer())
|
||||||
|
}
|
||||||
|
|
||||||
|
writeSlice(this.tree.toBuffer())
|
||||||
|
|
||||||
|
writeVarInt(this.filled.length)
|
||||||
|
this.filled.forEach(function (hash) {
|
||||||
|
writeSlice(hash)
|
||||||
|
})
|
||||||
|
|
||||||
|
writeOptional(this.cursor, writeZCIncrementalMerkleTree)
|
||||||
|
|
||||||
|
return buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalWitness.prototype.root = function () {
|
||||||
|
return this.tree.root(this.tree.depth, this.partial_path())
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalWitness.prototype.partial_path = function () {
|
||||||
|
var uncles = this.filled.map(function (entry) {
|
||||||
|
return entry
|
||||||
|
})
|
||||||
|
|
||||||
|
if (this.cursor) {
|
||||||
|
uncles.push(this.cursor.root(this.cursor_depth))
|
||||||
|
}
|
||||||
|
|
||||||
|
return uncles
|
||||||
|
}
|
||||||
|
|
||||||
|
ZCIncrementalWitness.prototype.append = function (obj) {
|
||||||
|
if (this.cursor) {
|
||||||
|
this.cursor.append(obj)
|
||||||
|
|
||||||
|
if (this.cursor.is_complete(this.cursor_depth)) {
|
||||||
|
this.filled.push(this.cursor.root(this.cursor_depth))
|
||||||
|
this.cursor = null
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.cursor_depth = this.tree.next_depth(this.filled.length)
|
||||||
|
|
||||||
|
if (this.cursor_depth >= this.tree.depth) {
|
||||||
|
throw new Error('tree is full')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.cursor_depth === 0) {
|
||||||
|
this.filled.push(obj)
|
||||||
|
} else {
|
||||||
|
this.cursor = new ZCIncrementalMerkleTree(this.tree.depth)
|
||||||
|
this.cursor.append(obj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ZCIncrementalWitness
|
|
@ -0,0 +1,18 @@
|
||||||
|
[
|
||||||
|
"bab6e8992959caf0ca94847c36b4e648a7f88a9b9c6a62ea387cf1fb9badfd62",
|
||||||
|
"43c9a4b21555b832a79fc12ce27a97d4f4eca1638e7161a780db1d5ebc35eb68",
|
||||||
|
"fb92a6142315bb3396b693222bf2d0e260b448cda74e189063cf774048456083",
|
||||||
|
"e44a57cd544018937680d385817be3a3e35bb5b87ceeea93d536ea95828a4992",
|
||||||
|
"43f48bfb9ab6f12ef91ce83e8f9190ce5dff2721784c90e08a50a67403367cff",
|
||||||
|
"fce910561c3c7ebf14ed5d712e6838cdc6f1145c87eec256b7181f9df6d0c468",
|
||||||
|
"b1e7016392805b227b11e58ba629f9a6684a0b4c34306e85e47548c43ecd168b",
|
||||||
|
"2d9a49d9425449a449cc62d16febaf9c7f8b32349752ecc39191c36130b4c050",
|
||||||
|
"53969b31a862b893dde857b8b7d4f53ce0e2c21a0f70d48ba1aef3a05fddff70",
|
||||||
|
"17f8fabd440fdf9e2eafd75a3407e8bbde048d2d2232cd803d5763004af61ed8",
|
||||||
|
"9b7805cb5e8ef337c13c73cab58ee719bf33a4a80ecc161bfe714269eca4928b",
|
||||||
|
"a3ebada94d4329899ae136391604799d8cea39c0c331f9aaaa4a1e73ab63e904",
|
||||||
|
"12091a20c9ebe67c2793bb71a6fdddb0ffe3ca781fcf1e192428161f186c3fbe",
|
||||||
|
"e9c65749638df548b8909c0ea1d0f79079a6bb3235c649a8806322c87f968018",
|
||||||
|
"8e8fddf0438a4263bc926fcfa6733dc201633959f294103533a2cb9328bb65c4",
|
||||||
|
"206a202bd08dd31f77afc7114b17850192b83948cff5828df0d638cbe734c884"
|
||||||
|
]
|
|
@ -0,0 +1,18 @@
|
||||||
|
[
|
||||||
|
"95bf71d8e803b8601c14b5949d0f92690181154ef9d82eb3e24852266823317a",
|
||||||
|
"73f18d3f9cd11010aa01d4f444039e566f14ef282109df9649b2eb75e7a53ed1",
|
||||||
|
"dcde8a273c9672bee1a894d7f7f4abb81078f52b498e095f2a87d0aec5addf25",
|
||||||
|
"4677d481ec6d1e97969afbc530958d1cbb4f1c047af6fdad4687cd10830e02bd",
|
||||||
|
"74cd9d82de30c4222a06d420b75522ae1273729c1d8419446adf1184df61dc69",
|
||||||
|
"2ff57f5468c6afdad30ec0fb6c2cb67289f12584e2c20c4e0065f66748697d77",
|
||||||
|
"27e4ce010670801911c5765a003b15f75cde31d7378bd36540f593c8a44b3011",
|
||||||
|
"62231ef2ec8c4da461072871ab7bc9de10253fcb40e164ddbad05b47e0b7fb69",
|
||||||
|
"733a4ce688fdf07efb9e9f5a4b2dafff87cfe198fbe1dff71e028ef4cdee1f1b",
|
||||||
|
"df39ed31924facdd69a93db07311d45fceac7a4987c091648044f37e6ecbb0d2",
|
||||||
|
"87795c069bdb55281c666b9cb872d13174334ce135c12823541e9536489a9107",
|
||||||
|
"438c80f532903b283230446514e400c329b29483db4fe9e279fdfc79e8f4347d",
|
||||||
|
"08afb2813eda17e94aba1ab28ec191d4af99283cd4f1c5a04c0c2bc221bc3119",
|
||||||
|
"a8b3ab3284f3288f7caa21bd2b69789a159ab4188b0908825b34723305c1228c",
|
||||||
|
"db9b289e620de7dca2ae8fdac96808752e32e7a2c6d97ce0755dcebaa03123ab",
|
||||||
|
"0bf622cb9f901b7532433ea2e7c1b7632f5935899b62dcf897a71551997dc8cc"
|
||||||
|
]
|
|
@ -0,0 +1,68 @@
|
||||||
|
[
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"da5698be17b9b46962335799779fbeca8ce5d491c0d26243bafef9ea1837a9d8",
|
||||||
|
"dc766fab492ccf3d1e49d4f374b5235fa56506aac2224d39f943fcd49202974c",
|
||||||
|
"3f0a406181105968fdaee30679e3273c66b72bf9a7f5debbf3b5a0a26e359f92",
|
||||||
|
"26b0052694fc42fdff93e6fb5a71d38c3dd7dc5b6ad710eb048c660233137fab",
|
||||||
|
"0109ecc0722659ff83450b8f7b8846e67b2859f33c30d9b7acd5bf39cae54e31",
|
||||||
|
"3f909b8ce3d7ffd8a5b30908f605a03b0db85169558ddc1da7bbbcc9b09fd325",
|
||||||
|
"40460fa6bc692a06f47521a6725a547c028a6a240d8409f165e63cb54da2d23f",
|
||||||
|
"8c085674249b43da1b9a31a0e820e81e75f342807b03b6b9e64983217bc2b38e",
|
||||||
|
"a083450c1ba2a3a7be76fad9d13bc37be4bf83bd3e59fc375a36ba62dc620298",
|
||||||
|
"1ddddabc2caa2de9eff9e18c8c5a39406d7936e889bc16cfabb144f5c0022682",
|
||||||
|
"c22d8f0b5e4056e5f318ba22091cc07db5694fbeb5e87ef0d7e2c57ca352359e",
|
||||||
|
"89a434ae1febd7687eceea21d07f20a2512449d08ce2eee55871cdb9d46c1233",
|
||||||
|
"7333dbffbd11f09247a2b33a013ec4c4342029d851e22ba485d4461851370c15",
|
||||||
|
"5dad844ab9466b70f745137195ca221b48f346abd145fb5efc23a8b4ba508022",
|
||||||
|
"507e0dae81cbfbe457fd370ef1ca4201c2b6401083ddab440e4a038dc1e358c4",
|
||||||
|
"bdcdb3293188c9807d808267018684cfece07ac35a42c00f2c79b4003825305d",
|
||||||
|
"bab5800972a16c2c22530c66066d0a5867e987bed21a6d5a450b683cf1cfd709",
|
||||||
|
"11aa0b4ad29b13b057a31619d6500d636cd735cdd07d811ea265ec4bcbbbd058",
|
||||||
|
"5145b1b055c2df02b95675e3797b91de1b846d25003c0a803d08900728f2cd6a",
|
||||||
|
"0323f2850bf3444f4b4c5c09a6057ec7169190f45acb9e46984ab3dfcec4f06a",
|
||||||
|
"671546e26b1da1af754531e26d8a6a51073a57ddd72dc472efb43fcb257cffff",
|
||||||
|
"bb23a9bba56de57cb284b0d2b01c642cf79c9a5563f0067a21292412145bd78a",
|
||||||
|
"f30cc836b9f71b4e7ee3c72b1fd253268af9a27e9d7291a23d02821b21ddfd16",
|
||||||
|
"58a2753dade103cecbcda50b5ebfce31e12d41d5841dcc95620f7b3d50a1b9a1",
|
||||||
|
"925e6d474a5d8d3004f29da0dd78d30ae3824ce79dfe4934bb29ec3afaf3d521",
|
||||||
|
"08f279618616bcdd4eadc9c7a9062691a59b43b07e2c1e237f17bd189cd6a8fe",
|
||||||
|
"c92b32db42f42e2bf0a59df9055be5c669d3242df45357659b75ae2c27a76f50",
|
||||||
|
"c0db2a74998c50eb7ba6534f6d410efc27c4bb88acb0222c7906ea28a327b511",
|
||||||
|
"d7c612c817793191a1e68652121876d6b3bde40f4fa52bc314145ce6e5cdd259",
|
||||||
|
"b22370106c67a17209f6130bc09f735d83aa2c04fc4fe72ea5d80b216723e7ce",
|
||||||
|
"9f67d5f664664c901940eee3d02dd5b3e4b92e7b42820c42fc5159e91b41172a",
|
||||||
|
"ac58cd1388fec290d398f1944b564449a63c815880566bd1d189f7839e3b0c8c",
|
||||||
|
"5698eae7c8515ed05a70339bdf7c1028e7acca13a4fa97d9538f01ac8d889ae3",
|
||||||
|
"2d4995770a76fb93314ca74b3524ea1db5688ad0a76183ea17204a8f024a9f3b",
|
||||||
|
"5e8992c1b072c16e9e28a85358fb5fb6901a81587766dadb7aa0b973ded2f264",
|
||||||
|
"e95db71e1f7291ba5499461bc715203e29b84bfa4283e3bb7f470a15d0e1584e",
|
||||||
|
"41f078bd1824c8a4b71964f394aa595084d8eb17b97a3630433af70d10e0eff6",
|
||||||
|
"a1913fe6b20132312f8c1f00ddd63cec7a03f5f1d7d83492fa284c0b5d6320b0",
|
||||||
|
"ba9440c4dbfcf55ceb605a5b8990fc11f8ef22870d8d12e130f986491eae84b3",
|
||||||
|
"49db2d5e22b8015cae4810d75e54014c5469862738e161ec96ec20218718828a",
|
||||||
|
"d4851fb8431edfbb8b1e85ada6895967c2dac87df344992a05faf1ecf836eec9",
|
||||||
|
"e4ab9f4470f00cd196d47c75c82e7adaf06fe17e042e3953d93bb5d56d8cd8fb",
|
||||||
|
"7e4320434849ecb357f1afaaba21a54400ef2d11cff83b937d87fdafa49f8199",
|
||||||
|
"020adc98d96cfbbcca15fc3aa03760ed286686c35b5d92c7cb64a999b394a854",
|
||||||
|
"3a26b29fe1acfdd6c6a151bcc3dbcb95a10ebe2f0553f80779569b67b7244e77",
|
||||||
|
"ec2d0986e6a0ddf43897b2d4f23bb034f538ffe00827f310dc4963f3267f0bfb",
|
||||||
|
"d48073f8819f81f0358e3fc35a047cc74082ae1cb7ee22fb609c01649342d0e6",
|
||||||
|
"ad8037601793f172441ecb00dc138d9fc5957125ecc382ec65e36f817dc799fb",
|
||||||
|
"ca500a5441f36f4df673d6b8ed075d36dae2c7e6481428c70a5a76b7a9bebce8",
|
||||||
|
"422b6ddd473231dc4d56fe913444ccd56f7c61f747ba57ca946d5fef72d840a0",
|
||||||
|
"ab41f4ecb7d7089615800e19fcc53b8379ed05ee35c82567095583fd90ff3035",
|
||||||
|
"bbf7618248354ceb1bc1fc9dbc42c426a4e2c1e0d443c5683a9256c62ecdc26f",
|
||||||
|
"e50ae71479fc8ec569192a13072e011afc249f471af09500ea39f75d0af856bf",
|
||||||
|
"e74c0b9220147db2d50a3b58d413775d16c984690be7d90f0bc43d99dba1b689",
|
||||||
|
"29324a0a48d11657a51ba08b004879bfcfc66a1acb7ce36dfe478d2655484b48",
|
||||||
|
"88952e3d0ac06cb16b665201122249659a22325e01c870f49e29da6b1757e082",
|
||||||
|
"cdf879f2435b95af042a3bf7b850f7819246c805285803d67ffbf4f295bed004",
|
||||||
|
"e005e324200b4f428c62bc3331e695c373607cd0faa9790341fa3ba1ed228bc5",
|
||||||
|
"354447727aa9a53dd8345b6b6c693443e56ef4aeba13c410179fc8589e7733d5",
|
||||||
|
"da52dda91f2829c15c0e58d29a95360b86ab30cf0cac8101832a29f38c3185f1",
|
||||||
|
"c7da7814e228e1144411d78b536092fe920bcdfcc36cf19d1259047b267d58b5",
|
||||||
|
"aba1f68b6c2b4db6cc06a7340e12313c4b4a4ea6deb17deb3e1e66cd8eacf32b",
|
||||||
|
"c160ae4f64ab764d864a52ad5e33126c4b5ce105a47deedd75bc70199a5247ef",
|
||||||
|
"eadf23fc99d514dd8ea204d223e98da988831f9b5d1940274ca520b7fb173d8a",
|
||||||
|
"5b8e14facac8a7c7a3bfee8bae71f2f7793d3ad5fe3383f93ab6061f2a11bb02"
|
||||||
|
]
|
|
@ -0,0 +1,18 @@
|
||||||
|
[
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0000",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
|
||||||
|
"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
|
||||||
|
"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
|
||||||
|
"01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
|
||||||
|
"01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0184c834e7cb38d6f08d82f5cf4839b8920185174b11c7af771fd38dd02b206a200301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806"
|
||||||
|
]
|
|
@ -0,0 +1,138 @@
|
||||||
|
[
|
||||||
|
"0000000162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00",
|
||||||
|
"0000000262fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
|
||||||
|
"0000000262fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300000101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
|
||||||
|
"0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae400",
|
||||||
|
"0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae40101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618000101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
|
||||||
|
"0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae40101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618000101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
|
||||||
|
"0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180001018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10000",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10000",
|
||||||
|
"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047400",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047400",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d00",
|
||||||
|
"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f00010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
|
||||||
|
"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f00010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
|
||||||
|
"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81701018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0000",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0000",
|
||||||
|
"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e755000",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e755000",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba300",
|
||||||
|
"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
|
||||||
|
"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
|
||||||
|
"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
|
||||||
|
"0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
|
||||||
|
"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e90101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0000",
|
||||||
|
"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0000",
|
||||||
|
"0000000562fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000468eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
|
||||||
|
"0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430003a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180392498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
|
||||||
|
"01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861802112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0368c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
|
||||||
|
"01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f02050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0250c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
|
||||||
|
"018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80603d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e7550305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
|
||||||
|
"0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e7550305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060204e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba3305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
|
||||||
|
"018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
|
||||||
|
"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806021880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e92f7a96ecc725694533a999db6786f6016bcfdca5c9353151837faf43d93c50ef00",
|
||||||
|
"01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806012f7a96ecc725694533a999db6786f6016bcfdca5c9353151837faf43d93c50ef00",
|
||||||
|
"01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060184c834e7cb38d6f08d82f5cf4839b8920185174b11c7af771fd38dd02b206a2000"
|
||||||
|
]
|
|
@ -0,0 +1,198 @@
|
||||||
|
/* global describe, it */
|
||||||
|
|
||||||
|
var assert = require('assert')
|
||||||
|
|
||||||
|
var ZCIncrementalMerkleTree = require('../src/incremental_merkle_tree')
|
||||||
|
var ZCIncrementalWitness = require('../src/incremental_witness')
|
||||||
|
|
||||||
|
var merkleCommitments = require('./fixtures/zcash/merkle_commitments')
|
||||||
|
var merkleRoots = require('./fixtures/zcash/merkle_roots')
|
||||||
|
var merkleRootsEmpty = require('./fixtures/zcash/merkle_roots_empty')
|
||||||
|
var merkleSerialization = require('./fixtures/zcash/merkle_serialization')
|
||||||
|
var merkleWitnessSerialization = require('./fixtures/zcash/merkle_witness_serialization')
|
||||||
|
|
||||||
|
var INCREMENTAL_MERKLE_TREE_DEPTH_TESTING = 4
|
||||||
|
|
||||||
|
describe('ZCIncrementalMerkleTree', function () {
|
||||||
|
it('correctly constructs a tree', function () {
|
||||||
|
var witnessSerIndex = 0
|
||||||
|
var tree = new ZCIncrementalMerkleTree(INCREMENTAL_MERKLE_TREE_DEPTH_TESTING)
|
||||||
|
|
||||||
|
// The root of the tree at this point is expected to be the root of the
|
||||||
|
// empty tree.
|
||||||
|
assert.strictEqual(
|
||||||
|
tree.root().toString('hex'),
|
||||||
|
tree.empty_root().toString('hex'),
|
||||||
|
'Tree root inconsistent for empty tree'
|
||||||
|
)
|
||||||
|
|
||||||
|
// The tree doesn't have a 'last' element added since it's blank.
|
||||||
|
assert.throws(function () {
|
||||||
|
tree.last()
|
||||||
|
}, new RegExp('tree has no cursor'))
|
||||||
|
|
||||||
|
// The tree is empty.
|
||||||
|
assert.strictEqual(tree.size(), 0)
|
||||||
|
|
||||||
|
// We need to witness at every single point in the tree, so
|
||||||
|
// that the consistency of the tree and the merkle paths can
|
||||||
|
// be checked.
|
||||||
|
var witnesses = []
|
||||||
|
|
||||||
|
merkleCommitments.forEach(function (commitment, i) {
|
||||||
|
var testCommitment = [].reverse.call(Buffer.from(commitment, 'hex'))
|
||||||
|
|
||||||
|
// Witness here
|
||||||
|
witnesses.push(ZCIncrementalWitness.fromTree(tree))
|
||||||
|
|
||||||
|
// Now append a commitment to the tree
|
||||||
|
tree.append(testCommitment)
|
||||||
|
|
||||||
|
// Size incremented by one
|
||||||
|
assert.strictEqual(
|
||||||
|
tree.size(), i + 1,
|
||||||
|
'Invalid tree size for commitment ' + i
|
||||||
|
)
|
||||||
|
|
||||||
|
// Last element added to the tree was `testCommitment`
|
||||||
|
assert.strictEqual(
|
||||||
|
tree.last().toString('hex'), testCommitment.toString('hex'),
|
||||||
|
'Invalid last element for commitment ' + i
|
||||||
|
)
|
||||||
|
|
||||||
|
// Check tree root consistency
|
||||||
|
assert.strictEqual(
|
||||||
|
tree.root().toString('hex'), merkleRoots[i],
|
||||||
|
'Tree root inconsistent for commitment ' + i
|
||||||
|
)
|
||||||
|
|
||||||
|
// Check serialization of tree
|
||||||
|
assert.strictEqual(
|
||||||
|
tree.toBuffer().toString('hex'), merkleSerialization[i],
|
||||||
|
'Tree serialization inconsistent for commitment ' + i
|
||||||
|
)
|
||||||
|
|
||||||
|
witnesses.forEach(function (witness, j) {
|
||||||
|
// Append the same commitment to all the witnesses
|
||||||
|
witness.append(testCommitment)
|
||||||
|
|
||||||
|
// Can't do path checks without libsnark
|
||||||
|
|
||||||
|
// Check witness serialization
|
||||||
|
assert.strictEqual(
|
||||||
|
witness.toBuffer().toString('hex'), merkleWitnessSerialization[witnessSerIndex++],
|
||||||
|
'Witness ' + j + ' serialization inconsistent for commitment ' + i
|
||||||
|
)
|
||||||
|
|
||||||
|
// Check witness root is same as tree root
|
||||||
|
assert.strictEqual(
|
||||||
|
witness.root().toString('hex'), tree.root().toString('hex'),
|
||||||
|
'Witness ' + j + ' root inconsistent for commitment ' + i
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// Tree should be full now
|
||||||
|
assert.throws(function () {
|
||||||
|
tree.append(Buffer.alloc(32))
|
||||||
|
})
|
||||||
|
|
||||||
|
witnesses.forEach(function (witness) {
|
||||||
|
assert.throws(function () {
|
||||||
|
witness.append(Buffer.alloc(32))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('has the correct empty root', function () {
|
||||||
|
assert.strictEqual(
|
||||||
|
new ZCIncrementalMerkleTree().empty_root().toString('hex'),
|
||||||
|
'd7c612c817793191a1e68652121876d6b3bde40f4fa52bc314145ce6e5cdd259',
|
||||||
|
'Invalid empty root'
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('_generateEmptyRoots', function () {
|
||||||
|
var emptyRoots = ZCIncrementalMerkleTree._generateEmptyRoots(64)
|
||||||
|
|
||||||
|
emptyRoots.forEach(function (root, d) {
|
||||||
|
it('generates the correct empty root for depth ' + d, function () {
|
||||||
|
assert.strictEqual(root.toString('hex'), merkleRootsEmpty[d])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('fromBuffer', function () {
|
||||||
|
it('throws when the most ancestral parent is empty', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalMerkleTree.fromBuffer(
|
||||||
|
Buffer.from('0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3000100', 'hex')
|
||||||
|
)
|
||||||
|
}, new RegExp('tree has non-canonical representation of parent'))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws when left doesn\'t exists but right does', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalMerkleTree.fromBuffer(
|
||||||
|
Buffer.from('000155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300', 'hex')
|
||||||
|
)
|
||||||
|
}, new RegExp('tree has non-canonical representation; right should not exist'))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws when left doesn\'t exists but a parent does', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalMerkleTree.fromBuffer(
|
||||||
|
Buffer.from('000001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d', 'hex')
|
||||||
|
)
|
||||||
|
}, new RegExp('tree has non-canonical representation; parents should not be unempty'))
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('invalid optional', function () {
|
||||||
|
var data = Buffer.from('0262fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0000', 'hex')
|
||||||
|
|
||||||
|
it('throws', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalMerkleTree.fromBuffer(data)
|
||||||
|
}, new RegExp('Invalid optional'))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws with __noStrict = true', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalMerkleTree.fromBuffer(data, true)
|
||||||
|
}, new RegExp('Invalid optional'))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('insufficient data', function () {
|
||||||
|
var data = Buffer.from('0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00', 'hex')
|
||||||
|
|
||||||
|
it('throws', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalMerkleTree.fromBuffer(data)
|
||||||
|
}, new RegExp('Index out of range'))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws with __noStrict = true', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalMerkleTree.fromBuffer(data, true)
|
||||||
|
}, new RegExp('Index out of range'))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('excess data', function () {
|
||||||
|
var data = Buffer.from('0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0000ff', 'hex')
|
||||||
|
|
||||||
|
it('throws', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalMerkleTree.fromBuffer(data)
|
||||||
|
}, new RegExp('ZCIncrementalMerkleTree has unexpected data'))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('passes with __noStrict = true', function () {
|
||||||
|
assert.doesNotThrow(function () {
|
||||||
|
ZCIncrementalMerkleTree.fromBuffer(data, true)
|
||||||
|
}, new RegExp('ZCIncrementalMerkleTree has unexpected data'))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
|
@ -0,0 +1,71 @@
|
||||||
|
/* global describe, it */
|
||||||
|
|
||||||
|
var assert = require('assert')
|
||||||
|
|
||||||
|
var ZCIncrementalWitness = require('../src/incremental_witness')
|
||||||
|
|
||||||
|
var INCREMENTAL_MERKLE_TREE_DEPTH_TESTING = 4
|
||||||
|
|
||||||
|
describe('ZCIncrementalWitness', function () {
|
||||||
|
describe('fromBuffer/toBuffer', function () {
|
||||||
|
it('is unchanged by import and export', function () {
|
||||||
|
// From merkle_witness_serialization.json
|
||||||
|
var hex = '01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900'
|
||||||
|
var witness = ZCIncrementalWitness.fromBuffer(Buffer.from(hex, 'hex'), false, INCREMENTAL_MERKLE_TREE_DEPTH_TESTING)
|
||||||
|
assert.strictEqual(witness.toBuffer().toString('hex'), hex)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('fromBuffer', function () {
|
||||||
|
describe('invalid optional', function () {
|
||||||
|
// From merkle_witness_serialization.json
|
||||||
|
var data = Buffer.from('0000000162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba02', 'hex')
|
||||||
|
|
||||||
|
it('throws', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalWitness.fromBuffer(data, false, INCREMENTAL_MERKLE_TREE_DEPTH_TESTING)
|
||||||
|
}, new RegExp('Invalid optional'))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws with __noStrict = true', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalWitness.fromBuffer(data, true, INCREMENTAL_MERKLE_TREE_DEPTH_TESTING)
|
||||||
|
}, new RegExp('Invalid optional'))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('insufficient data', function () {
|
||||||
|
// From merkle_witness_serialization.json
|
||||||
|
var data = Buffer.from('01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9', 'hex')
|
||||||
|
|
||||||
|
it('throws', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalWitness.fromBuffer(data, false, INCREMENTAL_MERKLE_TREE_DEPTH_TESTING)
|
||||||
|
}, new RegExp('Index out of range'))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws with __noStrict = true', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalWitness.fromBuffer(data, true, INCREMENTAL_MERKLE_TREE_DEPTH_TESTING)
|
||||||
|
}, new RegExp('Index out of range'))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('excess data', function () {
|
||||||
|
// From merkle_witness_serialization.json
|
||||||
|
var data = Buffer.from('01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900ff', 'hex')
|
||||||
|
|
||||||
|
it('throws', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
ZCIncrementalWitness.fromBuffer(data, false, INCREMENTAL_MERKLE_TREE_DEPTH_TESTING)
|
||||||
|
}, new RegExp('ZCIncrementalWitness has unexpected data'))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('passes with __noStrict = true', function () {
|
||||||
|
assert.doesNotThrow(function () {
|
||||||
|
ZCIncrementalWitness.fromBuffer(data, true, INCREMENTAL_MERKLE_TREE_DEPTH_TESTING)
|
||||||
|
}, new RegExp('ZCIncrementalWitness has unexpected data'))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue