UNPKG

@firestone-hs/replay-parser

Version:

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

143 lines 23.1 kB
import { GameTag, Zone } from '@firestone-hs/reference-data'; import { CardDrawAction } from '../../models/action/card-draw-action'; import { FullEntityHistoryItem } from '../../models/history/full-entity-history-item'; import { ShowEntityHistoryItem } from '../../models/history/show-entity-history-item'; import { TagChangeHistoryItem } from '../../models/history/tag-change-history-item'; import { ActionHelper } from './action-helper'; export class CardDrawParser { constructor(allCards) { this.allCards = allCards; } applies(item) { return (item instanceof TagChangeHistoryItem || item instanceof FullEntityHistoryItem || item instanceof ShowEntityHistoryItem); } parse(item, currentTurn, entitiesBeforeAction, history) { if (item) if (currentTurn === 0) { return; } // We typically get a TagChange when the card is hidden, so typically when our opponent draws a card if (item instanceof TagChangeHistoryItem) { // if (item.tag.entity === 37) { // console.warn('handling card draw from tagchange?', item); // } if (!entitiesBeforeAction.get(item.tag.entity)) { // console.warn('could not get drawn entity from tag change', item); return []; } const previousZone = entitiesBeforeAction.get(item.tag.entity).getTag(GameTag.ZONE); if (item.tag.tag === GameTag.ZONE && item.tag.value === Zone.HAND && // SETASIDE is for discovery actions (previousZone === Zone.DECK || previousZone === Zone.SETASIDE || !previousZone)) { const controller = entitiesBeforeAction.get(item.tag.entity).getTag(GameTag.CONTROLLER); if (!controller) { console.warn('[card-draw-parser] empty controller', item, entitiesBeforeAction.get(item.tag.entity)); return null; } return [ CardDrawAction.create({ timestamp: item.timestamp, index: item.index, controller, data: [item.tag.entity], }, this.allCards), ]; } else { // if (item.tag.entity === 37) { // console.warn('invalid previous zone', previousZone); // } } } else if (item instanceof ShowEntityHistoryItem) { // if (item.entityDefintion.id === 37) { // console.warn('hanndling card draw showentity?', item); // } if (!entitiesBeforeAction.get(item.entityDefintion.id)) { // if (item.entityDefintion.id === 37) { // console.warn('could not get drawn entity from showentity', item); // } return []; } const previousZone = entitiesBeforeAction.get(item.entityDefintion.id).getTag(GameTag.ZONE); if (item.entityDefintion.tags[GameTag[GameTag.ZONE]] === Zone.HAND && (previousZone === Zone.DECK || !previousZone)) { const controller = entitiesBeforeAction.get(item.entityDefintion.id).getTag(GameTag.CONTROLLER); if (!controller) { console.warn('empty controller', item, entitiesBeforeAction.get(item.entityDefintion.id)); return null; } return [ CardDrawAction.create({ timestamp: item.timestamp, index: item.index, controller, data: [item.entityDefintion.id], }, this.allCards), ]; } else { // if (item.entityDefintion.id === 37) { // console.warn('invalid previous zone from showentity?', previousZone, item); // } } } else if (item instanceof FullEntityHistoryItem) { if (!entitiesBeforeAction.get(item.entityDefintion.id)) { // console.warn('could not get drawn entity from fullen', item); return []; } const zone = item.entityDefintion.tags[GameTag[GameTag.ZONE]]; if (zone !== Zone.HAND) { // console.warn('incorrect zone from showentity', item); return []; } const previousZone = entitiesBeforeAction.get(item.entityDefintion.id).getTag(GameTag.ZONE); if (previousZone && previousZone !== Zone.DECK) { // console.warn('previous zone was not deck', item); return; } const controller = item.entityDefintion.tags[GameTag[GameTag.CONTROLLER]] || entitiesBeforeAction.get(item.entityDefintion.id).getTag(GameTag.CONTROLLER); if (!controller) { console.warn('[card-draw-parser] empty controller', item); return []; } return [ CardDrawAction.create({ timestamp: item.timestamp, index: item.index, controller, data: [item.entityDefintion.id], }, this.allCards), ]; } return []; } reduce(actions) { return ActionHelper.combineActions(actions, (previous, current) => this.shouldMergeActions(previous, current), (previous, current) => this.mergeActions(previous, current)); } shouldMergeActions(previous, current) { if (!(previous instanceof CardDrawAction && current instanceof CardDrawAction)) { return false; } if (previous.controller === undefined || current.controller === undefined) { console.warn('[card-draw-parser] Empty controller for draw action', previous, current); return false; } return previous.controller === current.controller; } mergeActions(previousAction, currentAction) { return CardDrawAction.create({ timestamp: previousAction.timestamp, index: currentAction.index, entities: currentAction.entities, controller: currentAction.controller, data: [...(previousAction.data ?? []), ...(currentAction.data ?? [])].filter((id, index, self) => self.indexOf(id) === index), }, this.allCards); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1kcmF3LXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9hY3Rpb24vY2FyZC1kcmF3LXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUV0RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUVwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHL0MsTUFBTSxPQUFPLGNBQWM7SUFDMUIsWUFBb0IsUUFBeUI7UUFBekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFBRyxDQUFDO0lBRTFDLE9BQU8sQ0FBQyxJQUFpQjtRQUMvQixPQUFPLENBQ04sSUFBSSxZQUFZLG9CQUFvQjtZQUNwQyxJQUFJLFlBQVkscUJBQXFCO1lBQ3JDLElBQUksWUFBWSxxQkFBcUIsQ0FDckMsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQ1gsSUFBMEUsRUFDMUUsV0FBbUIsRUFDbkIsb0JBQXlDLEVBQ3pDLE9BQStCO1FBRS9CLElBQUksSUFBSTtZQUNQLElBQUksV0FBVyxLQUFLLENBQUMsRUFBRTtnQkFDdEIsT0FBTzthQUNQO1FBRUYsb0dBQW9HO1FBQ3BHLElBQUksSUFBSSxZQUFZLG9CQUFvQixFQUFFO1lBQ3pDLGdDQUFnQztZQUNoQyw2REFBNkQ7WUFDN0QsSUFBSTtZQUNKLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFD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WUFBWSxDQUFDLGNBQThCLEVBQUUsYUFBNkI7UUFDakYsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUMzQjtZQUNDLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztZQUNuQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7WUFDMUIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO1lBQ2hDLFVBQVUsRUFBRSxhQUFhLENBQUMsVUFBVTtZQUNwQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDM0UsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLENBQy9DO1NBQ0QsRUFDRCxJQUFJLENBQUMsUUFBUSxDQUNiLENBQUM7SUFDSCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHYW1lVGFnLCBab25lIH0gZnJvbSAnQGZpcmVzdG9uZS1ocy9yZWZlcmVuY2UtZGF0YSc7XHJcbmltcG9ydCB7IE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XHJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vYWN0aW9uJztcclxuaW1wb3J0IHsgQ2FyZERyYXdBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uL2NhcmQtZHJhdy1hY3Rpb24nO1xyXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS9lbnRpdHknO1xyXG5pbXBvcnQgeyBGdWxsRW50aXR5SGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9mdWxsLWVudGl0eS1oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBIaXN0b3J5SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9oaXN0b3J5L2hpc3RvcnktaXRlbSc7XHJcbmltcG9ydCB7IFNob3dFbnRpdHlIaXN0b3J5SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9oaXN0b3J5L3Nob3ctZW50aXR5LWhpc3RvcnktaXRlbSc7XHJcbmltcG9ydCB7IFRhZ0NoYW5nZUhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hpc3RvcnkvdGFnLWNoYW5nZS1oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBBbGxDYXJkc1NlcnZpY2UgfSBmcm9tICcuLi9hbGwtY2FyZHMuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjdGlvbkhlbHBlciB9IGZyb20gJy4vYWN0aW9uLWhlbHBlcic7XHJcbmltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4vcGFyc2VyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDYXJkRHJhd1BhcnNlciBpbXBsZW1lbnRzIFBhcnNlciB7XHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBhbGxDYXJkczogQWxsQ2FyZHNTZXJ2aWNlKSB7fVxyXG5cclxuXHRwdWJsaWMgYXBwbGllcyhpdGVtOiBIaXN0b3J5SXRlbSk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0aXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtIHx8XHJcblx0XHRcdGl0ZW0gaW5zdGFuY2VvZiBGdWxsRW50aXR5SGlzdG9yeUl0ZW0gfHxcclxuXHRcdFx0aXRlbSBpbnN0YW5jZW9mIFNob3dFbnRpdHlIaXN0b3J5SXRlbVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBwYXJzZShcclxuXHRcdGl0ZW06IFRhZ0NoYW5nZUhpc3RvcnlJdGVtIHwgRnVsbEVudGl0eUhpc3RvcnlJdGVtIHwgU2hvd0VudGl0eUhpc3RvcnlJdGVtLFxyXG5cdFx0Y3VycmVudFR1cm46IG51bWJlcixcclxuXHRcdGVudGl0aWVzQmVmb3JlQWN0aW9uOiBNYXA8bnVtYmVyLCBFbnRpdHk+LFxyXG5cdFx0aGlzdG9yeTogcmVhZG9ubHkgSGlzdG9yeUl0ZW1bXSxcclxuXHQpOiBBY3Rpb25bXSB7XHJcblx0XHRpZiAoaXRlbSlcclxuXHRcdFx0aWYgKGN1cnJlbnRUdXJuID09PSAwKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0Ly8gV2UgdHlwaWNhbGx5IGdldCBhIFRhZ0NoYW5nZSB3aGVuIHRoZSBjYXJkIGlzIGhpZGRlbiwgc28gdHlwaWNhbGx5IHdoZW4gb3VyIG9wcG9uZW50IGRyYXdzIGEgY2FyZFxyXG5cdFx0aWYgKGl0ZW0gaW5zdGFuY2VvZiBUYWdDaGFuZ2VIaXN0b3J5SXRlbSkge1xyXG5cdFx0XHQvLyBpZiAoaXRlbS50YWcuZW50aXR5ID09PSAzNykge1xyXG5cdFx0XHQvLyBcdGNvbnNvbGUud2FybignaGFuZGxpbmcgY2FyZCBkcmF3IGZyb20gdGFnY2hhbmdlPycsIGl0ZW0pO1xyXG5cdFx0XHQvLyB9XHJcblx0XHRcdGlmICghZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0udGFnLmVudGl0eSkpIHtcclxuXHRcdFx0XHQvLyBjb25zb2xlLndhcm4oJ2NvdWxkIG5vdCBnZXQgZHJhd24gZW50aXR5IGZyb20gdGFnIGNoYW5nZScsIGl0ZW0pO1xyXG5cdFx0XHRcdHJldHVybiBbXTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBwcmV2aW91c1pvbmUgPSBlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoaXRlbS50YWcuZW50aXR5KS5nZXRUYWcoR2FtZVRhZy5aT05FKTtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGl0ZW0udGFnLnRhZyA9PT0gR2FtZVRhZy5aT05FICYmXHJcblx0XHRcdFx0aXRlbS50YWcudmFsdWUgPT09IFpvbmUuSEFORCAmJlxyXG5cdFx0XHRcdC8vIFNFVEFTSURFIGlzIGZvciBkaXNjb3ZlcnkgYWN0aW9uc1xyXG5cdFx0XHRcdChwcmV2aW91c1pvbmUgPT09IFpvbmUuREVDSyB8fCBwcmV2aW91c1pvbmUgPT09IFpvbmUuU0VUQVNJREUgfHwgIXByZXZpb3VzWm9uZSlcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0Y29uc3QgY29udHJvbGxlciA9IGVudGl0aWVzQmVmb3JlQWN0aW9uLmdldChpdGVtLnRhZy5lbnRpdHkpLmdldFRhZyhHYW1lVGFnLkNPTlRST0xMRVIpO1xyXG5cdFx0XHRcdGlmICghY29udHJvbGxlcikge1xyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKFxyXG5cdFx0XHRcdFx0XHQnW2NhcmQtZHJhdy1wYXJzZXJdIGVtcHR5IGNvbnRyb2xsZXInLFxyXG5cdFx0XHRcdFx0XHRpdGVtLFxyXG5cdFx0XHRcdFx0XHRlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoaXRlbS50YWcuZW50aXR5KSxcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIFtcclxuXHRcdFx0XHRcdENhcmREcmF3QWN0aW9uLmNyZWF0ZShcclxuXHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdHRpbWVzdGFtcDogaXRlbS50aW1lc3RhbXAsXHJcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGl0ZW0uaW5kZXgsXHJcblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlcixcclxuXHRcdFx0XHRcdFx0XHRkYXRhOiBbaXRlbS50YWcuZW50aXR5XSxcclxuXHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0dGhpcy5hbGxDYXJkcyxcclxuXHRcdFx0XHRcdCksXHJcblx0XHRcdFx0XTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBpZiAoaXRlbS50YWcuZW50aXR5ID09PSAzNykge1xyXG5cdFx0XHRcdC8vIFx0Y29uc29sZS53YXJuKCdpbnZhbGlkIHByZXZpb3VzIHpvbmUnLCBwcmV2aW91c1pvbmUpO1xyXG5cdFx0XHRcdC8vIH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU2hvd0VudGl0eUhpc3RvcnlJdGVtKSB7XHJcblx0XHRcdC8vIGlmIChpdGVtLmVudGl0eURlZmludGlvbi5pZCA9PT0gMzcpIHtcclxuXHRcdFx0Ly8gXHRjb25zb2xlLndhcm4oJ2hhbm5kbGluZyBjYXJkIGRyYXcgc2hvd2VudGl0eT8nLCBpdGVtKTtcclxuXHRcdFx0Ly8gfVxyXG5cdFx0XHRpZiAoIWVudGl0aWVzQmVmb3JlQWN0aW9uLmdldChpdGVtLmVudGl0eURlZmludGlvbi5pZCkpIHtcclxuXHRcdFx0XHQvLyBpZiAoaXRlbS5lbnRpdHlEZWZpbnRpb24uaWQgPT09IDM3KSB7XHJcblx0XHRcdFx0Ly8gXHRjb25zb2xlLndhcm4oJ2NvdWxkIG5vdCBnZXQgZHJhd24gZW50aXR5IGZyb20gc2hvd2VudGl0eScsIGl0ZW0pO1xyXG5cdFx0XHRcdC8vIH1cclxuXHRcdFx0XHRyZXR1cm4gW107XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgcHJldmlvdXNab25lID0gZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0uZW50aXR5RGVmaW50aW9uLmlkKS5nZXRUYWcoR2FtZVRhZy5aT05FKTtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGl0ZW0uZW50aXR5RGVmaW50aW9uLnRhZ3NbR2FtZVRhZ1tHYW1lVGFnLlpPTkVdXSA9PT0gWm9uZS5IQU5EICYmXHJcblx0XHRcdFx0KHByZXZpb3VzWm9uZSA9PT0gWm9uZS5ERUNLIHx8ICFwcmV2aW91c1pvbmUpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSBlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoaXRlbS5lbnRpdHlEZWZpbnRpb24uaWQpLmdldFRhZyhHYW1lVGFnLkNPTlRST0xMRVIpO1xyXG5cdFx0XHRcdGlmICghY29udHJvbGxlcikge1xyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdlbXB0eSBjb250cm9sbGVyJywgaXRlbSwgZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0uZW50aXR5RGVmaW50aW9uLmlkKSk7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIFtcclxuXHRcdFx0XHRcdENhcmREcmF3QWN0aW9uLmNyZWF0ZShcclxuXHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdHRpbWVzdGFtcDogaXRlbS50aW1lc3RhbXAsXHJcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGl0ZW0uaW5kZXgsXHJcblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlcixcclxuXHRcdFx0XHRcdFx0XHRkYXRhOiBbaXRlbS5lbnRpdHlEZWZpbnRpb24uaWRdLFxyXG5cdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHR0aGlzLmFsbENhcmRzLFxyXG5cdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRdO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIGlmIChpdGVtLmVudGl0eURlZmludGlvbi5pZCA9PT0gMzcpIHtcclxuXHRcdFx0XHQvLyBcdGNvbnNvbGUud2FybignaW52YWxpZCBwcmV2aW91cyB6b25lIGZyb20gc2hvd2VudGl0eT8nLCBwcmV2aW91c1pvbmUsIGl0ZW0pO1xyXG5cdFx0XHRcdC8vIH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRnVsbEVudGl0eUhpc3RvcnlJdGVtKSB7XHJcblx0XHRcdGlmICghZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0uZW50aXR5RGVmaW50aW9uLmlkKSkge1xyXG5cdFx0XHRcdC8vIGNvbnNvbGUud2FybignY291bGQgbm90IGdldCBkcmF3biBlbnRpdHkgZnJvbSBmdWxsZW4nLCBpdGVtKTtcclxuXHRcdFx0XHRyZXR1cm4gW107XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3Qgem9uZSA9IGl0ZW0uZW50aXR5RGVmaW50aW9uLnRhZ3NbR2FtZVRhZ1tHYW1lVGFnLlpPTkVdXTtcclxuXHRcdFx0aWYgKHpvbmUgIT09IFpvbmUuSEFORCkge1xyXG5cdFx0XHRcdC8vIGNvbnNvbGUud2FybignaW5jb3JyZWN0IHpvbmUgZnJvbSBzaG93ZW50aXR5JywgaXRlbSk7XHJcblx0XHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IHByZXZpb3VzWm9uZSA9IGVudGl0aWVzQmVmb3JlQWN0aW9uLmdldChpdGVtLmVudGl0eURlZmludGlvbi5pZCkuZ2V0VGFnKEdhbWVUYWcuWk9ORSk7XHJcblx0XHRcdGlmIChwcmV2aW91c1pvbmUgJiYgcHJldmlvdXNab25lICE9PSBab25lLkRFQ0spIHtcclxuXHRcdFx0XHQvLyBjb25zb2xlLndhcm4oJ3ByZXZpb3VzIHpvbmUgd2FzIG5vdCBkZWNrJywgaXRlbSk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPVxyXG5cdFx0XHRcdGl0ZW0uZW50aXR5RGVmaW50aW9uLnRhZ3NbR2FtZVRhZ1tHYW1lVGFnLkNPTlRST0xMRVJdXSB8fFxyXG5cdFx0XHRcdGVudGl0aWVzQmVmb3JlQWN0aW9uLmdldChpdGVtLmVudGl0eURlZmludGlvbi5pZCkuZ2V0VGFnKEdhbWVUYWcuQ09OVFJPTExFUik7XHJcblx0XHRcdGlmICghY29udHJvbGxlcikge1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybignW2NhcmQtZHJhdy1wYXJzZXJdIGVtcHR5IGNvbnRyb2xsZXInLCBpdGVtKTtcclxuXHRcdFx0XHRyZXR1cm4gW107XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIFtcclxuXHRcdFx0XHRDYXJkRHJhd0FjdGlvbi5jcmVhdGUoXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdHRpbWVzdGFtcDogaXRlbS50aW1lc3RhbXAsXHJcblx0XHRcdFx0XHRcdGluZGV4OiBpdGVtLmluZGV4LFxyXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLFxyXG5cdFx0XHRcdFx0XHRkYXRhOiBbaXRlbS5lbnRpdHlEZWZpbnRpb24uaWRdLFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdHRoaXMuYWxsQ2FyZHMsXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gW107XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgcmVkdWNlKGFjdGlvbnM6IHJlYWRvbmx5IEFjdGlvbltdKTogcmVhZG9ubHkgQWN0aW9uW10ge1xyXG5cdFx0cmV0dXJuIEFjdGlvbkhlbHBlci5jb21iaW5lQWN0aW9uczxDYXJkRHJhd0FjdGlvbj4oXHJcblx0XHRcdGFjdGlvbnMsXHJcblx0XHRcdChwcmV2aW91cywgY3VycmVudCkgPT4gdGhpcy5zaG91bGRNZXJnZUFjdGlvbnMocHJldmlvdXMsIGN1cnJlbnQpLFxyXG5cdFx0XHQocHJldmlvdXMsIGN1cnJlbnQpID0+IHRoaXMubWVyZ2VBY3Rpb25zKHByZXZpb3VzLCBjdXJyZW50KSxcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHNob3VsZE1lcmdlQWN0aW9ucyhwcmV2aW91czogQWN0aW9uLCBjdXJyZW50OiBBY3Rpb24pOiBib29sZWFuIHtcclxuXHRcdGlmICghKHByZXZpb3VzIGluc3RhbmNlb2YgQ2FyZERyYXdBY3Rpb24gJiYgY3VycmVudCBpbnN0YW5jZW9mIENhcmREcmF3QWN0aW9uKSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXMuY29udHJvbGxlciA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnQuY29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignW2NhcmQtZHJhdy1wYXJzZXJdIEVtcHR5IGNvbnRyb2xsZXIgZm9yIGRyYXcgYWN0aW9uJywgcHJldmlvdXMsIGN1cnJlbnQpO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcHJldmlvdXMuY29udHJvbGxlciA9PT0gY3VycmVudC5jb250cm9sbGVyO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBtZXJnZUFjdGlvbnMocHJldmlvdXNBY3Rpb246IENhcmREcmF3QWN0aW9uLCBjdXJyZW50QWN0aW9uOiBDYXJkRHJhd0FjdGlvbik6IENhcmREcmF3QWN0aW9uIHtcclxuXHRcdHJldHVybiBDYXJkRHJhd0FjdGlvbi5jcmVhdGUoXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0aW1lc3RhbXA6IHByZXZpb3VzQWN0aW9uLnRpbWVzdGFtcCxcclxuXHRcdFx0XHRpbmRleDogY3VycmVudEFjdGlvbi5pbmRleCxcclxuXHRcdFx0XHRlbnRpdGllczogY3VycmVudEFjdGlvbi5lbnRpdGllcyxcclxuXHRcdFx0XHRjb250cm9sbGVyOiBjdXJyZW50QWN0aW9uLmNvbnRyb2xsZXIsXHJcblx0XHRcdFx0ZGF0YTogWy4uLihwcmV2aW91c0FjdGlvbi5kYXRhID8/IFtdKSwgLi4uKGN1cnJlbnRBY3Rpb24uZGF0YSA/PyBbXSldLmZpbHRlcihcclxuXHRcdFx0XHRcdChpZCwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZihpZCkgPT09IGluZGV4LFxyXG5cdFx0XHRcdCksXHJcblx0XHRcdH0sXHJcblx0XHRcdHRoaXMuYWxsQ2FyZHMsXHJcblx0XHQpO1xyXG5cdH1cclxufVxyXG4iXX0=