UNPKG

@firestone-hs/replay-parser

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.

134 lines 22.8 kB
import { BlockType, CardType, GameTag, MetaTags } from '@firestone-hs/reference-data'; import { AttachingEnchantmentAction } from '../../models/action/attaching-enchantment-action'; import { CardTargetAction } from '../../models/action/card-target-action'; import { PowerTargetAction } from '../../models/action/power-target-action'; import { ActionHistoryItem } from '../../models/history/action-history-item'; import { MetadataHistoryItem } from '../../models/history/metadata-history-item'; import { ActionButtonUsedAction, CardPlayedFromHandAction, SummonAction } from '../../models/models'; import { deepEqual } from '../../utils'; import { ActionHelper } from './action-helper'; export class PowerTargetParser { constructor(allCards) { this.allCards = allCards; } applies(item) { if (!(item instanceof MetadataHistoryItem)) { return false; } const meta = item.meta; if (!meta.info && !meta.meta) { return false; } if (meta.meta !== MetaTags[MetaTags.TARGET]) { return false; } return true; } parse(item, currentTurn, entitiesBeforeAction, history) { const meta = item.meta; const parentAction = history .filter((historyItem) => historyItem.index === item.meta.parentIndex) .filter((historyItem) => historyItem instanceof ActionHistoryItem) .map((historyItem) => historyItem)[0]; if (parseInt(parentAction.node.attributes.type) !== BlockType.POWER && parseInt(parentAction.node.attributes.type) !== BlockType.TRIGGER) { return; } // TODO: hard-code Malchezaar? if (meta.info) { // // console.log('building power action', parentAction.node, parentAction, entitiesBeforeAction.get(35)?.tags?.toJS()) return meta.info .map((info) => this.buildPowerActions(entitiesBeforeAction, parentAction, meta, info)) .reduce((a, b) => a.concat(b), []); } } buildPowerActions(entities, item, meta, info) { const entityId = parseInt(item.node.attributes.entity); // Prevent a spell from targeting itself if (entityId === info.entity && entities.get(entityId) && entities.get(entityId).getTag(GameTag.CARDTYPE) === CardType.SPELL) { return []; } let target = info.entity; if (!target && parseInt(item.node.attributes.target)) { target = parseInt(item.node.attributes.target); } if (!target) { return []; } return [ PowerTargetAction.create({ timestamp: item.timestamp, index: meta.index, originId: entityId, targetIds: [target], }, this.allCards), ]; } reduce(actions) { return ActionHelper.combineActions(actions, (previous, current) => this.shouldMergeActions(previous, current), (previous, current) => this.mergeActions(previous, current)); } shouldMergeActions(previousAction, currentAction) { if (!(currentAction instanceof PowerTargetAction)) { return false; } if (previousAction instanceof PowerTargetAction) { return previousAction.originId === currentAction.originId; } if (previousAction instanceof ActionButtonUsedAction) { return previousAction.entityId === currentAction.originId; } // Spells that target would trigger twice otherwise if (previousAction instanceof CardTargetAction) { return previousAction.originId === currentAction.originId; } if (previousAction instanceof AttachingEnchantmentAction) { if (previousAction.originId === currentAction.originId && deepEqual(previousAction.targetIds ?? [], currentAction.targetIds ?? [])) { return true; } } if (previousAction instanceof CardPlayedFromHandAction) { return previousAction.entityId === currentAction.originId; } if (previousAction instanceof SummonAction) { return previousAction.originId === currentAction.originId; } return false; } mergeActions(previousAction, currentAction) { if (!(currentAction instanceof PowerTargetAction)) { console.warn('incorrect currentAction as current action for power-target-parser', currentAction); return; } if (previousAction instanceof PowerTargetAction || previousAction instanceof CardTargetAction) { return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, { entities: currentAction.entities, originId: currentAction.originId, targetIds: [...(previousAction.targetIds ?? []), ...(currentAction.targetIds ?? [])].filter((id, index, self) => self.indexOf(id) === index), }); } else if (previousAction instanceof AttachingEnchantmentAction) { return previousAction; } else if (previousAction instanceof SummonAction) { return previousAction; } else if (previousAction instanceof ActionButtonUsedAction) { return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, { entities: currentAction.entities, entityId: previousAction.entityId, targetIds: [...(previousAction.targetIds ?? []), ...(currentAction.targetIds ?? [])].filter((id, index, self) => self.indexOf(id) === index), }); } else if (previousAction instanceof CardPlayedFromHandAction) { return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, { entities: currentAction.entities, originId: previousAction.entityId, targetIds: [...(previousAction.targetIds ?? []), ...(currentAction.targetIds ?? [])].filter((id, index, self) => self.indexOf(id) === index), }); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG93ZXItdGFyZ2V0LXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9hY3Rpb24vcG93ZXItdGFyZ2V0LXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHdEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDOUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFN0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3JHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE1BQU0sT0FBTyxpQkFBaUI7SUFDN0IsWUFBb0IsUUFBeUI7UUFBekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFBSSxDQUFDO0lBRTNDLE9BQU8sQ0FBQyxJQUFpQjtRQUMvQixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksbUJBQW1CLENBQUMsRUFBRTtZQUMzQyxPQUFPLEtBQUssQ0FBQztTQUNiO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJ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QUMsUUFBUTtnQkFDaEMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRO2dCQUNqQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDMUYsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLENBQzFCO2FBQ0ksQ0FBQyxDQUFDO1NBQzdCO2FBQU0sSUFBSSxjQUFjLFlBQVksd0JBQXdCLEVBQUU7WUFDOUQsT0FBTyxZQUFZLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRTtnQkFDdkUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO2dCQUNoQyxRQUFRLEVBQUUsY0FBYyxDQUFDLFFBQVE7Z0JBQ2pDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUMxRixDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FDMUI7YUFDTSxDQUFDLENBQUM7U0FDL0I7SUFDRixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCbG9ja1R5cGUsIENhcmRUeXBlLCBHYW1lVGFnLCBNZXRhVGFncyB9IGZyb20gJ0BmaXJlc3RvbmUtaHMvcmVmZXJlbmNlLWRhdGEnO1xyXG5pbXBvcnQgeyBNYXAgfSBmcm9tICdpbW11dGFibGUnO1xyXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uL2FjdGlvbic7XHJcbmltcG9ydCB7IEF0dGFjaGluZ0VuY2hhbnRtZW50QWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9hdHRhY2hpbmctZW5jaGFudG1lbnQtYWN0aW9uJztcclxuaW1wb3J0IHsgQ2FyZFRhcmdldEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vY2FyZC10YXJnZXQtYWN0aW9uJztcclxuaW1wb3J0IHsgUG93ZXJUYXJnZXRBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uL3Bvd2VyLXRhcmdldC1hY3Rpb24nO1xyXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS9lbnRpdHknO1xyXG5pbXBvcnQgeyBBY3Rpb25IaXN0b3J5SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9oaXN0b3J5L2FjdGlvbi1oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBIaXN0b3J5SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9oaXN0b3J5L2hpc3RvcnktaXRlbSc7XHJcbmltcG9ydCB7IE1ldGFkYXRhSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9tZXRhZGF0YS1oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBBY3Rpb25CdXR0b25Vc2VkQWN0aW9uLCBDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24sIFN1bW1vbkFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBJbmZvIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BhcnNlci9pbmZvJztcclxuaW1wb3J0IHsgTWV0YURhdGEgfSBmcm9tICcuLi8uLi9tb2RlbHMvcGFyc2VyL21ldGFkYXRhJztcclxuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBBbGxDYXJkc1NlcnZpY2UgfSBmcm9tICcuLi9hbGwtY2FyZHMuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjdGlvbkhlbHBlciB9IGZyb20gJy4vYWN0aW9uLWhlbHBlcic7XHJcbmltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4vcGFyc2VyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBQb3dlclRhcmdldFBhcnNlciBpbXBsZW1lbnRzIFBhcnNlciB7XHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBhbGxDYXJkczogQWxsQ2FyZHNTZXJ2aWNlKSB7IH1cclxuXHJcblx0cHVibGljIGFwcGxpZXMoaXRlbTogSGlzdG9yeUl0ZW0pOiBib29sZWFuIHtcclxuXHRcdGlmICghKGl0ZW0gaW5zdGFuY2VvZiBNZXRhZGF0YUhpc3RvcnlJdGVtKSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRjb25zdCBtZXRhID0gaXRlbS5tZXRhO1xyXG5cdFx0aWYgKCFtZXRhLmluZm8gJiYgIW1ldGEubWV0YSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRpZiAobWV0YS5tZXRhICE9PSBNZXRhVGFnc1tNZXRhVGFncy5UQVJHRVRdKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHBhcnNlKFxyXG5cdFx0aXRlbTogTWV0YWRhdGFIaXN0b3J5SXRlbSxcclxuXHRcdGN1cnJlbnRUdXJuOiBudW1iZXIsXHJcblx0XHRlbnRpdGllc0JlZm9yZUFjdGlvbjogTWFwPG51bWJlciwgRW50aXR5PixcclxuXHRcdGhpc3Rvcnk6IHJlYWRvbmx5IEhpc3RvcnlJdGVtW10sXHJcblx0KTogQWN0aW9uW10ge1xyXG5cdFx0Y29uc3QgbWV0YSA9IGl0ZW0ubWV0YTtcclxuXHRcdGNvbnN0IHBhcmVudEFjdGlvbiA9IGhpc3RvcnlcclxuXHRcdFx0LmZpbHRlcigoaGlzdG9yeUl0ZW0pID0+IGhpc3RvcnlJdGVtLmluZGV4ID09PSBpdGVtLm1ldGEucGFyZW50SW5kZXgpXHJcblx0XHRcdC5maWx0ZXIoKGhpc3RvcnlJdGVtKSA9PiBoaXN0b3J5SXRlbSBpbnN0YW5jZW9mIEFjdGlvbkhpc3RvcnlJdGVtKVxyXG5cdFx0XHQubWFwKChoaXN0b3J5SXRlbSkgPT4gaGlzdG9yeUl0ZW0gYXMgQWN0aW9uSGlzdG9yeUl0ZW0pWzBdO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRwYXJzZUludChwYXJlbnRBY3Rpb24ubm9kZS5hdHRyaWJ1dGVzLnR5cGUpICE9PSBCbG9ja1R5cGUuUE9XRVIgJiZcclxuXHRcdFx0cGFyc2VJbnQocGFyZW50QWN0aW9uLm5vZGUuYXR0cmlidXRlcy50eXBlKSAhPT0gQmxvY2tUeXBlLlRSSUdHRVJcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHQvLyBUT0RPOiBoYXJkLWNvZGUgTWFsY2hlemFhcj9cclxuXHRcdGlmIChtZXRhLmluZm8pIHtcclxuXHRcdFx0Ly8gLy8gY29uc29sZS5sb2coJ2J1aWxkaW5nIHBvd2VyIGFjdGlvbicsIHBhcmVudEFjdGlvbi5ub2RlLCBwYXJlbnRBY3Rpb24sIGVudGl0aWVzQmVmb3JlQWN0aW9uLmdldCgzNSk/LnRhZ3M/LnRvSlMoKSlcclxuXHRcdFx0cmV0dXJuIG1ldGEuaW5mb1xyXG5cdFx0XHRcdC5tYXAoKGluZm8pID0+IHRoaXMuYnVpbGRQb3dlckFjdGlvbnMoZW50aXRpZXNCZWZvcmVBY3Rpb24sIHBhcmVudEFjdGlvbiwgbWV0YSwgaW5mbykpXHJcblx0XHRcdFx0LnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYnVpbGRQb3dlckFjdGlvbnMoXHJcblx0XHRlbnRpdGllczogTWFwPG51bWJlciwgRW50aXR5PixcclxuXHRcdGl0ZW06IEFjdGlvbkhpc3RvcnlJdGVtLFxyXG5cdFx0bWV0YTogTWV0YURhdGEsXHJcblx0XHRpbmZvOiBJbmZvLFxyXG5cdCk6IFBvd2VyVGFyZ2V0QWN0aW9uW10ge1xyXG5cdFx0Y29uc3QgZW50aXR5SWQgPSBwYXJzZUludChpdGVtLm5vZGUuYXR0cmlidXRlcy5lbnRpdHkpO1xyXG5cdFx0Ly8gUHJldmVudCBhIHNwZWxsIGZyb20gdGFyZ2V0aW5nIGl0c2VsZlxyXG5cdFx0aWYgKFxyXG5cdFx0XHRlbnRpdHlJZCA9PT0gaW5mby5lbnRpdHkgJiZcclxuXHRcdFx0ZW50aXRpZXMuZ2V0KGVudGl0eUlkKSAmJlxyXG5cdFx0XHRlbnRpdGllcy5nZXQoZW50aXR5SWQpLmdldFRhZyhHYW1lVGFnLkNBUkRUWVBFKSA9PT0gQ2FyZFR5cGUuU1BFTExcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gW107XHJcblx0XHR9XHJcblx0XHRsZXQgdGFyZ2V0ID0gaW5mby5lbnRpdHk7XHJcblx0XHRpZiAoIXRhcmdldCAmJiBwYXJzZUludChpdGVtLm5vZGUuYXR0cmlidXRlcy50YXJnZXQpKSB7XHJcblx0XHRcdHRhcmdldCA9IHBhcnNlSW50KGl0ZW0ubm9kZS5hdHRyaWJ1dGVzLnRhcmdldCk7XHJcblx0XHR9XHJcblx0XHRpZiAoIXRhcmdldCkge1xyXG5cdFx0XHRyZXR1cm4gW107XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gW1xyXG5cdFx0XHRQb3dlclRhcmdldEFjdGlvbi5jcmVhdGUoXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0dGltZXN0YW1wOiBpdGVtLnRpbWVzdGFtcCxcclxuXHRcdFx0XHRcdGluZGV4OiBtZXRhLmluZGV4LFxyXG5cdFx0XHRcdFx0b3JpZ2luSWQ6IGVudGl0eUlkLFxyXG5cdFx0XHRcdFx0dGFyZ2V0SWRzOiBbdGFyZ2V0XSxcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHRoaXMuYWxsQ2FyZHMsXHJcblx0XHRcdCksXHJcblx0XHRdO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHJlZHVjZShhY3Rpb25zOiByZWFkb25seSBBY3Rpb25bXSk6IHJlYWRvbmx5IEFjdGlvbltdIHtcclxuXHRcdHJldHVybiBBY3Rpb25IZWxwZXIuY29tYmluZUFjdGlvbnM8QWN0aW9uPihcclxuXHRcdFx0YWN0aW9ucyxcclxuXHRcdFx0KHByZXZpb3VzLCBjdXJyZW50KSA9PiB0aGlzLnNob3VsZE1lcmdlQWN0aW9ucyhwcmV2aW91cywgY3VycmVudCksXHJcblx0XHRcdChwcmV2aW91cywgY3VycmVudCkgPT4gdGhpcy5tZXJnZUFjdGlvbnMocHJldmlvdXMsIGN1cnJlbnQpLFxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc2hvdWxkTWVyZ2VBY3Rpb25zKHByZXZpb3VzQWN0aW9uOiBBY3Rpb24sIGN1cnJlbnRBY3Rpb246IEFjdGlvbik6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCEoY3VycmVudEFjdGlvbiBpbnN0YW5jZW9mIFBvd2VyVGFyZ2V0QWN0aW9uKSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBQb3dlclRhcmdldEFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gcHJldmlvdXNBY3Rpb24ub3JpZ2luSWQgPT09IGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQ7XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBBY3Rpb25CdXR0b25Vc2VkQWN0aW9uKSB7XHJcblx0XHRcdHJldHVybiBwcmV2aW91c0FjdGlvbi5lbnRpdHlJZCA9PT0gY3VycmVudEFjdGlvbi5vcmlnaW5JZDtcclxuXHRcdH1cclxuXHRcdC8vIFNwZWxscyB0aGF0IHRhcmdldCB3b3VsZCB0cmlnZ2VyIHR3aWNlIG90aGVyd2lzZVxyXG5cdFx0aWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgQ2FyZFRhcmdldEFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gcHJldmlvdXNBY3Rpb24ub3JpZ2luSWQgPT09IGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQ7XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBBdHRhY2hpbmdFbmNoYW50bWVudEFjdGlvbikge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24ub3JpZ2luSWQgPT09IGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQgJiZcclxuXHRcdFx0XHRkZWVwRXF1YWwocHJldmlvdXNBY3Rpb24udGFyZ2V0SWRzID8/IFtdLCBjdXJyZW50QWN0aW9uLnRhcmdldElkcyA/PyBbXSlcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIENhcmRQbGF5ZWRGcm9tSGFuZEFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gcHJldmlvdXNBY3Rpb24uZW50aXR5SWQgPT09IGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQ7XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBTdW1tb25BY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIHByZXZpb3VzQWN0aW9uLm9yaWdpbklkID09PSBjdXJyZW50QWN0aW9uLm9yaWdpbklkO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBtZXJnZUFjdGlvbnMocHJldmlvdXNBY3Rpb246IEFjdGlvbiwgY3VycmVudEFjdGlvbjogQWN0aW9uKTogQWN0aW9uIHtcclxuXHRcdGlmICghKGN1cnJlbnRBY3Rpb24gaW5zdGFuY2VvZiBQb3dlclRhcmdldEFjdGlvbikpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdpbmNvcnJlY3QgY3VycmVudEFjdGlvbiBhcyBjdXJyZW50IGFjdGlvbiBmb3IgcG93ZXItdGFyZ2V0LXBhcnNlcicsIGN1cnJlbnRBY3Rpb24pO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBQb3dlclRhcmdldEFjdGlvbiB8fCBwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIENhcmRUYXJnZXRBY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIEFjdGlvbkhlbHBlci5tZXJnZUludG9GaXJzdEFjdGlvbihwcmV2aW91c0FjdGlvbiwgY3VycmVudEFjdGlvbiwge1xyXG5cdFx0XHRcdGVudGl0aWVzOiBjdXJyZW50QWN0aW9uLmVudGl0aWVzLFxyXG5cdFx0XHRcdG9yaWdpbklkOiBjdXJyZW50QWN0aW9uLm9yaWdpbklkLFxyXG5cdFx0XHRcdHRhcmdldElkczogWy4uLihwcmV2aW91c0FjdGlvbi50YXJnZXRJZHMgPz8gW10pLCAuLi4oY3VycmVudEFjdGlvbi50YXJnZXRJZHMgPz8gW10pXS5maWx0ZXIoXHJcblx0XHRcdFx0XHQoaWQsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YoaWQpID09PSBpbmRleCxcclxuXHRcdFx0XHQpIGFzIHJlYWRvbmx5IG51bWJlcltdLFxyXG5cdFx0XHR9IGFzIFBvd2VyVGFyZ2V0QWN0aW9uKTtcclxuXHRcdH0gZWxzZSBpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBBdHRhY2hpbmdFbmNoYW50bWVudEFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gcHJldmlvdXNBY3Rpb247XHJcblx0XHR9IGVsc2UgaWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgU3VtbW9uQWN0aW9uKSB7XHJcblx0XHRcdHJldHVybiBwcmV2aW91c0FjdGlvbjtcclxuXHRcdH0gZWxzZSBpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBBY3Rpb25CdXR0b25Vc2VkQWN0aW9uKSB7XHJcblx0XHRcdHJldHVybiBBY3Rpb25IZWxwZXIubWVyZ2VJbnRvRmlyc3RBY3Rpb24ocHJldmlvdXNBY3Rpb24sIGN1cnJlbnRBY3Rpb24sIHtcclxuXHRcdFx0XHRlbnRpdGllczogY3VycmVudEFjdGlvbi5lbnRpdGllcyxcclxuXHRcdFx0XHRlbnRpdHlJZDogcHJldmlvdXNBY3Rpb24uZW50aXR5SWQsXHJcblx0XHRcdFx0dGFyZ2V0SWRzOiBbLi4uKHByZXZpb3VzQWN0aW9uLnRhcmdldElkcyA/PyBbXSksIC4uLihjdXJyZW50QWN0aW9uLnRhcmdldElkcyA/PyBbXSldLmZpbHRlcihcclxuXHRcdFx0XHRcdChpZCwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZihpZCkgPT09IGluZGV4LFxyXG5cdFx0XHRcdCkgYXMgcmVhZG9ubHkgbnVtYmVyW10sXHJcblx0XHRcdH0gYXMgQWN0aW9uQnV0dG9uVXNlZEFjdGlvbik7XHJcblx0XHR9IGVsc2UgaWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgQ2FyZFBsYXllZEZyb21IYW5kQWN0aW9uKSB7XHJcblx0XHRcdHJldHVybiBBY3Rpb25IZWxwZXIubWVyZ2VJbnRvRmlyc3RBY3Rpb24ocHJldmlvdXNBY3Rpb24sIGN1cnJlbnRBY3Rpb24sIHtcclxuXHRcdFx0XHRlbnRpdGllczogY3VycmVudEFjdGlvbi5lbnRpdGllcyxcclxuXHRcdFx0XHRvcmlnaW5JZDogcHJldmlvdXNBY3Rpb24uZW50aXR5SWQsXHJcblx0XHRcdFx0dGFyZ2V0SWRzOiBbLi4uKHByZXZpb3VzQWN0aW9uLnRhcmdldElkcyA/PyBbXSksIC4uLihjdXJyZW50QWN0aW9uLnRhcmdldElkcyA/PyBbXSldLmZpbHRlcihcclxuXHRcdFx0XHRcdChpZCwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZihpZCkgPT09IGluZGV4LFxyXG5cdFx0XHRcdCkgYXMgcmVhZG9ubHkgbnVtYmVyW10sXHJcblx0XHRcdH0gYXMgQ2FyZFBsYXllZEZyb21IYW5kQWN0aW9uKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIl19