UNPKG

@firestone-hs/replay-parser

Version:

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

77 lines 15.1 kB
import { BlockType, CardType, GameTag, Zone } from '@firestone-hs/reference-data'; import { CardPlayedFromHandAction } from '../../models/action/card-played-from-hand-action'; import { ActionHistoryItem } from '../../models/history/action-history-item'; import { TagChangeHistoryItem } from '../../models/history/tag-change-history-item'; import { ActionHelper } from './action-helper'; export class CardPlayedFromHandParser { constructor(allCards) { this.allCards = allCards; } applies(item) { return item instanceof ActionHistoryItem || item instanceof TagChangeHistoryItem; } parse(item, currentTurn, entitiesBeforeAction, history) { if (item instanceof ActionHistoryItem && parseInt(item.node.attributes.type) === BlockType.PLAY) { // The case of a ShowEntity (or FullEntity) when we didn't previously know the // card. In that case, a ShowEntity (or FullEntity) element is created that contains // the tag with the proper zone // Use entities when playing Eviscerate at t6o at // http://www.zerotoheroes.com/r/hearthstone/572de12ee4b0d4231295c49e/an-arena-game-going-5-0 const result = []; if (item.node.showEntities) { for (const showEntity of item.node.showEntities) { if (showEntity.tags[GameTag[GameTag.ZONE]] === Zone.PLAY && showEntity.tags[GameTag[GameTag.CARDTYPE]] !== CardType.ENCHANTMENT) { result.push(CardPlayedFromHandAction.create({ timestamp: showEntity.attributes.ts, index: showEntity.index, entityId: showEntity.id, }, this.allCards)); } } } return result; } else if (item instanceof TagChangeHistoryItem) { // The case of a ShowEntity command when the card was already known - basically // when we play our own card. In that case, the tags are already known, and // tag changes are the only things we care about if (item.tag.tag === GameTag.ZONE && item.tag.value === Zone.PLAY) { if (entitiesBeforeAction.get(item.tag.entity) && entitiesBeforeAction.get(item.tag.entity).getTag(GameTag.CARDTYPE) !== CardType.ENCHANTMENT && entitiesBeforeAction.get(item.tag.entity).getTag(GameTag.ZONE) === Zone.HAND) { return [ CardPlayedFromHandAction.create({ timestamp: item.timestamp, index: item.index, entityId: item.tag.entity, }, this.allCards), ]; } } } } // For blood gems reduce(actions) { return ActionHelper.combineActions(actions, (previous, current) => this.shouldMergeActions(previous, current), (previous, current) => this.mergeActions(previous, current)); } shouldMergeActions(previousAction, currentAction) { if (previousAction instanceof CardPlayedFromHandAction && currentAction instanceof CardPlayedFromHandAction) { // console.log('Merging card played from hand actions', previousAction, currentAction); if (previousAction.entities.get(previousAction.originId)?.getTag(GameTag.CARDTYPE) === CardType.SPELL && previousAction.entities.get(previousAction.originId)?.cardID === currentAction.entities.get(currentAction.originId)?.cardID) { return true; } } return false; } mergeActions(previousAction, currentAction) { return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, { entities: currentAction.entities, originId: currentAction.originId, targetIds: [...(previousAction.targetIds ?? []), ...(currentAction.targetIds ?? [])].filter((id, index, self) => self.indexOf(id) === index), }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1wbGF5ZWQtZnJvbS1oYW5kLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9hY3Rpb24vY2FyZC1wbGF5ZWQtZnJvbS1oYW5kLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHbEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFNUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE1BQU0sT0FBTyx3QkFBd0I7SUFDcEMsWUFBb0IsUUFBeUI7UUFBekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFBRyxDQUFDO0lBRTFDLE9BQU8sQ0FBQyxJQUFpQjtRQUMvQixPQUFPLElBQUksWUFBWSxpQkFBaUIsSUFBSSxJQUFJLFlBQVksb0JBQW9CLENBQUM7SUFDbEYsQ0FBQztJQUVNLEtBQUssQ0FDWCxJQUE4QyxFQUM5QyxXQUFtQixFQUNuQixvQkFBeUMsRUFDekMsT0FBK0I7UUFFL0IsSUFBSSxJQUFJLFlBQVksaUJBQWlCLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDaEcsOEVBQThFO1lBQzlFLG9GQUFvRjtZQUNwRiwrQkFBK0I7WUFDL0IsaURBQWlEO1lBQ2pELDZGQUE2RjtZQUM3RixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDM0IsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDaEQsSUFDQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSTt3QkFDcEQsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLFdBQVcsRUFDbEU7d0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FDVix3QkFBd0IsQ0FBQyxNQUFNLENBQzlCOzRCQUNDLFNBQVMsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7NEJBQ25DLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSzs0QkFDdkIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxFQUFFO3lCQUN2QixFQUNELElBQUksQ0FBQyxRQUFRLENBQ2IsQ0FDRCxDQUFDO3FCQUNGO2lCQUNEO2FBQ0Q7WUFDRCxPQUFPLE1BQU0sQ0FBQztTQUNkO2FBQU0sSUFBSSxJQUFJLFlBQVksb0JBQW9CLEVBQUU7WUFDaEQsK0VBQStFO1lBQy9FLDJFQUEyRTtZQUMzRSxnREFBZ0Q7WUFDaEQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xFLElBQ0Msb0JBQW9CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO29CQUN6QyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxXQUFXO29CQUMzRixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQzNFO29CQUNELE9BQU87d0JBQ04sd0JBQXdCLENBQUMsTUFBTSxDQUM5Qjs0QkFDQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7NEJBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSzs0QkFDakIsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTTt5QkFDekIsRUFDRCxJQUFJLENBQUMsUUFBUSxDQUNiO3FCQUNELENBQUM7aUJBQ0Y7YUFDRDtTQUNEO0lBQ0YsQ0FBQztJQUVELGlCQUFpQjtJQUNWLE1BQU0sQ0FBQyxPQUEwQjtRQUN2QyxPQUFPLFlBQVksQ0FBQyxjQUFjLENBQ2pDLE9BQU8sRUFDUCxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQ2pFLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQzNELENBQUM7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsY0FBc0IsRUFBRSxhQUFxQjtRQUN2RSxJQUFJLGNBQWMsWUFBWSx3QkFBd0IsSUFBSSxhQUFhLFlBQVksd0JBQXdCLEVBQUU7WUFDNUcsdUZBQXVGO1lBQ3ZGLElBQ0MsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxDQUFDLEtBQUs7Z0JBQ2pHLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNO29CQUMzRCxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUMxRDtnQkFDRCxPQUFPLElBQUksQ0FBQzthQUNaO1NBQ0Q7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFTyxZQUFZLENBQUMsY0FBc0IsRUFBRSxhQUFxQjtRQUNqRSxPQUFPLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFO1lBQ3ZFLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtZQUNoQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7WUFDaEMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQzFGLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxDQUMxQjtTQUNNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCbG9ja1R5cGUsIENhcmRUeXBlLCBHYW1lVGFnLCBab25lIH0gZnJvbSAnQGZpcmVzdG9uZS1ocy9yZWZlcmVuY2UtZGF0YSc7XHJcbmltcG9ydCB7IE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XHJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vYWN0aW9uJztcclxuaW1wb3J0IHsgQ2FyZFBsYXllZEZyb21IYW5kQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9jYXJkLXBsYXllZC1mcm9tLWhhbmQtYWN0aW9uJztcclxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvZW50aXR5JztcclxuaW1wb3J0IHsgQWN0aW9uSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9hY3Rpb24taGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBUYWdDaGFuZ2VIaXN0b3J5SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9oaXN0b3J5L3RhZy1jaGFuZ2UtaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgQWxsQ2FyZHNTZXJ2aWNlIH0gZnJvbSAnLi4vYWxsLWNhcmRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBY3Rpb25IZWxwZXIgfSBmcm9tICcuL2FjdGlvbi1oZWxwZXInO1xyXG5pbXBvcnQgeyBQYXJzZXIgfSBmcm9tICcuL3BhcnNlcic7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2FyZFBsYXllZEZyb21IYW5kUGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHtcclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGFsbENhcmRzOiBBbGxDYXJkc1NlcnZpY2UpIHt9XHJcblxyXG5cdHB1YmxpYyBhcHBsaWVzKGl0ZW06IEhpc3RvcnlJdGVtKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gaXRlbSBpbnN0YW5jZW9mIEFjdGlvbkhpc3RvcnlJdGVtIHx8IGl0ZW0gaW5zdGFuY2VvZiBUYWdDaGFuZ2VIaXN0b3J5SXRlbTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBwYXJzZShcclxuXHRcdGl0ZW06IEFjdGlvbkhpc3RvcnlJdGVtIHwgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0sXHJcblx0XHRjdXJyZW50VHVybjogbnVtYmVyLFxyXG5cdFx0ZW50aXRpZXNCZWZvcmVBY3Rpb246IE1hcDxudW1iZXIsIEVudGl0eT4sXHJcblx0XHRoaXN0b3J5OiByZWFkb25seSBIaXN0b3J5SXRlbVtdLFxyXG5cdCk6IEFjdGlvbltdIHtcclxuXHRcdGlmIChpdGVtIGluc3RhbmNlb2YgQWN0aW9uSGlzdG9yeUl0ZW0gJiYgcGFyc2VJbnQoaXRlbS5ub2RlLmF0dHJpYnV0ZXMudHlwZSkgPT09IEJsb2NrVHlwZS5QTEFZKSB7XHJcblx0XHRcdC8vIFRoZSBjYXNlIG9mIGEgU2hvd0VudGl0eSAob3IgRnVsbEVudGl0eSkgd2hlbiB3ZSBkaWRuJ3QgcHJldmlvdXNseSBrbm93IHRoZVxyXG5cdFx0XHQvLyBjYXJkLiBJbiB0aGF0IGNhc2UsIGEgU2hvd0VudGl0eSAob3IgRnVsbEVudGl0eSkgZWxlbWVudCBpcyBjcmVhdGVkIHRoYXQgY29udGFpbnNcclxuXHRcdFx0Ly8gdGhlIHRhZyB3aXRoIHRoZSBwcm9wZXIgem9uZVxyXG5cdFx0XHQvLyBVc2UgZW50aXRpZXMgd2hlbiBwbGF5aW5nIEV2aXNjZXJhdGUgYXQgdDZvIGF0XHJcblx0XHRcdC8vIGh0dHA6Ly93d3cuemVyb3RvaGVyb2VzLmNvbS9yL2hlYXJ0aHN0b25lLzU3MmRlMTJlZTRiMGQ0MjMxMjk1YzQ5ZS9hbi1hcmVuYS1nYW1lLWdvaW5nLTUtMFxyXG5cdFx0XHRjb25zdCByZXN1bHQgPSBbXTtcclxuXHRcdFx0aWYgKGl0ZW0ubm9kZS5zaG93RW50aXRpZXMpIHtcclxuXHRcdFx0XHRmb3IgKGNvbnN0IHNob3dFbnRpdHkgb2YgaXRlbS5ub2RlLnNob3dFbnRpdGllcykge1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRzaG93RW50aXR5LnRhZ3NbR2FtZVRhZ1tHYW1lVGFnLlpPTkVdXSA9PT0gWm9uZS5QTEFZICYmXHJcblx0XHRcdFx0XHRcdHNob3dFbnRpdHkudGFnc1tHYW1lVGFnW0dhbWVUYWcuQ0FSRFRZUEVdXSAhPT0gQ2FyZFR5cGUuRU5DSEFOVE1FTlRcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChcclxuXHRcdFx0XHRcdFx0XHRDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24uY3JlYXRlKFxyXG5cdFx0XHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aW1lc3RhbXA6IHNob3dFbnRpdHkuYXR0cmlidXRlcy50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0aW5kZXg6IHNob3dFbnRpdHkuaW5kZXgsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVudGl0eUlkOiBzaG93RW50aXR5LmlkLFxyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYWxsQ2FyZHMsXHJcblx0XHRcdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtKSB7XHJcblx0XHRcdC8vIFRoZSBjYXNlIG9mIGEgU2hvd0VudGl0eSBjb21tYW5kIHdoZW4gdGhlIGNhcmQgd2FzIGFscmVhZHkga25vd24gLSBiYXNpY2FsbHlcclxuXHRcdFx0Ly8gd2hlbiB3ZSBwbGF5IG91ciBvd24gY2FyZC4gSW4gdGhhdCBjYXNlLCB0aGUgdGFncyBhcmUgYWxyZWFkeSBrbm93biwgYW5kXHJcblx0XHRcdC8vIHRhZyBjaGFuZ2VzIGFyZSB0aGUgb25seSB0aGluZ3Mgd2UgY2FyZSBhYm91dFxyXG5cdFx0XHRpZiAoaXRlbS50YWcudGFnID09PSBHYW1lVGFnLlpPTkUgJiYgaXRlbS50YWcudmFsdWUgPT09IFpvbmUuUExBWSkge1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGVudGl0aWVzQmVmb3JlQWN0aW9uLmdldChpdGVtLnRhZy5lbnRpdHkpICYmXHJcblx0XHRcdFx0XHRlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoaXRlbS50YWcuZW50aXR5KS5nZXRUYWcoR2FtZVRhZy5DQVJEVFlQRSkgIT09IENhcmRUeXBlLkVOQ0hBTlRNRU5UICYmXHJcblx0XHRcdFx0XHRlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoaXRlbS50YWcuZW50aXR5KS5nZXRUYWcoR2FtZVRhZy5aT05FKSA9PT0gWm9uZS5IQU5EXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gW1xyXG5cdFx0XHRcdFx0XHRDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24uY3JlYXRlKFxyXG5cdFx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpbWVzdGFtcDogaXRlbS50aW1lc3RhbXAsXHJcblx0XHRcdFx0XHRcdFx0XHRpbmRleDogaXRlbS5pbmRleCxcclxuXHRcdFx0XHRcdFx0XHRcdGVudGl0eUlkOiBpdGVtLnRhZy5lbnRpdHksXHJcblx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmFsbENhcmRzLFxyXG5cdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIEZvciBibG9vZCBnZW1zXHJcblx0cHVibGljIHJlZHVjZShhY3Rpb25zOiByZWFkb25seSBBY3Rpb25bXSk6IHJlYWRvbmx5IEFjdGlvbltdIHtcclxuXHRcdHJldHVybiBBY3Rpb25IZWxwZXIuY29tYmluZUFjdGlvbnM8QWN0aW9uPihcclxuXHRcdFx0YWN0aW9ucyxcclxuXHRcdFx0KHByZXZpb3VzLCBjdXJyZW50KSA9PiB0aGlzLnNob3VsZE1lcmdlQWN0aW9ucyhwcmV2aW91cywgY3VycmVudCksXHJcblx0XHRcdChwcmV2aW91cywgY3VycmVudCkgPT4gdGhpcy5tZXJnZUFjdGlvbnMocHJldmlvdXMsIGN1cnJlbnQpLFxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc2hvdWxkTWVyZ2VBY3Rpb25zKHByZXZpb3VzQWN0aW9uOiBBY3Rpb24sIGN1cnJlbnRBY3Rpb246IEFjdGlvbik6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgQ2FyZFBsYXllZEZyb21IYW5kQWN0aW9uICYmIGN1cnJlbnRBY3Rpb24gaW5zdGFuY2VvZiBDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24pIHtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coJ01lcmdpbmcgY2FyZCBwbGF5ZWQgZnJvbSBoYW5kIGFjdGlvbnMnLCBwcmV2aW91c0FjdGlvbiwgY3VycmVudEFjdGlvbik7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRwcmV2aW91c0FjdGlvbi5lbnRpdGllcy5nZXQocHJldmlvdXNBY3Rpb24ub3JpZ2luSWQpPy5nZXRUYWcoR2FtZVRhZy5DQVJEVFlQRSkgPT09IENhcmRUeXBlLlNQRUxMICYmXHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24uZW50aXRpZXMuZ2V0KHByZXZpb3VzQWN0aW9uLm9yaWdpbklkKT8uY2FyZElEID09PVxyXG5cdFx0XHRcdFx0Y3VycmVudEFjdGlvbi5lbnRpdGllcy5nZXQoY3VycmVudEFjdGlvbi5vcmlnaW5JZCk/LmNhcmRJRFxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBtZXJnZUFjdGlvbnMocHJldmlvdXNBY3Rpb246IEFjdGlvbiwgY3VycmVudEFjdGlvbjogQWN0aW9uKTogQWN0aW9uIHtcclxuXHRcdHJldHVybiBBY3Rpb25IZWxwZXIubWVyZ2VJbnRvRmlyc3RBY3Rpb24ocHJldmlvdXNBY3Rpb24sIGN1cnJlbnRBY3Rpb24sIHtcclxuXHRcdFx0ZW50aXRpZXM6IGN1cnJlbnRBY3Rpb24uZW50aXRpZXMsXHJcblx0XHRcdG9yaWdpbklkOiBjdXJyZW50QWN0aW9uLm9yaWdpbklkLFxyXG5cdFx0XHR0YXJnZXRJZHM6IFsuLi4ocHJldmlvdXNBY3Rpb24udGFyZ2V0SWRzID8/IFtdKSwgLi4uKGN1cnJlbnRBY3Rpb24udGFyZ2V0SWRzID8/IFtdKV0uZmlsdGVyKFxyXG5cdFx0XHRcdChpZCwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZihpZCkgPT09IGluZGV4LFxyXG5cdFx0XHQpIGFzIHJlYWRvbmx5IG51bWJlcltdLFxyXG5cdFx0fSBhcyBDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24pO1xyXG5cdH1cclxufVxyXG4iXX0=