UNPKG

bp-prism-game

Version:
129 lines 17.6 kB
import { Component, ViewChild, HostListener } from '@angular/core'; import { MainGunnerClass } from '../main-gunner/main-gunner.class'; import { ObservableTypeEnum } from '../../enum/observable-type.enum'; import { ROWS, COLS } from '../main-gunner/main-gunner-constants'; import { BLOCK_SIZE } from '../../gameboard/gameboard-constants'; import * as i0 from "@angular/core"; import * as i1 from "../../service/game.service"; import * as i2 from "@angular/common"; /** * The Main Gunner Component */ export class MainGunnerComponent { /** * The Constructor * @param gameService The GameService from DI */ constructor(gameService) { this.gameService = gameService; this.assets = [ { key: 'mainGunner', name: 'M-1' } ]; } /** * On Init */ ngOnInit() { this.gameBoard = Array.from({ length: ROWS }, () => Array(COLS).fill(0)); this.gameBoard[2][2] = 8; this.ctx = this.gameService.initBoard(this.canvas, ROWS, COLS, BLOCK_SIZE * 5, this.gameBoard); this.addGunners(); this.animate(); this.gunner.animate(); } /** * Add the gunners */ addGunners() { this.gunners = []; const gunner1 = new MainGunnerClass(this.gameService, this.ctx, 1); this.gunners.push(gunner1); this.gunner = this.gunners[0]; this.gunner.move(); } /** * Animate the object once */ animateAsset() { this.gunner.isDestroyed = false; cancelAnimationFrame(this.requestId); this.animate(); } /** * Draw the board */ draw() { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); this.gameService.addOutlines(this.ctx, 1, 0.1); } /** * Animate * @param now the current time */ animate(now = 0) { this.draw(); this.gunner.animate(now); this.requestId = requestAnimationFrame(this.animate.bind(this)); } /** * The keyEvent down listener * @param event the Keyboard event */ keyDownEvent(event) { event.preventDefault(); this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.keyDownEvent, stringData: event.code }); } /** * The keyEvent up listener * @param event the Keyboard event */ keyUpEvent(event) { event.preventDefault(); this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.keyUpEvent, stringData: event.code }); } /** * toggleAssets * * @param key The asset to display */ toggleAssets(key) { this.gunner.isDestroyed = true; this.draw(); let index = 0; this.gunners.map((gunner) => { gunner.isDestroyed = true; }); this.assets.map((asset, $index) => { if (key === asset.key) { index = $index; } }); this.gunner = this.gunners[index]; this.animateAsset(); } } MainGunnerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: MainGunnerComponent, deps: [{ token: i1.GameService }], target: i0.ɵɵFactoryTarget.Component }); MainGunnerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: MainGunnerComponent, selector: "bp-prism-main-gunner", 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\">Main Gunner</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-bottom: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"], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: MainGunnerComponent, decorators: [{ type: Component, args: [{ selector: 'bp-prism-main-gunner', template: "<div class=\"game-container\">\n <div class=\"asset-title\">Main Gunner</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-bottom: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: function () { return [{ type: i1.GameService }]; }, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi1ndW5uZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpc20vc3JjL2xpYi9ndW5uZXIvdGVzdC1jb21wb25lbnQvbWFpbi1ndW5uZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpc20vc3JjL2xpYi9ndW5uZXIvdGVzdC1jb21wb25lbnQvbWFpbi1ndW5uZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd2RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7QUFFakU7O0dBRUc7QUFNSCxNQUFNLE9BQU8sbUJBQW1CO0lBb0M5Qjs7O09BR0c7SUFDSCxZQUFvQixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1o7Z0JBQ0UsR0FBRyxFQUFFLFlBQVk7Z0JBQ2pCLElBQUksRUFBRSxLQUFLO2FBQ2U7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWEsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FB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QUFDLENBQUMsTUFBdUIsRUFBRSxFQUFFO1lBQzNDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUE4QixFQUFFLE1BQWMsRUFBRSxFQUFFO1lBQ2pFLElBQUksR0FBRyxLQUFLLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ3JCLEtBQUssR0FBRyxNQUFNLENBQUM7YUFDaEI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQzs7Z0hBckpVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLG9SQ2xCaEMsK2ZBY0E7MkZESWEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLHNCQUFzQjtrR0FTaEMsTUFBTTtzQkFETCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBd0dwQyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBYzFDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdhbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9nYW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hc3NldC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IE1haW5HdW5uZXJDbGFzcyB9IGZyb20gJy4uL21haW4tZ3VubmVyL21haW4tZ3VubmVyLmNsYXNzJztcbmltcG9ydCB7IEd1bm5lckNsYXNzIH0gZnJvbSAnLi4vZ3VubmVyLmNsYXNzJztcbmltcG9ydCB7IE9ic2VydmFibGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL29ic2VydmFibGUubW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZVR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZW51bS9vYnNlcnZhYmxlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBST1dTLCBDT0xTIH0gZnJvbSAnLi4vbWFpbi1ndW5uZXIvbWFpbi1ndW5uZXItY29uc3RhbnRzJztcbmltcG9ydCB7IEJMT0NLX1NJWkUgfSBmcm9tICcuLi8uLi9nYW1lYm9hcmQvZ2FtZWJvYXJkLWNvbnN0YW50cyc7XG5cbi8qKlxuICogVGhlIE1haW4gR3VubmVyIENvbXBvbmVudFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicC1wcmlzbS1tYWluLWd1bm5lcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYWluLWd1bm5lci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21haW4tZ3VubmVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTWFpbkd1bm5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBUaGUgY2FudmFzXG4gICAqL1xuICBAVmlld0NoaWxkKCdib2FyZCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNhbnZhczogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XG5cbiAgLyoqXG4gICAqIENUU1xuICAgKi9cbiAgcHJpdmF0ZSBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblxuICAvKipcbiAgICogcmVxdWVzdCBJZFxuICAgKi9cbiAgcHJpdmF0ZSByZXF1ZXN0SWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQmFzZXNcbiAgICovXG4gIHByaXZhdGUgZ3VubmVyczogR3VubmVyQ2xhc3NbXTtcblxuICAvKipcbiAgICogVGhlIEJhc2VcbiAgICovXG4gIHByaXZhdGUgZ3VubmVyOiBHdW5uZXJDbGFzcztcblxuICAvKipcbiAgICogRGVidWcgQXNzZXRzXG4gICAqL1xuICBwdWJsaWMgYXNzZXRzOiBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbFtdO1xuICAvKipcbiAgICogR2FtZWJvYXJkXG4gICAqL1xuICBwcml2YXRlIGdhbWVCb2FyZDogbnVtYmVyW11bXTtcblxuICAvKipcbiAgICogVGhlIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBnYW1lU2VydmljZSBUaGUgR2FtZVNlcnZpY2UgZnJvbSBESVxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnYW1lU2VydmljZTogR2FtZVNlcnZpY2UpIHtcbiAgICB0aGlzLmFzc2V0cyA9IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiAnbWFpbkd1bm5lcicsXG4gICAgICAgIG5hbWU6ICdNLTEnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBJbml0XG4gICAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmdhbWVCb2FyZCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IFJPV1MgfSwgKCkgPT4gQXJyYXkoQ09MUykuZmlsbCgwKSBhcyBudW1iZXJbXSk7XG4gICAgdGhpcy5nYW1lQm9hcmRbMl1bMl0gPSA4O1xuXG4gICAgdGhpcy5jdHggPSB0aGlzLmdhbWVTZXJ2aWNlLmluaXRCb2FyZCh0aGlzLmNhbnZhcywgUk9XUywgQ09MUywgQkxPQ0tfU0laRSAqIDUsIHRoaXMuZ2FtZUJvYXJkKTtcblxuICAgIHRoaXMuYWRkR3VubmVycygpO1xuICAgIHRoaXMuYW5pbWF0ZSgpO1xuICAgIHRoaXMuZ3VubmVyLmFuaW1hdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGd1bm5lcnNcbiAgICovXG4gIHByaXZhdGUgYWRkR3VubmVycygpOiB2b2lkIHtcbiAgICB0aGlzLmd1bm5lcnMgPSBbXTtcblxuICAgIGNvbnN0IGd1bm5lcjEgPSBuZXcgTWFpbkd1bm5lckNsYXNzKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4LCAxKTtcbiAgICB0aGlzLmd1bm5lcnMucHVzaChndW5uZXIxKTtcblxuICAgIHRoaXMuZ3VubmVyID0gdGhpcy5ndW5uZXJzWzBdO1xuICAgIHRoaXMuZ3VubmVyLm1vdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBvYmplY3Qgb25jZVxuICAgKi9cbiAgYW5pbWF0ZUFzc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZ3VubmVyLmlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZXF1ZXN0SWQpO1xuICAgIHRoaXMuYW5pbWF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGJvYXJkXG4gICAqL1xuICBwcml2YXRlIGRyYXcoKSB7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5nYW1lU2VydmljZS5hZGRPdXRsaW5lcyh0aGlzLmN0eCwgMSwgMC4xKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlXG4gICAqIEBwYXJhbSBub3cgdGhlIGN1cnJlbnQgdGltZVxuICAgKi9cbiAgcHVibGljIGFuaW1hdGUobm93ID0gMCk6IHZvaWQge1xuICAgIHRoaXMuZHJhdygpO1xuICAgIHRoaXMuZ3VubmVyLmFuaW1hdGUobm93KTtcbiAgICB0aGlzLnJlcXVlc3RJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUuYmluZCh0aGlzKSBhcyBGcmFtZVJlcXVlc3RDYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleUV2ZW50IGRvd24gbGlzdGVuZXJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBLZXlib2FyZCBldmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxuICBrZXlEb3duRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZ2FtZVNlcnZpY2UuZW1pdE1hc3Rlck9ic2VydmFibGVFdmVudCh7XG4gICAgICB0eXBlOiBPYnNlcnZhYmxlVHlwZUVudW0ua2V5RG93bkV2ZW50LFxuICAgICAgc3RyaW5nRGF0YTogZXZlbnQuY29kZVxuICAgIH0gYXMgT2JzZXJ2YWJsZU1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUga2V5RXZlbnQgdXAgbGlzdGVuZXJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBLZXlib2FyZCBldmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwJywgWyckZXZlbnQnXSlcbiAga2V5VXBFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5nYW1lU2VydmljZS5lbWl0TWFzdGVyT2JzZXJ2YWJsZUV2ZW50KHtcbiAgICAgIHR5cGU6IE9ic2VydmFibGVUeXBlRW51bS5rZXlVcEV2ZW50LFxuICAgICAgc3RyaW5nRGF0YTogZXZlbnQuY29kZVxuICAgIH0gYXMgT2JzZXJ2YWJsZU1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b2dnbGVBc3NldHNcbiAgICpcbiAgICogQHBhcmFtIGtleSBUaGUgYXNzZXQgdG8gZGlzcGxheVxuICAgKi9cbiAgdG9nZ2xlQXNzZXRzKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5ndW5uZXIuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuZHJhdygpO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgdGhpcy5ndW5uZXJzLm1hcCgoZ3VubmVyOiBNYWluR3VubmVyQ2xhc3MpID0+IHtcbiAgICAgIGd1bm5lci5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5hc3NldHMubWFwKChhc3NldDogQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsICRpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBhc3NldC5rZXkpIHtcbiAgICAgICAgaW5kZXggPSAkaW5kZXg7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmd1bm5lciA9IHRoaXMuZ3VubmVyc1tpbmRleF07XG4gICAgdGhpcy5hbmltYXRlQXNzZXQoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImdhbWUtY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJhc3NldC10aXRsZVwiPk1haW4gR3VubmVyPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJnYW1lLWJvYXJkLWNvbnRhaW5lclwiPlxuICAgIDxjYW52YXMgI2JvYXJkIGNsYXNzPVwiZ2FtZS1ib2FyZFwiPjwvY2FudmFzPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJhbmltYXRlQXNzZXQoKVwiIGNsYXNzPVwiYW5pbWF0aW9uLWJ1dHRvbiBidXR0b25cIj5BbmltYXRlPC9idXR0b24+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgYXNzZXQgb2YgYXNzZXRzXCI+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVBc3NldHMoYXNzZXQua2V5KVwiIGNsYXNzPVwiYW5pbWF0aW9uLWJ1dHRvbiBidXR0b25cIj5cbiAgICAgICAge3sgYXNzZXQubmFtZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=