Files
Tessellate/public/js/main.js
2016-02-17 10:32:14 -05:00

788 lines
61 KiB
JavaScript

(function(e, a) { for(var i in a) e[i] = a[i]; }(this, /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _tessellate = __webpack_require__(1);
var _tessellate2 = _interopRequireDefault(_tessellate);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var tessellate = new _tessellate2.default({
element: '#container'
});
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _utils = __webpack_require__(2);
var _onTap = __webpack_require__(3);
var _onTap2 = _interopRequireDefault(_onTap);
var _point = __webpack_require__(4);
var _point2 = _interopRequireDefault(_point);
var _sketch = __webpack_require__(5);
var _sketch2 = _interopRequireDefault(_sketch);
var _tileCircle = __webpack_require__(6);
var _tileCircle2 = _interopRequireDefault(_tileCircle);
var _tileDiamond = __webpack_require__(8);
var _tileDiamond2 = _interopRequireDefault(_tileDiamond);
var _tileHex = __webpack_require__(9);
var _tileHex2 = _interopRequireDefault(_tileHex);
var _tileSquare = __webpack_require__(10);
var _tileSquare2 = _interopRequireDefault(_tileSquare);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Tessellate = function () {
function Tessellate(settings) {
var _this = this;
_classCallCheck(this, Tessellate);
['draw'].map(function (method) {
_this[method] = _this[method].bind(_this);
});
this.element = document.querySelector(settings.element);
this.sketch = new _sketch2.default({
element: this.element,
draw: this.draw
});
this.map = [];
this.onTap = new _onTap2.default({
element: this.element,
click: function click(event) {
var x = event.pageX;
var y = event.pageY;
var tiles = ['circle', 'diamond', 'hex', 'square'];
var styles = ['filled', 'outline'];
var scale = (0, _utils.random)(10, 50);
_this.map.push({
tile: tiles[(0, _utils.random)(tiles.length - 1)],
style: styles[(0, _utils.random)(styles.length - 1)],
x: x,
y: y,
scale: scale,
pointy: (0, _utils.random)(1) ? true : false,
color: 'rgba(' + (0, _utils.random)(255) + ', ' + (0, _utils.random)(255) + ', ' + (0, _utils.random)(255) + ', 0.5)'
});
}
});
this.circle = new _tileCircle2.default({ context: this.sketch.getContext() });
this.diamond = new _tileDiamond2.default({ context: this.sketch.getContext() });
this.hex = new _tileHex2.default({ context: this.sketch.getContext() });
this.square = new _tileSquare2.default({ context: this.sketch.getContext() });
}
_createClass(Tessellate, [{
key: 'draw',
value: function draw(context, now, lastTime) {
var _this2 = this;
var canvas = context.canvas;
var width = canvas.width;
var height = canvas.height;
context.clearRect(0, 0, width, height);
this.map.forEach(function (cell) {
return _this2[cell.tile][cell.style](cell);
});
}
}]);
return Tessellate;
}();
exports.default = Tessellate;
/***/ },
/* 2 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.throttleEvent = throttleEvent;
exports.clone = clone;
exports.extend = extend;
exports.hypotenuse = hypotenuse;
exports.random = random;
function throttleEvent(type, name, obj) {
obj = obj || window;
var running = false;
var throttle = function throttle() {
if (!running) {
running = true;
requestAnimationFrame(function () {
obj.dispatchEvent(new CustomEvent(name));
running = false;
});
}
};
obj.addEventListener(type, throttle);
}
throttleEvent('resize', 'optimizedResize');
function clone(obj) {
return JSON.parse(JSON.stringify(obj));
}
function extend(obj, src) {
for (var key in src) {
if (src.hasOwnProperty(key)) obj[key] = src[key];
}
return obj;
}
function hypotenuse(a, b) {
if (b == null) b = a;
return Math.sqrt(a * a + b * b);
}
function random(min, max) {
if (max == null) {
max = min;
min = 0;
}
return min + Math.floor(Math.random() * (max - min + 1));
}
/***/ },
/* 3 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var OnTap = function () {
function OnTap(settings) {
var _this = this;
_classCallCheck(this, OnTap);
this.element = settings.element || document.body;
this.callbacks = {};
this.events = ['click'];
this.events.map(function (method) {
_this[method] = _this[method].bind(_this);
if (typeof settings[method] === 'function') {
_this.element.addEventListener(method, _this[method]);
_this.callbacks[method] = settings[method];
}
});
}
_createClass(OnTap, [{
key: 'click',
value: function click(event) {
this.callbacks.click(event);
}
}]);
return OnTap;
}();
exports.default = OnTap;
/***/ },
/* 4 */
/***/ function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Point = function () {
function Point(newX, newY) {
_classCallCheck(this, Point);
this.x = newX;
this.y = newY;
}
_createClass(Point, [{
key: "getX",
value: function getX() {
return this.x;
}
}, {
key: "getY",
value: function getY() {
return this.y;
}
}, {
key: "setX",
value: function setX(newX) {
this.x = newX;
}
}, {
key: "setY",
value: function setY(newY) {
this.y = newY;
}
}, {
key: "getPoint",
value: function getPoint() {
return { x: this.x, y: this.y };
}
}]);
return Point;
}();
exports.default = Point;
;
/***/ },
/* 5 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
//import {throttleEvent} from './utils.js';
var Sketch = function () {
function Sketch(settings) {
var _this = this;
_classCallCheck(this, Sketch);
this.lastTime = null;
['getContext', 'onResize', 'render'].map(function (method) {
return _this[method] = _this[method].bind(_this);
});
this.draw = settings.draw || function () {}; // () => {};
this.container = settings.element || document.body;
window.addEventListener('optimizedResize', this.onResize);
window.addEventListener('resize', function () {
return console.log('*** resize ***');
});
this.canvas = document.createElement('canvas');
this.canvas.width = this.container.offsetWidth;
this.canvas.height = this.container.offsetHeight;
this.context = this.canvas.getContext('2d');
this.container.appendChild(this.canvas);
requestAnimationFrame(this.render);
}
_createClass(Sketch, [{
key: 'getContext',
value: function getContext() {
return this.context;
}
}, {
key: 'onResize',
value: function onResize(event) {
console.log('sketch - onResize', arguments);
}
}, {
key: 'render',
value: function render(now) {
this.draw(this.context, now, this.lastTime);
this.lastTime = now;
requestAnimationFrame(this.render);
}
}]);
return Sketch;
}();
exports.default = Sketch;
/***/ },
/* 6 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _tile = __webpack_require__(7);
var _tile2 = _interopRequireDefault(_tile);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var RGBA_DEFAULT = 'rgba(0, 0, 0, 0.5)';
var TileCircle = function (_Tile) {
_inherits(TileCircle, _Tile);
function TileCircle(settings) {
_classCallCheck(this, TileCircle);
return _possibleConstructorReturn(this, Object.getPrototypeOf(TileCircle).call(this, settings));
}
_createClass(TileCircle, [{
key: 'filled',
value: function filled(settings) {
this.context.beginPath();
this.context.arc(settings.x, settings.y, settings.scale, 0, 2 * Math.PI, false);
this.context.fillStyle = settings.color || RGBA_DEFAULT;
this.context.fill();
}
}, {
key: 'outline',
value: function outline(settings) {
this.context.beginPath();
this.context.arc(settings.x, settings.y, settings.scale, 0, 2 * Math.PI, false);
this.context.lineWidth = settings.width ? settings.width : 1;
this.context.strokeStyle = settings.color || RGBA_DEFAULT;
this.context.stroke();
}
}]);
return TileCircle;
}(_tile2.default);
exports.default = TileCircle;
/***/ },
/* 7 */
/***/ function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Tile = function () {
function Tile(settings) {
_classCallCheck(this, Tile);
this.context = settings.context || null;
}
_createClass(Tile, [{
key: "setContext",
value: function setContext(newContext) {
this.context = newContext || this.context;
}
}]);
return Tile;
}();
exports.default = Tile;
/***/ },
/* 8 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _tile = __webpack_require__(7);
var _tile2 = _interopRequireDefault(_tile);
var _utils = __webpack_require__(2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var RGBA_DEFAULT = 'rgba(0, 0, 0, 0.5)';
var TileDiamond = function (_Tile) {
_inherits(TileDiamond, _Tile);
function TileDiamond(settings) {
_classCallCheck(this, TileDiamond);
return _possibleConstructorReturn(this, Object.getPrototypeOf(TileDiamond).call(this, settings));
}
_createClass(TileDiamond, [{
key: 'filled',
value: function filled(settings) {
var x = settings.x;
var y = settings.y;
var scale = settings.scale;
this.context.beginPath();
this.context.moveTo(x + (0, _utils.hypotenuse)(scale), y);
this.context.lineTo(x, y - (0, _utils.hypotenuse)(scale));
this.context.lineTo(x - (0, _utils.hypotenuse)(scale), y);
this.context.lineTo(x, y + (0, _utils.hypotenuse)(scale));
this.context.fillStyle = settings.color || RGBA_DEFAULT;
this.context.fill();
}
}, {
key: 'outline',
value: function outline(settings) {
var x = settings.x;
var y = settings.y;
var scale = settings.scale;
this.context.beginPath();
this.context.moveTo(x + (0, _utils.hypotenuse)(scale), y);
this.context.lineTo(x, y - (0, _utils.hypotenuse)(scale));
this.context.lineTo(x - (0, _utils.hypotenuse)(scale), y);
this.context.lineTo(x, y + (0, _utils.hypotenuse)(scale));
this.context.closePath();
this.context.lineWidth = settings.width ? settings.width : 1;
this.context.strokeStyle = settings.color || RGBA_DEFAULT;
this.context.stroke();
}
}]);
return TileDiamond;
}(_tile2.default);
exports.default = TileDiamond;
/***/ },
/* 9 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _tile = __webpack_require__(7);
var _tile2 = _interopRequireDefault(_tile);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var RGBA_DEFAULT = 'rgba(0, 0, 0, 0.5)';
var TileHex = function (_Tile) {
_inherits(TileHex, _Tile);
function TileHex(settings) {
_classCallCheck(this, TileHex);
var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(TileHex).call(this, settings));
_this.sqrt3 = Math.sqrt(3);
_this.hexSides = 6;
_this.pointyTopCornerX = [];
_this.pointyTopCornerY = [];
_this.flatTopCornerX = [];
_this.flatTopCornerY = [];
// dice dots, 0,0 is center
// TODO: if pointy: [0].concat(flatTop), if flat: [0].concat(pointy)
// this.hexDotX = [0];
// this.hexDotY = [0];
_this.hexSlices = 24;
_this.hexSliceX = [0];
_this.hexSliceY = [0];
for (var hexSlice = 0; hexSlice < _this.hexSlices; hexSlice++) {
_this.hexSliceX[hexSlice] = parseInt(Math.cos(hexSlice / _this.hexSlices * _this.hexSides * (2 * Math.PI) / _this.hexSides) * 1000) / 1000;
_this.hexSliceY[hexSlice] = parseInt(Math.sin(hexSlice / _this.hexSlices * _this.hexSides * (2 * Math.PI) / _this.hexSides) * 1000) / 1000;
if ((hexSlice - 2) % 4 === 0) {
var cur = (hexSlice - 2) / 4;
_this.pointyTopCornerX[cur] = _this.hexSliceX[hexSlice];
_this.pointyTopCornerY[cur] = _this.hexSliceY[hexSlice];
}
if (hexSlice % 4 === 0) {
var cur = hexSlice / 4;
_this.flatTopCornerX[cur] = _this.hexSliceX[hexSlice];
_this.flatTopCornerY[cur] = _this.hexSliceY[hexSlice];
}
// if (((hexSlice-2) % 4) === 0) {
// let cur = (hexSlice-2) / 4;
// this.hexCornerX[cur] = this.hexSliceX[hexSlice];
// this.hexCornerY[cur] = this.hexSliceY[hexSlice];
// }
//
// if ((hexSlice % 4) === 0) {
// let cur = hexSlice / 4;
// this.hexDotX[cur+1] = this.hexSliceX[hexSlice];
// this.hexDotY[cur+1] = this.hexSliceY[hexSlice];
// }
}
return _this;
}
_createClass(TileHex, [{
key: 'outline',
value: function outline(settings) {
var x = settings.x;
var y = settings.y;
var scale = settings.scale;
var hexCornerX = settings.pointy ? this.pointyTopCornerX : this.flatTopCornerX;
var hexCornerY = settings.pointy ? this.pointyTopCornerY : this.flatTopCornerY;
this.context.beginPath();
this.context.moveTo(x + scale * hexCornerX[0], y + scale * hexCornerY[0]);
this.context.lineTo(x + scale * hexCornerX[1], y + scale * hexCornerY[1]);
this.context.lineTo(x + scale * hexCornerX[2], y + scale * hexCornerY[2]);
this.context.lineTo(x + scale * hexCornerX[3], y + scale * hexCornerY[3]);
this.context.lineTo(x + scale * hexCornerX[4], y + scale * hexCornerY[4]);
this.context.lineTo(x + scale * hexCornerX[5], y + scale * hexCornerY[5]);
this.context.closePath();
this.context.lineWidth = settings.width ? settings.width : 1;
this.context.strokeStyle = settings.color || RGBA_DEFAULT;
this.context.stroke();
}
}, {
key: 'filled',
value: function filled(settings) {
var x = settings.x;
var y = settings.y;
var scale = settings.scale;
var hexCornerX = settings.pointy ? this.pointyTopCornerX : this.flatTopCornerX;
var hexCornerY = settings.pointy ? this.pointyTopCornerY : this.flatTopCornerY;
this.context.beginPath();
this.context.moveTo(x + scale * hexCornerX[0], y + scale * hexCornerY[0]);
this.context.lineTo(x + scale * hexCornerX[1], y + scale * hexCornerY[1]);
this.context.lineTo(x + scale * hexCornerX[2], y + scale * hexCornerY[2]);
this.context.lineTo(x + scale * hexCornerX[3], y + scale * hexCornerY[3]);
this.context.lineTo(x + scale * hexCornerX[4], y + scale * hexCornerY[4]);
this.context.lineTo(x + scale * hexCornerX[5], y + scale * hexCornerY[5]);
this.context.fillStyle = settings.color || RGBA_DEFAULT;
this.context.fill();
}
}]);
return TileHex;
}(_tile2.default);
exports.default = TileHex;
/***/ },
/* 10 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _tile = __webpack_require__(7);
var _tile2 = _interopRequireDefault(_tile);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var RGBA_DEFAULT = 'rgba(0, 0, 0, 0.5)';
var TileSquare = function (_Tile) {
_inherits(TileSquare, _Tile);
function TileSquare(settings) {
_classCallCheck(this, TileSquare);
return _possibleConstructorReturn(this, Object.getPrototypeOf(TileSquare).call(this, settings));
}
_createClass(TileSquare, [{
key: 'filled',
value: function filled(settings) {
var x = settings.x;
var y = settings.y;
var scale = settings.scale;
this.context.beginPath();
this.context.moveTo(x + scale, y + scale);
this.context.lineTo(x + scale, y - scale);
this.context.lineTo(x - scale, y - scale);
this.context.lineTo(x - scale, y + scale);
this.context.fillStyle = settings.color || RGBA_DEFAULT;
this.context.fill();
}
}, {
key: 'outline',
value: function outline(settings) {
var x = settings.x;
var y = settings.y;
var scale = settings.scale;
this.context.beginPath();
this.context.moveTo(x + scale, y + scale);
this.context.lineTo(x + scale, y - scale);
this.context.lineTo(x - scale, y - scale);
this.context.lineTo(x - scale, y + scale);
this.context.closePath();
this.context.lineWidth = settings.width ? settings.width : 1;
this.context.strokeStyle = settings.color || RGBA_DEFAULT;
this.context.stroke();
}
}]);
return TileSquare;
}(_tile2.default);
exports.default = TileSquare;
/***/ }
/******/ ])));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMjY2ODliNTdjODNkNDNjMTQxMDciLCJ3ZWJwYWNrOi8vLy4vc3JjL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rlc3NlbGxhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzLmpzIiwid2VicGFjazovLy8uL3NyYy9vblRhcC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NrZXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdGlsZUNpcmNsZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdGlsZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdGlsZURpYW1vbmQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RpbGVIZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RpbGVTcXVhcmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ25DQSxLQUFJLGFBQWEseUJBQWU7QUFDL0IsV0FBUyxZQUFUO0VBRGdCLENBQWIsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tDU2lCO0FBQ3BCLFdBRG9CLFVBQ3BCLENBQVksUUFBWixFQUFzQjs7O3lCQURGLFlBQ0U7O0FBQ3JCLElBQUMsTUFBRCxFQUFTLEdBQVQsQ0FBYSxrQkFBVTtBQUFDLFVBQUssTUFBTCxJQUFlLE1BQUssTUFBTCxFQUFhLElBQWIsT0FBZixDQUFEO0lBQVYsQ0FBYixDQURxQjs7QUFHckIsUUFBSyxPQUFMLEdBQWUsU0FBUyxhQUFULENBQXVCLFNBQVMs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LFNBQUssT0FBTCxDQUFhLElBQWIsR0FaZ0I7Ozs7MkJBZVQsVUFBVTtBQUNqQixRQUFJLElBQUksU0FBUyxDQUFULENBRFM7QUFFakIsUUFBSSxJQUFJLFNBQVMsQ0FBVCxDQUZTO0FBR2pCLFFBQUksUUFBUSxTQUFTLEtBQVQsQ0FISzs7QUFLakIsU0FBSyxPQUFMLENBQWEsU0FBYixHQUxpQjtBQU1qQixTQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLElBQUUsS0FBRixFQUFTLElBQUUsS0FBRixDQUE3QixDQU5pQjtBQU9qQixTQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLElBQUUsS0FBRixFQUFTLElBQUUsS0FBRixDQUE3QixDQVBpQjtBQVFqQixTQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLElBQUUsS0FBRixFQUFTLElBQUUsS0FBRixDQUE3QixDQVJpQjtBQVNqQixTQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLElBQUUsS0FBRixFQUFTLElBQUUsS0FBRixDQUE3QixDQVRpQjtBQVVqQixTQUFLLE9BQUwsQ0FBYSxTQUFiLEdBVmlCOztBQVlqQixTQUFLLE9BQUwsQ0FBYSxTQUFiLEdBQXlCLFNBQVMsS0FBVCxHQUFpQixTQUFTLEtBQVQsR0FBaUIsQ0FBbEMsQ0FaUjtBQWFqQixTQUFLLE9BQUwsQ0FBYSxXQUFiLEdBQTJCLFNBQVMsS0FBVCxJQUFrQixZQUFsQixDQWJWO0FBY2pCLFNBQUssT0FBTCxDQUFhLE1BQWIsR0FkaUI7Ozs7U0FwQkUiLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgMjY2ODliNTdjODNkNDNjMTQxMDdcbiAqKi8iLCJcbmltcG9ydCBUZXNzZWxsYXRlIGZyb20gJy4vdGVzc2VsbGF0ZS5qcyc7XG5cbnZhciB0ZXNzZWxsYXRlID0gbmV3IFRlc3NlbGxhdGUoe1xuXHRlbGVtZW50OiAnI2NvbnRhaW5lcidcbn0pO1xuXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9tYWluLmpzXG4gKiovIiwiXG5pbXBvcnQge3JhbmRvbX0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmltcG9ydCBPblRhcCBmcm9tICcuL29uVGFwLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICcuL3BvaW50LmpzJztcbmltcG9ydCBTa2V0Y2ggZnJvbSAnLi9za2V0Y2guanMnO1xuXG5pbXBvcnQgVGlsZUNpcmNsZSBmcm9tICcuL3RpbGVDaXJjbGUuanMnO1xuaW1wb3J0IFRpbGVEaWFtb25kIGZyb20gJy4vdGlsZURpYW1vbmQuanMnO1xuaW1wb3J0IFRpbGVIZXggICAgZnJvbSAnLi90aWxlSGV4LmpzJztcbmltcG9ydCBUaWxlU3F1YXJlIGZyb20gJy4vdGlsZVNxdWFyZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3NlbGxhdGUge1xuXHRjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuXHRcdFsnZHJhdyddLm1hcChtZXRob2QgPT4ge3RoaXNbbWV0aG9kXSA9IHRoaXNbbWV0aG9kXS5iaW5kKHRoaXMpfSk7XG5cblx0XHR0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNldHRpbmdzLmVsZW1lbnQpO1xuXG5cdFx0dGhpcy5za2V0Y2ggPSBuZXcgU2tldGNoKHtcblx0XHRcdGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcblx0XHRcdGRyYXc6IHRoaXMuZHJhd1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5tYXAgPSBbXTtcblxuXHRcdHRoaXMub25UYXAgPSBuZXcgT25UYXAoe1xuXHRcdFx0ZWxlbWVudDogdGhpcy5lbGVtZW50LFxuXHRcdFx0Y2xpY2s6IChldmVudCkgPT4ge1xuXHRcdFx0XHRsZXQgeCA9IGV2ZW50LnBhZ2VYO1xuXHRcdFx0XHRsZXQgeSA9IGV2ZW50LnBhZ2VZO1xuXHRcdFx0XHRsZXQgdGlsZXMgPSBbJ2NpcmNsZScsICdkaWFtb25kJywgJ2hleCcsICdzcXVhcmUnXTtcblx0XHRcdFx0bGV0IHN0eWxlcyA9IFsnZmlsbGVkJywgJ291dGxpbmUnXTtcblx0XHRcdFx0bGV0IHNjYWxlID0gcmFuZG9tKDEwLCA1MCk7XG5cblx0XHRcdFx0dGhpcy5tYXAucHVzaCh7XG5cdFx0XHRcdFx0dGlsZTogdGlsZXNbcmFuZG9tKHRpbGVzLmxlbmd0aC0xKV0sXG5cdFx0XHRcdFx0c3R5bGU6IHN0eWxlc1tyYW5kb20oc3R5bGVzLmxlbmd0aC0xKV0sXG5cdFx0XHRcdFx0eCxcblx0XHRcdFx0XHR5LFxuXHRcdFx0XHRcdHNjYWxlLFxuXHRcdFx0XHRcdHBvaW50eTogcmFuZG9tKDEpID8gdHJ1ZSA6IGZhbHNlLFxuXHRcdFx0XHRcdGNvbG9yOiBgcmdiYSgkeyByYW5kb20oMjU1KSB9LCAkeyByYW5kb20oMjU1KSB9LCAkeyByYW5kb20oMjU1KSB9LCAwLjUpYFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuY2lyY2xlICA9IG5ldyBUaWxlQ2lyY2xlKHtjb250ZXh0OiB0aGlzLnNrZXRjaC5nZXRDb250ZXh0KCl9KTtcblx0XHR0aGlzLmRpYW1vbmQgPSBuZXcgVGlsZURpYW1vbmQoe2NvbnRleHQ6IHRoaXMuc2tldGNoLmdldENvbnRleHQoKX0pO1xuXHRcdHRoaXMuaGV4ICAgICA9IG5ldyBUaWxlSGV4KHtjb250ZXh0OiB0aGlzLnNrZXRjaC5nZXRDb250ZXh0KCl9KTtcblx0XHR0aGlzLnNxdWFyZSAgPSBuZXcgVGlsZVNxdWFyZSh7Y29udGV4dDogdGhpcy5za2V0Y2guZ2V0Q29udGV4dCgpfSk7XG5cdH1cblxuXHRkcmF3KGNvbnRleHQsIG5vdywgbGFzdFRpbWUpIHtcblx0XHRsZXQgY2FudmFzID0gY29udGV4dC5jYW52YXM7XG5cdFx0bGV0IHdpZHRoID0gY2FudmFzLndpZHRoO1xuXHRcdGxldCBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuXG5cdFx0Y29udGV4dC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cblx0XHR0aGlzLm1hcC5mb3JFYWNoKGNlbGwgPT4gdGhpc1tjZWxsLnRpbGVdW2NlbGwuc3R5bGVdKGNlbGwpKTtcblx0fVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvdGVzc2VsbGF0ZS5qc1xuICoqLyIsIlxuZXhwb3J0IGZ1bmN0aW9uIHRocm90dGxlRXZlbnQodHlwZSwgbmFtZSwgb2JqKSB7XG5cdG9iaiA9IG9iaiB8fCB3aW5kb3c7XG5cdGxldCBydW5uaW5nID0gZmFsc2U7XG5cblx0bGV0IHRocm90dGxlID0gKCkgPT4ge1xuXHRcdGlmICghcnVubmluZykge1xuXHRcdFx0cnVubmluZyA9IHRydWU7XG5cblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdG9iai5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChuYW1lKSk7XG5cdFx0XHRcdHJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdG9iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRocm90dGxlKTtcbn1cblxudGhyb3R0bGVFdmVudCgncmVzaXplJywgJ29wdGltaXplZFJlc2l6ZScpO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUob2JqKSB7XG5cdHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iaiwgc3JjKSB7XG5cdGZvciAobGV0IGtleSBpbiBzcmMpIHtcblx0XHRpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkpIG9ialtrZXldID0gc3JjW2tleV07XG5cdH1cblxuXHRyZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHlwb3RlbnVzZShhLCBiKSB7XG5cdGlmIChiID09IG51bGwpIGIgPSBhO1xuXG5cdHJldHVybiBNYXRoLnNxcnQoYSphICsgYipiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShtaW4sIG1heCkge1xuXHRpZiAobWF4ID09IG51bGwpIHtcblx0XHRtYXggPSBtaW47XG5cdFx0bWluID0gMDtcblx0fVxuXG5cdHJldHVybiBtaW4gKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpO1xufVxuXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy91dGlscy5qc1xuICoqLyIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT25UYXAge1xuXHRjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuXHRcdHRoaXMuZWxlbWVudCA9IHNldHRpbmdzLmVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTtcblxuXHRcdHRoaXMuY2FsbGJhY2tzID0ge307XG5cblx0XHR0aGlzLmV2ZW50cyA9IFsnY2xpY2snXTtcblxuXHRcdHRoaXMuZXZlbnRzLm1hcChtZXRob2QgPT4ge1xuXHRcdFx0dGhpc1ttZXRob2RdID0gdGhpc1ttZXRob2RdLmJpbmQodGhpcyk7XG5cblx0XHRcdGlmICh0eXBlb2Ygc2V0dGluZ3NbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihtZXRob2QsIHRoaXNbbWV0aG9kXSk7XG5cdFx0XHRcdHRoaXMuY2FsbGJhY2tzW21ldGhvZF0gPSBzZXR0aW5nc1ttZXRob2RdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Y2xpY2soZXZlbnQpIHtcblx0XHR0aGlzLmNhbGxiYWNrcy5jbGljayhldmVudCk7XG5cdH1cbn1cblxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvb25UYXAuanNcbiAqKi8iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvaW50IHtcblx0Y29uc3RydWN0b3IobmV3WCwgbmV3WSkge1xuXHRcdHRoaXMueCA9IG5ld1g7XG5cdFx0dGhpcy55ID0gbmV3WTtcblx0fVxuXG5cdGdldFgoKSB7IHJldHVybiB0aGlzLng7IH1cblx0Z2V0WSgpIHsgcmV0dXJuIHRoaXMueTsgfVxuXG5cdHNldFgobmV3WCkgeyB0aGlzLnggPSBuZXdYOyB9XG5cdHNldFkobmV3WSkgeyB0aGlzLnkgPSBuZXdZOyB9XG5cblx0Z2V0UG9pbnQoKSB7IHJldHVybiB7eDogdGhpcy54LCB5OiB0aGlzLnl9OyB9XG59O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcG9pbnQuanNcbiAqKi8iLCJcbi8vaW1wb3J0IHt0aHJvdHRsZUV2ZW50fSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2tldGNoIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHR0aGlzLmxhc3RUaW1lID0gbnVsbDtcblxuXHRcdFsnZ2V0Q29udGV4dCcsICdvblJlc2l6ZScsICdyZW5kZXInXS5tYXAobWV0aG9kID0+IHRoaXNbbWV0aG9kXSA9IHRoaXNbbWV0aG9kXS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuZHJhdyA9IHNldHRpbmdzLmRyYXcgfHwgZnVuY3Rpb24oKSB7fTsgLy8gKCkgPT4ge307XG5cdFx0dGhpcy5jb250YWluZXIgPSBzZXR0aW5ncy5lbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7XG5cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3B0aW1pemVkUmVzaXplJywgdGhpcy5vblJlc2l6ZSk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IGNvbnNvbGUubG9nKCcqKiogcmVzaXplICoqKicpKTtcblxuXHRcdHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cdFx0dGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aDtcblx0XHR0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG5cblx0XHR0aGlzLmNvbnRleHQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG5cdFx0dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyKTtcblx0fVxuXG5cdGdldENvbnRleHQoKSB7IHJldHVybiB0aGlzLmNvbnRleHQ7IH1cblxuXHRvblJlc2l6ZShldmVudCkge1xuXHRcdGNvbnNvbGUubG9nKCdza2V0Y2ggLSBvblJlc2l6ZScsIGFyZ3VtZW50cyk7XG5cdH1cblxuXHRyZW5kZXIobm93KSB7XG5cdFx0dGhpcy5kcmF3KHRoaXMuY29udGV4dCwgbm93LCB0aGlzLmxhc3RUaW1lKTtcblxuXHRcdHRoaXMubGFzdFRpbWUgPSBub3c7XG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyKTtcblx0fVxufVxuXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9za2V0Y2guanNcbiAqKi8iLCJcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZS5qcyc7XG5cbmxldCBSR0JBX0RFRkFVTFQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZUNpcmNsZSBleHRlbmRzIFRpbGUge1xuXHRjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuXHRcdHN1cGVyKHNldHRpbmdzKTtcblx0fVxuXG5cdGZpbGxlZChzZXR0aW5ncykge1xuXHRcdHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblx0XHR0aGlzLmNvbnRleHQuYXJjKHNldHRpbmdzLngsIHNldHRpbmdzLnksIHNldHRpbmdzLnNjYWxlLCAwLCAyKk1hdGguUEksIGZhbHNlKTtcblx0XHR0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gc2V0dGluZ3MuY29sb3IgfHwgUkdCQV9ERUZBVUxUO1xuXHRcdHRoaXMuY29udGV4dC5maWxsKCk7XG5cdH1cblxuXHRvdXRsaW5lKHNldHRpbmdzKSB7XG5cdFx0dGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdHRoaXMuY29udGV4dC5hcmMoc2V0dGluZ3MueCwgc2V0dGluZ3MueSwgc2V0dGluZ3Muc2NhbGUsIDAsIDIqTWF0aC5QSSwgZmFsc2UpO1xuXHRcdHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBzZXR0aW5ncy53aWR0aCA/IHNldHRpbmdzLndpZHRoIDogMTtcblx0XHR0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzZXR0aW5ncy5jb2xvciB8fCBSR0JBX0RFRkFVTFQ7XG5cdFx0dGhpcy5jb250ZXh0LnN0cm9rZSgpO1xuXHR9XG59XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3RpbGVDaXJjbGUuanNcbiAqKi8iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGUge1xuXHRjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuXHRcdHRoaXMuY29udGV4dCA9IHNldHRpbmdzLmNvbnRleHQgfHwgbnVsbDtcblx0fVxuXG5cdHNldENvbnRleHQobmV3Q29udGV4dCkge1xuXHRcdHRoaXMuY29udGV4dCA9IG5ld0NvbnRleHQgfHwgdGhpcy5jb250ZXh0O1xuXHR9XG59XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3RpbGUuanNcbiAqKi8iLCJcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZS5qcyc7XG5cbmltcG9ydCB7aHlwb3RlbnVzZX0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmxldCBSR0JBX0RFRkFVTFQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZURpYW1vbmQgZXh0ZW5kcyBUaWxlIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHRzdXBlcihzZXR0aW5ncyk7XG5cdH1cblxuXHRmaWxsZWQoc2V0dGluZ3MpIHtcblx0XHRsZXQgeCA9IHNldHRpbmdzLng7XG5cdFx0bGV0IHkgPSBzZXR0aW5ncy55O1xuXHRcdGxldCBzY2FsZSA9IHNldHRpbmdzLnNjYWxlO1xuXG5cdFx0dGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdHRoaXMuY29udGV4dC5tb3ZlVG8oeCtoeXBvdGVudXNlKHNjYWxlKSwgeSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4LCB5LWh5cG90ZW51c2Uoc2NhbGUpKTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHgtaHlwb3RlbnVzZShzY2FsZSksIHkpO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCwgeStoeXBvdGVudXNlKHNjYWxlKSk7XG5cblx0XHR0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gc2V0dGluZ3MuY29sb3IgfHwgUkdCQV9ERUZBVUxUO1xuXHRcdHRoaXMuY29udGV4dC5maWxsKCk7XG5cdH1cblxuXHRvdXRsaW5lKHNldHRpbmdzKSB7XG5cdFx0bGV0IHggPSBzZXR0aW5ncy54O1xuXHRcdGxldCB5ID0gc2V0dGluZ3MueTtcblx0XHRsZXQgc2NhbGUgPSBzZXR0aW5ncy5zY2FsZTtcblxuXHRcdHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblx0XHR0aGlzLmNvbnRleHQubW92ZVRvKHgraHlwb3RlbnVzZShzY2FsZSksIHkpO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCwgeS1oeXBvdGVudXNlKHNjYWxlKSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4LWh5cG90ZW51c2Uoc2NhbGUpLCB5KTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHgsIHkraHlwb3RlbnVzZShzY2FsZSkpO1xuXHRcdHRoaXMuY29udGV4dC5jbG9zZVBhdGgoKTtcblxuXHRcdHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBzZXR0aW5ncy53aWR0aCA/IHNldHRpbmdzLndpZHRoIDogMTtcblx0XHR0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzZXR0aW5ncy5jb2xvciB8fCBSR0JBX0RFRkFVTFQ7XG5cdFx0dGhpcy5jb250ZXh0LnN0cm9rZSgpO1xuXHR9XG59XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3RpbGVEaWFtb25kLmpzXG4gKiovIiwiXG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUuanMnO1xuXG5sZXQgUkdCQV9ERUZBVUxUID0gJ3JnYmEoMCwgMCwgMCwgMC41KSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGVIZXggZXh0ZW5kcyBUaWxlIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHRzdXBlcihzZXR0aW5ncyk7XG5cblx0XHR0aGlzLnNxcnQzID0gTWF0aC5zcXJ0KDMpO1xuXG5cdFx0dGhpcy5oZXhTaWRlcyA9IDY7XG5cdFx0dGhpcy5wb2ludHlUb3BDb3JuZXJYID0gW107XG5cdFx0dGhpcy5wb2ludHlUb3BDb3JuZXJZID0gW107XG5cdFx0dGhpcy5mbGF0VG9wQ29ybmVyWCA9IFtdO1xuXHRcdHRoaXMuZmxhdFRvcENvcm5lclkgPSBbXTtcblxuXHRcdC8vIGRpY2UgZG90cywgMCwwIGlzIGNlbnRlclxuXHRcdC8vIFRPRE86IGlmIHBvaW50eTogWzBdLmNvbmNhdChmbGF0VG9wKSwgaWYgZmxhdDogWzBdLmNvbmNhdChwb2ludHkpXG4vL1x0XHR0aGlzLmhleERvdFggPSBbMF07XG4vL1x0XHR0aGlzLmhleERvdFkgPSBbMF07XG5cblx0XHR0aGlzLmhleFNsaWNlcyA9IDI0O1xuXHRcdHRoaXMuaGV4U2xpY2VYID0gWzBdO1xuXHRcdHRoaXMuaGV4U2xpY2VZID0gWzBdO1xuXG5cdFx0Zm9yIChsZXQgaGV4U2xpY2UgPSAwOyBoZXhTbGljZSA8IHRoaXMuaGV4U2xpY2VzOyBoZXhTbGljZSsrKSB7XG5cdFx0XHR0aGlzLmhleFNsaWNlWFtoZXhTbGljZV0gPSBwYXJzZUludChNYXRoLmNvcygoKGhleFNsaWNlL3RoaXMuaGV4U2xpY2VzKSp0aGlzLmhleFNpZGVzKSAqICgyICogTWF0aC5QSSkgLyB0aGlzLmhleFNpZGVzKSAqIDEwMDApIC8gMTAwMDtcblx0XHRcdHRoaXMuaGV4U2xpY2VZW2hleFNsaWNlXSA9IHBhcnNlSW50KE1hdGguc2luKCgoaGV4U2xpY2UvdGhpcy5oZXhTbGljZXMpKnRoaXMuaGV4U2lkZXMpICogKDIgKiBNYXRoLlBJKSAvIHRoaXMuaGV4U2lkZXMpICogMTAwMCkgLyAxMDAwO1xuXG5cdFx0XHRpZiAoKChoZXhTbGljZS0yKSAlIDQpID09PSAwKSB7XG5cdFx0XHRcdGxldCBjdXIgPSAoaGV4U2xpY2UtMikgLyA0O1xuXHRcdFx0XHR0aGlzLnBvaW50eVRvcENvcm5lclhbY3VyXSA9IHRoaXMuaGV4U2xpY2VYW2hleFNsaWNlXTtcblx0XHRcdFx0dGhpcy5wb2ludHlUb3BDb3JuZXJZW2N1cl0gPSB0aGlzLmhleFNsaWNlWVtoZXhTbGljZV07XG5cdFx0XHR9XG5cblx0XHRcdGlmICgoaGV4U2xpY2UgJSA0KSA9PT0gMCkge1xuXHRcdFx0XHRsZXQgY3VyID0gaGV4U2xpY2UgLyA0O1xuXHRcdFx0XHR0aGlzLmZsYXRUb3BDb3JuZXJYW2N1cl0gPSB0aGlzLmhleFNsaWNlWFtoZXhTbGljZV07XG5cdFx0XHRcdHRoaXMuZmxhdFRvcENvcm5lcllbY3VyXSA9IHRoaXMuaGV4U2xpY2VZW2hleFNsaWNlXTtcblx0XHRcdH1cblxuLy9cdFx0XHRpZiAoKChoZXhTbGljZS0yKSAlIDQpID09PSAwKSB7XG4vL1x0XHRcdFx0bGV0IGN1ciA9IChoZXhTbGljZS0yKSAvIDQ7XG4vL1x0XHRcdFx0dGhpcy5oZXhDb3JuZXJYW2N1cl0gPSB0aGlzLmhleFNsaWNlWFtoZXhTbGljZV07XG4vL1x0XHRcdFx0dGhpcy5oZXhDb3JuZXJZW2N1cl0gPSB0aGlzLmhleFNsaWNlWVtoZXhTbGljZV07XG4vL1x0XHRcdH1cbi8vXG4vL1x0XHRcdGlmICgoaGV4U2xpY2UgJSA0KSA9PT0gMCkge1xuLy9cdFx0XHRcdGxldCBjdXIgPSBoZXhTbGljZSAvIDQ7XG4vL1x0XHRcdFx0dGhpcy5oZXhEb3RYW2N1cisxXSA9IHRoaXMuaGV4U2xpY2VYW2hleFNsaWNlXTtcbi8vXHRcdFx0XHR0aGlzLmhleERvdFlbY3VyKzFdID0gdGhpcy5oZXhTbGljZVlbaGV4U2xpY2VdO1xuLy9cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0b3V0bGluZShzZXR0aW5ncykge1xuXHRcdGxldCB4ID0gc2V0dGluZ3MueDtcblx0XHRsZXQgeSA9IHNldHRpbmdzLnk7XG5cdFx0bGV0IHNjYWxlID0gc2V0dGluZ3Muc2NhbGU7XG5cdFx0bGV0IGhleENvcm5lclggPSBzZXR0aW5ncy5wb2ludHkgPyB0aGlzLnBvaW50eVRvcENvcm5lclggOiB0aGlzLmZsYXRUb3BDb3JuZXJYO1xuXHRcdGxldCBoZXhDb3JuZXJZID0gc2V0dGluZ3MucG9pbnR5ID8gdGhpcy5wb2ludHlUb3BDb3JuZXJZIDogdGhpcy5mbGF0VG9wQ29ybmVyWTtcblxuXHRcdHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblx0XHR0aGlzLmNvbnRleHQubW92ZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbMF0sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbMF0pO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCArIHNjYWxlICogaGV4Q29ybmVyWFsxXSwgeSArIHNjYWxlICogaGV4Q29ybmVyWVsxXSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzJdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzJdKTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbM10sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbM10pO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCArIHNjYWxlICogaGV4Q29ybmVyWFs0XSwgeSArIHNjYWxlICogaGV4Q29ybmVyWVs0XSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzVdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzVdKTtcblx0XHR0aGlzLmNvbnRleHQuY2xvc2VQYXRoKCk7XG5cblx0XHR0aGlzLmNvbnRleHQubGluZVdpZHRoID0gc2V0dGluZ3Mud2lkdGggPyBzZXR0aW5ncy53aWR0aCA6IDE7XG5cdFx0dGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gc2V0dGluZ3MuY29sb3IgfHwgUkdCQV9ERUZBVUxUO1xuXHRcdHRoaXMuY29udGV4dC5zdHJva2UoKTtcblx0fVxuXG5cdGZpbGxlZChzZXR0aW5ncykge1xuXHRcdGxldCB4ID0gc2V0dGluZ3MueDtcblx0XHRsZXQgeSA9IHNldHRpbmdzLnk7XG5cdFx0bGV0IHNjYWxlID0gc2V0dGluZ3Muc2NhbGU7XG5cdFx0bGV0IGhleENvcm5lclggPSBzZXR0aW5ncy5wb2ludHkgPyB0aGlzLnBvaW50eVRvcENvcm5lclggOiB0aGlzLmZsYXRUb3BDb3JuZXJYO1xuXHRcdGxldCBoZXhDb3JuZXJZID0gc2V0dGluZ3MucG9pbnR5ID8gdGhpcy5wb2ludHlUb3BDb3JuZXJZIDogdGhpcy5mbGF0VG9wQ29ybmVyWTtcblxuXHRcdHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblx0XHR0aGlzLmNvbnRleHQubW92ZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbMF0sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbMF0pO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCArIHNjYWxlICogaGV4Q29ybmVyWFsxXSwgeSArIHNjYWxlICogaGV4Q29ybmVyWVsxXSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzJdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzJdKTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHggKyBzY2FsZSAqIGhleENvcm5lclhbM10sIHkgKyBzY2FsZSAqIGhleENvcm5lcllbM10pO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCArIHNjYWxlICogaGV4Q29ybmVyWFs0XSwgeSArIHNjYWxlICogaGV4Q29ybmVyWVs0XSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4ICsgc2NhbGUgKiBoZXhDb3JuZXJYWzVdLCB5ICsgc2NhbGUgKiBoZXhDb3JuZXJZWzVdKTtcblxuXHRcdHRoaXMuY29udGV4dC5maWxsU3R5bGUgPSBzZXR0aW5ncy5jb2xvciB8fCBSR0JBX0RFRkFVTFQ7XG5cdFx0dGhpcy5jb250ZXh0LmZpbGwoKTtcblx0fVxufVxuXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy90aWxlSGV4LmpzXG4gKiovIiwiXG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUuanMnO1xuXG5sZXQgUkdCQV9ERUZBVUxUID0gJ3JnYmEoMCwgMCwgMCwgMC41KSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGVTcXVhcmUgZXh0ZW5kcyBUaWxlIHtcblx0Y29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcblx0XHRzdXBlcihzZXR0aW5ncyk7XG5cdH1cblxuXHRmaWxsZWQoc2V0dGluZ3MpIHtcblx0XHRsZXQgeCA9IHNldHRpbmdzLng7XG5cdFx0bGV0IHkgPSBzZXR0aW5ncy55O1xuXHRcdGxldCBzY2FsZSA9IHNldHRpbmdzLnNjYWxlO1xuXG5cdFx0dGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcdHRoaXMuY29udGV4dC5tb3ZlVG8oeCtzY2FsZSwgeStzY2FsZSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4K3NjYWxlLCB5LXNjYWxlKTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHgtc2NhbGUsIHktc2NhbGUpO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeC1zY2FsZSwgeStzY2FsZSk7XG5cblx0XHR0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gc2V0dGluZ3MuY29sb3IgfHwgUkdCQV9ERUZBVUxUO1xuXHRcdHRoaXMuY29udGV4dC5maWxsKCk7XG5cdH1cblxuXHRvdXRsaW5lKHNldHRpbmdzKSB7XG5cdFx0bGV0IHggPSBzZXR0aW5ncy54O1xuXHRcdGxldCB5ID0gc2V0dGluZ3MueTtcblx0XHRsZXQgc2NhbGUgPSBzZXR0aW5ncy5zY2FsZTtcblxuXHRcdHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblx0XHR0aGlzLmNvbnRleHQubW92ZVRvKHgrc2NhbGUsIHkrc2NhbGUpO1xuXHRcdHRoaXMuY29udGV4dC5saW5lVG8oeCtzY2FsZSwgeS1zY2FsZSk7XG5cdFx0dGhpcy5jb250ZXh0LmxpbmVUbyh4LXNjYWxlLCB5LXNjYWxlKTtcblx0XHR0aGlzLmNvbnRleHQubGluZVRvKHgtc2NhbGUsIHkrc2NhbGUpO1xuXHRcdHRoaXMuY29udGV4dC5jbG9zZVBhdGgoKTtcblxuXHRcdHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBzZXR0aW5ncy53aWR0aCA/IHNldHRpbmdzLndpZHRoIDogMTtcblx0XHR0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzZXR0aW5ncy5jb2xvciB8fCBSR0JBX0RFRkFVTFQ7XG5cdFx0dGhpcy5jb250ZXh0LnN0cm9rZSgpO1xuXHR9XG59XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3RpbGVTcXVhcmUuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9