UNPKG

bp-prism-game

Version:
156 lines 19.5 kB
import { ObservableTypeEnum } from '../enum/observable-type.enum'; import { AssetClass } from '../asset/asset.class'; import { KEY } from '../gameboard/gameboard-constants'; import { ImageLoadedEnum } from '../enum/image-loaded.enum'; /** * The Missile Class */ export class MissileClass extends AssetClass { /** * Constructor * @param gameService The GameService * @param ctx The ctx * @param guid The guid of the misssle */ constructor(gameService, ctx, guid) { super(gameService, ctx, guid); /** * moves */ this.moves = { [KEY.UP]: (asset) => ({ ...asset, y: asset.y - 3 }) }; this.loadMissileImages(); this.assetScale = { x: 0.2, y: 0.2 }; } /** * Load the Gunner Images */ loadMissileImages() { const imagesToLoad = [ ImageLoadedEnum.missileWhite, ImageLoadedEnum.missileBlue, ImageLoadedEnum.missileGreen, ImageLoadedEnum.missileIndigo, ImageLoadedEnum.missileOrange, ImageLoadedEnum.missileRed, ImageLoadedEnum.missileViolet, ImageLoadedEnum.missileYellow ]; imagesToLoad.map((key) => { this.images.push(this.gameService.getImage(key)); this.isImageLoaded = true; }); this.currentMissile = this.images[0]; } /** * Set the Missile Color * @param index The index of the color */ setMissileColor(index) { this.currentMissile = this.images[index]; } /** * Un Set the Missile Color */ unsetMissileColor() { this.currentMissile = this.images[0]; } /** * Add the shadow * @param position The position of the shadow */ addMissileShadow(position) { const currentAngle = Math.abs(Math.floor(this.rotationDegree / 360)); const missileDegree = (this.rotationDegree - currentAngle * 360) % 360; const shadowRotationDegree = missileDegree < 0 ? 360 + missileDegree : missileDegree; let xOffset = shadowRotationDegree >= 90 && shadowRotationDegree <= 135 ? 2 : 7.5; xOffset = shadowRotationDegree >= 225 && shadowRotationDegree <= 260 ? 12.5 : xOffset; const missileMultiplier = (shadowRotationDegree >= -45 && shadowRotationDegree <= 135) || shadowRotationDegree >= 315 ? -1 : 1; this.ctx.fillStyle = 'grey'; this.ctx.fillRect(position.x + missileMultiplier * xOffset, position.y + 20, 2.5, 10); } /** * Draw evenything necessary */ draw() { if (this.isImageLoaded) { this.ctx.save(); this.ctx.translate(this.x, this.y); this.ctx.scale(this.assetScale.x, this.assetScale.y); if (this.currentMissile.isRotate) { this.ctx.rotate(this.gameService.getRadians(this.rotationDegree)); } this.ctx.drawImage(this.currentMissile.imageSource, this.currentMissile.x, this.currentMissile.y); this.addMissileShadow({ x: this.currentMissile.x, y: this.currentMissile.y }); this.ctx.restore(); } } /** * Set the rotation degree * @param rotationDegree The rotation degress */ setMissileData(data) { this.rotationDegree = data.rotation; this.launchPosition = data.position; this.originalPosition = data.position; const firstMove = this.convertMissilePosition(); firstMove.y -= 3; this.move(firstMove); } /** * Round to the nearest 100 * @param asset The asset to round */ roundCoordinates(asset) { asset.x = Math.round(asset.x * 100) / 100; asset.y = Math.round(asset.y * 100) / 100; return asset; } /** * Convert the missile position based on the angle */ convertMissilePosition() { this.launchPosition = this.moves[KEY.UP](this.launchPosition); const distance = this.originalPosition.y - this.launchPosition.y; const rad = this.gameService.getRadians(180 - this.rotationDegree); return this.roundCoordinates({ x: this.originalPosition.x + distance * Math.sin(rad), y: this.originalPosition.y + distance * Math.cos(rad) }); } /** * Animate the missile * @param now the current time */ animate(now = 0) { this.assetTimer.elapsed = now - this.assetTimer.start; if (this.stopAnimation()) { if (this.isGameOver || this.isDestroyed) { this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.missileDestroyed, numberData: this.uid }); } return; } if (this.assetTimer.elapsed > 30) { this.assetTimer.start = now; const asset = this.convertMissilePosition(); if (this.gameService.valid(asset)) { this.move(asset); } else { this.isDestroyed = true; } } this.draw(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzc2lsZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByaXNtL3NyYy9saWIvbWlzc2lsZS9taXNzaWxlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUdsRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxVQUFVO0lBeUIxQzs7Ozs7T0FLRztJQUNILFlBQVksV0FBd0IsRUFBRSxHQUE2QixFQUFFLElBQVk7UUFDL0UsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFkaEM7O1dBRUc7UUFDSyxVQUFLLEdBQUc7WUFDZCxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1NBQ3BFLENBQUM7UUFXQSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLENBQUMsRUFBRSxHQUFHO1lBQ04sQ0FBQyxFQUFFLEdBQUc7U0FDWSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQjtRQUN2QixNQUFNLFlBQVksR0FBRztZQUNuQixlQUFlLENBQUMsWUFBWTtZQUM1QixlQUFlLENBQUMsV0FBVztZQUMzQixlQUFlLENBQUMsWUFBWTtZQUM1QixlQUFlLENBQUMsYUFBYTtZQUM3QixlQUFlLENBQUMsYUFBYTtZQUM3QixlQUFlLENBQUMsVUFBVTtZQUMxQixlQUFlLENBQUMsYUFBYTtZQUM3QixlQUFlLENBQUMsYUFBYTtTQUM5QixDQUFDO1FBRUYsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQW9CLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlLENBQUMsS0FBYTtRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZ0JBQWdCLENBQUMsUUFBZ0I7UUFDdkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsWUFBWSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN2RSxNQUFNLG9CQUFvQixHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUVyRixJQUFJLE9BQU8sR0FBRyxvQkFBb0IsSUFBSSxFQUFFLElBQUksb0JBQW9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUVsRixPQUFPLEdBQUcsb0JBQW9CLElBQUksR0FBRyxJQUFJLG9CQUFvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFdEYsTUFBTSxpQkFBaUIsR0FDckIsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLEVBQUUsSUFBSSxvQkFBb0IsSUFBSSxHQUFHLENBQUMsSUFBSSxvQkFBb0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLEdBQUcsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQ7O09BRUc7SUFDTyxJQUFJO1FBQ1osSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVyRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQzthQUNuRTtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbEcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2dCQUNwQixDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN4QixDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ2YsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjLENBQUMsSUFBd0I7UUFDNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNoRCxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ3BDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDMUMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSyxzQkFBc0I7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUVqRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQzNCLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNyRCxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7U0FDNUMsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFdEQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUM7b0JBQ3pDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxnQkFBZ0I7b0JBQ3pDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRztpQkFDRixDQUFDLENBQUM7YUFDdkI7WUFFRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLEVBQUUsRUFBRTtZQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7WUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDNUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUN6QjtTQUNGO1FBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2FtZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2dhbWUuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlVHlwZUVudW0gfSBmcm9tICcuLi9lbnVtL29ic2VydmFibGUtdHlwZS5lbnVtJztcbmltcG9ydCB7IE9ic2VydmFibGVNb2RlbCB9IGZyb20gJy4uL21vZGVsL29ic2VydmFibGUubW9kZWwnO1xuaW1wb3J0IHsgQXNzZXRDbGFzcyB9IGZyb20gJy4uL2Fzc2V0L2Fzc2V0LmNsYXNzJztcbmltcG9ydCB7IElBc3NldCB9IGZyb20gJy4uL2ludGVyZmFjZS9hc3NldC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWlzc2lsZUxhdW5jaE1vZGVsIH0gZnJvbSAnLi9tb2RlbC9taXNzaWxlLWxhdW5jaC5tb2RlbCc7XG5pbXBvcnQgeyBLRVkgfSBmcm9tICcuLi9nYW1lYm9hcmQvZ2FtZWJvYXJkLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBJbWFnZUxvY2F0aW9uTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9pbWFnZS9pbWFnZS1sb2NhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBJbWFnZUxvYWRlZEVudW0gfSBmcm9tICcuLi9lbnVtL2ltYWdlLWxvYWRlZC5lbnVtJztcbmltcG9ydCB7IEFzc2V0U2NhbGVNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Fzc2V0LXNjYWxlLm1vZGUnO1xuXG4vKipcbiAqIFRoZSBNaXNzaWxlIENsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBNaXNzaWxlQ2xhc3MgZXh0ZW5kcyBBc3NldENsYXNzIHtcbiAgLyoqXG4gICAqIFRoZSByb3RhdGlvbiBEZWdyZXNzXG4gICAqL1xuICBwcml2YXRlIHJvdGF0aW9uRGVncmVlOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbGF1bmNoUG9zaXRpb25cbiAgICovXG4gIHByaXZhdGUgbGF1bmNoUG9zaXRpb246IElBc3NldDtcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbFBvc2l0aW9uXG4gICAqL1xuICBwcml2YXRlIG9yaWdpbmFsUG9zaXRpb246IElBc3NldDtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IG1pc3NpbGVcbiAgICovXG4gIHByaXZhdGUgY3VycmVudE1pc3NpbGU6IEltYWdlTG9jYXRpb25Nb2RlbDtcblxuICAvKipcbiAgICogbW92ZXNcbiAgICovXG4gIHByaXZhdGUgbW92ZXMgPSB7XG4gICAgW0tFWS5VUF06IChhc3NldDogSUFzc2V0KTogSUFzc2V0ID0+ICh7IC4uLmFzc2V0LCB5OiBhc3NldC55IC0gMyB9KVxuICB9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gZ2FtZVNlcnZpY2UgVGhlIEdhbWVTZXJ2aWNlXG4gICAqIEBwYXJhbSBjdHggVGhlIGN0eFxuICAgKiBAcGFyYW0gZ3VpZCBUaGUgZ3VpZCBvZiB0aGUgbWlzc3NsZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZ2FtZVNlcnZpY2U6IEdhbWVTZXJ2aWNlLCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgZ3VpZDogbnVtYmVyKSB7XG4gICAgc3VwZXIoZ2FtZVNlcnZpY2UsIGN0eCwgZ3VpZCk7XG5cbiAgICB0aGlzLmxvYWRNaXNzaWxlSW1hZ2VzKCk7XG5cbiAgICB0aGlzLmFzc2V0U2NhbGUgPSB7XG4gICAgICB4OiAwLjIsXG4gICAgICB5OiAwLjJcbiAgICB9IGFzIEFzc2V0U2NhbGVNb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBHdW5uZXIgSW1hZ2VzXG4gICAqL1xuICBwcml2YXRlIGxvYWRNaXNzaWxlSW1hZ2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGltYWdlc1RvTG9hZCA9IFtcbiAgICAgIEltYWdlTG9hZGVkRW51bS5taXNzaWxlV2hpdGUsXG4gICAgICBJbWFnZUxvYWRlZEVudW0ubWlzc2lsZUJsdWUsXG4gICAgICBJbWFnZUxvYWRlZEVudW0ubWlzc2lsZUdyZWVuLFxuICAgICAgSW1hZ2VMb2FkZWRFbnVtLm1pc3NpbGVJbmRpZ28sXG4gICAgICBJbWFnZUxvYWRlZEVudW0ubWlzc2lsZU9yYW5nZSxcbiAgICAgIEltYWdlTG9hZGVkRW51bS5taXNzaWxlUmVkLFxuICAgICAgSW1hZ2VMb2FkZWRFbnVtLm1pc3NpbGVWaW9sZXQsXG4gICAgICBJbWFnZUxvYWRlZEVudW0ubWlzc2lsZVllbGxvd1xuICAgIF07XG5cbiAgICBpbWFnZXNUb0xvYWQubWFwKChrZXk6IEltYWdlTG9hZGVkRW51bSkgPT4ge1xuICAgICAgdGhpcy5pbWFnZXMucHVzaCh0aGlzLmdhbWVTZXJ2aWNlLmdldEltYWdlKGtleSkpO1xuICAgICAgdGhpcy5pc0ltYWdlTG9hZGVkID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRoaXMuY3VycmVudE1pc3NpbGUgPSB0aGlzLmltYWdlc1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIE1pc3NpbGUgQ29sb3JcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sb3JcbiAgICovXG4gIHB1YmxpYyBzZXRNaXNzaWxlQ29sb3IoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudE1pc3NpbGUgPSB0aGlzLmltYWdlc1tpbmRleF07XG4gIH1cblxuICAvKipcbiAgICogVW4gU2V0IHRoZSBNaXNzaWxlIENvbG9yXG4gICAqL1xuICBwdWJsaWMgdW5zZXRNaXNzaWxlQ29sb3IoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50TWlzc2lsZSA9IHRoaXMuaW1hZ2VzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgc2hhZG93XG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIHNoYWRvd1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRNaXNzaWxlU2hhZG93KHBvc2l0aW9uOiBJQXNzZXQpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50QW5nbGUgPSBNYXRoLmFicyhNYXRoLmZsb29yKHRoaXMucm90YXRpb25EZWdyZWUgLyAzNjApKTtcbiAgICBjb25zdCBtaXNzaWxlRGVncmVlID0gKHRoaXMucm90YXRpb25EZWdyZWUgLSBjdXJyZW50QW5nbGUgKiAzNjApICUgMzYwO1xuICAgIGNvbnN0IHNoYWRvd1JvdGF0aW9uRGVncmVlID0gbWlzc2lsZURlZ3JlZSA8IDAgPyAzNjAgKyBtaXNzaWxlRGVncmVlIDogbWlzc2lsZURlZ3JlZTtcblxuICAgIGxldCB4T2Zmc2V0ID0gc2hhZG93Um90YXRpb25EZWdyZWUgPj0gOTAgJiYgc2hhZG93Um90YXRpb25EZWdyZWUgPD0gMTM1ID8gMiA6IDcuNTtcblxuICAgIHhPZmZzZXQgPSBzaGFkb3dSb3RhdGlvbkRlZ3JlZSA+PSAyMjUgJiYgc2hhZG93Um90YXRpb25EZWdyZWUgPD0gMjYwID8gMTIuNSA6IHhPZmZzZXQ7XG5cbiAgICBjb25zdCBtaXNzaWxlTXVsdGlwbGllciA9XG4gICAgICAoc2hhZG93Um90YXRpb25EZWdyZWUgPj0gLTQ1ICYmIHNoYWRvd1JvdGF0aW9uRGVncmVlIDw9IDEzNSkgfHwgc2hhZG93Um90YXRpb25EZWdyZWUgPj0gMzE1ID8gLTEgOiAxO1xuXG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gJ2dyZXknO1xuICAgIHRoaXMuY3R4LmZpbGxSZWN0KHBvc2l0aW9uLnggKyBtaXNzaWxlTXVsdGlwbGllciAqIHhPZmZzZXQsIHBvc2l0aW9uLnkgKyAyMCwgMi41LCAxMCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyBldmVueXRoaW5nIG5lY2Vzc2FyeVxuICAgKi9cbiAgcHJvdGVjdGVkIGRyYXcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNJbWFnZUxvYWRlZCkge1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKHRoaXMueCwgdGhpcy55KTtcbiAgICAgIHRoaXMuY3R4LnNjYWxlKHRoaXMuYXNzZXRTY2FsZS54LCB0aGlzLmFzc2V0U2NhbGUueSk7XG5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRNaXNzaWxlLmlzUm90YXRlKSB7XG4gICAgICAgIHRoaXMuY3R4LnJvdGF0ZSh0aGlzLmdhbWVTZXJ2aWNlLmdldFJhZGlhbnModGhpcy5yb3RhdGlvbkRlZ3JlZSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuY3VycmVudE1pc3NpbGUuaW1hZ2VTb3VyY2UsIHRoaXMuY3VycmVudE1pc3NpbGUueCwgdGhpcy5jdXJyZW50TWlzc2lsZS55KTtcblxuICAgICAgdGhpcy5hZGRNaXNzaWxlU2hhZG93KHtcbiAgICAgICAgeDogdGhpcy5jdXJyZW50TWlzc2lsZS54LFxuICAgICAgICB5OiB0aGlzLmN1cnJlbnRNaXNzaWxlLnlcbiAgICAgIH0gYXMgSUFzc2V0KTtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByb3RhdGlvbiBkZWdyZWVcbiAgICogQHBhcmFtIHJvdGF0aW9uRGVncmVlIFRoZSByb3RhdGlvbiBkZWdyZXNzXG4gICAqL1xuICBwdWJsaWMgc2V0TWlzc2lsZURhdGEoZGF0YTogTWlzc2lsZUxhdW5jaE1vZGVsKTogdm9pZCB7XG4gICAgdGhpcy5yb3RhdGlvbkRlZ3JlZSA9IGRhdGEucm90YXRpb247XG4gICAgdGhpcy5sYXVuY2hQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjtcbiAgICBjb25zdCBmaXJzdE1vdmUgPSB0aGlzLmNvbnZlcnRNaXNzaWxlUG9zaXRpb24oKTtcbiAgICBmaXJzdE1vdmUueSAtPSAzO1xuICAgIHRoaXMubW92ZShmaXJzdE1vdmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdW5kIHRvIHRoZSBuZWFyZXN0IDEwMFxuICAgKiBAcGFyYW0gYXNzZXQgVGhlIGFzc2V0IHRvIHJvdW5kXG4gICAqL1xuICBwcml2YXRlIHJvdW5kQ29vcmRpbmF0ZXMoYXNzZXQ6IElBc3NldCk6IElBc3NldCB7XG4gICAgYXNzZXQueCA9IE1hdGgucm91bmQoYXNzZXQueCAqIDEwMCkgLyAxMDA7XG4gICAgYXNzZXQueSA9IE1hdGgucm91bmQoYXNzZXQueSAqIDEwMCkgLyAxMDA7XG4gICAgcmV0dXJuIGFzc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIG1pc3NpbGUgcG9zaXRpb24gYmFzZWQgb24gdGhlIGFuZ2xlXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRNaXNzaWxlUG9zaXRpb24oKTogSUFzc2V0IHtcbiAgICB0aGlzLmxhdW5jaFBvc2l0aW9uID0gdGhpcy5tb3Zlc1tLRVkuVVBdKHRoaXMubGF1bmNoUG9zaXRpb24pO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gdGhpcy5vcmlnaW5hbFBvc2l0aW9uLnkgLSB0aGlzLmxhdW5jaFBvc2l0aW9uLnk7XG5cbiAgICBjb25zdCByYWQgPSB0aGlzLmdhbWVTZXJ2aWNlLmdldFJhZGlhbnMoMTgwIC0gdGhpcy5yb3RhdGlvbkRlZ3JlZSk7XG4gICAgcmV0dXJuIHRoaXMucm91bmRDb29yZGluYXRlcyh7XG4gICAgICB4OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueCArIGRpc3RhbmNlICogTWF0aC5zaW4ocmFkKSxcbiAgICAgIHk6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi55ICsgZGlzdGFuY2UgKiBNYXRoLmNvcyhyYWQpXG4gICAgfSBhcyBJQXNzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuaW1hdGUgdGhlIG1pc3NpbGVcbiAgICogQHBhcmFtIG5vdyB0aGUgY3VycmVudCB0aW1lXG4gICAqL1xuICBwdWJsaWMgYW5pbWF0ZShub3cgPSAwKTogdm9pZCB7XG4gICAgdGhpcy5hc3NldFRpbWVyLmVsYXBzZWQgPSBub3cgLSB0aGlzLmFzc2V0VGltZXIuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5zdG9wQW5pbWF0aW9uKCkpIHtcbiAgICAgIGlmICh0aGlzLmlzR2FtZU92ZXIgfHwgdGhpcy5pc0Rlc3Ryb3llZCkge1xuICAgICAgICB0aGlzLmdhbWVTZXJ2aWNlLmVtaXRNYXN0ZXJPYnNlcnZhYmxlRXZlbnQoe1xuICAgICAgICAgIHR5cGU6IE9ic2VydmFibGVUeXBlRW51bS5taXNzaWxlRGVzdHJveWVkLFxuICAgICAgICAgIG51bWJlckRhdGE6IHRoaXMudWlkXG4gICAgICAgIH0gYXMgT2JzZXJ2YWJsZU1vZGVsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFzc2V0VGltZXIuZWxhcHNlZCA+IDMwKSB7XG4gICAgICB0aGlzLmFzc2V0VGltZXIuc3RhcnQgPSBub3c7XG4gICAgICBjb25zdCBhc3NldCA9IHRoaXMuY29udmVydE1pc3NpbGVQb3NpdGlvbigpO1xuICAgICAgaWYgKHRoaXMuZ2FtZVNlcnZpY2UudmFsaWQoYXNzZXQpKSB7XG4gICAgICAgIHRoaXMubW92ZShhc3NldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRyYXcoKTtcbiAgfVxufVxuIl19