UNPKG

@cute-dw/core

Version:

This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need

270 lines 27 kB
var _a; import { Subject } from "rxjs"; import { AvlTree } from "./tree/AvlTree"; import { AbstractMap } from "./AbstractMap"; import { IllegalArgumentException } from "../util/exception/IllegalArgumentException"; /** * An AVL-tree based `NavigableMap` implementation. The map is sorted according to the natural ordering of its keys, or by a `Comparator` provided at map creation time, depending on which constructor is used. */ export class TreeMap extends AbstractMap { constructor(comparator) { super(); this._size = 0; this.contentChanged$ = new Subject(); /** * @override */ this[_a] = "TreeMap"; this._tree = new AvlTree(comparator); } get comparator() { return this._tree.keyComparator; } get contentChanged() { return this.contentChanged$.asObservable(); } get size() { return this._size; } clear() { if (!this.isEmpty()) { this._tree.clear(); this._size = this._tree.count(); this.contentChanged$.next(); } } clone() { const tMap = new TreeMap(this._tree.keyComparator); tMap.putAll(this); return tMap; } /** Returns the first (lowest) key currently in this map */ firstKey() { return this._tree.firstKey(); } /** * @override */ firstEntry() { const key = this.firstKey(); if (key !== undefined) { return [key, this.get(key)]; } return undefined; } /** Returns the last (highest) key currently in this map */ lastKey() { return this._tree.lastKey(); } /** * @override */ lastEntry() { const key = this.lastKey(); if (key !== undefined) { return [key, this.get(key)]; } return undefined; } /** * @override */ pollLastEntry() { const entry = this.lastEntry(); if (entry) { this.delete(entry[0]); } return entry; } /** * @override */ pollFirstEntry() { const entry = this.firstEntry(); if (entry) { this.delete(entry[0]); } return entry; } /** Returns the maximal level of the tree */ height() { return this._tree.height(); } /** * Gets the keys of this tree as a `Set` collection * @returns Set */ keySet() { return this._tree.keySet(); } /** * @override */ ceilingKey(key) { let findKey = undefined; for (let currKey of this.keys()) { if (this._tree.keyComparator.greaterThanOrEqual(currKey, key)) { findKey = currKey; break; } } return findKey; } /** * @override */ floorKey(key) { let findKey = undefined; for (let currKey of this.keys()) { if (this._tree.keyComparator.lessThanOrEqual(currKey, key)) { findKey = currKey; } else { break; } } return findKey; } /** * @override */ lowerKey(key) { let findKey = undefined; for (let currKey of this.keys()) { if (this._tree.keyComparator.lessThan(currKey, key)) { findKey = currKey; } else { break; } } return findKey; } /** * @override */ higherKey(key) { let findKey = undefined; for (let currKey of this.keys()) { if (this._tree.keyComparator.greaterThan(currKey, key)) { findKey = currKey; break; } } return findKey; } /** * Gets array of the keys * @returns Array */ *keys() { for (let key of this._tree.keys()) { yield key; } } /** * Gets array of the values * @returns Array */ *values() { for (let val of this._tree.values()) { yield val; } } /** * Gets array of the tree entries * @returns Array */ *entries() { yield* this[Symbol.iterator](); } /** * Returns _true_ if this tree contains a mapping for the specified `key` * @see {@link has} */ containsKey(key) { return this._tree.contains(key); } /** Returns _true_ if this tree contains a value, _false_ otherwise */ containsValue(value) { return [...this.values()].indexOf(value) >= 0; } /** Returns the value to which the `key` is mapped in this tree */ get(key) { return this._tree.get(key); } /** Returns the value to which the `key` is mapped in this tree, or `defaultValue` if this tree contains no mapping for the key */ getOrDefault(key, defaultValue) { return this._tree.get(key) ?? defaultValue; } /** * Tests the tree for the `key` existence * @param key A key value to test * @returns _true_ if this tree contains a mapping for the specified `key`, _false_ otherwise * @see {@link containsKey} */ has(key) { return this._tree.contains(key); } /** * Maps the specified `key` to the specified `value` in this tree and returns previous value of the mapping * @param key A key value of the mapping * @param value New value to assign for the `key` * @returns Old value of the `key` or _undefined_ if it was not set before * @throws IllegalArgumentException */ put(key, value) { if (key === undefined || value === undefined) { throw new IllegalArgumentException("Undefined key/value is not allowed in 'put()' operation"); } const oldElem = this._tree.get(key); this._tree.add(key, value); if (oldElem === undefined) { this._size++; } this.contentChanged$.next(); return oldElem; } /** Copies all of the mappings from the specified map to this tree */ putAll(map) { const aKeys = map.keys(); aKeys.forEach(key => this.put(key, this.get(key))); } /** Removes the `key` (and its corresponding value) from this tree */ remove(key) { const elem = this._tree.remove(key); if (elem !== undefined) { this._size--; this.contentChanged$.next(); } return elem; } /** * @override * @throws IllegalArgumentException */ set(key, value) { this.put(key, value); return this; } /** * Performs the specified action for each element in the tree. * @param callBack Function to call on each tree item * @param thisArg An object to which the `this` keyword can refer in the `callBack` function. If `thisArg` is omitted, undefined is used as the `this` value */ forEach(callBack, thisArg) { this._tree.forEach((value, key) => callBack(value, key, this), thisArg); } /** * @override */ *[(_a = Symbol.toStringTag, Symbol.iterator)]() { for (let node of this._tree) { yield [node.key, node.value]; } } /** * @override */ toString() { return this._tree.toString(); } print() { return this._tree.print(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJlZU1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N1dGUtY29yZS9zcmMvbGliL2NvbGxlY3Rpb25zL1RyZWVNYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFdEY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sT0FBYSxTQUFRLFdBQWdCO0lBS2hELFlBQVksVUFBMEI7UUFDcEMsS0FBSyxFQUFFLENBQUM7UUFKRixVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ1Ysb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBaVB0RDs7V0FFRztRQUNILFFBQW9CLEdBQVcsU0FBUyxDQUFDO1FBaFB2QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksT0FBTyxDQUFNLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLFVBQVUsS0FBbUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBLENBQUM7SUFFbEUsSUFBYSxjQUFjLEtBQXVCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFFOUYsSUFBYSxJQUFJLEtBQWEsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUV6QyxLQUFLO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FB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QUFXLEVBSVIsTUFBTSxDQUFDLFFBQVEsRUFBQztRQUN6QixLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQU0sQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUNEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1QixDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gXCIuL0RpY3Rpb25hcnlcIjtcclxuaW1wb3J0IHsgQXZsVHJlZSB9IGZyb20gXCIuL3RyZWUvQXZsVHJlZVwiO1xyXG5pbXBvcnQgeyBFbGVtZW50IH0gZnJvbSBcIi4vQ29sbGVjdGlvblwiO1xyXG5pbXBvcnQgeyBCaW5hcnlTZWFyY2hUcmVlIH0gZnJvbSBcIi4vdHJlZS9CaW5hcnlTZWFyY2hUcmVlXCI7XHJcbmltcG9ydCB7IENvbXBhcmF0b3IgfSBmcm9tIFwiLi4vdXRpbC9Db21wYXJhdG9yXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0TWFwIH0gZnJvbSBcIi4vQWJzdHJhY3RNYXBcIjtcclxuaW1wb3J0IHsgTmF2aWdhYmxlTWFwIH0gZnJvbSBcIi4vTmF2aWdhYmxlTWFwXCI7XHJcbmltcG9ydCB7IENsb25lYWJsZSB9IGZyb20gXCIuLi91dGlsL2ludGVyZmFjZS9DbG9uZWFibGVcIjtcclxuaW1wb3J0IHsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIH0gZnJvbSBcIi4uL3V0aWwvZXhjZXB0aW9uL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIEFWTC10cmVlIGJhc2VkIGBOYXZpZ2FibGVNYXBgIGltcGxlbWVudGF0aW9uLiBUaGUgbWFwIGlzIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG5hdHVyYWwgb3JkZXJpbmcgb2YgaXRzIGtleXMsIG9yIGJ5IGEgYENvbXBhcmF0b3JgIHByb3ZpZGVkIGF0IG1hcCBjcmVhdGlvbiB0aW1lLCBkZXBlbmRpbmcgb24gd2hpY2ggY29uc3RydWN0b3IgaXMgdXNlZC5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBUcmVlTWFwPEssVj4gZXh0ZW5kcyBBYnN0cmFjdE1hcDxLLFY+IGltcGxlbWVudHMgTmF2aWdhYmxlTWFwPEssVj4sIENsb25lYWJsZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfdHJlZTogQmluYXJ5U2VhcmNoVHJlZTxLLFY+O1xyXG4gIHByaXZhdGUgX3NpemU6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRlbnRDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbXBhcmF0b3I/OiBDb21wYXJhdG9yPEs+KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5fdHJlZSA9IG5ldyBBdmxUcmVlPEssVj4oY29tcGFyYXRvcik7XHJcbiAgfVxyXG5cclxuICBnZXQgY29tcGFyYXRvcigpOiBDb21wYXJhdG9yPEs+IHtyZXR1cm4gdGhpcy5fdHJlZS5rZXlDb21wYXJhdG9yO31cclxuXHJcbiAgb3ZlcnJpZGUgZ2V0IGNvbnRlbnRDaGFuZ2VkKCk6IE9ic2VydmFibGU8dm9pZD4geyByZXR1cm4gdGhpcy5jb250ZW50Q2hhbmdlZCQuYXNPYnNlcnZhYmxlKCkgfVxyXG5cclxuICBvdmVycmlkZSBnZXQgc2l6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc2l6ZTsgfVxyXG5cclxuICBvdmVycmlkZSBjbGVhcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0VtcHR5KCkpIHtcclxuICAgICAgdGhpcy5fdHJlZS5jbGVhcigpO1xyXG4gICAgICB0aGlzLl9zaXplID0gdGhpcy5fdHJlZS5jb3VudCgpO1xyXG4gICAgICB0aGlzLmNvbnRlbnRDaGFuZ2VkJC5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9uZSgpOiBUcmVlTWFwPEssVj4ge1xyXG4gICAgY29uc3QgdE1hcCA9IG5ldyBUcmVlTWFwPEssVj4odGhpcy5fdHJlZS5rZXlDb21wYXJhdG9yKTtcclxuICAgIHRNYXAucHV0QWxsKHRoaXMpO1xyXG4gICAgcmV0dXJuIHRNYXA7XHJcbiAgfVxyXG4gIC8qKiBSZXR1cm5zIHRoZSBmaXJzdCAobG93ZXN0KSBrZXkgY3VycmVudGx5IGluIHRoaXMgbWFwICovXHJcbiAgZmlyc3RLZXkoKTogSyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZS5maXJzdEtleSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICBmaXJzdEVudHJ5KCk6IFtLLFZdIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuZmlyc3RLZXkoKTtcclxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gW2tleSwgdGhpcy5nZXQoa2V5KSFdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcbiAgLyoqIFJldHVybnMgdGhlIGxhc3QgKGhpZ2hlc3QpIGtleSBjdXJyZW50bHkgaW4gdGhpcyBtYXAgKi9cclxuICBsYXN0S2V5KCk6IEsgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyZWUubGFzdEtleSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICBsYXN0RW50cnkoKTogW0ssVl0gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5sYXN0S2V5KCk7XHJcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIFtrZXksIHRoaXMuZ2V0KGtleSkhXTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqL1xyXG4gIHBvbGxMYXN0RW50cnkoKTogW0ssVl0gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmxhc3RFbnRyeSgpO1xyXG4gICAgaWYgKGVudHJ5KSB7XHJcbiAgICAgIHRoaXMuZGVsZXRlKGVudHJ5WzBdKTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbnRyeTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgcG9sbEZpcnN0RW50cnkoKTogW0ssVl0gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmZpcnN0RW50cnkoKTtcclxuICAgIGlmIChlbnRyeSkge1xyXG4gICAgICB0aGlzLmRlbGV0ZShlbnRyeVswXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW50cnk7XHJcbiAgfVxyXG4gIC8qKiBSZXR1cm5zIHRoZSBtYXhpbWFsIGxldmVsIG9mIHRoZSB0cmVlICovXHJcbiAgaGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZS5oZWlnaHQoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUga2V5cyBvZiB0aGlzIHRyZWUgYXMgYSBgU2V0YCBjb2xsZWN0aW9uXHJcbiAgICogQHJldHVybnMgU2V0XHJcbiAgICovXHJcbiAgb3ZlcnJpZGUga2V5U2V0KCk6IFNldDxLPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZS5rZXlTZXQoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgY2VpbGluZ0tleShrZXk6IEspOiBLIHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCBmaW5kS2V5OiAgSyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIGZvciAobGV0IGN1cnJLZXkgb2YgdGhpcy5rZXlzKCkpIHtcclxuICAgICAgaWYgKHRoaXMuX3RyZWUua2V5Q29tcGFyYXRvci5ncmVhdGVyVGhhbk9yRXF1YWwoY3VycktleSwga2V5KSkge1xyXG4gICAgICAgIGZpbmRLZXkgPSBjdXJyS2V5O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmluZEtleTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgZmxvb3JLZXkoa2V5OiBLKTogSyB8IHVuZGVmaW5lZCB7XHJcbiAgICBsZXQgZmluZEtleTogIEsgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBmb3IobGV0IGN1cnJLZXkgb2YgdGhpcy5rZXlzKCkpIHtcclxuICAgICAgaWYgKHRoaXMuX3RyZWUua2V5Q29tcGFyYXRvci5sZXNzVGhhbk9yRXF1YWwoY3VycktleSwga2V5KSkge1xyXG4gICAgICAgIGZpbmRLZXkgPSBjdXJyS2V5O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmluZEtleTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgbG93ZXJLZXkoa2V5OiBLKTogSyB8IHVuZGVmaW5lZCB7XHJcbiAgICBsZXQgZmluZEtleTogIEsgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBmb3IgKGxldCBjdXJyS2V5IG9mIHRoaXMua2V5cygpKSB7XHJcbiAgICAgIGlmICh0aGlzLl90cmVlLmtleUNvbXBhcmF0b3IubGVzc1RoYW4oY3VycktleSwga2V5KSkge1xyXG4gICAgICAgIGZpbmRLZXkgPSBjdXJyS2V5O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmluZEtleTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgaGlnaGVyS2V5KGtleTogSyk6IEsgfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IGZpbmRLZXk6ICBLIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgZm9yIChsZXQgY3VycktleSBvZiB0aGlzLmtleXMoKSkge1xyXG4gICAgICBpZiAodGhpcy5fdHJlZS5rZXlDb21wYXJhdG9yLmdyZWF0ZXJUaGFuKGN1cnJLZXksIGtleSkpIHtcclxuICAgICAgICBmaW5kS2V5ID0gY3VycktleTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpbmRLZXk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgYXJyYXkgb2YgdGhlIGtleXNcclxuICAgKiBAcmV0dXJucyBBcnJheVxyXG4gICAqL1xyXG4gIG92ZXJyaWRlICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Sz4ge1xyXG4gICAgZm9yIChsZXQga2V5IG9mIHRoaXMuX3RyZWUua2V5cygpKSB7XHJcbiAgICAgIHlpZWxkIGtleTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyBhcnJheSBvZiB0aGUgdmFsdWVzXHJcbiAgICogQHJldHVybnMgQXJyYXlcclxuICAgKi9cclxuICBvdmVycmlkZSAqdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Vj4ge1xyXG4gICAgZm9yIChsZXQgdmFsIG9mIHRoaXMuX3RyZWUudmFsdWVzKCkpIHtcclxuICAgICAgeWllbGQgdmFsITtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyBhcnJheSBvZiB0aGUgdHJlZSBlbnRyaWVzXHJcbiAgICogQHJldHVybnMgQXJyYXlcclxuICAgKi9cclxuICBvdmVycmlkZSAqZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtLLCBWXT4ge1xyXG4gICAgeWllbGQqIHRoaXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIF90cnVlXyBpZiB0aGlzIHRyZWUgY29udGFpbnMgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGBrZXlgXHJcbiAgICogQHNlZSB7QGxpbmsgaGFzfVxyXG4gICAqL1xyXG4gIGNvbnRhaW5zS2V5KGtleTogSyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyZWUuY29udGFpbnMoa2V5KTtcclxuICB9XHJcbiAgLyoqIFJldHVybnMgX3RydWVfIGlmIHRoaXMgdHJlZSBjb250YWlucyBhIHZhbHVlLCBfZmFsc2VfIG90aGVyd2lzZSAqL1xyXG4gIGNvbnRhaW5zVmFsdWUodmFsdWU6IFYpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBbLi4udGhpcy52YWx1ZXMoKV0uaW5kZXhPZih2YWx1ZSkgPj0gMDtcclxuICB9XHJcbiAgLyoqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBga2V5YCBpcyBtYXBwZWQgaW4gdGhpcyB0cmVlICovXHJcbiAgb3ZlcnJpZGUgZ2V0KGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyZWUuZ2V0KGtleSkhO1xyXG4gIH1cclxuICAvKiogUmV0dXJucyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIGBrZXlgIGlzIG1hcHBlZCBpbiB0aGlzIHRyZWUsIG9yIGBkZWZhdWx0VmFsdWVgIGlmIHRoaXMgdHJlZSBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGUga2V5ICovXHJcbiAgZ2V0T3JEZWZhdWx0KGtleTogSywgZGVmYXVsdFZhbHVlOiBFbGVtZW50PFY+KTogRWxlbWVudDxWPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZS5nZXQoa2V5KSA/PyBkZWZhdWx0VmFsdWU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRlc3RzIHRoZSB0cmVlIGZvciB0aGUgYGtleWAgZXhpc3RlbmNlXHJcbiAgICogQHBhcmFtIGtleSBBIGtleSB2YWx1ZSB0byB0ZXN0XHJcbiAgICogQHJldHVybnMgX3RydWVfIGlmIHRoaXMgdHJlZSBjb250YWlucyBhIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgYGtleWAsIF9mYWxzZV8gb3RoZXJ3aXNlXHJcbiAgICogQHNlZSB7QGxpbmsgY29udGFpbnNLZXl9XHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgaGFzKGtleTogSyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyZWUuY29udGFpbnMoa2V5KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTWFwcyB0aGUgc3BlY2lmaWVkIGBrZXlgIHRvIHRoZSBzcGVjaWZpZWQgYHZhbHVlYCBpbiB0aGlzIHRyZWUgYW5kIHJldHVybnMgcHJldmlvdXMgdmFsdWUgb2YgdGhlIG1hcHBpbmdcclxuICAgKiBAcGFyYW0ga2V5IEEga2V5IHZhbHVlIG9mIHRoZSBtYXBwaW5nXHJcbiAgICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZSB0byBhc3NpZ24gZm9yIHRoZSBga2V5YFxyXG4gICAqIEByZXR1cm5zIE9sZCB2YWx1ZSBvZiB0aGUgYGtleWAgb3IgX3VuZGVmaW5lZF8gaWYgaXQgd2FzIG5vdCBzZXQgYmVmb3JlXHJcbiAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cclxuICAgKi9cclxuICBwdXQoa2V5OiBLLCB2YWx1ZTogVik6IFYgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVuZGVmaW5lZCBrZXkvdmFsdWUgaXMgbm90IGFsbG93ZWQgaW4gJ3B1dCgpJyBvcGVyYXRpb25cIik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvbGRFbGVtID0gdGhpcy5fdHJlZS5nZXQoa2V5KSE7XHJcbiAgICB0aGlzLl90cmVlLmFkZChrZXksIHZhbHVlKTtcclxuICAgIGlmIChvbGRFbGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fc2l6ZSsrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250ZW50Q2hhbmdlZCQubmV4dCgpO1xyXG4gICAgcmV0dXJuIG9sZEVsZW07XHJcbiAgfVxyXG4gIC8qKiBDb3BpZXMgYWxsIG9mIHRoZSBtYXBwaW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgdHJlZSAqL1xyXG4gIHB1dEFsbDxLZXkgZXh0ZW5kcyBLLCBWYWx1ZSBleHRlbmRzIFY+KG1hcDogRGljdGlvbmFyeTxLZXksIFZhbHVlPiB8IE1hcDxLZXksIFZhbHVlPik6IHZvaWQge1xyXG4gICAgY29uc3QgYUtleXMgPSBtYXAua2V5cygpIGFzIEtbXTtcclxuICAgIGFLZXlzLmZvckVhY2goa2V5ID0+IHRoaXMucHV0KGtleSwgdGhpcy5nZXQoa2V5KSEpKTtcclxuICB9XHJcbiAgLyoqIFJlbW92ZXMgdGhlIGBrZXlgIChhbmQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUpIGZyb20gdGhpcyB0cmVlICovXHJcbiAgcmVtb3ZlKGtleTogSyk6IEVsZW1lbnQ8Vj4gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZWxlbSA9IHRoaXMuX3RyZWUucmVtb3ZlKGtleSk7XHJcbiAgICBpZiAoIGVsZW0gIT09IHVuZGVmaW5lZCApIHtcclxuICAgICAgdGhpcy5fc2l6ZS0tO1xyXG4gICAgICB0aGlzLmNvbnRlbnRDaGFuZ2VkJC5uZXh0KCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZWxlbTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cclxuICAgKi9cclxuICBvdmVycmlkZSBzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHRoaXMge1xyXG4gICAgdGhpcy5wdXQoa2V5LCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybXMgdGhlIHNwZWNpZmllZCBhY3Rpb24gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgdHJlZS5cclxuICAgKiBAcGFyYW0gY2FsbEJhY2sgIEZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCB0cmVlIGl0ZW1cclxuICAgKiBAcGFyYW0gdGhpc0FyZyAgIEFuIG9iamVjdCB0byB3aGljaCB0aGUgYHRoaXNgIGtleXdvcmQgY2FuIHJlZmVyIGluIHRoZSBgY2FsbEJhY2tgIGZ1bmN0aW9uLiBJZiBgdGhpc0FyZ2AgaXMgb21pdHRlZCwgdW5kZWZpbmVkIGlzIHVzZWQgYXMgdGhlIGB0aGlzYCB2YWx1ZVxyXG4gICAqL1xyXG4gIG92ZXJyaWRlIGZvckVhY2goY2FsbEJhY2s6ICh2YWx1ZTogViwga2V5OiBLLCBtYXA6IE1hcDxLLCBWPikgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5fdHJlZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiBjYWxsQmFjayh2YWx1ZSBhcyBWLCBrZXksIHRoaXMpLCB0aGlzQXJnKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZyA9IFwiVHJlZU1hcFwiO1xyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqL1xyXG4gIG92ZXJyaWRlICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFtLLFZdPiB7XHJcbiAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMuX3RyZWUpIHtcclxuICAgICAgeWllbGQgW25vZGUua2V5LCBub2RlLnZhbHVlIV07XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqL1xyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpbnQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90cmVlLnByaW50KCk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=