UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

336 lines 23.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { AkitaPlugin } from '../plugin'; import { QueryEntity } from '../../queryEntity'; import { BehaviorSubject, combineLatest, Subject } from 'rxjs'; import { distinctUntilChanged, map, skip } from 'rxjs/operators'; import { isUndefined } from '../../isUndefined'; import { coerceArray } from '../../coerceArray'; import { isFunction } from '../../isFunction'; import { logAction } from '../../actions'; /** @type {?} */ export var dirtyCheckDefaultParams = { comparator: (/** * @param {?} head * @param {?} current * @return {?} */ function (head, current) { return JSON.stringify(head) !== JSON.stringify(current); }) }; /** * @param {?} nestedObj * @param {?} path * @return {?} */ export function getNestedPath(nestedObj, path) { /** @type {?} */ var pathAsArray = path.split('.'); return pathAsArray.reduce((/** * @param {?} obj * @param {?} key * @return {?} */ function (obj, key) { return (obj && obj[key] !== 'undefined' ? obj[key] : undefined); }), nestedObj); } /** * @template State */ var /** * @template State */ DirtyCheckPlugin = /** @class */ (function (_super) { tslib_1.__extends(DirtyCheckPlugin, _super); function DirtyCheckPlugin(query, params, _entityId) { var _this = _super.call(this, query) || this; _this.query = query; _this.params = params; _this._entityId = _entityId; _this.dirty = new BehaviorSubject(false); _this.active = false; _this._reset = new Subject(); _this.isDirty$ = _this.dirty.asObservable().pipe(distinctUntilChanged()); _this.reset$ = _this._reset.asObservable(); _this.params = tslib_1.__assign({}, dirtyCheckDefaultParams, params); if (_this.params.watchProperty) { /** @type {?} */ var watchProp = (/** @type {?} */ (coerceArray(_this.params.watchProperty))); if (query instanceof QueryEntity && watchProp.includes('entities') && !watchProp.includes('ids')) { watchProp.push('ids'); } _this.params.watchProperty = watchProp; } return _this; } /** * @param {?=} params * @return {?} */ DirtyCheckPlugin.prototype.reset = /** * @param {?=} params * @return {?} */ function (params) { if (params === void 0) { params = {}; } /** @type {?} */ var currentValue = this.head; if (isFunction(params.updateFn)) { if (this.isEntityBased(this._entityId)) { currentValue = params.updateFn(this.head, ((/** @type {?} */ (this.getQuery()))).getEntity(this._entityId)); } else { currentValue = params.updateFn(this.head, ((/** @type {?} */ (this.getQuery()))).getValue()); } } logAction("@DirtyCheck - Revert"); this.updateStore(currentValue, this._entityId); this._reset.next(); }; /** * @template THIS * @this {THIS} * @return {THIS} */ DirtyCheckPlugin.prototype.setHead = /** * @template THIS * @this {THIS} * @return {THIS} */ function () { if (!(/** @type {?} */ (this)).active) { (/** @type {?} */ (this)).activate(); (/** @type {?} */ (this)).active = true; } else { (/** @type {?} */ (this)).head = (/** @type {?} */ (this))._getHead(); } (/** @type {?} */ (this)).updateDirtiness(false); return (/** @type {?} */ (this)); }; /** * @return {?} */ DirtyCheckPlugin.prototype.isDirty = /** * @return {?} */ function () { return !!this.dirty.value; }; /** * @return {?} */ DirtyCheckPlugin.prototype.hasHead = /** * @return {?} */ function () { return !!this.getHead(); }; /** * @return {?} */ DirtyCheckPlugin.prototype.destroy = /** * @return {?} */ function () { this.head = null; this.subscription && this.subscription.unsubscribe(); this._reset && this._reset.complete(); }; /** * @param {?} path * @return {?} */ DirtyCheckPlugin.prototype.isPathDirty = /** * @param {?} path * @return {?} */ function (path) { /** @type {?} */ var head = this.getHead(); /** @type {?} */ var current = ((/** @type {?} */ (this.getQuery()))).getValue(); /** @type {?} */ var currentPathValue = getNestedPath(current, path); /** @type {?} */ var headPathValue = getNestedPath(head, path); return this.params.comparator(currentPathValue, headPathValue); }; /** * @protected * @return {?} */ DirtyCheckPlugin.prototype.getHead = /** * @protected * @return {?} */ function () { return this.head; }; /** * @private * @return {?} */ DirtyCheckPlugin.prototype.activate = /** * @private * @return {?} */ function () { var _this = this; this.head = this._getHead(); /** * if we are tracking specific properties select only the relevant ones * @type {?} */ var source = this.params.watchProperty ? ((/** @type {?} */ (this.params.watchProperty))).map((/** * @param {?} prop * @return {?} */ function (prop) { return _this.query .select((/** * @param {?} state * @return {?} */ function (state) { return state[prop]; })) .pipe(map((/** * @param {?} val * @return {?} */ function (val) { return ({ val: val, __akitaKey: prop }); }))); })) : [this.selectSource(this._entityId)]; this.subscription = combineLatest.apply(void 0, tslib_1.__spread(source)).pipe(skip(1)) .subscribe((/** * @param {?} currentState * @return {?} */ function (currentState) { if (isUndefined(_this.head)) return; /** * __akitaKey is used to determine if we are tracking a specific property or a store change * @type {?} */ var isChange = currentState.some((/** * @param {?} state * @return {?} */ function (state) { /** @type {?} */ var head = state.__akitaKey ? _this.head[(/** @type {?} */ (state.__akitaKey))] : _this.head; /** @type {?} */ var compareTo = state.__akitaKey ? state.val : state; return _this.params.comparator(head, compareTo); })); _this.updateDirtiness(isChange); })); }; /** * @private * @param {?} isDirty * @return {?} */ DirtyCheckPlugin.prototype.updateDirtiness = /** * @private * @param {?} isDirty * @return {?} */ function (isDirty) { this.dirty.next(isDirty); }; /** * @private * @return {?} */ DirtyCheckPlugin.prototype._getHead = /** * @private * @return {?} */ function () { /** @type {?} */ var head = this.getSource(this._entityId); if (this.params.watchProperty) { head = this.getWatchedValues((/** @type {?} */ (head))); } return head; }; /** * @private * @param {?} source * @return {?} */ DirtyCheckPlugin.prototype.getWatchedValues = /** * @private * @param {?} source * @return {?} */ function (source) { return ((/** @type {?} */ (this.params.watchProperty))).reduce((/** * @param {?} watched * @param {?} prop * @return {?} */ function (watched, prop) { watched[prop] = source[prop]; return watched; }), (/** @type {?} */ ({}))); }; return DirtyCheckPlugin; }(AkitaPlugin)); /** * @template State */ export { DirtyCheckPlugin }; if (false) { /** * @type {?} * @private */ DirtyCheckPlugin.prototype.head; /** * @type {?} * @private */ DirtyCheckPlugin.prototype.dirty; /** * @type {?} * @private */ DirtyCheckPlugin.prototype.subscription; /** * @type {?} * @private */ DirtyCheckPlugin.prototype.active; /** * @type {?} * @private */ DirtyCheckPlugin.prototype._reset; /** @type {?} */ DirtyCheckPlugin.prototype.isDirty$; /** @type {?} */ DirtyCheckPlugin.prototype.reset$; /** * @type {?} * @protected */ DirtyCheckPlugin.prototype.query; /** * @type {?} * @private */ DirtyCheckPlugin.prototype.params; /** * @type {?} * @private */ DirtyCheckPlugin.prototype._entityId; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlydHlDaGVja1BsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BkYXRvcmFtYS9ha2l0YS8iLCJzb3VyY2VzIjpbInNyYy9wbHVnaW5zL2RpcnR5Q2hlY2svZGlydHlDaGVja1BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQVcsTUFBTSxXQUFXLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDekYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVcxQyxNQUFNLEtBQU8sdUJBQXVCLEdBQUc7SUFDckMsVUFBVTs7Ozs7SUFBRSxVQUFDLElBQUksRUFBRSxPQUFPLElBQUssT0FBQSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQWhELENBQWdELENBQUE7Q0FDaEY7Ozs7OztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsU0FBUyxFQUFFLElBQVk7O1FBQzdDLFdBQVcsR0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUM3QyxPQUFPLFdBQVcsQ0FBQyxNQUFNOzs7OztJQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENB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QUUsa0NBQXdDOzs7OztJQUFFLHFDQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFraXRhUGx1Z2luLCBRdWVyaWVzIH0gZnJvbSAnLi4vcGx1Z2luJztcbmltcG9ydCB7IFF1ZXJ5RW50aXR5IH0gZnJvbSAnLi4vLi4vcXVlcnlFbnRpdHknO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHNraXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJy4uLy4uL2lzVW5kZWZpbmVkJztcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi4vLi4vcXVlcnknO1xuaW1wb3J0IHsgY29lcmNlQXJyYXkgfSBmcm9tICcuLi8uLi9jb2VyY2VBcnJheSc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi4vLi4vaXNGdW5jdGlvbic7XG5pbXBvcnQgeyBsb2dBY3Rpb24gfSBmcm9tICcuLi8uLi9hY3Rpb25zJztcblxudHlwZSBIZWFkPFN0YXRlID0gYW55PiA9IFN0YXRlIHwgUGFydGlhbDxTdGF0ZT47XG5cbmV4cG9ydCB0eXBlIERpcnR5Q2hlY2tDb21wYXJhdG9yPFN0YXRlPiA9IChoZWFkOiBTdGF0ZSwgY3VycmVudDogU3RhdGUpID0+IGJvb2xlYW47XG5cbmV4cG9ydCB0eXBlIERpcnR5Q2hlY2tQYXJhbXM8U3RvcmVTdGF0ZSA9IGFueT4gPSB7XG4gIGNvbXBhcmF0b3I/OiBEaXJ0eUNoZWNrQ29tcGFyYXRvcjxTdG9yZVN0YXRlPjtcbiAgd2F0Y2hQcm9wZXJ0eT86IGtleW9mIFN0b3JlU3RhdGUgfCAoa2V5b2YgU3RvcmVTdGF0ZSlbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXJ0eUNoZWNrRGVmYXVsdFBhcmFtcyA9IHtcbiAgY29tcGFyYXRvcjogKGhlYWQsIGN1cnJlbnQpID0+IEpTT04uc3RyaW5naWZ5KGhlYWQpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyZW50KVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFBhdGgobmVzdGVkT2JqLCBwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGF0aEFzQXJyYXk6IHN0cmluZ1tdID0gcGF0aC5zcGxpdCgnLicpO1xuICByZXR1cm4gcGF0aEFzQXJyYXkucmVkdWNlKChvYmosIGtleSkgPT4gKG9iaiAmJiBvYmpba2V5XSAhPT0gJ3VuZGVmaW5lZCcgPyBvYmpba2V5XSA6IHVuZGVmaW5lZCksIG5lc3RlZE9iaik7XG59XG5cbmV4cG9ydCB0eXBlIERpcnR5Q2hlY2tSZXNldFBhcmFtczxTdG9yZVN0YXRlID0gYW55PiA9IHtcbiAgdXBkYXRlRm4/OiBTdG9yZVN0YXRlIHwgKChoZWFkOiBTdG9yZVN0YXRlLCBjdXJyZW50OiBTdG9yZVN0YXRlKSA9PiBhbnkpO1xufTtcblxuZXhwb3J0IGNsYXNzIERpcnR5Q2hlY2tQbHVnaW48U3RhdGUgPSBhbnk+IGV4dGVuZHMgQWtpdGFQbHVnaW48U3RhdGU+IHtcbiAgcHJpdmF0ZSBoZWFkOiBIZWFkPFN0YXRlPjtcbiAgcHJpdmF0ZSBkaXJ0eSA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGFjdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9yZXNldCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgaXNEaXJ0eSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmRpcnR5LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHJlc2V0JCA9IHRoaXMuX3Jlc2V0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVyeTogUXVlcmllczxTdGF0ZT4sIHByaXZhdGUgcGFyYW1zPzogRGlydHlDaGVja1BhcmFtczxTdGF0ZT4sIHByaXZhdGUgX2VudGl0eUlkPzogYW55KSB7XG4gICAgc3VwZXIocXVlcnkpO1xuICAgIHRoaXMucGFyYW1zID0geyAuLi5kaXJ0eUNoZWNrRGVmYXVsdFBhcmFtcywgLi4ucGFyYW1zIH07XG4gICAgaWYgKHRoaXMucGFyYW1zLndhdGNoUHJvcGVydHkpIHtcbiAgICAgIGxldCB3YXRjaFByb3AgPSBjb2VyY2VBcnJheSh0aGlzLnBhcmFtcy53YXRjaFByb3BlcnR5KSBhcyBhbnlbXTtcbiAgICAgIGlmIChxdWVyeSBpbnN0YW5jZW9mIFF1ZXJ5RW50aXR5ICYmIHdhdGNoUHJvcC5pbmNsdWRlcygnZW50aXRpZXMnKSAmJiAhd2F0Y2hQcm9wLmluY2x1ZGVzKCdpZHMnKSkge1xuICAgICAgICB3YXRjaFByb3AucHVzaCgnaWRzJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmFtcy53YXRjaFByb3BlcnR5ID0gd2F0Y2hQcm9wO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0KHBhcmFtczogRGlydHlDaGVja1Jlc2V0UGFyYW1zID0ge30pIHtcbiAgICBsZXQgY3VycmVudFZhbHVlID0gdGhpcy5oZWFkO1xuICAgIGlmIChpc0Z1bmN0aW9uKHBhcmFtcy51cGRhdGVGbikpIHtcbiAgICAgIGlmICh0aGlzLmlzRW50aXR5QmFzZWQodGhpcy5fZW50aXR5SWQpKSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHBhcmFtcy51cGRhdGVGbih0aGlzLmhlYWQsICh0aGlzLmdldFF1ZXJ5KCkgYXMgUXVlcnlFbnRpdHk8U3RhdGU+KS5nZXRFbnRpdHkodGhpcy5fZW50aXR5SWQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHBhcmFtcy51cGRhdGVGbih0aGlzLmhlYWQsICh0aGlzLmdldFF1ZXJ5KCkgYXMgUXVlcnk8U3RhdGU+KS5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nQWN0aW9uKGBARGlydHlDaGVjayAtIFJldmVydGApO1xuICAgIHRoaXMudXBkYXRlU3RvcmUoY3VycmVudFZhbHVlLCB0aGlzLl9lbnRpdHlJZCk7XG4gICAgdGhpcy5fcmVzZXQubmV4dCgpO1xuICB9XG5cbiAgc2V0SGVhZCgpIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICB0aGlzLmFjdGl2YXRlKCk7XG4gICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZCA9IHRoaXMuX2dldEhlYWQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEaXJ0aW5lc3MoZmFsc2UpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaXNEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmRpcnR5LnZhbHVlO1xuICB9XG5cbiAgaGFzSGVhZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldEhlYWQoKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiAmJiB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3Jlc2V0ICYmIHRoaXMuX3Jlc2V0LmNvbXBsZXRlKCk7XG4gIH1cblxuICBpc1BhdGhEaXJ0eShwYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBoZWFkID0gdGhpcy5nZXRIZWFkKCk7XG4gICAgY29uc3QgY3VycmVudCA9ICh0aGlzLmdldFF1ZXJ5KCkgYXMgUXVlcnk8U3RhdGU+KS5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRQYXRoVmFsdWUgPSBnZXROZXN0ZWRQYXRoKGN1cnJlbnQsIHBhdGgpO1xuICAgIGNvbnN0IGhlYWRQYXRoVmFsdWUgPSBnZXROZXN0ZWRQYXRoKGhlYWQsIHBhdGgpO1xuXG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLmNvbXBhcmF0b3IoY3VycmVudFBhdGhWYWx1ZSwgaGVhZFBhdGhWYWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SGVhZCgpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLmhlYWQgPSB0aGlzLl9nZXRIZWFkKCk7XG4gICAgLyoqIGlmIHdlIGFyZSB0cmFja2luZyBzcGVjaWZpYyBwcm9wZXJ0aWVzIHNlbGVjdCBvbmx5IHRoZSByZWxldmFudCBvbmVzICovXG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5wYXJhbXMud2F0Y2hQcm9wZXJ0eVxuICAgICAgPyAodGhpcy5wYXJhbXMud2F0Y2hQcm9wZXJ0eSBhcyAoa2V5b2YgU3RhdGUpW10pLm1hcChwcm9wID0+XG4gICAgICAgICAgdGhpcy5xdWVyeVxuICAgICAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZVtwcm9wXSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBtYXAodmFsID0+ICh7XG4gICAgICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgICAgIF9fYWtpdGFLZXk6IHByb3BcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDogW3RoaXMuc2VsZWN0U291cmNlKHRoaXMuX2VudGl0eUlkKV07XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KC4uLnNvdXJjZSlcbiAgICAgIC5waXBlKHNraXAoMSkpXG4gICAgICAuc3Vic2NyaWJlKChjdXJyZW50U3RhdGU6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh0aGlzLmhlYWQpKSByZXR1cm47XG4gICAgICAgIC8qKiBfX2FraXRhS2V5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHdlIGFyZSB0cmFja2luZyBhIHNwZWNpZmljIHByb3BlcnR5IG9yIGEgc3RvcmUgY2hhbmdlICovXG4gICAgICAgIGNvbnN0IGlzQ2hhbmdlID0gY3VycmVudFN0YXRlLnNvbWUoc3RhdGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGhlYWQgPSBzdGF0ZS5fX2FraXRhS2V5ID8gdGhpcy5oZWFkW3N0YXRlLl9fYWtpdGFLZXkgYXMgYW55XSA6IHRoaXMuaGVhZDtcbiAgICAgICAgICBjb25zdCBjb21wYXJlVG8gPSBzdGF0ZS5fX2FraXRhS2V5ID8gc3RhdGUudmFsIDogc3RhdGU7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMuY29tcGFyYXRvcihoZWFkLCBjb21wYXJlVG8pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZURpcnRpbmVzcyhpc0NoYW5nZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlydGluZXNzKGlzRGlydHk6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpcnR5Lm5leHQoaXNEaXJ0eSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRIZWFkKCk6IEhlYWQ8U3RhdGU+IHtcbiAgICBsZXQgaGVhZDogSGVhZDxTdGF0ZT4gPSB0aGlzLmdldFNvdXJjZSh0aGlzLl9lbnRpdHlJZCk7XG4gICAgaWYgKHRoaXMucGFyYW1zLndhdGNoUHJvcGVydHkpIHtcbiAgICAgIGhlYWQgPSB0aGlzLmdldFdhdGNoZWRWYWx1ZXMoaGVhZCBhcyBTdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBoZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXYXRjaGVkVmFsdWVzKHNvdXJjZTogU3RhdGUpOiBQYXJ0aWFsPFN0YXRlPiB7XG4gICAgcmV0dXJuICh0aGlzLnBhcmFtcy53YXRjaFByb3BlcnR5IGFzIChrZXlvZiBTdGF0ZSlbXSkucmVkdWNlKFxuICAgICAgKHdhdGNoZWQsIHByb3ApID0+IHtcbiAgICAgICAgd2F0Y2hlZFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgcmV0dXJuIHdhdGNoZWQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUGFydGlhbDxTdGF0ZT5cbiAgICApO1xuICB9XG59XG4iXX0=