bp-prism-game
Version:
The BP Prism Game
182 lines • 21.4 kB
JavaScript
import { ObservableTypeEnum } from '../enum/observable-type.enum';
import { PrismBlastClass } from '../prism/prism-blast/prism-blast.class';
import { KEY, BLOCK_SIZE } from '../gameboard/gameboard-constants';
import { PrismBlastIconClass } from '../prism/prism-blast-icon/prism-blast-icon.class';
/**
* The Prism Blast service
*/
export class PrismBlastService {
/**
* The constructor
*
* @param gameService The GameService
* @param ctx The ctx
*/
constructor(gameService, ctx) {
this.gameService = gameService;
this.ctx = ctx;
/**
* moves
*/
this.moves = {
[KEY.UP]: (asset) => ({ ...asset, y: asset.y - BLOCK_SIZE }),
[KEY.RIGHT]: (asset) => ({ ...asset, x: asset.x + BLOCK_SIZE })
};
const prismBlastCoordinates = this.gameService.getCoordinatesForPrismBlast();
this.prismBlastIconsPosition = this.gameService.getPrismBlastIconPosition();
this.totalBlasts = prismBlastCoordinates.distance;
this.blastAngle = prismBlastCoordinates.angle;
this.blastCounter = 0;
this.prismBlasts = [];
this.prismBlastIcons = [];
for (let index = 0; index < this.totalBlasts; index++) {
this.prismBlasts.push(new PrismBlastClass(this.gameService, this.ctx, 1));
}
}
/**
* If the Prism Blast can be fired
*/
canFirePrismBlast() {
return (this.canFire &&
this.prismBlastIcons.filter((prismBlastIcon) => prismBlastIcon.isDestroyed === false)
.length > 0);
}
/**
* Remove used prism blasts
*/
removePrismBlast() {
this.prismBlastIcons
.filter((prismBlastIcon) => prismBlastIcon.isDestroyed === false)
.slice(0)
.reverse()
.map((prismBlastIcon, index) => {
prismBlastIcon.isDestroyed = index === 0;
});
}
/**
* Init the service with the listener
*/
init() {
this.gameService.getMasterObservable().subscribe((event) => {
if (event.type === ObservableTypeEnum.gameOver) {
this.canFire = !event.booleanData;
if (!event.booleanData) {
this.prismBlastIcons.map((prismBlastIcon, index) => {
prismBlastIcon.isDestroyed = index > 1;
});
}
}
else if (event.type === ObservableTypeEnum.prismBlastLaunched) {
if (this.canFirePrismBlast()) {
this.removePrismBlast();
this.positionBlast(event);
this.launchPrismBlast();
}
}
});
this.addPrismBlast();
this.addPrismBlast();
}
/**
* Find any unused missiles
*/
findUnusedPrismBlastIcons() {
return this.prismBlastIcons.filter((prismBlastIcon) => prismBlastIcon.isDestroyed)[0];
}
/**
* Add A new Prism Blast Icon
*/
addPrismBlast() {
let prismBlastIcon = this.findUnusedPrismBlastIcons();
if (this.prismBlastIcons.length > 0) {
this.prismBlastIconsPosition = this.moves[KEY.RIGHT](this.prismBlastIconsPosition);
}
if (!prismBlastIcon) {
prismBlastIcon = new PrismBlastIconClass(this.gameService, this.ctx);
this.prismBlastIcons.push(prismBlastIcon);
}
prismBlastIcon.position(this.prismBlastIconsPosition);
prismBlastIcon.isDestroyed = false;
}
/**
* Position the blast
* @param event The event coordinates
*/
positionBlast(event) {
let nextMove = event.assetCoordinateData;
nextMove.y += BLOCK_SIZE / 2;
this.prismBlasts.map((prismBlast) => {
nextMove = this.moves[KEY.UP](nextMove);
prismBlast.move(nextMove);
prismBlast.setBlastAngle(this.blastAngle);
});
}
/**
* Animate
* @param index The index of the blast
*/
startAnimation(index) {
this.prismBlasts[index].isDestroyed = false;
}
/**
* Animate
* @param index The index of the blast
*/
stopAnimation(index) {
this.prismBlasts[index].isDestroyed = true;
}
/**
* Animate
* @param now the current time
*/
animate(now = 0) {
this.prismBlastIcons.map((prismBlastIcon) => {
prismBlastIcon.animate();
});
this.prismBlasts.map((prismBlast) => {
if (prismBlast.isDestroyed === false) {
prismBlast.animate(now);
}
});
}
/**
* Launch a Blast
*/
launchPrismBlast() {
while (this.blastCounter < this.totalBlasts) {
const index = this.blastCounter;
setTimeout(() => {
this.startAnimation(index);
if (index === this.totalBlasts - 1) {
this.gameService.emitMasterObservableEvent({
type: ObservableTypeEnum.prismBlastFire
});
setTimeout(() => {
this.defusePrismBlast();
}, 3500);
}
}, (this.blastCounter + 1) * 100);
this.blastCounter++;
}
}
/**
* Stop the blast
*/
defusePrismBlast() {
let counter = 0;
while (this.blastCounter > 0) {
const index = this.blastCounter - 1;
setTimeout(() => {
this.stopAnimation(index);
if (index === 0) {
this.gameService.emitMasterObservableEvent({
type: ObservableTypeEnum.prismBlastDefused,
booleanData: true
});
}
}, (counter += 1) * 100);
this.blastCounter--;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpc20tYmxhc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaXNtL3NyYy9saWIvc2VydmljZS9wcmlzbS1ibGFzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRXZGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQXNDNUI7Ozs7O09BS0c7SUFDSCxZQUFvQixXQUF3QixFQUFVLEdBQTZCO1FBQS9ELGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBMEI7UUFkbkY7O1dBRUc7UUFDSyxVQUFLLEdBQUc7WUFDZCxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDO1lBQzVFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUM7U0FDaEYsQ0FBQztRQVNBLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQzdFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixFQUFF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QyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQjtRQUN0QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsRUFBRTtZQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUNwQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtvQkFDZixJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUFDO3dCQUN6QyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsaUJBQWlCO3dCQUMxQyxXQUFXLEVBQUUsSUFBSTtxQkFDQyxDQUFDLENBQUM7aUJBQ3ZCO1lBQ0gsQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdhbWVTZXJ2aWNlIH0gZnJvbSAnLi9nYW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZU1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvb2JzZXJ2YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlVHlwZUVudW0gfSBmcm9tICcuLi9lbnVtL29ic2VydmFibGUtdHlwZS5lbnVtJztcbmltcG9ydCB7IFByaXNtQmxhc3RDbGFzcyB9IGZyb20gJy4uL3ByaXNtL3ByaXNtLWJsYXN0L3ByaXNtLWJsYXN0LmNsYXNzJztcbmltcG9ydCB7IEtFWSwgQkxPQ0tfU0laRSB9IGZyb20gJy4uL2dhbWVib2FyZC9nYW1lYm9hcmQtY29uc3RhbnRzJztcbmltcG9ydCB7IElBc3NldCB9IGZyb20gJy4uL2ludGVyZmFjZS9hc3NldC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUHJpc21CbGFzdEljb25DbGFzcyB9IGZyb20gJy4uL3ByaXNtL3ByaXNtLWJsYXN0LWljb24vcHJpc20tYmxhc3QtaWNvbi5jbGFzcyc7XG5cbi8qKlxuICogVGhlIFByaXNtIEJsYXN0IHNlcnZpY2VcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXNtQmxhc3RTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIFRoZSBwcmlzbSBibGFzdHNcbiAgICovXG4gIHByaXZhdGUgcHJpc21CbGFzdHM6IFByaXNtQmxhc3RDbGFzc1tdO1xuICAvKipcbiAgICogVGhlIHByaXNtIGJsYXN0IEljb25zXG4gICAqL1xuICBwcml2YXRlIHByaXNtQmxhc3RJY29uczogUHJpc21CbGFzdEljb25DbGFzc1tdO1xuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIHByaXNtIGJsYXN0IEljb25zIHBvc2l0aW9uXG4gICAqL1xuICBwcml2YXRlIHByaXNtQmxhc3RJY29uc1Bvc2l0aW9uOiBJQXNzZXQ7XG4gIC8qKlxuICAgKiBUaGUgY2FuIGZpcmVcbiAgICovXG4gIHByaXZhdGUgY2FuRmlyZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRvdGFsIEJsYXN0c1xuICAgKi9cbiAgcHJpdmF0ZSB0b3RhbEJsYXN0czogbnVtYmVyO1xuICAvKipcbiAgICogQmxhc3QgQ291bnRlclxuICAgKi9cbiAgcHJpdmF0ZSBibGFzdENvdW50ZXI6IG51bWJlcjtcbiAgLyoqXG4gICAqIEJsYXN0IEFuZ2xlXG4gICAqL1xuICBwcml2YXRlIGJsYXN0QW5nbGU6IG51bWJlcjtcblxuICAvKipcbiAgICogbW92ZXNcbiAgICovXG4gIHByaXZhdGUgbW92ZXMgPSB7XG4gICAgW0tFWS5VUF06IChhc3NldDogSUFzc2V0KTogSUFzc2V0ID0+ICh7IC4uLmFzc2V0LCB5OiBhc3NldC55IC0gQkxPQ0tfU0laRSB9KSxcbiAgICBbS0VZLlJJR0hUXTogKGFzc2V0OiBJQXNzZXQpOiBJQXNzZXQgPT4gKHsgLi4uYXNzZXQsIHg6IGFzc2V0LnggKyBCTE9DS19TSVpFIH0pXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3RvclxuICAgKlxuICAgKiBAcGFyYW0gZ2FtZVNlcnZpY2UgVGhlIEdhbWVTZXJ2aWNlXG4gICAqIEBwYXJhbSBjdHggVGhlIGN0eFxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnYW1lU2VydmljZTogR2FtZVNlcnZpY2UsIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpIHtcbiAgICBjb25zdCBwcmlzbUJsYXN0Q29vcmRpbmF0ZXMgPSB0aGlzLmdhbWVTZXJ2aWNlLmdldENvb3JkaW5hdGVzRm9yUHJpc21CbGFzdCgpO1xuICAgIHRoaXMucHJpc21CbGFzdEljb25zUG9zaXRpb24gPSB0aGlzLmdhbWVTZXJ2aWNlLmdldFByaXNtQmxhc3RJY29uUG9zaXRpb24oKTtcbiAgICB0aGlzLnRvdGFsQmxhc3RzID0gcHJpc21CbGFzdENvb3JkaW5hdGVzLmRpc3RhbmNlO1xuICAgIHRoaXMuYmxhc3RBbmdsZSA9IHByaXNtQmxhc3RDb29yZGluYXRlcy5hbmdsZTtcbiAgICB0aGlzLmJsYXN0Q291bnRlciA9IDA7XG4gICAgdGhpcy5wcmlzbUJsYXN0cyA9IFtdO1xuICAgIHRoaXMucHJpc21CbGFzdEljb25zID0gW107XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50b3RhbEJsYXN0czsgaW5kZXgrKykge1xuICAgICAgdGhpcy5wcmlzbUJsYXN0cy5wdXNoKG5ldyBQcmlzbUJsYXN0Q2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgsIDEpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIFByaXNtIEJsYXN0IGNhbiBiZSBmaXJlZFxuICAgKi9cbiAgcHJpdmF0ZSBjYW5GaXJlUHJpc21CbGFzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jYW5GaXJlICYmXG4gICAgICB0aGlzLnByaXNtQmxhc3RJY29ucy5maWx0ZXIoKHByaXNtQmxhc3RJY29uOiBQcmlzbUJsYXN0SWNvbkNsYXNzKSA9PiBwcmlzbUJsYXN0SWNvbi5pc0Rlc3Ryb3llZCA9PT0gZmFsc2UpXG4gICAgICAgIC5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdXNlZCBwcmlzbSBibGFzdHNcbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlUHJpc21CbGFzdCgpOiB2b2lkIHtcbiAgICB0aGlzLnByaXNtQmxhc3RJY29uc1xuICAgICAgLmZpbHRlcigocHJpc21CbGFzdEljb246IFByaXNtQmxhc3RJY29uQ2xhc3MpID0+IHByaXNtQmxhc3RJY29uLmlzRGVzdHJveWVkID09PSBmYWxzZSlcbiAgICAgIC5zbGljZSgwKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLm1hcCgocHJpc21CbGFzdEljb246IFByaXNtQmxhc3RJY29uQ2xhc3MsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgcHJpc21CbGFzdEljb24uaXNEZXN0cm95ZWQgPSBpbmRleCA9PT0gMDtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXQgdGhlIHNlcnZpY2Ugd2l0aCB0aGUgbGlzdGVuZXJcbiAgICovXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2FtZVNlcnZpY2UuZ2V0TWFzdGVyT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoZXZlbnQ6IE9ic2VydmFibGVNb2RlbCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IE9ic2VydmFibGVUeXBlRW51bS5nYW1lT3Zlcikge1xuICAgICAgICB0aGlzLmNhbkZpcmUgPSAhZXZlbnQuYm9vbGVhbkRhdGE7XG4gICAgICAgIGlmICghZXZlbnQuYm9vbGVhbkRhdGEpIHtcbiAgICAgICAgICB0aGlzLnByaXNtQmxhc3RJY29ucy5tYXAoKHByaXNtQmxhc3RJY29uOiBQcmlzbUJsYXN0SWNvbkNsYXNzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBwcmlzbUJsYXN0SWNvbi5pc0Rlc3Ryb3llZCA9IGluZGV4ID4gMTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0ucHJpc21CbGFzdExhdW5jaGVkKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbkZpcmVQcmlzbUJsYXN0KCkpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZVByaXNtQmxhc3QoKTtcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uQmxhc3QoZXZlbnQpO1xuICAgICAgICAgIHRoaXMubGF1bmNoUHJpc21CbGFzdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZFByaXNtQmxhc3QoKTtcbiAgICB0aGlzLmFkZFByaXNtQmxhc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFueSB1bnVzZWQgbWlzc2lsZXNcbiAgICovXG4gIHByaXZhdGUgZmluZFVudXNlZFByaXNtQmxhc3RJY29ucygpOiBQcmlzbUJsYXN0SWNvbkNsYXNzIHtcbiAgICByZXR1cm4gdGhpcy5wcmlzbUJsYXN0SWNvbnMuZmlsdGVyKChwcmlzbUJsYXN0SWNvbjogUHJpc21CbGFzdEljb25DbGFzcykgPT4gcHJpc21CbGFzdEljb24uaXNEZXN0cm95ZWQpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBBIG5ldyBQcmlzbSBCbGFzdCBJY29uXG4gICAqL1xuICBwdWJsaWMgYWRkUHJpc21CbGFzdCgpOiB2b2lkIHtcbiAgICBsZXQgcHJpc21CbGFzdEljb24gPSB0aGlzLmZpbmRVbnVzZWRQcmlzbUJsYXN0SWNvbnMoKTtcblxuICAgIGlmICh0aGlzLnByaXNtQmxhc3RJY29ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnByaXNtQmxhc3RJY29uc1Bvc2l0aW9uID0gdGhpcy5tb3Zlc1tLRVkuUklHSFRdKHRoaXMucHJpc21CbGFzdEljb25zUG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmICghcHJpc21CbGFzdEljb24pIHtcbiAgICAgIHByaXNtQmxhc3RJY29uID0gbmV3IFByaXNtQmxhc3RJY29uQ2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgpO1xuICAgICAgdGhpcy5wcmlzbUJsYXN0SWNvbnMucHVzaChwcmlzbUJsYXN0SWNvbik7XG4gICAgfVxuXG4gICAgcHJpc21CbGFzdEljb24ucG9zaXRpb24odGhpcy5wcmlzbUJsYXN0SWNvbnNQb3NpdGlvbik7XG4gICAgcHJpc21CbGFzdEljb24uaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3NpdGlvbiB0aGUgYmxhc3RcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb29yZGluYXRlc1xuICAgKi9cbiAgcHJpdmF0ZSBwb3NpdGlvbkJsYXN0KGV2ZW50OiBPYnNlcnZhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICBsZXQgbmV4dE1vdmUgPSBldmVudC5hc3NldENvb3JkaW5hdGVEYXRhO1xuICAgIG5leHRNb3ZlLnkgKz0gQkxPQ0tfU0laRSAvIDI7XG4gICAgdGhpcy5wcmlzbUJsYXN0cy5tYXAoKHByaXNtQmxhc3Q6IFByaXNtQmxhc3RDbGFzcykgPT4ge1xuICAgICAgbmV4dE1vdmUgPSB0aGlzLm1vdmVzW0tFWS5VUF0obmV4dE1vdmUpO1xuICAgICAgcHJpc21CbGFzdC5tb3ZlKG5leHRNb3ZlKTtcbiAgICAgIHByaXNtQmxhc3Quc2V0Qmxhc3RBbmdsZSh0aGlzLmJsYXN0QW5nbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuaW1hdGVcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgYmxhc3RcbiAgICovXG4gIHByaXZhdGUgc3RhcnRBbmltYXRpb24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucHJpc21CbGFzdHNbaW5kZXhdLmlzRGVzdHJveWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQW5pbWF0ZVxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBibGFzdFxuICAgKi9cbiAgcHJpdmF0ZSBzdG9wQW5pbWF0aW9uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnByaXNtQmxhc3RzW2luZGV4XS5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQW5pbWF0ZVxuICAgKiBAcGFyYW0gbm93IHRoZSBjdXJyZW50IHRpbWVcbiAgICovXG4gIHB1YmxpYyBhbmltYXRlKG5vdyA9IDApOiB2b2lkIHtcbiAgICB0aGlzLnByaXNtQmxhc3RJY29ucy5tYXAoKHByaXNtQmxhc3RJY29uOiBQcmlzbUJsYXN0SWNvbkNsYXNzKSA9PiB7XG4gICAgICBwcmlzbUJsYXN0SWNvbi5hbmltYXRlKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnByaXNtQmxhc3RzLm1hcCgocHJpc21CbGFzdDogUHJpc21CbGFzdENsYXNzKSA9PiB7XG4gICAgICBpZiAocHJpc21CbGFzdC5pc0Rlc3Ryb3llZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcHJpc21CbGFzdC5hbmltYXRlKG5vdyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoIGEgQmxhc3RcbiAgICovXG4gIHByaXZhdGUgbGF1bmNoUHJpc21CbGFzdCgpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5ibGFzdENvdW50ZXIgPCB0aGlzLnRvdGFsQmxhc3RzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuYmxhc3RDb3VudGVyO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oaW5kZXgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMudG90YWxCbGFzdHMgLSAxKSB7XG4gICAgICAgICAgdGhpcy5nYW1lU2VydmljZS5lbWl0TWFzdGVyT2JzZXJ2YWJsZUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6IE9ic2VydmFibGVUeXBlRW51bS5wcmlzbUJsYXN0RmlyZVxuICAgICAgICAgIH0gYXMgT2JzZXJ2YWJsZU1vZGVsKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVmdXNlUHJpc21CbGFzdCgpO1xuICAgICAgICAgIH0sIDM1MDApO1xuICAgICAgICB9XG4gICAgICB9LCAodGhpcy5ibGFzdENvdW50ZXIgKyAxKSAqIDEwMCk7XG4gICAgICB0aGlzLmJsYXN0Q291bnRlcisrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBibGFzdFxuICAgKi9cbiAgcHJpdmF0ZSBkZWZ1c2VQcmlzbUJsYXN0KCk6IHZvaWQge1xuICAgIGxldCBjb3VudGVyID0gMDtcbiAgICB3aGlsZSAodGhpcy5ibGFzdENvdW50ZXIgPiAwKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuYmxhc3RDb3VudGVyIC0gMTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oaW5kZXgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmdhbWVTZXJ2aWNlLmVtaXRNYXN0ZXJPYnNlcnZhYmxlRXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogT2JzZXJ2YWJsZVR5cGVFbnVtLnByaXNtQmxhc3REZWZ1c2VkLFxuICAgICAgICAgICAgYm9vbGVhbkRhdGE6IHRydWVcbiAgICAgICAgICB9IGFzIE9ic2VydmFibGVNb2RlbCk7XG4gICAgICAgIH1cbiAgICAgIH0sIChjb3VudGVyICs9IDEpICogMTAwKTtcbiAgICAgIHRoaXMuYmxhc3RDb3VudGVyLS07XG4gICAgfVxuICB9XG59XG4iXX0=