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

184 lines 18.6 kB
var _a; import { IllegalArgumentException } from "../util/exception/IllegalArgumentException"; import { AbstractSet } from "./AbstractSet"; /** * This class implements the `Set` interface. Set objects are collections of values. You can iterate through the elements of a set in * insertion order. A value in the `Set` may only occur once; it is unique in the Set's collection. */ export class HashSet extends AbstractSet { /** * @constructor * @param initSet If an _iterable_ object is passed, all of its elements will be added to the new HashSet. * If you don't specify this parameter, or its value is _null_, the new HashSet is empty. * @throws `IllegalArgumentException` if the initial set includes a key which value is _undefined_ */ constructor(initSet) { super(); this[_a] = "HashSet"; if (initSet) { let bErr = false; if (initSet instanceof Set) { bErr = initSet.has(undefined); } else { for (const el of initSet) { if (el === undefined) { bErr = true; break; } } } if (bErr) { throw new IllegalArgumentException("Mapped argument has a key with undefined value"); } } this._set = new Set(initSet); } get size() { return this._set.size; } append(key) { if (key === undefined) { throw new IllegalArgumentException("Key has an undefined value"); } const oldSize = this.size; this._set.add(key); return oldSize != this.size; } /** * Gets the copy of the current set object * @returns A new set object with the same values as this set */ clone() { return new HashSet(this._set); } delete(key) { return this._set.delete(key); } has(key) { return this._set.has(key); } *entries() { yield* this._set.entries(); } *keys() { yield* this._set.keys(); } *values() { yield* this._set.values(); } forEach(callbackfn, thisArg) { this._set.forEach(callbackfn, thisArg); } *[Symbol.iterator]() { yield* this._set.keys(); } clear() { this._set.clear(); } contains(key) { return this._set.has(key); } remove(key) { return this.delete(key); } toArray() { return [...this._set.keys()]; } /** * Checks if the specified set is the sub set for the current set * @param setB Target set object to check * @returns _true_ if the target `setB` set is the sub set of this set, _false_ otherwise */ isSubSet(setB) { for (const elem of setB) { if (!this.has(elem)) { return false; } } return true; } /** * Checks if the specified set is the super set for the current set * @param setB Target set object to check * @returns _true_ if the target `setB` set is the super set of this set, _false_ otherwise */ isSuperSet(setB) { for (const elem of this) { if (!setB.has(elem)) { return false; } } return true; } /** * Gets the common values (intersection) with another set * @param setB Target set object for get the intersection * @returns New set object with common values * @see {@link retainAll} * @see {@link union} * @see {@link complement} */ intersection(setB) { const iSet = new HashSet(); for (let key of this) { if (setB.has(key)) { iSet.add(key); } } return iSet; } /** * Combines values with another set * @param setB Target set object for get the union * @returns New set object with combined values * @see {@link intersection} * @see {@link complement} */ union(setB) { const uSet = new HashSet(this); for (let key of setB) { if (key !== undefined) { uSet.add(key); } } return uSet; } /** * Retrieves values from `this` set that are missing from another (relative complement) * @param setB Target set object for get the relative complement * @returns New set object of the missing values * @see {@link intersection} * @see {@link union} * @see {@link symmetricDifference} */ complement(setB) { const cSet = new HashSet(); for (const key of this) { if (!setB.has(key)) { cSet.add(key); } } return cSet; } /** * Extracts values that are a combination of difference values from both sides of the comparison * @param setB Target set object for get the symmetric difference * @returns New set object of differences * @see {@link complement} */ symmetricDifference(setB) { const diffSet = new HashSet(this); for (const elem of setB) { if (diffSet.has(elem)) { diffSet.delete(elem); } else if (elem !== undefined) { diffSet.add(elem); } } return diffSet; } } _a = Symbol.toStringTag; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGFzaFNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N1dGUtY29yZS9zcmMvbGliL2NvbGxlY3Rpb25zL0hhc2hTZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBR3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLE9BQVcsU0FBUSxXQUFjO0lBRzVDOzs7OztPQUtHO0lBQ0gsWUFBWSxPQUFxQztRQUMvQyxLQUFLLEVBQUUsQ0FBQztRQWlMRCxRQUFvQixHQUFXLFNBQVMsQ0FBQztRQWhMaEQsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7WUFDakIsSUFBSSxPQUFPLFlBQVksR0FBRyxFQUFFO2dCQUMxQixJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFVLENBQUMsQ0FBQzthQUNoQztpQkFBTTtnQkFDTCxLQUFLLE1BQU0sRUFBRSxJQUFJLE9BQU8sRUFBRTtvQkFDeEIsSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFO3dCQUNwQixJQUFJLEdBQUcsSUFBSSxDQUFDO3dCQUNaLE1BQU07cUJBQ1A7aUJBQ0Y7YUFDRjtZQUNELElBQUksSUFBSSxFQUFFO2dCQUNSLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ3RGO1NBQ0Y7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFhLElBQUk7UUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFUSxNQUFNLENBQUMsR0FBTTtRQUNwQixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckIsTUFBTSxJ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Li91dGlsL2V4Y2VwdGlvbi9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cIjtcclxuaW1wb3J0IHsgQ2xvbmVhYmxlIH0gZnJvbSBcIi4uL3V0aWwvaW50ZXJmYWNlL0Nsb25lYWJsZVwiO1xyXG5pbXBvcnQgeyBFbGVtZW50IH0gZnJvbSBcIi4vQ29sbGVjdGlvblwiO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFNldCB9IGZyb20gXCIuL0Fic3RyYWN0U2V0XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBgU2V0YCBpbnRlcmZhY2UuIFNldCBvYmplY3RzIGFyZSBjb2xsZWN0aW9ucyBvZiB2YWx1ZXMuIFlvdSBjYW4gaXRlcmF0ZSB0aHJvdWdoIHRoZSBlbGVtZW50cyBvZiBhIHNldCBpblxyXG4gKiBpbnNlcnRpb24gb3JkZXIuIEEgdmFsdWUgaW4gdGhlIGBTZXRgIG1heSBvbmx5IG9jY3VyIG9uY2U7IGl0IGlzIHVuaXF1ZSBpbiB0aGUgU2V0J3MgY29sbGVjdGlvbi5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBIYXNoU2V0PEs+IGV4dGVuZHMgQWJzdHJhY3RTZXQ8Sz4gaW1wbGVtZW50cyBDbG9uZWFibGUge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NldDogU2V0PEs+O1xyXG5cclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gaW5pdFNldCBJZiBhbiBfaXRlcmFibGVfIG9iamVjdCBpcyBwYXNzZWQsIGFsbCBvZiBpdHMgZWxlbWVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgbmV3IEhhc2hTZXQuXHJcbiAgICogICAgICAgICAgICAgICAgSWYgeW91IGRvbid0IHNwZWNpZnkgdGhpcyBwYXJhbWV0ZXIsIG9yIGl0cyB2YWx1ZSBpcyBfbnVsbF8sIHRoZSBuZXcgSGFzaFNldCBpcyBlbXB0eS5cclxuICAgKiBAdGhyb3dzIGBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25gIGlmIHRoZSBpbml0aWFsIHNldCBpbmNsdWRlcyBhIGtleSB3aGljaCB2YWx1ZSBpcyBfdW5kZWZpbmVkX1xyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKGluaXRTZXQ/OiBTZXQ8Sz4gfCBJdGVyYWJsZTxLPiB8IG51bGwpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAoaW5pdFNldCkge1xyXG4gICAgICBsZXQgYkVyciA9IGZhbHNlO1xyXG4gICAgICBpZiAoaW5pdFNldCBpbnN0YW5jZW9mIFNldCkge1xyXG4gICAgICAgIGJFcnIgPSBpbml0U2V0Lmhhcyh1bmRlZmluZWQhKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGluaXRTZXQpIHtcclxuICAgICAgICAgIGlmIChlbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGJFcnIgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGJFcnIpIHtcclxuICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiTWFwcGVkIGFyZ3VtZW50IGhhcyBhIGtleSB3aXRoIHVuZGVmaW5lZCB2YWx1ZVwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fc2V0ID0gbmV3IFNldChpbml0U2V0KTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGdldCBzaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2V0LnNpemU7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBhcHBlbmQoa2V5OiBLKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIktleSBoYXMgYW4gdW5kZWZpbmVkIHZhbHVlXCIpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgb2xkU2l6ZSA9IHRoaXMuc2l6ZTtcclxuICAgIHRoaXMuX3NldC5hZGQoa2V5KTtcclxuICAgIHJldHVybiBvbGRTaXplICE9IHRoaXMuc2l6ZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgY29weSBvZiB0aGUgY3VycmVudCBzZXQgb2JqZWN0XHJcbiAgICogQHJldHVybnMgQSBuZXcgc2V0IG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGlzIHNldFxyXG4gICAqL1xyXG4gIGNsb25lKCk6IEhhc2hTZXQ8Sz4ge1xyXG4gICAgcmV0dXJuIG5ldyBIYXNoU2V0PEs+KHRoaXMuX3NldCk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBkZWxldGUoa2V5OiBLKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2V0LmRlbGV0ZShrZXkpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgaGFzKGtleTogSyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoa2V5KTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0ssIEtdPiB7XHJcbiAgICB5aWVsZCogdGhpcy5fc2V0LmVudHJpZXMoKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Sz4ge1xyXG4gICAgeWllbGQqIHRoaXMuX3NldC5rZXlzKCk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSAqdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Sz4ge1xyXG4gICAgeWllbGQqIHRoaXMuX3NldC52YWx1ZXMoKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGZvckVhY2goY2FsbGJhY2tmbjogKHZhbHVlOiBLLCB2YWx1ZTI6IEssIHNldDogU2V0PEs+KSA9PiB2b2lkLCB0aGlzQXJnPzogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXQuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPEs+IHtcclxuICAgIHlpZWxkKiB0aGlzLl9zZXQua2V5cygpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXQuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGNvbnRhaW5zKGtleTogSyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoa2V5KTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHJlbW92ZShrZXk6IEspOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgdG9BcnJheSgpOiBFbGVtZW50PEs+W10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLl9zZXQua2V5cygpXTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgc2V0IGlzIHRoZSBzdWIgc2V0IGZvciB0aGUgY3VycmVudCBzZXRcclxuICAgKiBAcGFyYW0gc2V0QiBUYXJnZXQgc2V0IG9iamVjdCB0byBjaGVja1xyXG4gICAqIEByZXR1cm5zIF90cnVlXyBpZiB0aGUgdGFyZ2V0IGBzZXRCYCBzZXQgaXMgdGhlIHN1YiBzZXQgb2YgdGhpcyBzZXQsIF9mYWxzZV8gb3RoZXJ3aXNlXHJcbiAgICovXHJcbiAgaXNTdWJTZXQoc2V0QjogU2V0PEs+KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGVsZW0gb2Ygc2V0Qikge1xyXG4gICAgICBpZiAoIXRoaXMuaGFzKGVsZW0pKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgc2V0IGlzIHRoZSBzdXBlciBzZXQgZm9yIHRoZSBjdXJyZW50IHNldFxyXG4gICAqIEBwYXJhbSBzZXRCIFRhcmdldCBzZXQgb2JqZWN0IHRvIGNoZWNrXHJcbiAgICogQHJldHVybnMgX3RydWVfIGlmIHRoZSB0YXJnZXQgYHNldEJgIHNldCBpcyB0aGUgc3VwZXIgc2V0IG9mIHRoaXMgc2V0LCBfZmFsc2VfIG90aGVyd2lzZVxyXG4gICAqL1xyXG4gIGlzU3VwZXJTZXQoc2V0QjogU2V0PEs+KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGVsZW0gb2YgdGhpcykge1xyXG4gICAgICBpZiAoIXNldEIuaGFzKGVsZW0pKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgY29tbW9uIHZhbHVlcyAoaW50ZXJzZWN0aW9uKSB3aXRoIGFub3RoZXIgc2V0XHJcbiAgICogQHBhcmFtIHNldEIgVGFyZ2V0IHNldCBvYmplY3QgZm9yIGdldCB0aGUgaW50ZXJzZWN0aW9uXHJcbiAgICogQHJldHVybnMgTmV3IHNldCBvYmplY3Qgd2l0aCBjb21tb24gdmFsdWVzXHJcbiAgICogQHNlZSB7QGxpbmsgcmV0YWluQWxsfVxyXG4gICAqIEBzZWUge0BsaW5rIHVuaW9ufVxyXG4gICAqIEBzZWUge0BsaW5rIGNvbXBsZW1lbnR9XHJcbiAgICovXHJcbiAgaW50ZXJzZWN0aW9uKHNldEI6IFNldDxLPik6IEhhc2hTZXQ8Sz4ge1xyXG4gICAgY29uc3QgaVNldCA9IG5ldyBIYXNoU2V0PEs+KCk7XHJcbiAgICBmb3IgKGxldCBrZXkgb2YgdGhpcykge1xyXG4gICAgICBpZiAoc2V0Qi5oYXMoa2V5KSkge1xyXG4gICAgICAgIGlTZXQuYWRkKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpU2V0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb21iaW5lcyB2YWx1ZXMgd2l0aCBhbm90aGVyIHNldFxyXG4gICAqIEBwYXJhbSBzZXRCIFRhcmdldCBzZXQgb2JqZWN0IGZvciBnZXQgdGhlIHVuaW9uXHJcbiAgICogQHJldHVybnMgTmV3IHNldCBvYmplY3Qgd2l0aCBjb21iaW5lZCB2YWx1ZXNcclxuICAgKiBAc2VlIHtAbGluayBpbnRlcnNlY3Rpb259XHJcbiAgICogQHNlZSB7QGxpbmsgY29tcGxlbWVudH1cclxuICAgKi9cclxuICB1bmlvbihzZXRCOiBTZXQ8Sz4pOiBIYXNoU2V0PEs+IHtcclxuICAgIGNvbnN0IHVTZXQgPSBuZXcgSGFzaFNldDxLPih0aGlzKTtcclxuICAgIGZvciAobGV0IGtleSBvZiBzZXRCKSB7XHJcbiAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHVTZXQuYWRkKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1U2V0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdmFsdWVzIGZyb20gYHRoaXNgIHNldCB0aGF0IGFyZSBtaXNzaW5nIGZyb20gYW5vdGhlciAocmVsYXRpdmUgY29tcGxlbWVudClcclxuICAgKiBAcGFyYW0gc2V0QiBUYXJnZXQgc2V0IG9iamVjdCBmb3IgZ2V0IHRoZSByZWxhdGl2ZSBjb21wbGVtZW50XHJcbiAgICogQHJldHVybnMgTmV3IHNldCBvYmplY3Qgb2YgdGhlIG1pc3NpbmcgdmFsdWVzXHJcbiAgICogQHNlZSB7QGxpbmsgaW50ZXJzZWN0aW9ufVxyXG4gICAqIEBzZWUge0BsaW5rIHVuaW9ufVxyXG4gICAqIEBzZWUge0BsaW5rIHN5bW1ldHJpY0RpZmZlcmVuY2V9XHJcbiAgICovXHJcbiAgY29tcGxlbWVudChzZXRCOiBTZXQ8Sz4pOiBIYXNoU2V0PEs+IHtcclxuICAgIGNvbnN0IGNTZXQgPSBuZXcgSGFzaFNldDxLPigpO1xyXG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcykge1xyXG4gICAgICBpZiAoICFzZXRCLmhhcyhrZXkpICkge1xyXG4gICAgICAgIGNTZXQuYWRkKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjU2V0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBFeHRyYWN0cyB2YWx1ZXMgdGhhdCBhcmUgYSBjb21iaW5hdGlvbiBvZiBkaWZmZXJlbmNlIHZhbHVlcyBmcm9tIGJvdGggc2lkZXMgb2YgdGhlIGNvbXBhcmlzb25cclxuICAgKiBAcGFyYW0gc2V0QiBUYXJnZXQgc2V0IG9iamVjdCBmb3IgZ2V0IHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZVxyXG4gICAqIEByZXR1cm5zIE5ldyBzZXQgb2JqZWN0IG9mIGRpZmZlcmVuY2VzXHJcbiAgICogQHNlZSB7QGxpbmsgY29tcGxlbWVudH1cclxuICAgKi9cclxuICBzeW1tZXRyaWNEaWZmZXJlbmNlKHNldEI6IFNldDxLPik6IEhhc2hTZXQ8Sz4ge1xyXG4gICAgY29uc3QgZGlmZlNldCA9IG5ldyBIYXNoU2V0PEs+KHRoaXMpO1xyXG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHNldEIpIHtcclxuICAgICAgaWYgKGRpZmZTZXQuaGFzKGVsZW0pKSB7XHJcbiAgICAgICAgZGlmZlNldC5kZWxldGUoZWxlbSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZWxlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZGlmZlNldC5hZGQoZWxlbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkaWZmU2V0O1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZyA9IFwiSGFzaFNldFwiO1xyXG5cclxufVxyXG4iXX0=