thor-devkit
Version:
Typescript library to aid DApp development on VeChain Thor
275 lines • 20.7 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RLP = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const rlp = __importStar(require("rlp"));
const buffer_1 = require("buffer");
class RLP {
constructor(profile) {
this.profile = profile;
}
/**
* encode data according to profile
* @param data the structured data to be encoded
*/
encode(data) {
const packed = pack(data, this.profile, '');
return rlp.encode(packed);
}
/**
* decode buffer according to profile
* @param buf rlp encoded data
*/
decode(buf) {
const packed = rlp.decode(buf);
return unpack(packed, this.profile, '');
}
}
exports.RLP = RLP;
(function (RLP) {
/** base class of scalar kind */
class ScalarKind {
}
RLP.ScalarKind = ScalarKind;
/** a buffer kind to keep buffer type */
class BufferKind extends ScalarKind {
data(data, ctx) {
assert(buffer_1.Buffer.isBuffer(data), ctx, 'expected buffer');
return { encode() { return data; } };
}
buffer(buf, ctx) {
return { decode() { return buf; } };
}
}
RLP.BufferKind = BufferKind;
/** a scalar kind to presents number */
class NumericKind extends ScalarKind {
/**
* create a numeric kind
* @param maxBytes up limit of data in bytes
*/
constructor(maxBytes) {
super();
this.maxBytes = maxBytes;
}
data(data, ctx) {
assert(typeof data === 'string' || typeof data === 'number', ctx, 'expected string or number');
if (typeof data === 'string') {
const isHex = isHexString(data);
const isDec = isDecString(data);
assert(isHex || isDec, ctx, 'expected non-negative integer in hex or dec string');
if (isHex) {
assert(data.length > 2, ctx, 'expected valid hex string');
}
}
else {
assert(Number.isSafeInteger(data) && data >= 0, ctx, 'expected non-negative safe integer');
}
const bn = new bignumber_js_1.default(data);
if (bn.isZero()) {
return {
encode() {
return buffer_1.Buffer.alloc(0);
}
};
}
let hex = bn.toString(16);
if (hex.length % 2 !== 0) {
hex = '0' + hex;
}
assert(this.maxBytes ? hex.length <= this.maxBytes * 2 : true, ctx, `expected number in ${this.maxBytes} bytes`);
return {
encode() {
return buffer_1.Buffer.from(hex, 'hex');
}
};
}
buffer(buf, ctx) {
assert(this.maxBytes ? buf.length <= this.maxBytes : true, ctx, `expected less than ${this.maxBytes} bytes`);
assert(buf.length === 0 || buf[0] !== 0, ctx, 'expected canonical integer (no leading zero bytes)');
return {
decode() {
if (buf.length === 0) {
return 0;
}
const bn = new bignumber_js_1.default(buf.toString('hex'), 16);
const num = bn.toNumber();
return Number.isSafeInteger(num) ? num : '0x' + bn.toString(16);
}
};
}
}
RLP.NumericKind = NumericKind;
/** a scalar kind to present blob */
class BlobKind extends ScalarKind {
data(data, ctx) {
assert(isHexString(data), ctx, 'expected hex string');
assert(data.length % 2 === 0, ctx, 'expected even length hex');
return {
encode() {
return buffer_1.Buffer.from(data.slice(2), 'hex');
}
};
}
buffer(buf, ctx) {
return {
decode() {
return '0x' + buf.toString('hex');
}
};
}
}
RLP.BlobKind = BlobKind;
/** fixed length blob */
class FixedBlobKind extends BlobKind {
constructor(bytes) {
super();
this.bytes = bytes;
}
data(data, ctx) {
const encoder = super.data(data, ctx);
assert(data.length === this.bytes * 2 + 2, ctx, `expected hex string presents ${this.bytes} bytes`);
return encoder;
}
buffer(buf, ctx) {
const decoder = super.buffer(buf, ctx);
assert(buf.length === this.bytes, ctx, `expected ${this.bytes} bytes`);
return decoder;
}
}
RLP.FixedBlobKind = FixedBlobKind;
/** fixed length blob allowing null */
class NullableFixedBlobKind extends FixedBlobKind {
data(data, ctx) {
if (!data) {
return {
encode() {
return buffer_1.Buffer.alloc(0);
}
};
}
return super.data(data, ctx);
}
buffer(buf, ctx) {
if (buf.length === 0) {
return { decode() { return null; } };
}
return super.buffer(buf, ctx);
}
}
RLP.NullableFixedBlobKind = NullableFixedBlobKind;
/** fixed length blob kind that will remove leading zero on encoding and pad zero on decoding */
class CompactFixedBlobKind extends FixedBlobKind {
data(data, ctx) {
const buf = super.data(data, ctx).encode();
return {
encode() {
const nzIndex = buf.findIndex(v => v !== 0);
if (nzIndex >= 0) {
return buf.slice(nzIndex);
}
return buffer_1.Buffer.alloc(0);
}
};
}
buffer(buf, ctx) {
assert(buf.length <= this.bytes, ctx, `expected less than ${this.bytes} bytes`);
assert(buf.length === 0 || buf[0] !== 0, ctx, 'expected no leading zero bytes');
const bytes = this.bytes;
return {
decode() {
const zeros = '0'.repeat((bytes - buf.length) * 2);
return '0x' + zeros + buf.toString('hex');
}
};
}
}
RLP.CompactFixedBlobKind = CompactFixedBlobKind;
})(RLP || (exports.RLP = RLP = {}));
function pack(obj, profile, ctx) {
ctx = ctx ? ctx + '.' + profile.name : profile.name;
const kind = profile.kind;
if (kind instanceof RLP.ScalarKind) {
return kind.data(obj, ctx).encode();
}
if (Array.isArray(kind)) {
return kind.map(k => pack(obj[k.name], k, ctx));
}
assert(Array.isArray(obj), ctx, 'expected array');
const item = kind.item;
return obj.map((part, i) => pack(part, { name: '#' + i, kind: item }, ctx));
}
function unpack(packed, profile, ctx) {
ctx = ctx ? ctx + '.' + profile.name : profile.name;
const kind = profile.kind;
if (kind instanceof RLP.ScalarKind) {
assert(buffer_1.Buffer.isBuffer(packed), ctx, 'expected Buffer');
return kind.buffer(packed, ctx).decode();
}
if (Array.isArray(kind)) {
assert(Array.isArray(packed), ctx, 'expected array');
const parts = packed;
assert(parts.length === kind.length, ctx, `expected ${kind.length} items, but got ${parts.length}`);
return kind.reduce((o, p, i) => {
o[p.name] = unpack(parts[i], p, ctx);
return o;
}, {});
}
assert(Array.isArray(packed), ctx, 'expected array');
const item = kind.item;
return packed.map((part, i) => unpack(part, { name: '#' + i, kind: item }, ctx));
}
function assert(cond, ctx, msg) {
if (!cond) {
throw new RLPError(`${ctx}: ${msg}`);
}
}
function isHexString(str) {
return /^0x[0-9a-f]*$/i.test(str);
}
function isDecString(str) {
return /^\d+$/.test(str);
}
class RLPError extends Error {
constructor(msg) {
super(msg);
this.name = RLPError.name;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmxwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JscC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBb0M7QUFDcEMseUNBQTBCO0FBQzFCLG1DQUErQjtBQUUvQixNQUFhLEdBQUc7SUFDWixZQUFxQixPQUFvQjtRQUFwQixZQUFPLEdBQVAsT0FBTyxDQUFhO0lBQUksQ0FBQztJQUU5Qzs7O09BR0c7SUFDSSxNQUFNLENBQUMsSUFBUztRQUNuQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDM0MsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBa0IsQ0FBQTtJQUM5QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLEdBQVc7UUFDckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFVLENBQUMsQ0FBQTtRQUNyQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0NBQ0o7QUFwQkQsa0JBb0JDO0FBRUQsV0FBaUIsR0FBRztJQUNoQixnQ0FBZ0M7SUFDaEMsTUFBc0IsVUFBVTtLQUcvQjtJQUhxQixjQUFVLGFBRy9CLENBQUE7SUFFRCx3Q0FBd0M7SUFDeEMsTUFBYSxVQUFXLFNBQVEsVUFBVTtRQUMvQixJQUFJLENBQUMsSUFBWSxFQUFFLEdBQVc7WUFDakMsTUFBTSxDQUFDLGVBQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixDQUFDLENBQUE7WUFDckQsT0FBTyxFQUFFLE1BQU0sS0FBSyxPQUFPLElBQUksQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ3ZDLENBQUM7UUFDTSxNQUFNLENBQUMsR0FBVyxFQUFFLEdBQVc7WUFDbEMsT0FBTyxFQUFFLE1BQU0sS0FBSyxPQUFPLEdBQUcsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ3RDLENBQUM7S0FDSjtJQVJZLGNBQVUsYUFRdEIsQ0FBQTtJQUVELHVDQUF1QztJQUN2QyxNQUFhLFdBQVksU0FBUSxVQUFVO1FBQ3ZDOzs7V0FHRztRQUNILFlBQXFCLFFBQWlCO1lBQ2xDLEtBQUssRUFBRSxDQUFBO1lBRFUsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUV0QyxDQUFDO1FBRU0sSUFBSSxDQUFDLElBQXFCLEVBQUUsR0FBVztZQUMxQyxNQUFNLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxHQUFHLEVBQzVELDJCQUEyQixDQUFDLENBQUE7WUFDaEMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUMvQixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQy9CLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxFQUFFLEdBQUcsRUFDdEIsb0RBQW9ELENBQUMsQ0FBQTtnQkFDekQsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDUixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLDJCQUEyQixDQUFDLENBQUE7Z0JBQzdELENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQy9DLG9DQUFvQyxDQUFDLENBQUE7WUFDN0MsQ0FBQztZQUVELE1BQU0sRUFBRSxHQUFHLElBQUksc0JBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUM5QixJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUNkLE9BQU87b0JBQ0gsTUFBTTt3QkFDRixPQUFPLGVBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7b0JBQzFCLENBQUM7aUJBQ0osQ0FBQTtZQUNMLENBQUM7WUFFRCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3pCLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO1lBQ25CLENBQUM7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFDOUQsc0JBQXNCLElBQUksQ0FBQyxRQUFRLFFBQVEsQ0FBQyxDQUFBO1lBRWhELE9BQU87Z0JBQ0gsTUFBTTtvQkFDRixPQUFPLGVBQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUNsQyxDQUFDO2FBQ0osQ0FBQTtRQUNMLENBQUM7UUFFTSxNQUFNLENBQUMsR0FBVyxFQUFFLEdBQVc7WUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFDMUQsc0JBQXNCLElBQUksQ0FBQyxRQUFRLFFBQVEsQ0FBQyxDQUFBO1lBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFDeEMsb0RBQW9ELENBQUMsQ0FBQTtZQUV6RCxPQUFPO2dCQUNILE1BQU07b0JBQ0YsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUNuQixPQUFPLENBQUMsQ0FBQTtvQkFDWixDQUFDO29CQUNELE1BQU0sRUFBRSxHQUFHLElBQUksc0JBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO29CQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUE7b0JBQ3pCLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDbkUsQ0FBQzthQUNKLENBQUE7UUFDTCxDQUFDO0tBQ0o7SUFqRVksZUFBVyxjQWlFdkIsQ0FBQTtJQUVELG9DQUFvQztJQUNwQyxNQUFhLFFBQW9CLFNBQVEsVUFBVTtRQUN4QyxJQUFJLENBQUMsSUFBWSxFQUFFLEdBQVc7WUFDakMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQ3pCLHFCQUFxQixDQUFDLENBQUE7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQzdCLDBCQUEwQixDQUFDLENBQUE7WUFFL0IsT0FBTztnQkFDSCxNQUFNO29CQUNGLE9BQU8sZUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUM1QyxDQUFDO2FBQ0osQ0FBQTtRQUNMLENBQUM7UUFFTSxNQUFNLENBQUMsR0FBVyxFQUFFLEdBQVc7WUFDbEMsT0FBTztnQkFDSCxNQUFNO29CQUNGLE9BQU8sSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ3JDLENBQUM7YUFDSixDQUFBO1FBQ0wsQ0FBQztLQUNKO0lBckJZLFlBQVEsV0FxQnBCLENBQUE7SUFFRCx3QkFBd0I7SUFDeEIsTUFBYSxhQUF5QixTQUFRLFFBQVc7UUFDckQsWUFBcUIsS0FBYTtZQUM5QixLQUFLLEVBQUUsQ0FBQTtZQURVLFVBQUssR0FBTCxLQUFLLENBQVE7UUFFbEMsQ0FBQztRQUVNLElBQUksQ0FBQyxJQUFZLEVBQUUsR0FBVztZQUNqQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUMxQyxnQ0FBZ0MsSUFBSSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUE7WUFDdkQsT0FBTyxPQUFPLENBQUE7UUFDbEIsQ0FBQztRQUVNLE1BQU0sQ0FBQyxHQUFXLEVBQUUsR0FBVztZQUNsQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFDakMsWUFBWSxJQUFJLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQTtZQUNuQyxPQUFPLE9BQU8sQ0FBQTtRQUNsQixDQUFDO0tBQ0o7SUFsQlksaUJBQWEsZ0JBa0J6QixDQUFBO0lBRUQsc0NBQXNDO0lBQ3RDLE1BQWEscUJBQXNCLFNBQVEsYUFBbUI7UUFDbkQsSUFBSSxDQUFDLElBQW1CLEVBQUUsR0FBVztZQUN4QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1IsT0FBTztvQkFDSCxNQUFNO3dCQUNGLE9BQU8sZUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtvQkFDMUIsQ0FBQztpQkFDSixDQUFBO1lBQ0wsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDaEMsQ0FBQztRQUVNLE1BQU0sQ0FBQyxHQUFXLEVBQUUsR0FBVztZQUNsQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sRUFBRSxNQUFNLEtBQUssT0FBTyxJQUFJLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUN2QyxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUNqQyxDQUFDO0tBQ0o7SUFsQlkseUJBQXFCLHdCQWtCakMsQ0FBQTtJQUVELGdHQUFnRztJQUNoRyxNQUFhLG9CQUFxQixTQUFRLGFBQWE7UUFDNUMsSUFBSSxDQUFDLElBQVksRUFBRSxHQUFXO1lBQ2pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO1lBQzFDLE9BQU87Z0JBQ0gsTUFBTTtvQkFDRixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO29CQUMzQyxJQUFJLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDZixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQzdCLENBQUM7b0JBQ0QsT0FBTyxlQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUMxQixDQUFDO2FBQ0osQ0FBQTtRQUNMLENBQUM7UUFDTSxNQUFNLENBQUMsR0FBVyxFQUFFLEdBQVc7WUFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQ2hDLHNCQUFzQixJQUFJLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQTtZQUU3QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQ3hDLGdDQUFnQyxDQUFDLENBQUE7WUFFckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQTtZQUN4QixPQUFPO2dCQUNILE1BQU07b0JBQ0YsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7b0JBQ2xELE9BQU8sSUFBSSxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUM3QyxDQUFDO2FBQ0osQ0FBQTtRQUNMLENBQUM7S0FDSjtJQTVCWSx3QkFBb0IsdUJBNEJoQyxDQUFBO0FBWUwsQ0FBQyxFQWpNZ0IsR0FBRyxtQkFBSCxHQUFHLFFBaU1uQjtBQUVELFNBQVMsSUFBSSxDQUFDLEdBQVEsRUFBRSxPQUFvQixFQUFFLEdBQVc7SUFDckQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFBO0lBQ25ELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUE7SUFDekIsSUFBSSxJQUFJLFlBQVksR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDdkMsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQzFCLGdCQUFnQixDQUFDLENBQUE7SUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtJQUN0QixPQUFRLEdBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDMUYsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLE1BQVcsRUFBRSxPQUFvQixFQUFFLEdBQVc7SUFDMUQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFBO0lBQ25ELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUE7SUFDekIsSUFBSSxJQUFJLFlBQVksR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxlQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFDL0IsaUJBQWlCLENBQUMsQ0FBQTtRQUN0QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQzVDLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQzdCLGdCQUFnQixDQUFDLENBQUE7UUFDckIsTUFBTSxLQUFLLEdBQUcsTUFBZSxDQUFBO1FBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUNwQyxZQUFZLElBQUksQ0FBQyxNQUFNLG1CQUFtQixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUM3RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDcEMsT0FBTyxDQUFDLENBQUE7UUFDWixDQUFDLEVBQUUsRUFBUyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFDN0IsZ0JBQWdCLENBQUMsQ0FBQTtJQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQ3RCLE9BQVEsTUFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDL0YsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLElBQWEsRUFBRSxHQUFXLEVBQUUsR0FBVztJQUNuRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDUixNQUFNLElBQUksUUFBUSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDeEMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxHQUFXO0lBQzVCLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxHQUFXO0lBQzVCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUM1QixDQUFDO0FBRUQsTUFBTSxRQUFTLFNBQVEsS0FBSztJQUN4QixZQUFZLEdBQVc7UUFDbkIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ1YsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFBO0lBQzdCLENBQUM7Q0FDSiJ9