bp-space-invaders
Version:
The BP Space Invaders Game
136 lines • 23.9 kB
JavaScript
import { Component, ElementRef, ViewChild } from '@angular/core';
import { GameService } from '../../../service/game.service';
import { AssetAlignVerticalEnum } from '../../../asset/enum/asset-align-vertical.enum';
import { AssetAlignEnum } from '../../../asset/enum/asset-align.enum';
import { Alien1Class } from '../../alien-1/alien-1.class';
import { Alien2Class } from '../../alien-2/alien-2.class';
import { Alien3Class } from '../../alien-3/alien-3.class';
import { Alien4Class } from '../../alien-4/alien-4.class';
import { Alien5Class } from '../../alien-5/alien-5.class';
import { Alien6Class } from '../../alien-6/alien-6.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 AlienComponent {
constructor(gameService, gameCookieService) {
this.gameService = gameService;
this.gameCookieService = gameCookieService;
this.isAnimateOnce = true;
this.assets = [
{
key: 'alien1',
name: 'A-1'
},
{
key: 'alien2',
name: 'A-2'
},
{
key: 'alien3',
name: 'A-3'
},
{
key: 'alien4',
name: 'A-4'
},
{
key: 'alien5',
name: 'A-5'
},
{
key: 'alien6',
name: 'A-6'
}
];
}
ngOnInit() {
const rows = 20;
const columns = 20;
this.ctx = this.gameService.initBoard(this.canvas, rows, columns, 25);
this.addAliens({
x: 0,
y: 0,
height: rows,
width: columns
});
this.toggleAssets(this.gameCookieService.getSecondaryDebugData());
this.animate();
}
addAliens(boundary) {
this.aliens = [];
const alien1 = new Alien1Class(this.gameService, this.ctx, boundary, 1);
alien1.move(alien1.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle));
alien1.isDestroyed = true;
this.aliens.push(alien1);
const alien2 = new Alien2Class(this.gameService, this.ctx, boundary, 1);
alien2.isDestroyed = true;
alien2.move(alien2.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle));
this.aliens.push(alien2);
const alien3 = new Alien3Class(this.gameService, this.ctx, boundary, 1);
alien3.isDestroyed = true;
alien3.move(alien3.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle));
this.aliens.push(alien3);
const alien4 = new Alien4Class(this.gameService, this.ctx, boundary, 1);
alien4.isDestroyed = true;
alien4.move(alien4.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle));
this.aliens.push(alien4);
const alien5 = new Alien5Class(this.gameService, this.ctx, boundary, 1);
alien5.isDestroyed = true;
alien5.move(alien5.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle));
this.aliens.push(alien5);
const alien6 = new Alien6Class(this.gameService, this.ctx, boundary, 1);
alien6.isDestroyed = true;
alien6.move(alien6.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle));
this.aliens.push(alien6);
this.alien = this.aliens[0];
this.alien.isDestroyed = false;
}
animateAsset() {
this.isAnimateOnce = !this.isAnimateOnce;
this.alien.isDestroyed = false;
this.alien.move(this.alien.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle));
cancelAnimationFrame(this.requestId);
this.animate();
}
draw() {
this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
this.gameService.addOutlines(this.ctx, 5, 0.025);
}
animate(now = 0) {
this.draw();
this.alien.animate(now);
if (!this.isAnimateOnce) {
this.requestId = requestAnimationFrame(this.animate.bind(this));
}
}
toggleAssets(key) {
this.alien.isDestroyed = true;
this.draw();
let index = 0;
this.aliens.map((alien) => {
alien.isDestroyed = true;
});
this.assets.map((asset, $index) => {
if (key === asset.key) {
index = $index;
this.gameCookieService.setDebugData({
secondaryAssetName: key
});
}
});
this.alien = this.aliens[index];
this.animateAsset();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: AlienComponent, 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: AlienComponent, selector: "bp-alien", viewQueries: [{ propertyName: "canvas", first: true, predicate: ["board"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"game-container\">\n <div class=\"asset-title\">Alien</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-wrap:wrap;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{flex-wrap:wrap;font-size:16px;margin-top:10px;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: AlienComponent, decorators: [{
type: Component,
args: [{ selector: 'bp-alien', template: "<div class=\"game-container\">\n <div class=\"asset-title\">Alien</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-wrap:wrap;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{flex-wrap:wrap;font-size:16px;margin-top:10px;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 }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpZW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BhY2UtaW52YWRlcnMvc3JjL2xpYi9hbGllbnMvYWxpZW4vdGVzdC1jb21wb25lbnQvYWxpZW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BhY2UtaW52YWRlcnMvc3JjL2xpYi9hbGllbnMvYWxpZW4vdGVzdC1jb21wb25lbnQvYWxpZW4uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN2RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7O0FBV3pFLE1BQU0sT0FBTyxjQUFjO0lBMEN6QixZQUFvQixXQUF3QixFQUFVLGlCQUFvQztRQUF0RSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLHNCQUFpQixHQUFqQixpQkFBaUIs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SSxFQUFFLENBQUM7UUFDWixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUNwQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBOEIsRUFBRSxNQUFjLEVBQUUsRUFBRTtZQUNqRSxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsR0FBRyxFQUFFO2dCQUNyQixLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUNmLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7b0JBQ2xDLGtCQUFrQixFQUFFLEdBQUc7aUJBQ04sQ0FBQyxDQUFDO2FBQ3RCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7OEdBMUxVLGNBQWM7a0dBQWQsY0FBYywrSkN6QjNCLHlmQWNBOzsyRkRXYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFVBQVU7Z0hBU3BCLE1BQU07c0JBREwsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBHYW1lU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvZ2FtZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFzc2V0QWxpZ25WZXJ0aWNhbEVudW0gfSBmcm9tICcuLi8uLi8uLi9hc3NldC9lbnVtL2Fzc2V0LWFsaWduLXZlcnRpY2FsLmVudW0nO1xuaW1wb3J0IHsgQXNzZXRBbGlnbkVudW0gfSBmcm9tICcuLi8uLi8uLi9hc3NldC9lbnVtL2Fzc2V0LWFsaWduLmVudW0nO1xuaW1wb3J0IHsgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9hc3NldC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IEFsaWVuQ2xhc3MgfSBmcm9tICcuLi9hbGllbi5jbGFzcyc7XG5pbXBvcnQgeyBBbGllbjFDbGFzcyB9IGZyb20gJy4uLy4uL2FsaWVuLTEvYWxpZW4tMS5jbGFzcyc7XG5pbXBvcnQgeyBBbGllbjJDbGFzcyB9IGZyb20gJy4uLy4uL2FsaWVuLTIvYWxpZW4tMi5jbGFzcyc7XG5pbXBvcnQgeyBBbGllbjNDbGFzcyB9IGZyb20gJy4uLy4uL2FsaWVuLTMvYWxpZW4tMy5jbGFzcyc7XG5pbXBvcnQgeyBBbGllbjRDbGFzcyB9IGZyb20gJy4uLy4uL2FsaWVuLTQvYWxpZW4tNC5jbGFzcyc7XG5pbXBvcnQgeyBBbGllbjVDbGFzcyB9IGZyb20gJy4uLy4uL2FsaWVuLTUvYWxpZW4tNS5jbGFzcyc7XG5pbXBvcnQgeyBBbGllbjZDbGFzcyB9IGZyb20gJy4uLy4uL2FsaWVuLTYvYWxpZW4tNi5jbGFzcyc7XG5pbXBvcnQgeyBCb3VuZGFyeVNldHVwTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9ib3VuZGFyeS1zZXQubW9kZWwnO1xuaW1wb3J0IHsgR2FtZUNvb2tpZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL2dhbWUtY29va2llLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGVidWdEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9kZWJ1Zy1kYXRhLm1vZGVsJztcblxuLyoqXG4gKiBUaGUgQWxpZW4gQ29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JwLWFsaWVuJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FsaWVuLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWxpZW4uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBBbGllbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBUaGUgY2FudmFzXG4gICAqL1xuICBAVmlld0NoaWxkKCdib2FyZCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNhbnZhczogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XG5cbiAgLyoqXG4gICAqIENUU1xuICAgKi9cbiAgcHJpdmF0ZSBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblxuICAvKipcbiAgICogcmVxdWVzdCBJZFxuICAgKi9cbiAgcHJpdmF0ZSByZXF1ZXN0SWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogcmVxdWVzdFxuICAgKi9cbiAgcHJpdmF0ZSBpc0FuaW1hdGVPbmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBhbGllbnNcbiAgICovXG4gIHByaXZhdGUgYWxpZW5zOiBBbGllbkNsYXNzW107XG5cbiAgLyoqXG4gICAqIFRoZSBhbGllblxuICAgKi9cbiAgcHJpdmF0ZSBhbGllbjogQWxpZW5DbGFzcztcblxuICAvKipcbiAgICogRGVidWcgQXNzZXRzXG4gICAqL1xuICBwdWJsaWMgYXNzZXRzOiBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIGdhbWVTZXJ2aWNlIFRoZSBHYW1lU2VydmljZSBmcm9tIERJXG4gICAqIEBwYXJhbSBnYW1lQ29va2llIFRoZSBHYW1lIENvb2tpZSBTZXJ2aWNlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdhbWVTZXJ2aWNlOiBHYW1lU2VydmljZSwgcHJpdmF0ZSBnYW1lQ29va2llU2VydmljZTogR2FtZUNvb2tpZVNlcnZpY2UpIHtcbiAgICB0aGlzLmlzQW5pbWF0ZU9uY2UgPSB0cnVlO1xuICAgIHRoaXMuYXNzZXRzID0gW1xuICAgICAge1xuICAgICAgICBrZXk6ICdhbGllbjEnLFxuICAgICAgICBuYW1lOiAnQS0xJ1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnYWxpZW4yJyxcbiAgICAgICAgbmFtZTogJ0EtMidcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2FsaWVuMycsXG4gICAgICAgIG5hbWU6ICdBLTMnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLFxuICAgICAge1xuICAgICAgICBrZXk6ICdhbGllbjQnLFxuICAgICAgICBuYW1lOiAnQS00J1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnYWxpZW41JyxcbiAgICAgICAgbmFtZTogJ0EtNSdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2FsaWVuNicsXG4gICAgICAgIG5hbWU6ICdBLTYnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBJbml0XG4gICAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCByb3dzID0gMjA7XG4gICAgY29uc3QgY29sdW1ucyA9IDIwO1xuICAgIHRoaXMuY3R4ID0gdGhpcy5nYW1lU2VydmljZS5pbml0Qm9hcmQodGhpcy5jYW52YXMsIHJvd3MsIGNvbHVtbnMsIDI1KTtcblxuICAgIHRoaXMuYWRkQWxpZW5zKHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgaGVpZ2h0OiByb3dzLFxuICAgICAgd2lkdGg6IGNvbHVtbnNcbiAgICB9IGFzIEJvdW5kYXJ5U2V0dXBNb2RlbCk7XG5cbiAgICB0aGlzLnRvZ2dsZUFzc2V0cyh0aGlzLmdhbWVDb29raWVTZXJ2aWNlLmdldFNlY29uZGFyeURlYnVnRGF0YSgpKTtcblxuICAgIHRoaXMuYW5pbWF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgYWxpZW5zXG4gICAqL1xuICBwcml2YXRlIGFkZEFsaWVucyhib3VuZGFyeTogQm91bmRhcnlTZXR1cE1vZGVsKTogdm9pZCB7XG4gICAgdGhpcy5hbGllbnMgPSBbXTtcblxuICAgIGNvbnN0IGFsaWVuMSA9IG5ldyBBbGllbjFDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgYm91bmRhcnksIDEpO1xuICAgIGFsaWVuMS5tb3ZlKGFsaWVuMS5wb3NpdGlvbkFzc2V0KEFzc2V0QWxpZ25FbnVtLmNlbnRlciwgQXNzZXRBbGlnblZlcnRpY2FsRW51bS5taWRkbGUpKTtcbiAgICBhbGllbjEuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuYWxpZW5zLnB1c2goYWxpZW4xKTtcblxuICAgIGNvbnN0IGFsaWVuMiA9IG5ldyBBbGllbjJDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgYm91bmRhcnksIDEpO1xuICAgIGFsaWVuMi5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgYWxpZW4yLm1vdmUoYWxpZW4yLnBvc2l0aW9uQXNzZXQoQXNzZXRBbGlnbkVudW0uY2VudGVyLCBBc3NldEFsaWduVmVydGljYWxFbnVtLm1pZGRsZSkpO1xuICAgIHRoaXMuYWxpZW5zLnB1c2goYWxpZW4yKTtcblxuICAgIGNvbnN0IGFsaWVuMyA9IG5ldyBBbGllbjNDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgYm91bmRhcnksIDEpO1xuICAgIGFsaWVuMy5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgYWxpZW4zLm1vdmUoYWxpZW4zLnBvc2l0aW9uQXNzZXQoQXNzZXRBbGlnbkVudW0uY2VudGVyLCBBc3NldEFsaWduVmVydGljYWxFbnVtLm1pZGRsZSkpO1xuICAgIHRoaXMuYWxpZW5zLnB1c2goYWxpZW4zKTtcblxuICAgIGNvbnN0IGFsaWVuNCA9IG5ldyBBbGllbjRDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgYm91bmRhcnksIDEpO1xuICAgIGFsaWVuNC5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgYWxpZW40Lm1vdmUoYWxpZW40LnBvc2l0aW9uQXNzZXQoQXNzZXRBbGlnbkVudW0uY2VudGVyLCBBc3NldEFsaWduVmVydGljYWxFbnVtLm1pZGRsZSkpO1xuICAgIHRoaXMuYWxpZW5zLnB1c2goYWxpZW40KTtcblxuICAgIGNvbnN0IGFsaWVuNSA9IG5ldyBBbGllbjVDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgYm91bmRhcnksIDEpO1xuICAgIGFsaWVuNS5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgYWxpZW41Lm1vdmUoYWxpZW41LnBvc2l0aW9uQXNzZXQoQXNzZXRBbGlnbkVudW0uY2VudGVyLCBBc3NldEFsaWduVmVydGljYWxFbnVtLm1pZGRsZSkpO1xuICAgIHRoaXMuYWxpZW5zLnB1c2goYWxpZW41KTtcblxuICAgIGNvbnN0IGFsaWVuNiA9IG5ldyBBbGllbjZDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgYm91bmRhcnksIDEpO1xuICAgIGFsaWVuNi5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgYWxpZW42Lm1vdmUoYWxpZW42LnBvc2l0aW9uQXNzZXQoQXNzZXRBbGlnbkVudW0uY2VudGVyLCBBc3NldEFsaWduVmVydGljYWxFbnVtLm1pZGRsZSkpO1xuICAgIHRoaXMuYWxpZW5zLnB1c2goYWxpZW42KTtcblxuICAgIHRoaXMuYWxpZW4gPSB0aGlzLmFsaWVuc1swXTtcbiAgICB0aGlzLmFsaWVuLmlzRGVzdHJveWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQW5pbWF0ZSB0aGUgb2JqZWN0IG9uY2VcbiAgICovXG4gIGFuaW1hdGVBc3NldCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQW5pbWF0ZU9uY2UgPSAhdGhpcy5pc0FuaW1hdGVPbmNlO1xuICAgIHRoaXMuYWxpZW4uaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmFsaWVuLm1vdmUodGhpcy5hbGllbi5wb3NpdGlvbkFzc2V0KEFzc2V0QWxpZ25FbnVtLmNlbnRlciwgQXNzZXRBbGlnblZlcnRpY2FsRW51bS5taWRkbGUpKTtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJlcXVlc3RJZCk7XG4gICAgdGhpcy5hbmltYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgYm9hcmRcbiAgICovXG4gIHByaXZhdGUgZHJhdygpIHtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLmdhbWVTZXJ2aWNlLmFkZE91dGxpbmVzKHRoaXMuY3R4LCA1LCAwLjAyNSk7XG4gIH1cblxuICAvKipcbiAgICogQW5pbWF0ZVxuICAgKiBAcGFyYW0gbm93IHRoZSBjdXJyZW50IHRpbWVcbiAgICovXG4gIHB1YmxpYyBhbmltYXRlKG5vdyA9IDApOiB2b2lkIHtcbiAgICB0aGlzLmRyYXcoKTtcbiAgICB0aGlzLmFsaWVuLmFuaW1hdGUobm93KTtcbiAgICBpZiAoIXRoaXMuaXNBbmltYXRlT25jZSkge1xuICAgICAgdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRlLmJpbmQodGhpcykgYXMgRnJhbWVSZXF1ZXN0Q2FsbGJhY2spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b2dnbGVBc3NldHNcbiAgICpcbiAgICogQHBhcmFtIGtleSBUaGUgYXNzZXQgdG8gZGlzcGxheVxuICAgKi9cbiAgdG9nZ2xlQXNzZXRzKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5hbGllbi5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5kcmF3KCk7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICB0aGlzLmFsaWVucy5tYXAoKGFsaWVuOiBBbGllbkNsYXNzKSA9PiB7XG4gICAgICBhbGllbi5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5hc3NldHMubWFwKChhc3NldDogQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsICRpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBhc3NldC5rZXkpIHtcbiAgICAgICAgaW5kZXggPSAkaW5kZXg7XG4gICAgICAgIHRoaXMuZ2FtZUNvb2tpZVNlcnZpY2Uuc2V0RGVidWdEYXRhKHtcbiAgICAgICAgICBzZWNvbmRhcnlBc3NldE5hbWU6IGtleVxuICAgICAgICB9IGFzIERlYnVnRGF0YU1vZGVsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYWxpZW4gPSB0aGlzLmFsaWVuc1tpbmRleF07XG4gICAgdGhpcy5hbmltYXRlQXNzZXQoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImdhbWUtY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJhc3NldC10aXRsZVwiPkFsaWVuPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJnYW1lLWJvYXJkLWNvbnRhaW5lclwiPlxuICAgIDxjYW52YXMgI2JvYXJkIGNsYXNzPVwiZ2FtZS1ib2FyZFwiPjwvY2FudmFzPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJhbmltYXRlQXNzZXQoKVwiIGNsYXNzPVwiYW5pbWF0aW9uLWJ1dHRvbiBidXR0b25cIj5BbmltYXRlPC9idXR0b24+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgYXNzZXQgb2YgYXNzZXRzXCI+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVBc3NldHMoYXNzZXQua2V5KVwiIGNsYXNzPVwiYW5pbWF0aW9uLWJ1dHRvbiBidXR0b25cIj5cbiAgICAgICAge3sgYXNzZXQubmFtZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=