bp-space-invaders
Version:
The BP Space Invaders Game
118 lines • 20 kB
JavaScript
import { Component, ElementRef, ViewChild, HostListener } from '@angular/core';
import { Spaceship1Class } from '../../spaceship-1/spaceship-1.class';
import { GameService } from '../../../service/game.service';
import { ObservableTypeEnum } from '../../../enum/observable-type.enum';
import { Spaceship2Class } from '../../spaceship-2/spaceship-2.class';
import { GameCookieService } from '../../../service/game-cookie.service';
import * as i0 from "@angular/core";
import * as i1 from "../../../service/game.service";
import * as i2 from "../../../service/game-cookie.service";
import * as i3 from "@angular/common";
export class SpaceshipComponent {
constructor(gameService, gameCookieService) {
this.gameService = gameService;
this.gameCookieService = gameCookieService;
this.isAnimateOnce = false;
this.assets = [
{
key: 'spaceship1',
name: 'S-1'
},
{
key: 'spaceship2',
name: 'S-2'
}
];
}
ngOnInit() {
const rows = 20;
const columns = 20;
this.ctx = this.gameService.initBoard(this.canvas, columns, rows, 25);
this.addSpaceships({
x: 0,
y: 0,
height: rows,
width: columns
});
this.isAnimateOnce = true;
this.toggleAssets(this.gameCookieService.getSecondaryDebugData());
this.animate();
}
addSpaceships(boundary) {
this.spaceships = [];
const spaceship1 = new Spaceship1Class(this.gameService, this.ctx, boundary);
spaceship1.isDestroyed = true;
this.spaceships.push(spaceship1);
const spaceship2 = new Spaceship2Class(this.gameService, this.ctx, boundary, true);
spaceship2.isDestroyed = true;
this.spaceships.push(spaceship2);
this.spaceship = this.spaceships[0];
this.spaceship.isAnimateOnce = true;
this.spaceship.isDestroyed = false;
}
animateAsset() {
this.isAnimateOnce = !this.isAnimateOnce;
this.spaceship.isDestroyed = false;
cancelAnimationFrame(this.requestId);
this.animate();
}
draw() {
this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
this.gameService.addOutlines(this.ctx, 1, 0.1);
}
animate(now = 0) {
this.draw();
this.spaceship.animate(now);
if (!this.isAnimateOnce) {
this.requestId = requestAnimationFrame(this.animate.bind(this));
}
}
keyDownEvent(event) {
event.preventDefault();
this.gameService.emitMasterObservableEvent({
type: ObservableTypeEnum.keyDownEvent,
stringData: event.code
});
}
keyUpEvent(event) {
event.preventDefault();
this.gameService.emitMasterObservableEvent({
type: ObservableTypeEnum.keyUpEvent,
stringData: event.code
});
}
toggleAssets(key) {
this.spaceship.isDestroyed = true;
this.draw();
let index = 0;
this.spaceships.map((spaceship) => {
spaceship.isDestroyed = true;
});
this.assets.map((asset, $index) => {
if (key === asset.key) {
index = $index;
this.gameCookieService.setDebugData({
secondaryAssetName: key
});
}
});
this.spaceship = this.spaceships[index];
this.animateAsset();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: SpaceshipComponent, deps: [{ token: i1.GameService }, { token: i2.GameCookieService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: SpaceshipComponent, selector: "bp-spaceship", host: { listeners: { "window:keydown": "keyDownEvent($event)", "window:keyup": "keyUpEvent($event)" } }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["board"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"game-container\">\n <div class=\"asset-title\">Spaceship</div>\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"animateAsset()\" class=\"animation-button button\">Animate</button>\n <div *ngFor=\"let asset of assets\">\n <button (click)=\"toggleAssets(asset.key)\" class=\"animation-button button\">\n {{ asset.name }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".game-container .asset-title{margin:25px;width:100%;text-align:center}.game-container .game-board-container{display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{border:solid 2px grey;background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{font-size:16px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: SpaceshipComponent, decorators: [{
type: Component,
args: [{ selector: 'bp-spaceship', template: "<div class=\"game-container\">\n <div class=\"asset-title\">Spaceship</div>\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"animateAsset()\" class=\"animation-button button\">Animate</button>\n <div *ngFor=\"let asset of assets\">\n <button (click)=\"toggleAssets(asset.key)\" class=\"animation-button button\">\n {{ asset.name }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".game-container .asset-title{margin:25px;width:100%;text-align:center}.game-container .game-board-container{display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{border:solid 2px grey;background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{font-size:16px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"] }]
}], ctorParameters: () => [{ type: i1.GameService }, { type: i2.GameCookieService }], propDecorators: { canvas: [{
type: ViewChild,
args: ['board', { static: true }]
}], keyDownEvent: [{
type: HostListener,
args: ['window:keydown', ['$event']]
}], keyUpEvent: [{
type: HostListener,
args: ['window:keyup', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhY2VzaGlwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwYWNlLWludmFkZXJzL3NyYy9saWIvc3BhY2VzaGlwcy9zcGFjZXNoaXAvdGVzdC1jb21wb25lbnQvc3BhY2VzaGlwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwYWNlLWludmFkZXJzL3NyYy9saWIvc3BhY2VzaGlwcy9zcGFjZXNoaXAvdGVzdC1jb21wb25lbnQvc3BhY2VzaGlwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUl4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7O0FBV3pFLE1BQU0sT0FBTyxrQkFBa0I7SUEwQzdCLFlBQW9CLFdBQXdCLEVBQVUsaUJBQW9DO1FBQXRFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUN4RixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1o7Z0JBQ0UsR0FBRyxFQUFFLFlBQVk7Z0JBQ2pCLElBQUksRUFBRSxLQUFLO2FBQ2U7WUFDNUI7Z0JBQ0UsR0FBRyxFQUFFLFlBQVk7Z0JBQ2pCLElBQUksRUFBRSxLQUFLO2FBQ2U7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R0FBbEIsa0JBQWtCLDRRQ3JCL0IsNmZBY0E7OzJGRE9hLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxjQUFjO2dIQVN4QixNQUFNO3NCQURMLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkE0SHBDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFjMUMsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTcGFjZXNoaXAxQ2xhc3MgfSBmcm9tICcuLi8uLi9zcGFjZXNoaXAtMS9zcGFjZXNoaXAtMS5jbGFzcyc7XG5pbXBvcnQgeyBHYW1lU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvZ2FtZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVsL29ic2VydmFibGUubW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZVR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZW51bS9vYnNlcnZhYmxlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBCb3VuZGFyeVNldHVwTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9ib3VuZGFyeS1zZXQubW9kZWwnO1xuaW1wb3J0IHsgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9hc3NldC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IFNwYWNlc2hpcENsYXNzIH0gZnJvbSAnLi4vc3BhY2VzaGlwLmNsYXNzJztcbmltcG9ydCB7IFNwYWNlc2hpcDJDbGFzcyB9IGZyb20gJy4uLy4uL3NwYWNlc2hpcC0yL3NwYWNlc2hpcC0yLmNsYXNzJztcbmltcG9ydCB7IEdhbWVDb29raWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9nYW1lLWNvb2tpZS5zZXJ2aWNlJztcbmltcG9ydCB7IERlYnVnRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvZGVidWctZGF0YS5tb2RlbCc7XG5cbi8qKlxuICogVGhlIFNwYWNlc2hpcCBDb21wb25lbnQgVHdvXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JwLXNwYWNlc2hpcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGFjZXNoaXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zcGFjZXNoaXAuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTcGFjZXNoaXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogVGhlIGNhbnZhc1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnYm9hcmQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBjYW52YXM6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBDVFNcbiAgICovXG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgLyoqXG4gICAqIHJlcXVlc3RJZFxuICAgKi9cbiAgcHJpdmF0ZSByZXF1ZXN0SWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogU3BhY2VzaGlwc1xuICAgKi9cbiAgcHJpdmF0ZSBzcGFjZXNoaXBzOiBTcGFjZXNoaXBDbGFzc1tdO1xuXG4gIC8qKlxuICAgKiByZXF1ZXN0XG4gICAqL1xuICBwcml2YXRlIGlzQW5pbWF0ZU9uY2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzcGFjZXNoaXBcbiAgICovXG4gIHByaXZhdGUgc3BhY2VzaGlwOiBTcGFjZXNoaXBDbGFzcztcblxuICAvKipcbiAgICogRGVidWcgQXNzZXRzXG4gICAqL1xuICBhc3NldHM6IEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsW107XG5cbiAgLyoqXG4gICAqIFRoZSBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gZ2FtZVNlcnZpY2UgVGhlIEdhbWVTZXJ2aWNlIGZyb20gRElcbiAgICogQHBhcmFtIGdhbWVDb29raWUgVGhlIEdhbWUgQ29va2llIFNlcnZpY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZ2FtZVNlcnZpY2U6IEdhbWVTZXJ2aWNlLCBwcml2YXRlIGdhbWVDb29raWVTZXJ2aWNlOiBHYW1lQ29va2llU2VydmljZSkge1xuICAgIHRoaXMuaXNBbmltYXRlT25jZSA9IGZhbHNlO1xuICAgIHRoaXMuYXNzZXRzID0gW1xuICAgICAge1xuICAgICAgICBrZXk6ICdzcGFjZXNoaXAxJyxcbiAgICAgICAgbmFtZTogJ1MtMSdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NwYWNlc2hpcDInLFxuICAgICAgICBuYW1lOiAnUy0yJ1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogT24gSW5pdFxuICAgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgcm93cyA9IDIwO1xuICAgIGNvbnN0IGNvbHVtbnMgPSAyMDtcbiAgICB0aGlzLmN0eCA9IHRoaXMuZ2FtZVNlcnZpY2UuaW5pdEJvYXJkKHRoaXMuY2FudmFzLCBjb2x1bW5zLCByb3dzLCAyNSk7XG4gICAgdGhpcy5hZGRTcGFjZXNoaXBzKHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgaGVpZ2h0OiByb3dzLFxuICAgICAgd2lkdGg6IGNvbHVtbnNcbiAgICB9IGFzIEJvdW5kYXJ5U2V0dXBNb2RlbCk7XG4gICAgdGhpcy5pc0FuaW1hdGVPbmNlID0gdHJ1ZTtcbiAgICB0aGlzLnRvZ2dsZUFzc2V0cyh0aGlzLmdhbWVDb29raWVTZXJ2aWNlLmdldFNlY29uZGFyeURlYnVnRGF0YSgpKTtcbiAgICB0aGlzLmFuaW1hdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIHNwYWNlc2hpcHNcbiAgICovXG4gIHByaXZhdGUgYWRkU3BhY2VzaGlwcyhib3VuZGFyeTogQm91bmRhcnlTZXR1cE1vZGVsKTogdm9pZCB7XG4gICAgdGhpcy5zcGFjZXNoaXBzID0gW107XG5cbiAgICBjb25zdCBzcGFjZXNoaXAxID0gbmV3IFNwYWNlc2hpcDFDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgYm91bmRhcnkpO1xuICAgIHNwYWNlc2hpcDEuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuc3BhY2VzaGlwcy5wdXNoKHNwYWNlc2hpcDEpO1xuXG4gICAgY29uc3Qgc3BhY2VzaGlwMiA9IG5ldyBTcGFjZXNoaXAyQ2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgsIGJvdW5kYXJ5LCB0cnVlKTtcbiAgICBzcGFjZXNoaXAyLmlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLnNwYWNlc2hpcHMucHVzaChzcGFjZXNoaXAyKTtcblxuICAgIHRoaXMuc3BhY2VzaGlwID0gdGhpcy5zcGFjZXNoaXBzWzBdO1xuICAgIHRoaXMuc3BhY2VzaGlwLmlzQW5pbWF0ZU9uY2UgPSB0cnVlO1xuICAgIHRoaXMuc3BhY2VzaGlwLmlzRGVzdHJveWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQW5pbWF0ZSB0aGUgb2JqZWN0IG9uY2VcbiAgICovXG4gIGFuaW1hdGVBc3NldCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQW5pbWF0ZU9uY2UgPSAhdGhpcy5pc0FuaW1hdGVPbmNlO1xuICAgIHRoaXMuc3BhY2VzaGlwLmlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZXF1ZXN0SWQpO1xuICAgIHRoaXMuYW5pbWF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGJvYXJkXG4gICAqL1xuICBwcml2YXRlIGRyYXcoKSB7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5nYW1lU2VydmljZS5hZGRPdXRsaW5lcyh0aGlzLmN0eCwgMSwgMC4xKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlXG4gICAqIEBwYXJhbSBub3cgdGhlIGN1cnJlbnQgdGltZVxuICAgKi9cbiAgcHVibGljIGFuaW1hdGUobm93ID0gMCk6IHZvaWQge1xuICAgIHRoaXMuZHJhdygpO1xuICAgIHRoaXMuc3BhY2VzaGlwLmFuaW1hdGUobm93KTtcbiAgICBpZiAoIXRoaXMuaXNBbmltYXRlT25jZSkge1xuICAgICAgdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRlLmJpbmQodGhpcykgYXMgRnJhbWVSZXF1ZXN0Q2FsbGJhY2spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUga2V5RXZlbnQgZG93biBsaXN0ZW5lclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIEtleWJvYXJkIGV2ZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGtleURvd25FdmVudChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5nYW1lU2VydmljZS5lbWl0TWFzdGVyT2JzZXJ2YWJsZUV2ZW50KHtcbiAgICAgIHR5cGU6IE9ic2VydmFibGVUeXBlRW51bS5rZXlEb3duRXZlbnQsXG4gICAgICBzdHJpbmdEYXRhOiBldmVudC5jb2RlXG4gICAgfSBhcyBPYnNlcnZhYmxlTW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBrZXlFdmVudCB1cGxpc3RlbmVyXG4gICAqIEBwYXJhbSBldmVudCB0aGUgS2V5Ym9hcmQgZXZlbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cCcsIFsnJGV2ZW50J10pXG4gIGtleVVwRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZ2FtZVNlcnZpY2UuZW1pdE1hc3Rlck9ic2VydmFibGVFdmVudCh7XG4gICAgICB0eXBlOiBPYnNlcnZhYmxlVHlwZUVudW0ua2V5VXBFdmVudCxcbiAgICAgIHN0cmluZ0RhdGE6IGV2ZW50LmNvZGVcbiAgICB9IGFzIE9ic2VydmFibGVNb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogdG9nZ2xlQXNzZXRzXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgVGhlIGFzc2V0IHRvIGRpc3BsYXlcbiAgICovXG4gIHRvZ2dsZUFzc2V0cyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3BhY2VzaGlwLmlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLmRyYXcoKTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHRoaXMuc3BhY2VzaGlwcy5tYXAoKHNwYWNlc2hpcDogU3BhY2VzaGlwQ2xhc3MpID0+IHtcbiAgICAgIHNwYWNlc2hpcC5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5hc3NldHMubWFwKChhc3NldDogQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsICRpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBhc3NldC5rZXkpIHtcbiAgICAgICAgaW5kZXggPSAkaW5kZXg7XG4gICAgICAgIHRoaXMuZ2FtZUNvb2tpZVNlcnZpY2Uuc2V0RGVidWdEYXRhKHtcbiAgICAgICAgICBzZWNvbmRhcnlBc3NldE5hbWU6IGtleVxuICAgICAgICB9IGFzIERlYnVnRGF0YU1vZGVsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc3BhY2VzaGlwID0gdGhpcy5zcGFjZXNoaXBzW2luZGV4XTtcbiAgICB0aGlzLmFuaW1hdGVBc3NldCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZ2FtZS1jb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cImFzc2V0LXRpdGxlXCI+U3BhY2VzaGlwPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJnYW1lLWJvYXJkLWNvbnRhaW5lclwiPlxuICAgIDxjYW52YXMgI2JvYXJkIGNsYXNzPVwiZ2FtZS1ib2FyZFwiPjwvY2FudmFzPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJhbmltYXRlQXNzZXQoKVwiIGNsYXNzPVwiYW5pbWF0aW9uLWJ1dHRvbiBidXR0b25cIj5BbmltYXRlPC9idXR0b24+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgYXNzZXQgb2YgYXNzZXRzXCI+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVBc3NldHMoYXNzZXQua2V5KVwiIGNsYXNzPVwiYW5pbWF0aW9uLWJ1dHRvbiBidXR0b25cIj5cbiAgICAgICAge3sgYXNzZXQubmFtZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=