@firestone-hs/replay-parser
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.
117 lines • 18.2 kB
JavaScript
import { GameTag } from '@firestone-hs/reference-data';
import isEqual from 'lodash-es/isEqual';
import { PlayerEntity } from '../../models/game/player-entity';
export class ActionHelper {
static getOwner(entities, entityId) {
const ownerId = entityId;
let owner = entities.get(ownerId);
if (!(owner instanceof PlayerEntity)) {
const controllerId = entities.get(entityId).getTag(GameTag.CONTROLLER);
owner = entities
.filter((entity) => entity instanceof PlayerEntity)
.filter((entity) => entity.playerId === controllerId)
.first();
}
return owner;
}
static getCardId(entities, entityId, allEntitiesSoFar) {
const entity = entities.get(entityId);
if (entity && entity.cardID) {
return entity.cardID;
}
if (allEntitiesSoFar) {
const entitySoFar = allEntitiesSoFar.get(entityId);
if (entitySoFar && entitySoFar.cardID) {
return entitySoFar.cardID;
}
}
// Otherwise, this can happen when we're targeting a player entity, which doesn't have a card id
if (!(entity instanceof PlayerEntity)) {
// Since we don't always know the entity id, it is often correct to say we don't know
return null;
}
const heroEntityId = entity.getTag(GameTag.HERO_ENTITY);
return entities.get(heroEntityId).cardID;
}
static combineActions(actions, shouldMerge, combiner, shouldSwap) {
let previousResult = actions;
let result = ActionHelper.doCombine(previousResult, shouldMerge, combiner, shouldSwap);
while (!isEqual(result, previousResult)) {
previousResult = result;
result = ActionHelper.doCombine(previousResult, shouldMerge, combiner);
}
return result;
}
static getTag(tags, name) {
if (!tags) {
return null;
}
const defender = tags?.find(tag => tag.tag === name);
return defender ? defender.value : 0;
}
static mergeIntoFirstAction(first, second, newElements) {
const result = first.updateAction(newElements);
// const concat = [...(first.damages || []), ...(second.damages || [])] as ReadonlyArray<Damage>;
const finalDamages = first.damages.mergeWith((prev, next) => prev + next, second.damages);
return result.updateAction({
damages: finalDamages,
});
}
static doCombine(actions, shouldMerge, combiner, shouldSwap) {
const result = [];
let previousAction;
// // console.log('considering actions to merge', actions);
for (let i = 0; i < actions.length; i++) {
const currentAction = actions[i];
// // console.log(
// 'reduce 150',
// previousAction && previousAction.entities.get(150) && previousAction.entities.get(150).tags.toJS(),
// currentAction && currentAction.entities.get(150) && currentAction.entities.get(150).tags.toJS(),
// previousAction,
// currentAction,
// );
if (shouldMerge(previousAction, currentAction)) {
// // console.log('merging');
const index = result.indexOf(previousAction);
previousAction = combiner(previousAction, currentAction);
// // console.log(
// 'new previous action',
// previousAction.entities.get(150) && previousAction.entities.get(150).tags.toJS(),
// previousAction,
// );
result[index] = previousAction;
}
else if (shouldSwap && shouldSwap(previousAction, currentAction)) {
// // console.log('swapping', previousAction, currentAction);
const index = result.indexOf(previousAction);
const previousEntities = previousAction.entities;
const previousIndex = previousAction.index;
const previousTs = previousAction.timestamp;
const currentEntities = currentAction.entities;
const currentIndex = currentAction.index;
const currentTs = currentAction.timestamp;
result[index] = Object.assign(currentAction, {
entities: previousEntities,
index: previousIndex,
timestamp: previousTs,
});
result[index + 1] = Object.assign(previousAction, {
entities: currentEntities,
index: currentIndex,
timestamp: currentTs,
});
}
else {
// // console.log('doing nothing');
previousAction = currentAction;
result.push(currentAction);
}
}
// // console.log(
// 'finished',
// result[result.length - 1].entities.get(150) && result[result.length - 1].entities.get(150).tags.toJS(),
// );
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9hY3Rpb24vYWN0aW9uLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdkQsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFHeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRy9ELE1BQU0sT0FBTyxZQUFZO0lBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBNkIsRUFBRSxRQUFnQjtRQUNyRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksWUFBWSxDQUFDLEVBQUU7WUFDckMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZFLEtBQUssR0FBRyxRQUFRO2lCQUNkLE1BQU0sQ0FBQyxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUMsTUFBTSxZQUFZLFlBQVksQ0FBQztpQkFDMUQsTUFBTSxDQUFDLENBQUMsTUFBb0IsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQUM7aUJBQ2xFLEtBQUssRUFBRSxDQUFDO1NBQ1Y7UUFDRCxPQUFPLEtBQXFCLENBQUM7SUFDOUIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBNkIsRUFBRSxRQUFnQixFQUFFLGdCQUFxQztRQUM3RyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxD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b0JBQ3pCLEtBQUssRUFBRSxZQUFZO29CQUNuQixTQUFTLEVBQUUsU0FBUztpQkFDVixDQUFDLENBQUM7YUFDYjtpQkFBTTtnQkFDTixtQ0FBbUM7Z0JBQ25DLGNBQWMsR0FBRyxhQUFhLENBQUM7Z0JBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDM0I7U0FDRDtRQUNELGtCQUFrQjtRQUNsQixlQUFlO1FBQ2YsMkdBQTJHO1FBQzNHLEtBQUs7UUFDTCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdhbWVUYWcgfSBmcm9tICdAZmlyZXN0b25lLWhzL3JlZmVyZW5jZS1kYXRhJztcclxuaW1wb3J0IHsgTWFwIH0gZnJvbSAnaW1tdXRhYmxlJztcclxuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoLWVzL2lzRXF1YWwnO1xyXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uL2FjdGlvbic7XHJcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscy9nYW1lL2VudGl0eSc7XHJcbmltcG9ydCB7IFBsYXllckVudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscy9nYW1lL3BsYXllci1lbnRpdHknO1xyXG5pbXBvcnQgeyBFbnRpdHlUYWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvcGFyc2VyL2VudGl0eS10YWcnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFjdGlvbkhlbHBlciB7XHJcblx0cHVibGljIHN0YXRpYyBnZXRPd25lcihlbnRpdGllczogTWFwPG51bWJlciwgRW50aXR5PiwgZW50aXR5SWQ6IG51bWJlcik6IFBsYXllckVudGl0eSB7XHJcblx0XHRjb25zdCBvd25lcklkID0gZW50aXR5SWQ7XHJcblx0XHRsZXQgb3duZXIgPSBlbnRpdGllcy5nZXQob3duZXJJZCk7XHJcblx0XHRpZiAoIShvd25lciBpbnN0YW5jZW9mIFBsYXllckVudGl0eSkpIHtcclxuXHRcdFx0Y29uc3QgY29udHJvbGxlcklkID0gZW50aXRpZXMuZ2V0KGVudGl0eUlkKS5nZXRUYWcoR2FtZVRhZy5DT05UUk9MTEVSKTtcclxuXHRcdFx0b3duZXIgPSBlbnRpdGllc1xyXG5cdFx0XHRcdC5maWx0ZXIoKGVudGl0eTogRW50aXR5KSA9PiBlbnRpdHkgaW5zdGFuY2VvZiBQbGF5ZXJFbnRpdHkpXHJcblx0XHRcdFx0LmZpbHRlcigoZW50aXR5OiBQbGF5ZXJFbnRpdHkpID0+IGVudGl0eS5wbGF5ZXJJZCA9PT0gY29udHJvbGxlcklkKVxyXG5cdFx0XHRcdC5maXJzdCgpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG93bmVyIGFzIFBsYXllckVudGl0eTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgZ2V0Q2FyZElkKGVudGl0aWVzOiBNYXA8bnVtYmVyLCBFbnRpdHk+LCBlbnRpdHlJZDogbnVtYmVyLCBhbGxFbnRpdGllc1NvRmFyOiBNYXA8bnVtYmVyLCBFbnRpdHk+KTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IGVudGl0eSA9IGVudGl0aWVzLmdldChlbnRpdHlJZCk7XHJcblx0XHRpZiAoZW50aXR5ICYmIGVudGl0eS5jYXJkSUQpIHtcclxuXHRcdFx0cmV0dXJuIGVudGl0eS5jYXJkSUQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGFsbEVudGl0aWVzU29GYXIpIHtcclxuXHRcdFx0Y29uc3QgZW50aXR5U29GYXIgPSBhbGxFbnRpdGllc1NvRmFyLmdldChlbnRpdHlJZCk7XHJcblx0XHRcdGlmIChlbnRpdHlTb0ZhciAmJiBlbnRpdHlTb0Zhci5jYXJkSUQpIHtcclxuXHRcdFx0XHRyZXR1cm4gZW50aXR5U29GYXIuY2FyZElEO1xyXG5cdFx0XHR9IFxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE90aGVyd2lzZSwgdGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UncmUgdGFyZ2V0aW5nIGEgcGxheWVyIGVudGl0eSwgd2hpY2ggZG9lc24ndCBoYXZlIGEgY2FyZCBpZFxyXG5cdFx0aWYgKCEoZW50aXR5IGluc3RhbmNlb2YgUGxheWVyRW50aXR5KSkge1xyXG5cdFx0XHQvLyBTaW5jZSB3ZSBkb24ndCBhbHdheXMga25vdyB0aGUgZW50aXR5IGlkLCBpdCBpcyBvZnRlbiBjb3JyZWN0IHRvIHNheSB3ZSBkb24ndCBrbm93XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgaGVyb0VudGl0eUlkID0gZW50aXR5LmdldFRhZyhHYW1lVGFnLkhFUk9fRU5USVRZKTtcclxuXHRcdHJldHVybiBlbnRpdGllcy5nZXQoaGVyb0VudGl0eUlkKS5jYXJkSUQ7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc3RhdGljIGNvbWJpbmVBY3Rpb25zPFQgZXh0ZW5kcyBBY3Rpb24+KFxyXG5cdFx0YWN0aW9uczogcmVhZG9ubHkgQWN0aW9uW10sXHJcblx0XHRzaG91bGRNZXJnZTogKGE6IEFjdGlvbiwgYjogQWN0aW9uKSA9PiBib29sZWFuLFxyXG5cdFx0Y29tYmluZXI6IChhOiBULCBiOiBUKSA9PiBULFxyXG5cdFx0c2hvdWxkU3dhcD86IChhOiBBY3Rpb24sIGI6IEFjdGlvbikgPT4gYm9vbGVhbixcclxuXHQpOiByZWFkb25seSBBY3Rpb25bXSB7XHJcblx0XHRsZXQgcHJldmlvdXNSZXN1bHQgPSBhY3Rpb25zO1xyXG5cdFx0bGV0IHJlc3VsdDogcmVhZG9ubHkgQWN0aW9uW10gPSBBY3Rpb25IZWxwZXIuZG9Db21iaW5lKHByZXZpb3VzUmVzdWx0LCBzaG91bGRNZXJnZSwgY29tYmluZXIsIHNob3VsZFN3YXApO1xyXG5cdFx0d2hpbGUgKCFpc0VxdWFsKHJlc3VsdCwgcHJldmlvdXNSZXN1bHQpKSB7XHJcblx0XHRcdHByZXZpb3VzUmVzdWx0ID0gcmVzdWx0O1xyXG5cdFx0XHRyZXN1bHQgPSBBY3Rpb25IZWxwZXIuZG9Db21iaW5lKHByZXZpb3VzUmVzdWx0LCBzaG91bGRNZXJnZSwgY29tYmluZXIpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VGFnKHRhZ3M6IHJlYWRvbmx5IEVudGl0eVRhZ1tdLCBuYW1lOiBHYW1lVGFnKTogbnVtYmVyIHtcclxuXHRcdGlmICghdGFncykge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGRlZmVuZGVyID0gdGFncz8uZmluZCh0YWcgPT4gdGFnLnRhZyA9PT0gbmFtZSk7XHJcblx0XHRyZXR1cm4gZGVmZW5kZXIgPyBkZWZlbmRlci52YWx1ZSA6IDA7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc3RhdGljIG1lcmdlSW50b0ZpcnN0QWN0aW9uPFQgZXh0ZW5kcyBBY3Rpb24+KGZpcnN0OiBULCBzZWNvbmQ6IEFjdGlvbiwgbmV3RWxlbWVudHM6IFQpOiBUIHtcclxuXHRcdGNvbnN0IHJlc3VsdCA9IGZpcnN0LnVwZGF0ZUFjdGlvbihuZXdFbGVtZW50cyk7XHJcblx0XHQvLyBjb25zdCBjb25jYXQgPSBbLi4uKGZpcnN0LmRhbWFnZXMgfHwgW10pLCAuLi4oc2Vjb25kLmRhbWFnZXMgfHwgW10pXSBhcyBSZWFkb25seUFycmF5PERhbWFnZT47XHJcblx0XHRjb25zdCBmaW5hbERhbWFnZXMgPSBmaXJzdC5kYW1hZ2VzLm1lcmdlV2l0aCgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQsIHNlY29uZC5kYW1hZ2VzKTtcclxuXHRcdHJldHVybiByZXN1bHQudXBkYXRlQWN0aW9uKHtcclxuXHRcdFx0ZGFtYWdlczogZmluYWxEYW1hZ2VzLFxyXG5cdFx0fSBhcyBUKSBhcyBUO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzdGF0aWMgZG9Db21iaW5lPFQgZXh0ZW5kcyBBY3Rpb24+KFxyXG5cdFx0YWN0aW9uczogcmVhZG9ubHkgQWN0aW9uW10sXHJcblx0XHRzaG91bGRNZXJnZTogKGE6IEFjdGlvbiwgYjogQWN0aW9uKSA9PiBib29sZWFuLFxyXG5cdFx0Y29tYmluZXI6IChhOiBULCBiOiBUKSA9PiBULFxyXG5cdFx0c2hvdWxkU3dhcD86IChhOiBBY3Rpb24sIGI6IEFjdGlvbikgPT4gYm9vbGVhbixcclxuXHQpOiByZWFkb25seSBBY3Rpb25bXSB7XHJcblx0XHRjb25zdCByZXN1bHQ6IEFjdGlvbltdID0gW107XHJcblx0XHRsZXQgcHJldmlvdXNBY3Rpb246IEFjdGlvbjtcclxuXHRcdC8vIC8vIGNvbnNvbGUubG9nKCdjb25zaWRlcmluZyBhY3Rpb25zIHRvIG1lcmdlJywgYWN0aW9ucyk7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgY3VycmVudEFjdGlvbiA9IGFjdGlvbnNbaV07XHJcblx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKFxyXG5cdFx0XHQvLyBcdCdyZWR1Y2UgMTUwJyxcclxuXHRcdFx0Ly8gXHRwcmV2aW91c0FjdGlvbiAmJiBwcmV2aW91c0FjdGlvbi5lbnRpdGllcy5nZXQoMTUwKSAmJiBwcmV2aW91c0FjdGlvbi5lbnRpdGllcy5nZXQoMTUwKS50YWdzLnRvSlMoKSxcclxuXHRcdFx0Ly8gXHRjdXJyZW50QWN0aW9uICYmIGN1cnJlbnRBY3Rpb24uZW50aXRpZXMuZ2V0KDE1MCkgJiYgY3VycmVudEFjdGlvbi5lbnRpdGllcy5nZXQoMTUwKS50YWdzLnRvSlMoKSxcclxuXHRcdFx0Ly8gXHRwcmV2aW91c0FjdGlvbixcclxuXHRcdFx0Ly8gXHRjdXJyZW50QWN0aW9uLFxyXG5cdFx0XHQvLyApO1xyXG5cdFx0XHRpZiAoc2hvdWxkTWVyZ2UocHJldmlvdXNBY3Rpb24sIGN1cnJlbnRBY3Rpb24pKSB7XHJcblx0XHRcdFx0Ly8gLy8gY29uc29sZS5sb2coJ21lcmdpbmcnKTtcclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IHJlc3VsdC5pbmRleE9mKHByZXZpb3VzQWN0aW9uKTtcclxuXHRcdFx0XHRwcmV2aW91c0FjdGlvbiA9IGNvbWJpbmVyKHByZXZpb3VzQWN0aW9uIGFzIFQsIGN1cnJlbnRBY3Rpb24gYXMgVCk7XHJcblx0XHRcdFx0Ly8gLy8gY29uc29sZS5sb2coXHJcblx0XHRcdFx0Ly8gXHQnbmV3IHByZXZpb3VzIGFjdGlvbicsXHJcblx0XHRcdFx0Ly8gXHRwcmV2aW91c0FjdGlvbi5lbnRpdGllcy5nZXQoMTUwKSAmJiBwcmV2aW91c0FjdGlvbi5lbnRpdGllcy5nZXQoMTUwKS50YWdzLnRvSlMoKSxcclxuXHRcdFx0XHQvLyBcdHByZXZpb3VzQWN0aW9uLFxyXG5cdFx0XHRcdC8vICk7XHJcblx0XHRcdFx0cmVzdWx0W2luZGV4XSA9IHByZXZpb3VzQWN0aW9uO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHNob3VsZFN3YXAgJiYgc2hvdWxkU3dhcChwcmV2aW91c0FjdGlvbiwgY3VycmVudEFjdGlvbikpIHtcclxuXHRcdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnc3dhcHBpbmcnLCBwcmV2aW91c0FjdGlvbiwgY3VycmVudEFjdGlvbik7XHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSByZXN1bHQuaW5kZXhPZihwcmV2aW91c0FjdGlvbik7XHJcblx0XHRcdFx0Y29uc3QgcHJldmlvdXNFbnRpdGllcyA9IHByZXZpb3VzQWN0aW9uLmVudGl0aWVzO1xyXG5cdFx0XHRcdGNvbnN0IHByZXZpb3VzSW5kZXggPSBwcmV2aW91c0FjdGlvbi5pbmRleDtcclxuXHRcdFx0XHRjb25zdCBwcmV2aW91c1RzID0gcHJldmlvdXNBY3Rpb24udGltZXN0YW1wO1xyXG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRFbnRpdGllcyA9IGN1cnJlbnRBY3Rpb24uZW50aXRpZXM7XHJcblx0XHRcdFx0Y29uc3QgY3VycmVudEluZGV4ID0gY3VycmVudEFjdGlvbi5pbmRleDtcclxuXHRcdFx0XHRjb25zdCBjdXJyZW50VHMgPSBjdXJyZW50QWN0aW9uLnRpbWVzdGFtcDtcclxuXHRcdFx0XHRyZXN1bHRbaW5kZXhdID0gT2JqZWN0LmFzc2lnbihjdXJyZW50QWN0aW9uLCB7XHJcblx0XHRcdFx0XHRlbnRpdGllczogcHJldmlvdXNFbnRpdGllcyxcclxuXHRcdFx0XHRcdGluZGV4OiBwcmV2aW91c0luZGV4LFxyXG5cdFx0XHRcdFx0dGltZXN0YW1wOiBwcmV2aW91c1RzLFxyXG5cdFx0XHRcdH0gYXMgQWN0aW9uKTtcclxuXHRcdFx0XHRyZXN1bHRbaW5kZXggKyAxXSA9IE9iamVjdC5hc3NpZ24ocHJldmlvdXNBY3Rpb24sIHtcclxuXHRcdFx0XHRcdGVudGl0aWVzOiBjdXJyZW50RW50aXRpZXMsXHJcblx0XHRcdFx0XHRpbmRleDogY3VycmVudEluZGV4LFxyXG5cdFx0XHRcdFx0dGltZXN0YW1wOiBjdXJyZW50VHMsXHJcblx0XHRcdFx0fSBhcyBBY3Rpb24pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKCdkb2luZyBub3RoaW5nJyk7XHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24gPSBjdXJyZW50QWN0aW9uO1xyXG5cdFx0XHRcdHJlc3VsdC5wdXNoKGN1cnJlbnRBY3Rpb24pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHQvLyAvLyBjb25zb2xlLmxvZyhcclxuXHRcdC8vIFx0J2ZpbmlzaGVkJyxcclxuXHRcdC8vIFx0cmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS5lbnRpdGllcy5nZXQoMTUwKSAmJiByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLmVudGl0aWVzLmdldCgxNTApLnRhZ3MudG9KUygpLFxyXG5cdFx0Ly8gKTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG59XHJcbiJdfQ==