UNPKG

bp-space-invaders

Version:
147 lines 24.1 kB
import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { AssetAlignEnum } from '../asset/enum/asset-align.enum'; import { AssetAlignVerticalEnum } from '../asset/enum/asset-align-vertical.enum'; import { BLOCK_SIZE } from '../gameboard/gameboard-constants'; import * as i0 from "@angular/core"; export class GameService { constructor() { this.masterSubject$ = new Subject(); } valid(asset, boundary) { return asset.shape.every((row, dy) => { return row.every((value, dx) => { const x = asset.x + dx; const y = asset.y + dy; return (this.isEmpty(value) || (this.insideWalls(x, boundary) && this.aboveFloor(y, boundary.floor) && this.belowCeiling(y, boundary.ceiling))); }); }); } isEmpty(value) { return value === 0; } insideWalls(x, boundary) { return x >= boundary.left && x <= boundary.right; } belowCeiling(y, boundaryTop) { return y >= boundaryTop; } aboveFloor(y, boundaryBottom) { return y <= boundaryBottom; } getBoundary(boundarySetup) { return { left: boundarySetup.x, right: boundarySetup.width, ceiling: boundarySetup.y, floor: boundarySetup.height }; } isHit(asset, damageAsset) { if (asset.x <= damageAsset.x && damageAsset.x <= asset.x + asset.shape[0].length && asset.y <= damageAsset.y && damageAsset.y <= asset.y + asset.shape.length) { const startY = damageAsset.y; let maxY = startY + damageAsset.shape.length; if (maxY > asset.y + asset.shape.length) { maxY = asset.y + asset.shape.length; } for (let y = startY; y < maxY; y++) { for (let x = damageAsset.x; x < damageAsset.x + damageAsset.shape[y - damageAsset.y].length; x++) { const assetY = Math.round(Math.abs(y - asset.y)); const assetX = Math.round(Math.abs(x - asset.x)); const damageAssetY = Math.round(Math.abs(y - damageAsset.y)); const damageAssetX = Math.round(Math.abs(x - damageAsset.x)); if (asset.shape[assetY][assetX] > 0 && damageAsset.shape[damageAssetY][damageAssetX] > 0) { return true; } } } } return false; } addOutlines(ctx, offset, width) { ctx.fillStyle = 'grey'; let lastIndex = 0; for (let index = 0; index < ctx.canvas.width; index += offset) { ctx.fillRect(index, 0, width, ctx.canvas.height); lastIndex = index; } ctx.fillRect(lastIndex + 1, 0, width, ctx.canvas.height); for (let index = 0; index < ctx.canvas.height; index += offset) { ctx.fillRect(0, index, ctx.canvas.width, width); lastIndex = index; } ctx.fillRect(0, lastIndex + 1, ctx.canvas.width, width); ctx.fillStyle = 'red'; ctx.fillRect(ctx.canvas.width / (BLOCK_SIZE * 2), 0, width, ctx.canvas.height); ctx.fillRect(0, ctx.canvas.height / (BLOCK_SIZE * 2), ctx.canvas.width, width); } initBoard(canvas, columns, rows, blockSize) { const ctx = canvas.nativeElement.getContext('2d'); this.board = { x: 0, y: 0, height: rows, width: columns }; ctx.canvas.width = columns * blockSize + 1; ctx.canvas.height = rows * blockSize + 1; ctx.scale(blockSize, blockSize); return ctx; } getGameboard() { return this.board; } getMasterObservable() { return this.masterSubject$; } emitMasterObservableEvent(data) { this.masterSubject$.next(data); } positionAsset(asset, alignPosition, justifyPosition) { let x = 0; let y = 0; if (alignPosition === AssetAlignEnum.center) { x = (this.board.width - asset.getAssetWidth()) / 2; } else if (alignPosition === AssetAlignEnum.leftThird) { x = this.board.width / 3 - asset.getAssetWidth() / 2; } else if (alignPosition === AssetAlignEnum.leftFourth) { x = this.board.width / 4 - asset.getAssetWidth() / 2; } else if (alignPosition === AssetAlignEnum.rightThird) { x = (this.board.width * 2) / 3 - asset.getAssetWidth() / 2; } else if (alignPosition === AssetAlignEnum.rightFourth) { x = (this.board.width * 3) / 4 - asset.getAssetWidth() / 2; } else if (alignPosition === AssetAlignEnum.right) { x = this.board.width - asset.getAssetWidth(); } if (justifyPosition === AssetAlignVerticalEnum.bottom) { y = this.board.height - asset.getAssetHeight(); } else if (justifyPosition === AssetAlignVerticalEnum.middle) { y = (this.board.height - asset.getAssetHeight()) / 2; } return { x: Math.round(x), y: Math.round(y) }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: GameService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: GameService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: GameService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FtZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BhY2UtaW52YWRlcnMvc3JjL2xpYi9zZXJ2aWNlL2dhbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXZELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRWpGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFROUQsTUFBTSxPQUFPLFdBQVc7SUFIeEI7UUFPVSxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFtQixDQUFDO0tBeU96RDtJQTdOQyxLQUFLLENBQUMsS0FBYSxFQUFFLFFBQXVCO1FBQzFDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDbkMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO2dCQUM3QixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sQ0FDTCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztvQkFDbkIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUM7d0JBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUMxQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFNRCxPQUFPLENBQUMsS0FBYTtRQUNuQixPQUFPLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQU9PLFdBQVcsQ0FBQyxDQUFTLEVBQUUsUUFBdUI7UUFDcEQsT0FBTyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBT08sWUFBWSxDQUFDLENBQVMsRUFBRSxXQUFtQjtRQUNqRCxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQU9PLFVBQVUsQ0FBQyxDQUFTLEVBQUUsY0FBc0I7UUFDbEQsT0FBTyxDQUFDLElBQUksY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFNTSxXQUFXLENBQUMsYUFBaUM7UUFDbEQsT0FBTztZQUNMLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNyQixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7WUFDMUIsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3hCLEtBQUssRUFBRSxhQUFhLENBQUMsTUFBTTtTQUNYLENBQUM7SUFDckIsQ0FBQztJQU9NLEtBQUssQ0FBQyxLQUFhLEVBQUUsV0FBbUI7UUFDN0MsSUFDRSxLQUFLLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDO1lBQ3hCLFdBQVcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDaEQsS0FBSyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQztZQUN4QixXQUFXLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQzdDO1lBQ0EsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBRyxNQUFNLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDN0MsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDdkMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7YUFDckM7WUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDaEcsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0QsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1B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QUFDLElBQXFCO1FBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFLTSxhQUFhLENBQ2xCLEtBQWlCLEVBQ2pCLGFBQTZCLEVBQzdCLGVBQXVDO1FBRXZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVWLElBQUksYUFBYSxLQUFLLGNBQWMsQ0FBQyxNQUFNLEVBQUU7WUFDM0MsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BEO2FBQU0sSUFBSSxhQUFhLEtBQUssY0FBYyxDQUFDLFNBQVMsRUFBRTtZQUNyRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDdEQ7YUFBTSxJQUFJLGFBQWEsS0FBSyxjQUFjLENBQUMsVUFBVSxFQUFFO1lBQ3RELENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN0RDthQUFNLElBQUksYUFBYSxLQUFLLGNBQWMsQ0FBQyxVQUFVLEVBQUU7WUFDdEQsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDNUQ7YUFBTSxJQUFJLGFBQWEsS0FBSyxjQUFjLENBQUMsV0FBVyxFQUFFO1lBQ3ZELENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzVEO2FBQU0sSUFBSSxhQUFhLEtBQUssY0FBYyxDQUFDLEtBQUssRUFBRTtZQUNqRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzlDO1FBRUQsSUFBSSxlQUFlLEtBQUssc0JBQXNCLENBQUMsTUFBTSxFQUFFO1lBQ3JELENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDaEQ7YUFBTSxJQUFJLGVBQWUsS0FBSyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUU7WUFDNUQsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsT0FBTztZQUNMLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNoQixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDUCxDQUFDO0lBQ2QsQ0FBQzs4R0E1T1UsV0FBVztrSEFBWCxXQUFXLGNBRlYsTUFBTTs7MkZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJQXNzZXQgfSBmcm9tICcuLi9pbnRlcmZhY2UvYXNzZXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9ic2VydmFibGVNb2RlbCB9IGZyb20gJy4uL21vZGVsL29ic2VydmFibGUubW9kZWwnO1xuaW1wb3J0IHsgQm91bmRhcnlNb2RlbCB9IGZyb20gJy4uL21vZGVsL2JvdW5kYXJ5Lm1vZGVsJztcbmltcG9ydCB7IEJvdW5kYXJ5U2V0dXBNb2RlbCB9IGZyb20gJy4uL21vZGVsL2JvdW5kYXJ5LXNldC5tb2RlbCc7XG5pbXBvcnQgeyBCb2FyZE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvYm9hcmQubW9kZWwnO1xuaW1wb3J0IHsgQXNzZXRBbGlnbkVudW0gfSBmcm9tICcuLi9hc3NldC9lbnVtL2Fzc2V0LWFsaWduLmVudW0nO1xuaW1wb3J0IHsgQXNzZXRBbGlnblZlcnRpY2FsRW51bSB9IGZyb20gJy4uL2Fzc2V0L2VudW0vYXNzZXQtYWxpZ24tdmVydGljYWwuZW51bSc7XG5pbXBvcnQgeyBBc3NldENsYXNzIH0gZnJvbSAnLi4vYXNzZXQvYXNzZXQuY2xhc3MnO1xuaW1wb3J0IHsgQkxPQ0tfU0laRSB9IGZyb20gJy4uL2dhbWVib2FyZC9nYW1lYm9hcmQtY29uc3RhbnRzJztcblxuLyoqXG4gKiBUaGUgZ2FtZSBzZXJ2aWNlXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEdhbWVTZXJ2aWNlIHtcbiAgLyoqXG4gICAqICBNYXN0ZXIgT2JzZXJ2YWJsZSBTdWJqZWN0JFxuICAgKi9cbiAgcHJpdmF0ZSBtYXN0ZXJTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PE9ic2VydmFibGVNb2RlbD4oKTtcblxuICAvKipcbiAgICogVGhlIGJvYXJkXG4gICAqL1xuICBwcml2YXRlIGJvYXJkOiBCb2FyZE1vZGVsO1xuXG4gIC8qKlxuICAgKiBWYWxpZCB0aGUgQXNzZXRcbiAgICogQHBhcmFtIGFzc2V0IFRoZSBhc3NldFxuICAgKiBAcGFyYW0gYm91bmRhcnkgVGhlIGJvYXJkIGRpbWVuc2lvbnNcbiAgICovXG4gIHZhbGlkKGFzc2V0OiBJQXNzZXQsIGJvdW5kYXJ5OiBCb3VuZGFyeU1vZGVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFzc2V0LnNoYXBlLmV2ZXJ5KChyb3csIGR5KSA9PiB7XG4gICAgICByZXR1cm4gcm93LmV2ZXJ5KCh2YWx1ZSwgZHgpID0+IHtcbiAgICAgICAgY29uc3QgeCA9IGFzc2V0LnggKyBkeDtcbiAgICAgICAgY29uc3QgeSA9IGFzc2V0LnkgKyBkeTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLmlzRW1wdHkodmFsdWUpIHx8XG4gICAgICAgICAgKHRoaXMuaW5zaWRlV2FsbHMoeCwgYm91bmRhcnkpICYmXG4gICAgICAgICAgICB0aGlzLmFib3ZlRmxvb3IoeSwgYm91bmRhcnkuZmxvb3IpICYmXG4gICAgICAgICAgICB0aGlzLmJlbG93Q2VpbGluZyh5LCBib3VuZGFyeS5jZWlsaW5nKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBzaGFwZSBoYXMgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlIG9mIHRoZSBzaGFwZVxuICAgKi9cbiAgaXNFbXB0eSh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIHRoZSBwaWVjZSB3aXRoaW4gdGhlIGdhbWVib2FyZCB3YWxsc1xuICAgKiBAcGFyYW0geCBUaGUgeCBwb3NpdGlvblxuICAgKiBAcGFyYW0gYm91bmRhcnkgVGhlIGJvdW5kYXJ5IG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBpbnNpZGVXYWxscyh4OiBudW1iZXIsIGJvdW5kYXJ5OiBCb3VuZGFyeU1vZGVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHggPj0gYm91bmRhcnkubGVmdCAmJiB4IDw9IGJvdW5kYXJ5LnJpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIElzIHRoZSBwaWVjZSB3aXRoaW4gdGhlIGdhbWVib2FyZCBmbG9vclxuICAgKiBAcGFyYW0geSBUaGUgeSBwb3NpdGlvblxuICAgKiBAcGFyYW0gYm91bmRhcnlUb3AgVGhlIGJvdW5kYXJ5IHRvcCBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgYmVsb3dDZWlsaW5nKHk6IG51bWJlciwgYm91bmRhcnlUb3A6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB5ID49IGJvdW5kYXJ5VG9wO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIHRoZSBwaWVjZSB3aXRoaW4gdGhlIGdhbWVib2FyZCBmbG9vclxuICAgKiBAcGFyYW0geSBUaGUgeSBwb3NpdGlvblxuICAgKiBAcGFyYW0gYm91bmRhcnlCb3R0b20gVGhlIGJvdW5kYXJ5IGJvdHRvbSBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgYWJvdmVGbG9vcih5OiBudW1iZXIsIGJvdW5kYXJ5Qm90dG9tOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4geSA8PSBib3VuZGFyeUJvdHRvbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgYm91bmRhcnlcbiAgICogQHBhcmFtIGJvdW5kYXJ5U2V0dXAgVGhlIHkgcG9zaXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXRCb3VuZGFyeShib3VuZGFyeVNldHVwOiBCb3VuZGFyeVNldHVwTW9kZWwpOiBCb3VuZGFyeU1vZGVsIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogYm91bmRhcnlTZXR1cC54LFxuICAgICAgcmlnaHQ6IGJvdW5kYXJ5U2V0dXAud2lkdGgsXG4gICAgICBjZWlsaW5nOiBib3VuZGFyeVNldHVwLnksXG4gICAgICBmbG9vcjogYm91bmRhcnlTZXR1cC5oZWlnaHRcbiAgICB9IGFzIEJvdW5kYXJ5TW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIGFuIGFzc2V0IGhhcyBjb2xsaWRlZCB3aXRoIGFub3RoZXIgYXNzZXRcbiAgICogQHBhcmFtIGFzc2V0IFRoZSBhc3NldCByZWNlaXZpbmcgdGhlIGRhbWFnZVxuICAgKiBAcGFyYW0gZGFtYWdlQXNzZXQgVGhlIGFzc2V0IGdpdmluZyB0aGUgZGFtYWdlXG4gICAqL1xuICBwdWJsaWMgaXNIaXQoYXNzZXQ6IElBc3NldCwgZGFtYWdlQXNzZXQ6IElBc3NldCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIGFzc2V0LnggPD0gZGFtYWdlQXNzZXQueCAmJlxuICAgICAgZGFtYWdlQXNzZXQueCA8PSBhc3NldC54ICsgYXNzZXQuc2hhcGVbMF0ubGVuZ3RoICYmXG4gICAgICBhc3NldC55IDw9IGRhbWFnZUFzc2V0LnkgJiZcbiAgICAgIGRhbWFnZUFzc2V0LnkgPD0gYXNzZXQueSArIGFzc2V0LnNoYXBlLmxlbmd0aFxuICAgICkge1xuICAgICAgY29uc3Qgc3RhcnRZID0gZGFtYWdlQXNzZXQueTtcbiAgICAgIGxldCBtYXhZID0gc3RhcnRZICsgZGFtYWdlQXNzZXQuc2hhcGUubGVuZ3RoO1xuICAgICAgaWYgKG1heFkgPiBhc3NldC55ICsgYXNzZXQuc2hhcGUubGVuZ3RoKSB7XG4gICAgICAgIG1heFkgPSBhc3NldC55ICsgYXNzZXQuc2hhcGUubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCB5ID0gc3RhcnRZOyB5IDwgbWF4WTsgeSsrKSB7XG4gICAgICAgIGZvciAobGV0IHggPSBkYW1hZ2VBc3NldC54OyB4IDwgZGFtYWdlQXNzZXQueCArIGRhbWFnZUFzc2V0LnNoYXBlW3kgLSBkYW1hZ2VBc3NldC55XS5sZW5ndGg7IHgrKykge1xuICAgICAgICAgIGNvbnN0IGFzc2V0WSA9IE1hdGgucm91bmQoTWF0aC5hYnMoeSAtIGFzc2V0LnkpKTtcbiAgICAgICAgICBjb25zdCBhc3NldFggPSBNYXRoLnJvdW5kKE1hdGguYWJzKHggLSBhc3NldC54KSk7XG4gICAgICAgICAgY29uc3QgZGFtYWdlQXNzZXRZID0gTWF0aC5yb3VuZChNYXRoLmFicyh5IC0gZGFtYWdlQXNzZXQueSkpO1xuICAgICAgICAgIGNvbnN0IGRhbWFnZUFzc2V0WCA9IE1hdGgucm91bmQoTWF0aC5hYnMoeCAtIGRhbWFnZUFzc2V0LngpKTtcbiAgICAgICAgICBpZiAoYXNzZXQuc2hhcGVbYXNzZXRZXVthc3NldFhdID4gMCAmJiBkYW1hZ2VBc3NldC5zaGFwZVtkYW1hZ2VBc3NldFldW2RhbWFnZUFzc2V0WF0gPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSB0aGUgb3V0bGluZVxuICAgKlxuICAgKiBAcGFyYW0gY3R4IFRoZSBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQgMkRcbiAgICogQHBhcmFtIGNvbHVtbnMgVGhlIG51bWJlciBvZiBDb2x1bW5zXG4gICAqIEBwYXJhbSByb3dzIFRoZSBudW1iZXIgb2Ygcm93c1xuICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZm9yIHRoZSBncmlkXG4gICAqL1xuICBwdWJsaWMgYWRkT3V0bGluZXMoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIG9mZnNldDogbnVtYmVyLCB3aWR0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgY3R4LmZpbGxTdHlsZSA9ICdncmV5JztcblxuICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgIC8vIHZlcnRpY2FsIGxpbmVzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGN0eC5jYW52YXMud2lkdGg7IGluZGV4ICs9IG9mZnNldCkge1xuICAgICAgY3R4LmZpbGxSZWN0KGluZGV4LCAwLCB3aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgICAgbGFzdEluZGV4ID0gaW5kZXg7XG4gICAgfVxuXG4gICAgY3R4LmZpbGxSZWN0KGxhc3RJbmRleCArIDEsIDAsIHdpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7XG5cbiAgICAvLyBob3Jpem9udGFsIGxpbmVzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGN0eC5jYW52YXMuaGVpZ2h0OyBpbmRleCArPSBvZmZzZXQpIHtcbiAgICAgIGN0eC5maWxsUmVjdCgwLCBpbmRleCwgY3R4LmNhbnZhcy53aWR0aCwgd2lkdGgpO1xuICAgICAgbGFzdEluZGV4ID0gaW5kZXg7XG4gICAgfVxuXG4gICAgY3R4LmZpbGxSZWN0KDAsIGxhc3RJbmRleCArIDEsIGN0eC5jYW52YXMud2lkdGgsIHdpZHRoKTtcblxuICAgIGN0eC5maWxsU3R5bGUgPSAncmVkJztcbiAgICBjdHguZmlsbFJlY3QoY3R4LmNhbnZhcy53aWR0aCAvIChCTE9DS19TSVpFICogMiksIDAsIHdpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7XG4gICAgY3R4LmZpbGxSZWN0KDAsIGN0eC5jYW52YXMuaGVpZ2h0IC8gKEJMT0NLX1NJWkUgKiAyKSwgY3R4LmNhbnZhcy53aWR0aCwgd2lkdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJvYXJkXG4gICAqXG4gICAqIEBwYXJhbSBjdHggVGhlIENhbnZhcyBSZW5kZXJpbmcgQ29udGV4dCAyRFxuICAgKiBAcGFyYW0gY2FudmFzIFRoZSBjYW52YXMgZWxlbWVudFxuICAgKiBAcGFyYW0gY29sdW1ucyBUaGUgbnVtYmVyIG9mIENvbHVtbnNcbiAgICogQHBhcmFtIHJvd3MgVGhlIG51bWJlciBvZiByb3dzXG4gICAqIEBwYXJhbSBibG9ja1NpemUgVGhlIGJsb2NrIHNpemVcbiAgICovXG4gIHB1YmxpYyBpbml0Qm9hcmQoXG4gICAgY2FudmFzOiBFbGVtZW50UmVmPEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBjb2x1bW5zOiBudW1iZXIsXG4gICAgcm93czogbnVtYmVyLFxuICAgIGJsb2NrU2l6ZTogbnVtYmVyXG4gICk6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLm5hdGl2ZUVsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgIHRoaXMuYm9hcmQgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIGhlaWdodDogcm93cyxcbiAgICAgIHdpZHRoOiBjb2x1bW5zXG4gICAgfSBhcyBCb2FyZE1vZGVsO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHNpemUgb2YgY2FudmFzIGZyb20gY29uc3RhbnRzLlxuICAgIGN0eC5jYW52YXMud2lkdGggPSBjb2x1bW5zICogYmxvY2tTaXplICsgMTtcbiAgICBjdHguY2FudmFzLmhlaWdodCA9IHJvd3MgKiBibG9ja1NpemUgKyAxO1xuXG4gICAgLy8gU2NhbGUgc28gd2UgZG9uJ3QgbmVlZCB0byBnaXZlIHNpemUgb24gZXZlcnkgZHJhdy5cbiAgICBjdHguc2NhbGUoYmxvY2tTaXplLCBibG9ja1NpemUpO1xuXG4gICAgcmV0dXJuIGN0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGdhbWUgYm9hcmRcbiAgICovXG4gIHB1YmxpYyBnZXRHYW1lYm9hcmQoKTogQm9hcmRNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuYm9hcmQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtYXN0ZXIgb2JzZXJ2YWJsZVxuICAgKi9cbiAgcHVibGljIGdldE1hc3Rlck9ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxPYnNlcnZhYmxlTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5tYXN0ZXJTdWJqZWN0JDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1hc3RlciBvYnNlcnZhYmxlXG4gICAqL1xuICBwdWJsaWMgZW1pdE1hc3Rlck9ic2VydmFibGVFdmVudChkYXRhOiBPYnNlcnZhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLm1hc3RlclN1YmplY3QkLm5leHQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUG9zaXRpb24gdGhlIEFzc2V0XG4gICAqL1xuICBwdWJsaWMgcG9zaXRpb25Bc3NldChcbiAgICBhc3NldDogQXNzZXRDbGFzcyxcbiAgICBhbGlnblBvc2l0aW9uOiBBc3NldEFsaWduRW51bSxcbiAgICBqdXN0aWZ5UG9zaXRpb246IEFzc2V0QWxpZ25WZXJ0aWNhbEVudW1cbiAgKTogSUFzc2V0IHtcbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IHkgPSAwO1xuXG4gICAgaWYgKGFsaWduUG9zaXRpb24gPT09IEFzc2V0QWxpZ25FbnVtLmNlbnRlcikge1xuICAgICAgeCA9ICh0aGlzLmJvYXJkLndpZHRoIC0gYXNzZXQuZ2V0QXNzZXRXaWR0aCgpKSAvIDI7XG4gICAgfSBlbHNlIGlmIChhbGlnblBvc2l0aW9uID09PSBBc3NldEFsaWduRW51bS5sZWZ0VGhpcmQpIHtcbiAgICAgIHggPSB0aGlzLmJvYXJkLndpZHRoIC8gMyAtIGFzc2V0LmdldEFzc2V0V2lkdGgoKSAvIDI7XG4gICAgfSBlbHNlIGlmIChhbGlnblBvc2l0aW9uID09PSBBc3NldEFsaWduRW51bS5sZWZ0Rm91cnRoKSB7XG4gICAgICB4ID0gdGhpcy5ib2FyZC53aWR0aCAvIDQgLSBhc3NldC5nZXRBc3NldFdpZHRoKCkgLyAyO1xuICAgIH0gZWxzZSBpZiAoYWxpZ25Qb3NpdGlvbiA9PT0gQXNzZXRBbGlnbkVudW0ucmlnaHRUaGlyZCkge1xuICAgICAgeCA9ICh0aGlzLmJvYXJkLndpZHRoICogMikgLyAzIC0gYXNzZXQuZ2V0QXNzZXRXaWR0aCgpIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFsaWduUG9zaXRpb24gPT09IEFzc2V0QWxpZ25FbnVtLnJpZ2h0Rm91cnRoKSB7XG4gICAgICB4ID0gKHRoaXMuYm9hcmQud2lkdGggKiAzKSAvIDQgLSBhc3NldC5nZXRBc3NldFdpZHRoKCkgLyAyO1xuICAgIH0gZWxzZSBpZiAoYWxpZ25Qb3NpdGlvbiA9PT0gQXNzZXRBbGlnbkVudW0ucmlnaHQpIHtcbiAgICAgIHggPSB0aGlzLmJvYXJkLndpZHRoIC0gYXNzZXQuZ2V0QXNzZXRXaWR0aCgpO1xuICAgIH1cblxuICAgIGlmIChqdXN0aWZ5UG9zaXRpb24gPT09IEFzc2V0QWxpZ25WZXJ0aWNhbEVudW0uYm90dG9tKSB7XG4gICAgICB5ID0gdGhpcy5ib2FyZC5oZWlnaHQgLSBhc3NldC5nZXRBc3NldEhlaWdodCgpO1xuICAgIH0gZWxzZSBpZiAoanVzdGlmeVBvc2l0aW9uID09PSBBc3NldEFsaWduVmVydGljYWxFbnVtLm1pZGRsZSkge1xuICAgICAgeSA9ICh0aGlzLmJvYXJkLmhlaWdodCAtIGFzc2V0LmdldEFzc2V0SGVpZ2h0KCkpIC8gMjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5yb3VuZCh4KSxcbiAgICAgIHk6IE1hdGgucm91bmQoeSlcbiAgICB9IGFzIElBc3NldDtcbiAgfVxufVxuIl19