happo 2.8.1 → 2.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/lib/happo/public/026c001beac0620bb23a.worker.js +50 -0
  3. data/lib/happo/public/05ad45a945afc6882286.worker.js +56 -0
  4. data/lib/happo/public/0dd329b74ed90a207896.worker.js +56 -0
  5. data/lib/happo/public/174b944ab9e9053c766d.worker.js +56 -0
  6. data/lib/happo/public/196b75660e2791fda25a.worker.js +56 -0
  7. data/lib/happo/public/1d5c0eb9c479f44f0ec2.worker.js +56 -0
  8. data/lib/happo/public/1d6c41b4828b191ae315.worker.js +56 -0
  9. data/lib/happo/public/212269d558f1f8b1bc63.worker.js +56 -0
  10. data/lib/happo/public/25426637d793045ccb77.worker.js +56 -0
  11. data/lib/happo/public/28537ac53e64479763ba.worker.js +56 -0
  12. data/lib/happo/public/30e3af0e8f974da2885c.worker.js +56 -0
  13. data/lib/happo/public/32fc2a09f98d30cb2a06.worker.js +56 -0
  14. data/lib/happo/public/33c43f9f1296a6c3b236.worker.js +56 -0
  15. data/lib/happo/public/3a6592504d8ee1810017.worker.js +56 -0
  16. data/lib/happo/public/3a8bedd3121a2cdacb6d.worker.js +56 -0
  17. data/lib/happo/public/3d9ed68ca315896c8ec7.worker.js +56 -0
  18. data/lib/happo/public/3da88471c60703398f95.worker.js +56 -0
  19. data/lib/happo/public/40c1aadf458bda245630.worker.js +1 -0
  20. data/lib/happo/public/41749e1ff9db63f87a1e.worker.js +56 -0
  21. data/lib/happo/public/42bc2c20d61979a23a2f.worker.js +56 -0
  22. data/lib/happo/public/447f3bfe79be8a67b9cc.worker.js +56 -0
  23. data/lib/happo/public/4580dd75ba5a064f4366.worker.js +56 -0
  24. data/lib/happo/public/4975b25fe791d85e9827.worker.js +56 -0
  25. data/lib/happo/public/4b23fa5d7875a8fba618.worker.js +56 -0
  26. data/lib/happo/public/4ecbb720788698ce7a9b.worker.js +56 -0
  27. data/lib/happo/public/4ef2e26b666b08b7411a.worker.js +56 -0
  28. data/lib/happo/public/51ac7ca571ae07cd9d7a.worker.js +56 -0
  29. data/lib/happo/public/531d99f56a3343cee5f8.worker.js +56 -0
  30. data/lib/happo/public/53e6a60c2cf0558157a7.worker.js +56 -0
  31. data/lib/happo/public/55d488167040d5350534.worker.js +56 -0
  32. data/lib/happo/public/588f7a6b784ef2b87932.worker.js +56 -0
  33. data/lib/happo/public/59d03b8990473ae492e0.worker.js +56 -0
  34. data/lib/happo/public/5aded6f9af816e819a2b.worker.js +56 -0
  35. data/lib/happo/public/5e6771e4a41f597c26a9.worker.js +56 -0
  36. data/lib/happo/public/61e924aed1761ec05ca0.worker.js +56 -0
  37. data/lib/happo/public/65e7608bb10d0f2250d1.worker.js +56 -0
  38. data/lib/happo/public/6a71a1273a0cf4065e1e.worker.js +56 -0
  39. data/lib/happo/public/727ca4589d56ddcb9c7f.worker.js +56 -0
  40. data/lib/happo/public/769883a4d5abfa7384d4.worker.js +56 -0
  41. data/lib/happo/public/78fea81d29830297df57.worker.js +56 -0
  42. data/lib/happo/public/7bf45d52cf57b1949851.worker.js +56 -0
  43. data/lib/happo/public/7d4a4086de8530abe101.worker.js +56 -0
  44. data/lib/happo/public/7e330bc3ee246ab39910.worker.js +56 -0
  45. data/lib/happo/public/84f3a66517b77798456d.worker.js +56 -0
  46. data/lib/happo/public/856dbe98c40d8f4bd452.worker.js +56 -0
  47. data/lib/happo/public/90a4b81e4d7c2da63973.worker.js +56 -0
  48. data/lib/happo/public/92dd03e7cbe827a2df45.worker.js +56 -0
  49. data/lib/happo/public/94976fe48214f2bc68d6.worker.js +56 -0
  50. data/lib/happo/public/95f3e6e7eec59c0af3e5.worker.js +56 -0
  51. data/lib/happo/public/96c4c2f5df8175649a67.worker.js +56 -0
  52. data/lib/happo/public/973a6ae106ac4e664858.worker.js +56 -0
  53. data/lib/happo/public/989e9ba236891bdfcf46.worker.js +56 -0
  54. data/lib/happo/public/HappoApp.bundle.js +1 -2
  55. data/lib/happo/public/a50e9af74a422839a15c.worker.js +56 -0
  56. data/lib/happo/public/ad4fdfa82741585ce164.worker.js +56 -0
  57. data/lib/happo/public/ae0622a81101951ac112.worker.js +56 -0
  58. data/lib/happo/public/ae223678cdbfac88d9be.worker.js +56 -0
  59. data/lib/happo/public/b441a6c1393a5d39b5ff.worker.js +56 -0
  60. data/lib/happo/public/b4c84506199d5745d950.worker.js +56 -0
  61. data/lib/happo/public/b5176c936b696653a407.worker.js +56 -0
  62. data/lib/happo/public/b86b963a72892d8f0fd1.worker.js +56 -0
  63. data/lib/happo/public/ba50214d2b6ac001493b.worker.js +56 -0
  64. data/lib/happo/public/bb6413d1cea030ba7a1e.worker.js +56 -0
  65. data/lib/happo/public/bc084ad60fb7dbbe0818.worker.js +56 -0
  66. data/lib/happo/public/c15e6b44ae496af6af9b.worker.js +56 -0
  67. data/lib/happo/public/c4393394848f5242932e.worker.js +56 -0
  68. data/lib/happo/public/c60ceaff7849b394e27a.worker.js +56 -0
  69. data/lib/happo/public/c67c76de1e4def5019d5.worker.js +56 -0
  70. data/lib/happo/public/c7969739b50b79043b86.worker.js +56 -0
  71. data/lib/happo/public/cc82d7609935eb1d2738.worker.js +56 -0
  72. data/lib/happo/public/d135dda9b0318be75e3c.worker.js +56 -0
  73. data/lib/happo/public/d2aded5d63912f5b7e1b.worker.js +56 -0
  74. data/lib/happo/public/d2be644581f8f67b207d.worker.js +56 -0
  75. data/lib/happo/public/d6e037d3891cfb95fbca.worker.js +50 -0
  76. data/lib/happo/public/d7440908d264133044bb.worker.js +56 -0
  77. data/lib/happo/public/da071c51e9a641ed805c.worker.js +56 -0
  78. data/lib/happo/public/dbe8eef9555ef0d43469.worker.js +56 -0
  79. data/lib/happo/public/e1cbbfd7a3d705049eb0.worker.js +56 -0
  80. data/lib/happo/public/e3882591e6710cf03ed4.worker.js +56 -0
  81. data/lib/happo/public/e414c768d66b9bcf86bb.worker.js +56 -0
  82. data/lib/happo/public/e85bc4bb461158f5561d.worker.js +56 -0
  83. data/lib/happo/public/ed6256235d0a2b11aaf6.worker.js +56 -0
  84. data/lib/happo/public/edcc84bf4483670ba23e.worker.js +56 -0
  85. data/lib/happo/public/f3d33d482a4326121c45.worker.js +56 -0
  86. data/lib/happo/public/f67e23a954230ea878be.worker.js +56 -0
  87. data/lib/happo/public/f800c3a1d9200926bde6.worker.js +56 -0
  88. data/lib/happo/public/f8954fa2849952175e2c.worker.js +56 -0
  89. data/lib/happo/public/fde5a206ff86c3d7ab10.worker.js +56 -0
  90. data/lib/happo/public/globe-current.png +0 -0
  91. data/lib/happo/public/globe-previous.png +0 -0
  92. data/lib/happo/server.rb +7 -0
  93. data/lib/happo/version.rb +1 -1
  94. metadata +91 -3
  95. data/lib/happo/public/happo-logo.svg +0 -1
@@ -0,0 +1,56 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n var maxWidth = _ref2.maxWidth;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibWF4V2lkdGgiLCJoYXNoZWRQcmV2aW91c0RhdGEiLCJtYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZiIsInBvc3RNZXNzYWdlIiwicHJvZ3Jlc3MiLCJoYXNoZWRDdXJyZW50RGF0YSIsInRyYW5zcGFyZW50TGluZSIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxuICBtYXhXaWR0aCxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgaGFzaGVkUHJldmlvdXNEYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShpLCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBhbGlnbih7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgICBtYXhXaWR0aCxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n if (memo[aLength][bLength] === 0) {\n // No soltuion found\n return null;\n }\n return solution;\n}\n\nfunction placeholders(count) {\n var result = new Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = '+';\n }\n return result;\n}\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n var changes = 0;\n\n function applyChange() {\n if (changes < 0) {\n b.splice.apply(b, [bi, 0].concat(_toConsumableArray(placeholders(Math.abs(changes)))));\n } else if (changes > 0) {\n a.splice.apply(a, [ai, 0].concat(_toConsumableArray(placeholders(changes))));\n }\n changes = 0;\n }\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n applyChange();\n ai--;\n bi--;\n } else if (movement === MOVEMENT.horizontal) {\n bi--;\n changes++;\n } else if (movement === MOVEMENT.vertical) {\n ai--;\n changes--;\n }\n movement = solution[ai][bi];\n }\n changes = ai - bi;\n ai = 0;\n bi = 0;\n //applyChange();\n}\n\n/**\n * To be called for arrays that share nothing in common.\n *\n * Note that this will MUTATE the arrays,\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction applyPadding(a, b) {\n var aLength = a.length;\n var bLength = b.length;\n var shorterArray = aLength > bLength ? b : a;\n shorterArray.push.apply(shorterArray, _toConsumableArray(placeholders(Math.abs(aLength - bLength))));\n}\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n if (lcsSolution) {\n applySolution(lcsSolution, a, b);\n } else {\n applyPadding(a, b);\n }\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJwbGFjZWhvbGRlcnMiLCJjb3VudCIsInJlc3VsdCIsImFwcGx5U29sdXRpb24iLCJtb3ZlbWVudCIsImFpIiwiYmkiLCJjaGFuZ2VzIiwiYXBwbHlDaGFuZ2UiLCJzcGxpY2UiLCJhYnMiLCJhcHBseVBhZGRpbmciLCJzaG9ydGVyQXJyYXkiLCJwdXNoIiwibGNzU29sdXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQXVId0JBLFc7Ozs7QUF2SHhCLElBQU1DLFdBQVc7QUFDZkMsUUFBTSxDQURTO0FBRWZDLFlBQVUsQ0FGSztBQUdmQyxZQUFVLENBSEs7QUFJZkMsY0FBWTtBQUpHLENBQWpCOztBQU9BLFNBQVNDLFVBQVQsQ0FBb0JDLE1BQXBCLEVBQTRCQyxLQUE1QixFQUFtQztBQUNqQyxNQUFNQyxPQUFPLElBQUlDLEtBQUosQ0FBVUgsTUFBVixDQUFiO0FBQ0EsT0FBSyxJQUFJSSxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLEtBQUtHLE1BQXpCLEVBQWlDRCxHQUFqQyxFQUFzQztBQUNwQ0YsU0FBS0UsQ0FBTCxJQUFVLElBQUlFLFVBQUosQ0FBZUwsS0FBZixDQUFWO0FBQ0Q7QUFDRCxTQUFPQyxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0ssd0JBQVQsQ0FBa0NDLENBQWxDLEVBQXFDQyxDQUFyQyxFQUF3QztBQUN0QztBQUNBO0FBQ0EsTUFBTUMsVUFBVUYsRUFBRUgsTUFBbEI7QUFDQSxNQUFNTSxVQUFVRixFQUFFSixNQUFsQjtBQUNBLE1BQU1PLE9BQU9iLFdBQVdXLFVBQVUsQ0FBckIsRUFBd0JDLFVBQVUsQ0FBbEMsQ0FBYjtBQUNBLE1BQU1FLFdBQVdkLFdBQVdXLFVBQVUsQ0FBckIsRUFBd0JDLFVBQVUsQ0FBbEMsQ0FBakI7O0FBRUE7QUFDQSxPQUFLLElBQUlQLElBQUksQ0FBYixFQUFnQkEsS0FBS00sT0FBckIsRUFBOEJOLEdBQTlCLEVBQW1DO0FBQ2pDLFNBQUssSUFBSVUsSUFBSSxDQUFiLEVBQWdCQSxLQUFLSCxPQUFyQixFQUE4QkcsR0FBOUIsRUFBbUM7QUFDakMsVUFBSU4sRUFBRUosSUFBSSxDQUFOLE1BQWFLLEVBQUVLLElBQUksQ0FBTixDQUFqQixFQUEyQjtBQUN6QjtBQUNBRixhQUFLUixDQUFMLEVBQVFVLENBQVIsSUFBYUYsS0FBS1IsSUFBSSxDQUFULEVBQVlVLElBQUksQ0FBaEIsSUFBcUIsQ0FBbEM7QUFDQUQsaUJBQVNULENBQVQsRUFBWVUsQ0FBWixJQUFpQnBCLFNBQVNFLFFBQTFCO0FBQ0QsT0FKRCxNQUlPO0FBQ0xnQixhQUFLUixDQUFMLEVBQVFVLENBQVIsSUFBYUMsS0FBS0MsR0FBTCxDQUFTSixLQUFLUixJQUFJLENBQVQsRUFBWVUsQ0FBWixDQUFULEVBQXlCRixLQUFLUixDQUFMLEVBQVFVLElBQUksQ0FBWixDQUF6QixDQUFiO0FBQ0EsWUFBSUYsS0FBS1IsQ0FBTCxFQUFRVSxDQUFSLE1BQWVGLEtBQUtSLElBQUksQ0FBVCxFQUFZVSxDQUFaLENBQW5CLEVBQW1DO0FBQ2pDRCxtQkFBU1QsQ0FBVCxFQUFZVSxDQUFaLElBQWlCcEIsU0FBU0csUUFBMUI7QUFDRCxTQUZELE1BRU87QUFDTGdCLG1CQUFTVCxDQUFULEVBQVlVLENBQVosSUFBaUJwQixTQUFTSSxVQUExQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGO0FBQ0QsTUFBSWMsS0FBS0YsT0FBTCxFQUFjQyxPQUFkLE1BQTJCLENBQS9CLEVBQWtDO0FBQ2hDO0FBQ0EsV0FBTyxJQUFQO0FBQ0Q7QUFDRCxTQUFPRSxRQUFQO0FBQ0Q7O0FBRUQsU0FBU0ksWUFBVCxDQUFzQkMsS0FBdEIsRUFBNkI7QUFDM0IsTUFBTUMsU0FBUyxJQUFJaEIsS0FBSixDQUFVZSxLQUFWLENBQWY7QUFDQSxPQUFLLElBQUlkLElBQUksQ0FBYixFQUFnQkEsSUFBSWMsS0FBcEIsRUFBMkJkLEdBQTNCLEVBQWdDO0FBQzlCZSxXQUFPZixDQUFQLElBQVksR0FBWjtBQUNEO0FBQ0QsU0FBT2UsTUFBUDtBQUNEO0FBQ0Q7Ozs7Ozs7O0FBUUEsU0FBU0MsYUFBVCxDQUF1QlAsUUFBdkIsRUFBaUNMLENBQWpDLEVBQW9DQyxDQUFwQyxFQUF1QztBQUNyQyxNQUFJWSxXQUFXUixTQUFTTCxFQUFFSCxNQUFYLEVBQW1CSSxFQUFFSixNQUFyQixDQUFmO0FBQ0EsTUFBSWlCLEtBQUtkLEVBQUVILE1BQVg7QUFDQSxNQUFJa0IsS0FBS2QsRUFBRUosTUFBWDtBQUNBLE1BQUltQixVQUFVLENBQWQ7O0FBRUEsV0FBU0MsV0FBVCxHQUF1QjtBQUNyQixRQUFJRCxVQUFVLENBQWQsRUFBaUI7QUFDZmYsUUFBRWlCLE1BQUYsV0FBU0gsRUFBVCxFQUFhLENBQWIsNEJBQW1CTixhQUFhRixLQUFLWSxHQUFMLENBQVNILE9BQVQsQ0FBYixDQUFuQjtBQUNELEtBRkQsTUFFTyxJQUFJQSxVQUFVLENBQWQsRUFBaUI7QUFDdEJoQixRQUFFa0IsTUFBRixXQUFTSixFQUFULEVBQWEsQ0FBYiw0QkFBbUJMLGFBQWFPLE9BQWIsQ0FBbkI7QUFDRDtBQUNEQSxjQUFVLENBQVY7QUFDRDs7QUFFRCxTQUFPSCxhQUFhM0IsU0FBU0MsSUFBN0IsRUFBbUM7QUFDakMsUUFBSTBCLGFBQWEzQixTQUFTRSxRQUExQixFQUFvQztBQUNsQzZCO0FBQ0FIO0FBQ0FDO0FBQ0QsS0FKRCxNQUlPLElBQUlGLGFBQWEzQixTQUFTSSxVQUExQixFQUFzQztBQUMzQ3lCO0FBQ0FDO0FBQ0QsS0FITSxNQUdBLElBQUlILGFBQWEzQixTQUFTRyxRQUExQixFQUFvQztBQUN6Q3lCO0FBQ0FFO0FBQ0Q7QUFDREgsZUFBV1IsU0FBU1MsRUFBVCxFQUFhQyxFQUFiLENBQVg7QUFDRDtBQUNEQyxZQUFVRixLQUFLQyxFQUFmO0FBQ0FELE9BQUssQ0FBTDtBQUNBQyxPQUFLLENBQUw7QUFDQTtBQUNEOztBQUVEOzs7Ozs7OztBQVFBLFNBQVNLLFlBQVQsQ0FBc0JwQixDQUF0QixFQUF5QkMsQ0FBekIsRUFBNEI7QUFDMUIsTUFBTUMsVUFBVUYsRUFBRUgsTUFBbEI7QUFDQSxNQUFNTSxVQUFVRixFQUFFSixNQUFsQjtBQUNBLE1BQU13QixlQUFlbkIsVUFBVUMsT0FBVixHQUFvQkYsQ0FBcEIsR0FBd0JELENBQTdDO0FBQ0FxQixlQUFhQyxJQUFiLHdDQUFxQmIsYUFBYUYsS0FBS1ksR0FBTCxDQUFTakIsVUFBVUMsT0FBbkIsQ0FBYixDQUFyQjtBQUNEO0FBQ0Q7Ozs7Ozs7O0FBUWUsU0FBU2xCLFdBQVQsQ0FBcUJlLENBQXJCLEVBQXdCQyxDQUF4QixFQUEyQjtBQUN4QyxNQUFNc0IsY0FBY3hCLHlCQUF5QkMsQ0FBekIsRUFBNEJDLENBQTVCLENBQXBCO0FBQ0EsTUFBSXNCLFdBQUosRUFBaUI7QUFDZlgsa0JBQWNXLFdBQWQsRUFBMkJ2QixDQUEzQixFQUE4QkMsQ0FBOUI7QUFDRCxHQUZELE1BRU87QUFDTG1CLGlCQUFhcEIsQ0FBYixFQUFnQkMsQ0FBaEI7QUFDRDtBQUNGIiwiZmlsZSI6IjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBNT1ZFTUVOVCA9IHtcbiAgbm9uZTogMCxcbiAgZGlhZ29uYWw6IDEsXG4gIHZlcnRpY2FsOiAyLFxuICBob3Jpem9udGFsOiAzLFxufTtcblxuZnVuY3Rpb24gaW5pdE1hdHJpeChoZWlnaHQsIHdpZHRoKSB7XG4gIGNvbnN0IHJvd3MgPSBuZXcgQXJyYXkoaGVpZ2h0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgcm93c1tpXSA9IG5ldyBJbnQzMkFycmF5KHdpZHRoKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlKGEsIGIpIHtcbiAgLy8gYWRhcHRlZCBmcm9tXG4gIC8vIGh0dHA6Ly9hbGdvcml0aG1zLnR1dG9yaWFsaG9yaXpvbi5jb20vZHluYW1pYy1wcm9ncmFtbWluZy1sb25nZXN0LWNvbW1vbi1zdWJzZXF1ZW5jZS9cbiAgY29uc3QgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICBjb25zdCBiTGVuZ3RoID0gYi5sZW5ndGg7XG4gIGNvbnN0IG1lbW8gPSBpbml0TWF0cml4KGFMZW5ndGggKyAxLCBiTGVuZ3RoICsgMSk7XG4gIGNvbnN0IHNvbHV0aW9uID0gaW5pdE1hdHJpeChhTGVuZ3RoICsgMSwgYkxlbmd0aCArIDEpO1xuXG4gIC8vIExvb3AgYW5kIGZpbmQgdGhlIHNvbHV0aW9uXG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IGFMZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGJMZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFbaSAtIDFdID09PSBiW2ogLSAxXSkge1xuICAgICAgICAvLyBkaWFnb25hbFxuICAgICAgICBtZW1vW2ldW2pdID0gbWVtb1tpIC0gMV1baiAtIDFdICsgMTtcbiAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC5kaWFnb25hbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1heChtZW1vW2kgLSAxXVtqXSwgbWVtb1tpXVtqIC0gMV0pO1xuICAgICAgICBpZiAobWVtb1tpXVtqXSA9PT0gbWVtb1tpIC0gMV1bal0pIHtcbiAgICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULnZlcnRpY2FsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQuaG9yaXpvbnRhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobWVtb1thTGVuZ3RoXVtiTGVuZ3RoXSA9PT0gMCkge1xuICAgIC8vIE5vIHNvbHR1aW9uIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHNvbHV0aW9uO1xufVxuXG5mdW5jdGlvbiBwbGFjZWhvbGRlcnMoY291bnQpIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGNvdW50KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gJysnO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEFwcGx5IGFuIGxjcyBzb2x1dGlvbiB0byBhcnJheXMuIE5vdGUgdGhhdCB0aGlzIHdpbGwgTVVUQVRFIHRoZSBhcnJheXMsXG4gKiBpbmplY3RpbmcgXCIrXCIgd2hlcmUgZ2FwcyBhcmUgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk+fSBzb2x1dGlvbiBhcyBjb21wdXRlZCBieSBgbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlYFxuICogQHBhcmFtIHtBcnJheX0gYVxuICogQHBhcmFtIHtBcnJheX0gYlxuICovXG5mdW5jdGlvbiBhcHBseVNvbHV0aW9uKHNvbHV0aW9uLCBhLCBiKSB7XG4gIGxldCBtb3ZlbWVudCA9IHNvbHV0aW9uW2EubGVuZ3RoXVtiLmxlbmd0aF07XG4gIGxldCBhaSA9IGEubGVuZ3RoO1xuICBsZXQgYmkgPSBiLmxlbmd0aDtcbiAgbGV0IGNoYW5nZXMgPSAwO1xuXG4gIGZ1bmN0aW9uIGFwcGx5Q2hhbmdlKCkge1xuICAgIGlmIChjaGFuZ2VzIDwgMCkge1xuICAgICAgYi5zcGxpY2UoYmksIDAsIC4uLnBsYWNlaG9sZGVycyhNYXRoLmFicyhjaGFuZ2VzKSkpO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlcyA+IDApIHtcbiAgICAgIGEuc3BsaWNlKGFpLCAwLCAuLi5wbGFjZWhvbGRlcnMoY2hhbmdlcykpO1xuICAgIH1cbiAgICBjaGFuZ2VzID0gMDtcbiAgfVxuXG4gIHdoaWxlIChtb3ZlbWVudCAhPT0gTU9WRU1FTlQubm9uZSkge1xuICAgIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQuZGlhZ29uYWwpIHtcbiAgICAgIGFwcGx5Q2hhbmdlKCk7XG4gICAgICBhaS0tO1xuICAgICAgYmktLTtcbiAgICB9IGVsc2UgaWYgKG1vdmVtZW50ID09PSBNT1ZFTUVOVC5ob3Jpem9udGFsKSB7XG4gICAgICBiaS0tO1xuICAgICAgY2hhbmdlcysrO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULnZlcnRpY2FsKSB7XG4gICAgICBhaS0tO1xuICAgICAgY2hhbmdlcy0tO1xuICAgIH1cbiAgICBtb3ZlbWVudCA9IHNvbHV0aW9uW2FpXVtiaV07XG4gIH1cbiAgY2hhbmdlcyA9IGFpIC0gYmk7XG4gIGFpID0gMDtcbiAgYmkgPSAwO1xuICAvL2FwcGx5Q2hhbmdlKCk7XG59XG5cbi8qKlxuICogVG8gYmUgY2FsbGVkIGZvciBhcnJheXMgdGhhdCBzaGFyZSBub3RoaW5nIGluIGNvbW1vbi5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyB3aWxsIE1VVEFURSB0aGUgYXJyYXlzLFxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFcbiAqIEBwYXJhbSB7QXJyYXl9IGJcbiAqL1xuZnVuY3Rpb24gYXBwbHlQYWRkaW5nKGEsIGIpIHtcbiAgY29uc3QgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICBjb25zdCBiTGVuZ3RoID0gYi5sZW5ndGg7XG4gIGNvbnN0IHNob3J0ZXJBcnJheSA9IGFMZW5ndGggPiBiTGVuZ3RoID8gYiA6IGE7XG4gIHNob3J0ZXJBcnJheS5wdXNoKC4uLnBsYWNlaG9sZGVycyhNYXRoLmFicyhhTGVuZ3RoIC0gYkxlbmd0aCkpKTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlIG9mIHR3byBhcnJheXMsIHRoZW4gdXNlcyB0aGF0XG4gKiBzb2x1dGlvbiB0byBpbmplY3QgZ2FwcyBpbnRvIHRoZSBhcnJheXMsIG1ha2luZyB0aGVtIGFsaWduIG9uIGNvbW1vblxuICogc3Vic2VxdWVuY2VzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFcbiAqIEBwYXJhbSB7QXJyYXl9IGJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWxpZ25BcnJheXMoYSwgYikge1xuICBjb25zdCBsY3NTb2x1dGlvbiA9IGxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZShhLCBiKTtcbiAgaWYgKGxjc1NvbHV0aW9uKSB7XG4gICAgYXBwbHlTb2x1dGlvbihsY3NTb2x1dGlvbiwgYSwgYik7XG4gIH0gZWxzZSB7XG4gICAgYXBwbHlQYWRkaW5nKGEsIGIpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9hbGlnbkFycmF5cy5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
54
+
55
+ /***/ }
56
+ /******/ ]);
@@ -0,0 +1,56 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n var maxWidth = _ref2.maxWidth;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibWF4V2lkdGgiLCJoYXNoZWRQcmV2aW91c0RhdGEiLCJtYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZiIsInBvc3RNZXNzYWdlIiwicHJvZ3Jlc3MiLCJoYXNoZWRDdXJyZW50RGF0YSIsInRyYW5zcGFyZW50TGluZSIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxuICBtYXhXaWR0aCxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgaGFzaGVkUHJldmlvdXNEYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShpLCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBhbGlnbih7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgICBtYXhXaWR0aCxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n console.log(memo);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n return solution;\n}\n\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n ai--;\n bi--;\n } else if (movement === MOVEMENT.horizontal) {\n a.splice([ai], 0, '+');\n bi--;\n } else if (movement === MOVEMENT.vertical) {\n b.splice([bi], 0, '+');\n ai--;\n }\n movement = solution[ai][bi];\n }\n}\n\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n applySolution(lcsSolution, a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiY29uc29sZSIsImxvZyIsImoiLCJNYXRoIiwibWF4IiwiYXBwbHlTb2x1dGlvbiIsIm1vdmVtZW50IiwiYWkiLCJiaSIsInNwbGljZSIsImxjc1NvbHV0aW9uIl0sIm1hcHBpbmdzIjoiOzs7OztrQkFnRndCQSxXO0FBaEZ4QixJQUFNQyxXQUFXO0FBQ2ZDLFFBQU0sQ0FEUztBQUVmQyxZQUFVLENBRks7QUFHZkMsWUFBVSxDQUhLO0FBSWZDLGNBQVk7QUFKRyxDQUFqQjs7QUFPQSxTQUFTQyxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsS0FBNUIsRUFBbUM7QUFDakMsTUFBTUMsT0FBTyxJQUFJQyxLQUFKLENBQVVILE1BQVYsQ0FBYjtBQUNBLE9BQUssSUFBSUksSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixLQUFLRyxNQUF6QixFQUFpQ0QsR0FBakMsRUFBc0M7QUFDcENGLFNBQUtFLENBQUwsSUFBVSxJQUFJRSxVQUFKLENBQWVMLEtBQWYsQ0FBVjtBQUNEO0FBQ0QsU0FBT0MsSUFBUDtBQUNEOztBQUVELFNBQVNLLHdCQUFULENBQWtDQyxDQUFsQyxFQUFxQ0MsQ0FBckMsRUFBd0M7QUFDdEM7QUFDQTtBQUNBLE1BQU1DLFVBQVVGLEVBQUVILE1BQWxCO0FBQ0EsTUFBTU0sVUFBVUYsRUFBRUosTUFBbEI7QUFDQSxNQUFNTyxPQUFPYixXQUFXVyxVQUFVLENBQXJCLEVBQXdCQyxVQUFVLENBQWxDLENBQWI7QUFDQSxNQUFNRSxXQUFXZCxXQUFXVyxVQUFVLENBQXJCLEVBQXdCQyxVQUFVLENBQWxDLENBQWpCO0FBQ0FHLFVBQVFDLEdBQVIsQ0FBWUgsSUFBWjs7QUFFQTtBQUNBLE9BQUssSUFBSVIsSUFBSSxDQUFiLEVBQWdCQSxLQUFLTSxPQUFyQixFQUE4Qk4sR0FBOUIsRUFBbUM7QUFDakMsU0FBSyxJQUFJWSxJQUFJLENBQWIsRUFBZ0JBLEtBQUtMLE9BQXJCLEVBQThCSyxHQUE5QixFQUFtQztBQUNqQyxVQUFJUixFQUFFSixJQUFJLENBQU4sTUFBYUssRUFBRU8sSUFBSSxDQUFOLENBQWpCLEVBQTJCO0FBQ3pCO0FBQ0FKLGFBQUtSLENBQUwsRUFBUVksQ0FBUixJQUFhSixLQUFLUixJQUFJLENBQVQsRUFBWVksSUFBSSxDQUFoQixJQUFxQixDQUFsQztBQUNBSCxpQkFBU1QsQ0FBVCxFQUFZWSxDQUFaLElBQWlCdEIsU0FBU0UsUUFBMUI7QUFDRCxPQUpELE1BSU87QUFDTGdCLGFBQUtSLENBQUwsRUFBUVksQ0FBUixJQUFhQyxLQUFLQyxHQUFMLENBQVNOLEtBQUtSLElBQUksQ0FBVCxFQUFZWSxDQUFaLENBQVQsRUFBeUJKLEtBQUtSLENBQUwsRUFBUVksSUFBSSxDQUFaLENBQXpCLENBQWI7QUFDQSxZQUFJSixLQUFLUixDQUFMLEVBQVFZLENBQVIsTUFBZUosS0FBS1IsSUFBSSxDQUFULEVBQVlZLENBQVosQ0FBbkIsRUFBbUM7QUFDakNILG1CQUFTVCxDQUFULEVBQVlZLENBQVosSUFBaUJ0QixTQUFTRyxRQUExQjtBQUNELFNBRkQsTUFFTztBQUNMZ0IsbUJBQVNULENBQVQsRUFBWVksQ0FBWixJQUFpQnRCLFNBQVNJLFVBQTFCO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7QUFDRCxTQUFPZSxRQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O0FBUUEsU0FBU00sYUFBVCxDQUF1Qk4sUUFBdkIsRUFBaUNMLENBQWpDLEVBQW9DQyxDQUFwQyxFQUF1QztBQUNyQyxNQUFJVyxXQUFXUCxTQUFTTCxFQUFFSCxNQUFYLEVBQW1CSSxFQUFFSixNQUFyQixDQUFmO0FBQ0EsTUFBSWdCLEtBQUtiLEVBQUVILE1BQVg7QUFDQSxNQUFJaUIsS0FBS2IsRUFBRUosTUFBWDs7QUFFQSxTQUFPZSxhQUFhMUIsU0FBU0MsSUFBN0IsRUFBbUM7QUFDakMsUUFBSXlCLGFBQWExQixTQUFTRSxRQUExQixFQUFvQztBQUNsQ3lCO0FBQ0FDO0FBQ0QsS0FIRCxNQUdPLElBQUlGLGFBQWExQixTQUFTSSxVQUExQixFQUFzQztBQUMzQ1UsUUFBRWUsTUFBRixDQUFTLENBQUNGLEVBQUQsQ0FBVCxFQUFlLENBQWYsRUFBa0IsR0FBbEI7QUFDQUM7QUFDRCxLQUhNLE1BR0EsSUFBSUYsYUFBYTFCLFNBQVNHLFFBQTFCLEVBQW9DO0FBQ3pDWSxRQUFFYyxNQUFGLENBQVMsQ0FBQ0QsRUFBRCxDQUFULEVBQWUsQ0FBZixFQUFrQixHQUFsQjtBQUNBRDtBQUNEO0FBQ0RELGVBQVdQLFNBQVNRLEVBQVQsRUFBYUMsRUFBYixDQUFYO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7QUFRZSxTQUFTN0IsV0FBVCxDQUFxQmUsQ0FBckIsRUFBd0JDLENBQXhCLEVBQTJCO0FBQ3hDLE1BQU1lLGNBQWNqQix5QkFBeUJDLENBQXpCLEVBQTRCQyxDQUE1QixDQUFwQjtBQUNBVSxnQkFBY0ssV0FBZCxFQUEyQmhCLENBQTNCLEVBQThCQyxDQUE5QjtBQUNEIiwiZmlsZSI6IjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBNT1ZFTUVOVCA9IHtcbiAgbm9uZTogMCxcbiAgZGlhZ29uYWw6IDEsXG4gIHZlcnRpY2FsOiAyLFxuICBob3Jpem9udGFsOiAzLFxufTtcblxuZnVuY3Rpb24gaW5pdE1hdHJpeChoZWlnaHQsIHdpZHRoKSB7XG4gIGNvbnN0IHJvd3MgPSBuZXcgQXJyYXkoaGVpZ2h0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgcm93c1tpXSA9IG5ldyBJbnQzMkFycmF5KHdpZHRoKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlKGEsIGIpIHtcbiAgLy8gYWRhcHRlZCBmcm9tXG4gIC8vIGh0dHA6Ly9hbGdvcml0aG1zLnR1dG9yaWFsaG9yaXpvbi5jb20vZHluYW1pYy1wcm9ncmFtbWluZy1sb25nZXN0LWNvbW1vbi1zdWJzZXF1ZW5jZS9cbiAgY29uc3QgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICBjb25zdCBiTGVuZ3RoID0gYi5sZW5ndGg7XG4gIGNvbnN0IG1lbW8gPSBpbml0TWF0cml4KGFMZW5ndGggKyAxLCBiTGVuZ3RoICsgMSk7XG4gIGNvbnN0IHNvbHV0aW9uID0gaW5pdE1hdHJpeChhTGVuZ3RoICsgMSwgYkxlbmd0aCArIDEpO1xuICBjb25zb2xlLmxvZyhtZW1vKVxuXG4gIC8vIExvb3AgYW5kIGZpbmQgdGhlIHNvbHV0aW9uXG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IGFMZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGJMZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFbaSAtIDFdID09PSBiW2ogLSAxXSkge1xuICAgICAgICAvLyBkaWFnb25hbFxuICAgICAgICBtZW1vW2ldW2pdID0gbWVtb1tpIC0gMV1baiAtIDFdICsgMTtcbiAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC5kaWFnb25hbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1heChtZW1vW2kgLSAxXVtqXSwgbWVtb1tpXVtqIC0gMV0pO1xuICAgICAgICBpZiAobWVtb1tpXVtqXSA9PT0gbWVtb1tpIC0gMV1bal0pIHtcbiAgICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULnZlcnRpY2FsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQuaG9yaXpvbnRhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc29sdXRpb247XG59XG5cbi8qKlxuICogQXBwbHkgYW4gbGNzIHNvbHV0aW9uIHRvIGFycmF5cy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBNVVRBVEUgdGhlIGFycmF5cyxcbiAqIGluamVjdGluZyBcIitcIiB3aGVyZSBnYXBzIGFyZSBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxBcnJheT59IHNvbHV0aW9uIGFzIGNvbXB1dGVkIGJ5IGBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2VgXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U29sdXRpb24oc29sdXRpb24sIGEsIGIpIHtcbiAgbGV0IG1vdmVtZW50ID0gc29sdXRpb25bYS5sZW5ndGhdW2IubGVuZ3RoXTtcbiAgbGV0IGFpID0gYS5sZW5ndGg7XG4gIGxldCBiaSA9IGIubGVuZ3RoO1xuXG4gIHdoaWxlIChtb3ZlbWVudCAhPT0gTU9WRU1FTlQubm9uZSkge1xuICAgIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQuZGlhZ29uYWwpIHtcbiAgICAgIGFpLS07XG4gICAgICBiaS0tO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULmhvcml6b250YWwpIHtcbiAgICAgIGEuc3BsaWNlKFthaV0sIDAsICcrJyk7XG4gICAgICBiaS0tO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULnZlcnRpY2FsKSB7XG4gICAgICBiLnNwbGljZShbYmldLCAwLCAnKycpO1xuICAgICAgYWktLTtcbiAgICB9XG4gICAgbW92ZW1lbnQgPSBzb2x1dGlvblthaV1bYmldO1xuICB9XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlIG9mIHR3byBhcnJheXMsIHRoZW4gdXNlcyB0aGF0XG4gKiBzb2x1dGlvbiB0byBpbmplY3QgZ2FwcyBpbnRvIHRoZSBhcnJheXMsIG1ha2luZyB0aGVtIGFsaWduIG9uIGNvbW1vblxuICogc3Vic2VxdWVuY2VzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFcbiAqIEBwYXJhbSB7QXJyYXl9IGJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWxpZ25BcnJheXMoYSwgYikge1xuICBjb25zdCBsY3NTb2x1dGlvbiA9IGxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZShhLCBiKTtcbiAgYXBwbHlTb2x1dGlvbihsY3NTb2x1dGlvbiwgYSwgYik7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9hbGlnbkFycmF5cy5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
54
+
55
+ /***/ }
56
+ /******/ ]);
@@ -0,0 +1,56 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n var maxWidth = _ref2.maxWidth;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibWF4V2lkdGgiLCJoYXNoZWRQcmV2aW91c0RhdGEiLCJtYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZiIsInBvc3RNZXNzYWdlIiwicHJvZ3Jlc3MiLCJoYXNoZWRDdXJyZW50RGF0YSIsInRyYW5zcGFyZW50TGluZSIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxuICBtYXhXaWR0aCxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgaGFzaGVkUHJldmlvdXNEYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShpLCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBhbGlnbih7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgICBtYXhXaWR0aCxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n if (memo[aLength][bLength] === 0) {\n // No solution found\n return null;\n }\n return solution;\n}\n\nfunction placeholders(count) {\n var result = new Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = '+';\n }\n return result;\n}\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n var changes = 0;\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n if (changes < 0) {\n b.splice.apply(b, [bi, 0].concat(_toConsumableArray(placeholders(Math.abs(changes)))));\n } else if (changes > 0) {\n a.splice.apply(a, [ai, 0].concat(_toConsumableArray(placeholders(changes))));\n }\n ai--;\n bi--;\n changes = 0;\n } else if (movement === MOVEMENT.horizontal) {\n bi--;\n changes++;\n } else if (movement === MOVEMENT.vertical) {\n ai--;\n changes--;\n }\n movement = solution[ai][bi];\n }\n}\n\n/**\n * To be called for arrays that share nothing in common.\n *\n * Note that this will MUTATE the arrays,\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction applyPadding(a, b) {\n var aLength = a.length;\n var bLength = b.length;\n var shorterArray = aLength > bLength ? b : a;\n shorterArray.push.apply(shorterArray, _toConsumableArray(placeholders(Math.abs(aLength - bLength))));\n}\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n applyPadding(a, b);\n var lcsSolution = longestCommonSubsequence(a, b);\n console.log(a, b);\n if (lcsSolution) {\n applySolution(lcsSolution, a, b);\n }\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJwbGFjZWhvbGRlcnMiLCJjb3VudCIsInJlc3VsdCIsImFwcGx5U29sdXRpb24iLCJtb3ZlbWVudCIsImFpIiwiYmkiLCJjaGFuZ2VzIiwic3BsaWNlIiwiYWJzIiwiYXBwbHlQYWRkaW5nIiwic2hvcnRlckFycmF5IiwicHVzaCIsImxjc1NvbHV0aW9uIiwiY29uc29sZSIsImxvZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBK0d3QkEsVzs7OztBQS9HeEIsSUFBTUMsV0FBVztBQUNmQyxRQUFNLENBRFM7QUFFZkMsWUFBVSxDQUZLO0FBR2ZDLFlBQVUsQ0FISztBQUlmQyxjQUFZO0FBSkcsQ0FBakI7O0FBT0EsU0FBU0MsVUFBVCxDQUFvQkMsTUFBcEIsRUFBNEJDLEtBQTVCLEVBQW1DO0FBQ2pDLE1BQU1DLE9BQU8sSUFBSUMsS0FBSixDQUFVSCxNQUFWLENBQWI7QUFDQSxPQUFLLElBQUlJLElBQUksQ0FBYixFQUFnQkEsSUFBSUYsS0FBS0csTUFBekIsRUFBaUNELEdBQWpDLEVBQXNDO0FBQ3BDRixTQUFLRSxDQUFMLElBQVUsSUFBSUUsVUFBSixDQUFlTCxLQUFmLENBQVY7QUFDRDtBQUNELFNBQU9DLElBQVA7QUFDRDs7QUFFRCxTQUFTSyx3QkFBVCxDQUFrQ0MsQ0FBbEMsRUFBcUNDLENBQXJDLEVBQXdDO0FBQ3RDO0FBQ0E7QUFDQSxNQUFNQyxVQUFV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RTtBQUNEO0FBQ0RILGVBQVdSLFNBQVNTLEVBQVQsRUFBYUMsRUFBYixDQUFYO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7QUFRQSxTQUFTSSxZQUFULENBQXNCbkIsQ0FBdEIsRUFBeUJDLENBQXpCLEVBQTRCO0FBQzFCLE1BQU1DLFVBQVVGLEVBQUVILE1BQWxCO0FBQ0EsTUFBTU0sVUFBVUYsRUFBRUosTUFBbEI7QUFDQSxNQUFNdUIsZUFBZWxCLFVBQVVDLE9BQVYsR0FBb0JGLENBQXBCLEdBQXdCRCxDQUE3QztBQUNBb0IsZUFBYUMsSUFBYix3Q0FBcUJaLGFBQWFGLEtBQUtXLEdBQUwsQ0FBU2hCLFVBQVVDLE9BQW5CLENBQWIsQ0FBckI7QUFDRDtBQUNEOzs7Ozs7OztBQVFlLFNBQVNsQixXQUFULENBQXFCZSxDQUFyQixFQUF3QkMsQ0FBeEIsRUFBMkI7QUFDeENrQixlQUFhbkIsQ0FBYixFQUFnQkMsQ0FBaEI7QUFDQSxNQUFNcUIsY0FBY3ZCLHlCQUF5QkMsQ0FBekIsRUFBNEJDLENBQTVCLENBQXBCO0FBQ0FzQixVQUFRQyxHQUFSLENBQVl4QixDQUFaLEVBQWVDLENBQWY7QUFDQSxNQUFJcUIsV0FBSixFQUFpQjtBQUNmVixrQkFBY1UsV0FBZCxFQUEyQnRCLENBQTNCLEVBQThCQyxDQUE5QjtBQUNEO0FBQ0YiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IE1PVkVNRU5UID0ge1xuICBub25lOiAwLFxuICBkaWFnb25hbDogMSxcbiAgdmVydGljYWw6IDIsXG4gIGhvcml6b250YWw6IDMsXG59O1xuXG5mdW5jdGlvbiBpbml0TWF0cml4KGhlaWdodCwgd2lkdGgpIHtcbiAgY29uc3Qgcm93cyA9IG5ldyBBcnJheShoZWlnaHQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICByb3dzW2ldID0gbmV3IEludDMyQXJyYXkod2lkdGgpO1xuICB9XG4gIHJldHVybiByb3dzO1xufVxuXG5mdW5jdGlvbiBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UoYSwgYikge1xuICAvLyBhZGFwdGVkIGZyb21cbiAgLy8gaHR0cDovL2FsZ29yaXRobXMudHV0b3JpYWxob3Jpem9uLmNvbS9keW5hbWljLXByb2dyYW1taW5nLWxvbmdlc3QtY29tbW9uLXN1YnNlcXVlbmNlL1xuICBjb25zdCBhTGVuZ3RoID0gYS5sZW5ndGg7XG4gIGNvbnN0IGJMZW5ndGggPSBiLmxlbmd0aDtcbiAgY29uc3QgbWVtbyA9IGluaXRNYXRyaXgoYUxlbmd0aCArIDEsIGJMZW5ndGggKyAxKTtcbiAgY29uc3Qgc29sdXRpb24gPSBpbml0TWF0cml4KGFMZW5ndGggKyAxLCBiTGVuZ3RoICsgMSk7XG5cbiAgLy8gTG9vcCBhbmQgZmluZCB0aGUgc29sdXRpb25cbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYUxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDE7IGogPD0gYkxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoYVtpIC0gMV0gPT09IGJbaiAtIDFdKSB7XG4gICAgICAgIC8vIGRpYWdvbmFsXG4gICAgICAgIG1lbW9baV1bal0gPSBtZW1vW2kgLSAxXVtqIC0gMV0gKyAxO1xuICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULmRpYWdvbmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVtb1tpXVtqXSA9IE1hdGgubWF4KG1lbW9baSAtIDFdW2pdLCBtZW1vW2ldW2ogLSAxXSk7XG4gICAgICAgIGlmIChtZW1vW2ldW2pdID09PSBtZW1vW2kgLSAxXVtqXSkge1xuICAgICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQudmVydGljYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC5ob3Jpem9udGFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChtZW1vW2FMZW5ndGhdW2JMZW5ndGhdID09PSAwKSB7XG4gICAgLy8gTm8gc29sdXRpb24gZm91bmRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gc29sdXRpb247XG59XG5cbmZ1bmN0aW9uIHBsYWNlaG9sZGVycyhjb3VudCkge1xuICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoY291bnQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSAnKyc7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQXBwbHkgYW4gbGNzIHNvbHV0aW9uIHRvIGFycmF5cy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBNVVRBVEUgdGhlIGFycmF5cyxcbiAqIGluamVjdGluZyBcIitcIiB3aGVyZSBnYXBzIGFyZSBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxBcnJheT59IHNvbHV0aW9uIGFzIGNvbXB1dGVkIGJ5IGBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2VgXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U29sdXRpb24oc29sdXRpb24sIGEsIGIpIHtcbiAgbGV0IG1vdmVtZW50ID0gc29sdXRpb25bYS5sZW5ndGhdW2IubGVuZ3RoXTtcbiAgbGV0IGFpID0gYS5sZW5ndGg7XG4gIGxldCBiaSA9IGIubGVuZ3RoO1xuICBsZXQgY2hhbmdlcyA9IDA7XG5cbiAgd2hpbGUgKG1vdmVtZW50ICE9PSBNT1ZFTUVOVC5ub25lKSB7XG4gICAgaWYgKG1vdmVtZW50ID09PSBNT1ZFTUVOVC5kaWFnb25hbCkge1xuICAgICAgaWYgKGNoYW5nZXMgPCAwKSB7XG4gICAgICAgIGIuc3BsaWNlKGJpLCAwLCAuLi5wbGFjZWhvbGRlcnMoTWF0aC5hYnMoY2hhbmdlcykpKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcyA+IDApIHtcbiAgICAgICAgYS5zcGxpY2UoYWksIDAsIC4uLnBsYWNlaG9sZGVycyhjaGFuZ2VzKSk7XG4gICAgICB9XG4gICAgICBhaS0tO1xuICAgICAgYmktLTtcbiAgICAgIGNoYW5nZXMgPSAwO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULmhvcml6b250YWwpIHtcbiAgICAgIGJpLS07XG4gICAgICBjaGFuZ2VzKys7XG4gICAgfSBlbHNlIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQudmVydGljYWwpIHtcbiAgICAgIGFpLS07XG4gICAgICBjaGFuZ2VzLS07XG4gICAgfVxuICAgIG1vdmVtZW50ID0gc29sdXRpb25bYWldW2JpXTtcbiAgfVxufVxuXG4vKipcbiAqIFRvIGJlIGNhbGxlZCBmb3IgYXJyYXlzIHRoYXQgc2hhcmUgbm90aGluZyBpbiBjb21tb24uXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgd2lsbCBNVVRBVEUgdGhlIGFycmF5cyxcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UGFkZGluZyhhLCBiKSB7XG4gIGNvbnN0IGFMZW5ndGggPSBhLmxlbmd0aDtcbiAgY29uc3QgYkxlbmd0aCA9IGIubGVuZ3RoO1xuICBjb25zdCBzaG9ydGVyQXJyYXkgPSBhTGVuZ3RoID4gYkxlbmd0aCA/IGIgOiBhO1xuICBzaG9ydGVyQXJyYXkucHVzaCguLi5wbGFjZWhvbGRlcnMoTWF0aC5hYnMoYUxlbmd0aCAtIGJMZW5ndGgpKSk7XG59XG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb25nZXN0IGNvbW1vbiBzdWJzZXF1ZW5jZSBvZiB0d28gYXJyYXlzLCB0aGVuIHVzZXMgdGhhdFxuICogc29sdXRpb24gdG8gaW5qZWN0IGdhcHMgaW50byB0aGUgYXJyYXlzLCBtYWtpbmcgdGhlbSBhbGlnbiBvbiBjb21tb25cbiAqIHN1YnNlcXVlbmNlcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFsaWduQXJyYXlzKGEsIGIpIHtcbiAgYXBwbHlQYWRkaW5nKGEsIGIpO1xuICBjb25zdCBsY3NTb2x1dGlvbiA9IGxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZShhLCBiKTtcbiAgY29uc29sZS5sb2coYSwgYilcbiAgaWYgKGxjc1NvbHV0aW9uKSB7XG4gICAgYXBwbHlTb2x1dGlvbihsY3NTb2x1dGlvbiwgYSwgYik7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2FsaWduQXJyYXlzLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ }
56
+ /******/ ]);
@@ -0,0 +1,56 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n var maxWidth = _ref2.maxWidth;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibWF4V2lkdGgiLCJoYXNoZWRQcmV2aW91c0RhdGEiLCJtYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZiIsInBvc3RNZXNzYWdlIiwicHJvZ3Jlc3MiLCJoYXNoZWRDdXJyZW50RGF0YSIsInRyYW5zcGFyZW50TGluZSIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxuICBtYXhXaWR0aCxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgaGFzaGVkUHJldmlvdXNEYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShpLCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBhbGlnbih7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgICBtYXhXaWR0aCxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n console.log(memo);\n return solution;\n}\n\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n ai--;\n bi--;\n } else if (movement === MOVEMENT.horizontal) {\n a.splice([ai], 0, '+');\n bi--;\n } else if (movement === MOVEMENT.vertical) {\n b.splice([bi], 0, '+');\n ai--;\n }\n movement = solution[ai][bi];\n }\n}\n\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n applySolution(lcsSolution, a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJjb25zb2xlIiwibG9nIiwiYXBwbHlTb2x1dGlvbiIsIm1vdmVtZW50IiwiYWkiLCJiaSIsInNwbGljZSIsImxjc1NvbHV0aW9uIl0sIm1hcHBpbmdzIjoiOzs7OztrQkFnRndCQSxXO0FBaEZ4QixJQUFNQyxXQUFXO0FBQ2ZDLFFBQU0sQ0FEUztBQUVmQyxZQUFVLENBRks7QUFHZkMsWUFBVSxDQUhLO0FBSWZDLGNBQVk7QUFKRyxDQUFqQjs7QUFPQSxTQUFTQyxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsS0FBNUIsRUFBbUM7QUFDakMsTUFBTUMsT0FBTyxJQUFJQyxLQUFKLENBQVVILE1BQVYsQ0FBYjtBQUNBLE9BQUssSUFBSUksSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixLQUFLRyxNQUF6QixFQUFpQ0QsR0FBakMsRUFBc0M7QUFDcENGLFNBQUtFLENBQUwsSUFBVSxJQUFJRSxVQUFKLENBQWVMLEtBQWYsQ0FBVjtBQUNEO0FBQ0QsU0FBT0MsSUFBUDtBQUNEOztBQUVELFNBQVNLLHdCQUFULENBQWtDQyxDQUFsQyxFQUFxQ0MsQ0FBckMsRUFBd0M7QUFDdEM7QUFDQTtBQUNBLE1BQU1DLFVBQVVGLEVBQUVILE1BQWxCO0FBQ0EsTUFBTU0sVUFBVUYsRUFBRUosTUFBbEI7QUFDQSxNQUFNTyxPQUFPYixXQUFXVyxVQUFVLENBQXJCLEVBQXdCQyxVQUFVLENBQWxDLENBQWI7QUFDQSxNQUFNRSxXQUFXZCxXQUFXVyxVQUFVLENBQXJCLEVBQXdCQyxVQUFVLENBQWxDLENBQWpCOztBQUVBO0FBQ0EsT0FBSyxJQUFJUCxJQUFJLENBQWIsRUFBZ0JBLEtBQUtNLE9BQXJCLEVBQThCTixHQUE5QixFQUFtQztBQUNqQyxTQUFLLElBQUlVLElBQUksQ0FBYixFQUFnQkEsS0FBS0gsT0FBckIsRUFBOEJHLEdBQTlCLEVBQW1DO0FBQ2pDLFVBQUlOLEVBQUVKLElBQUksQ0FBTixNQUFhSyxFQUFFSyxJQUFJLENBQU4sQ0FBakIsRUFBMkI7QUFDekI7QUFDQUYsYUFBS1IsQ0FBTCxFQUFRVSxDQUFSLElBQWFGLEtBQUtSLElBQUksQ0FBVCxFQUFZVSxJQUFJLENBQWhCLElBQXFCLENBQWxDO0FBQ0FELGlCQUFTVCxDQUFULEVBQVlVLENBQVosSUFBaUJwQixTQUFTRSxRQUExQjtBQUNELE9BSkQsTUFJTztBQUNMZ0IsYUFBS1IsQ0FBTCxFQUFRVSxDQUFSLElBQWFDLEtBQUtDLEdBQUwsQ0FBU0osS0FBS1IsSUFBSSxDQUFULEVBQVlVLENBQVosQ0FBVCxFQUF5QkYsS0FBS1IsQ0FBTCxFQUFRVSxJQUFJLENBQVosQ0FBekIsQ0FBYjtBQUNBLFlBQUlGLEtBQUtSLENBQUwsRUFBUVUsQ0FBUixNQUFlRixLQUFLUixJQUFJLENBQVQsRUFBWVUsQ0FBWixDQUFuQixFQUFtQztBQUNqQ0QsbUJBQVNULENBQVQsRUFBWVUsQ0FBWixJQUFpQnBCLFNBQVNHLFFBQTFCO0FBQ0QsU0FGRCxNQUVPO0FBQ0xnQixtQkFBU1QsQ0FBVCxFQUFZVSxDQUFaLElBQWlCcEIsU0FBU0ksVUFBMUI7QUFDRDtBQUNGO0FBQ0Y7QUFDRjtBQUNEbUIsVUFBUUMsR0FBUixDQUFZTixJQUFaO0FBQ0EsU0FBT0MsUUFBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFBLFNBQVNNLGFBQVQsQ0FBdUJOLFFBQXZCLEVBQWlDTCxDQUFqQyxFQUFvQ0MsQ0FBcEMsRUFBdUM7QUFDckMsTUFBSVcsV0FBV1AsU0FBU0wsRUFBRUgsTUFBWCxFQUFtQkksRUFBRUosTUFBckIsQ0FBZjtBQUNBLE1BQUlnQixLQUFLYixFQUFFSCxNQUFYO0FBQ0EsTUFBSWlCLEtBQUtiLEVBQUVKLE1BQVg7O0FBRUEsU0FBT2UsYUFBYTFCLFNBQVNDLElBQTdCLEVBQW1DO0FBQ2pDLFFBQUl5QixhQUFhMUIsU0FBU0UsUUFBMUIsRUFBb0M7QUFDbEN5QjtBQUNBQztBQUNELEtBSEQsTUFHTyxJQUFJRixhQUFhMUIsU0FBU0ksVUFBMUIsRUFBc0M7QUFDM0NVLFFBQUVlLE1BQUYsQ0FBUyxDQUFDRixFQUFELENBQVQsRUFBZSxDQUFmLEVBQWtCLEdBQWxCO0FBQ0FDO0FBQ0QsS0FITSxNQUdBLElBQUlGLGFBQWExQixTQUFTRyxRQUExQixFQUFvQztBQUN6Q1ksUUFBRWMsTUFBRixDQUFTLENBQUNELEVBQUQsQ0FBVCxFQUFlLENBQWYsRUFBa0IsR0FBbEI7QUFDQUQ7QUFDRDtBQUNERCxlQUFXUCxTQUFTUSxFQUFULEVBQWFDLEVBQWIsQ0FBWDtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7O0FBUWUsU0FBUzdCLFdBQVQsQ0FBcUJlLENBQXJCLEVBQXdCQyxDQUF4QixFQUEyQjtBQUN4QyxNQUFNZSxjQUFjakIseUJBQXlCQyxDQUF6QixFQUE0QkMsQ0FBNUIsQ0FBcEI7QUFDQVUsZ0JBQWNLLFdBQWQsRUFBMkJoQixDQUEzQixFQUE4QkMsQ0FBOUI7QUFDRCIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgTU9WRU1FTlQgPSB7XG4gIG5vbmU6IDAsXG4gIGRpYWdvbmFsOiAxLFxuICB2ZXJ0aWNhbDogMixcbiAgaG9yaXpvbnRhbDogMyxcbn07XG5cbmZ1bmN0aW9uIGluaXRNYXRyaXgoaGVpZ2h0LCB3aWR0aCkge1xuICBjb25zdCByb3dzID0gbmV3IEFycmF5KGhlaWdodCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIHJvd3NbaV0gPSBuZXcgSW50MzJBcnJheSh3aWR0aCk7XG4gIH1cbiAgcmV0dXJuIHJvd3M7XG59XG5cbmZ1bmN0aW9uIGxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZShhLCBiKSB7XG4gIC8vIGFkYXB0ZWQgZnJvbVxuICAvLyBodHRwOi8vYWxnb3JpdGhtcy50dXRvcmlhbGhvcml6b24uY29tL2R5bmFtaWMtcHJvZ3JhbW1pbmctbG9uZ2VzdC1jb21tb24tc3Vic2VxdWVuY2UvXG4gIGNvbnN0IGFMZW5ndGggPSBhLmxlbmd0aDtcbiAgY29uc3QgYkxlbmd0aCA9IGIubGVuZ3RoO1xuICBjb25zdCBtZW1vID0gaW5pdE1hdHJpeChhTGVuZ3RoICsgMSwgYkxlbmd0aCArIDEpO1xuICBjb25zdCBzb2x1dGlvbiA9IGluaXRNYXRyaXgoYUxlbmd0aCArIDEsIGJMZW5ndGggKyAxKTtcblxuICAvLyBMb29wIGFuZCBmaW5kIHRoZSBzb2x1dGlvblxuICBmb3IgKGxldCBpID0gMTsgaSA8PSBhTGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBiTGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgICAgLy8gZGlhZ29uYWxcbiAgICAgICAgbWVtb1tpXVtqXSA9IG1lbW9baSAtIDFdW2ogLSAxXSArIDE7XG4gICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQuZGlhZ29uYWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZW1vW2ldW2pdID0gTWF0aC5tYXgobWVtb1tpIC0gMV1bal0sIG1lbW9baV1baiAtIDFdKTtcbiAgICAgICAgaWYgKG1lbW9baV1bal0gPT09IG1lbW9baSAtIDFdW2pdKSB7XG4gICAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC52ZXJ0aWNhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULmhvcml6b250YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc29sZS5sb2cobWVtbylcbiAgcmV0dXJuIHNvbHV0aW9uO1xufVxuXG4vKipcbiAqIEFwcGx5IGFuIGxjcyBzb2x1dGlvbiB0byBhcnJheXMuIE5vdGUgdGhhdCB0aGlzIHdpbGwgTVVUQVRFIHRoZSBhcnJheXMsXG4gKiBpbmplY3RpbmcgXCIrXCIgd2hlcmUgZ2FwcyBhcmUgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk+fSBzb2x1dGlvbiBhcyBjb21wdXRlZCBieSBgbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlYFxuICogQHBhcmFtIHtBcnJheX0gYVxuICogQHBhcmFtIHtBcnJheX0gYlxuICovXG5mdW5jdGlvbiBhcHBseVNvbHV0aW9uKHNvbHV0aW9uLCBhLCBiKSB7XG4gIGxldCBtb3ZlbWVudCA9IHNvbHV0aW9uW2EubGVuZ3RoXVtiLmxlbmd0aF07XG4gIGxldCBhaSA9IGEubGVuZ3RoO1xuICBsZXQgYmkgPSBiLmxlbmd0aDtcblxuICB3aGlsZSAobW92ZW1lbnQgIT09IE1PVkVNRU5ULm5vbmUpIHtcbiAgICBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULmRpYWdvbmFsKSB7XG4gICAgICBhaS0tO1xuICAgICAgYmktLTtcbiAgICB9IGVsc2UgaWYgKG1vdmVtZW50ID09PSBNT1ZFTUVOVC5ob3Jpem9udGFsKSB7XG4gICAgICBhLnNwbGljZShbYWldLCAwLCAnKycpO1xuICAgICAgYmktLTtcbiAgICB9IGVsc2UgaWYgKG1vdmVtZW50ID09PSBNT1ZFTUVOVC52ZXJ0aWNhbCkge1xuICAgICAgYi5zcGxpY2UoW2JpXSwgMCwgJysnKTtcbiAgICAgIGFpLS07XG4gICAgfVxuICAgIG1vdmVtZW50ID0gc29sdXRpb25bYWldW2JpXTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb25nZXN0IGNvbW1vbiBzdWJzZXF1ZW5jZSBvZiB0d28gYXJyYXlzLCB0aGVuIHVzZXMgdGhhdFxuICogc29sdXRpb24gdG8gaW5qZWN0IGdhcHMgaW50byB0aGUgYXJyYXlzLCBtYWtpbmcgdGhlbSBhbGlnbiBvbiBjb21tb25cbiAqIHN1YnNlcXVlbmNlcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFsaWduQXJyYXlzKGEsIGIpIHtcbiAgY29uc3QgbGNzU29sdXRpb24gPSBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UoYSwgYik7XG4gIGFwcGx5U29sdXRpb24obGNzU29sdXRpb24sIGEsIGIpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvYWxpZ25BcnJheXMuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
54
+
55
+ /***/ }
56
+ /******/ ]);
@@ -0,0 +1,56 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n self.postMessage({ progress: 85 });\n self.postMessage({ progress: 98 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwiaGFzaGVkUHJldmlvdXNEYXRhIiwibWFwIiwiSlNPTiIsInN0cmluZ2lmeSIsInNlbGYiLCJwb3N0TWVzc2FnZSIsInByb2dyZXNzIiwiaGFzaGVkQ3VycmVudERhdGEiLCJ0cmFuc3BhcmVudExpbmUiLCJtYXhXaWR0aCIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxufSkge1xuICBjb25zdCBoYXNoZWRQcmV2aW91c0RhdGEgPSBwcmV2aW91c0ltYWdlRGF0YS5tYXAoSlNPTi5zdHJpbmdpZnkpO1xuICBzZWxmLnBvc3RNZXNzYWdlKHsgcHJvZ3Jlc3M6IDQwIH0pO1xuICBjb25zdCBoYXNoZWRDdXJyZW50RGF0YSA9IGN1cnJlbnRJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA2MCB9KTtcblxuICBhbGlnbkFycmF5cyhcbiAgICBoYXNoZWRQcmV2aW91c0RhdGEsXG4gICAgaGFzaGVkQ3VycmVudERhdGFcbiAgKTtcblxuICBjb25zdCB0cmFuc3BhcmVudExpbmUgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobWF4V2lkdGggKiA0KTtcblxuICBoYXNoZWRQcmV2aW91c0RhdGEuZm9yRWFjaCgoaGFzaGVkTGluZSwgaSkgPT4ge1xuICAgIGlmIChoYXNoZWRMaW5lID09PSAnKycpICB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSAge1xuICAgICAgY3VycmVudEltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFRha2VzIHR3byAyZCBpbWFnZXMsIGNvbXB1dGVzIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3bywgYW5kIGluamVjdHMgcGl4ZWxzIHRvXG4gKiBib3RoIGluIG9yZGVyIHRvOlxuICogYSkgbWFrZSBib3RoIGltYWdlcyB0aGUgc2FtZSBoZWlnaHRcbiAqIGIpIHByb3Blcmx5IHZpc3VhbGl6ZSBkaWZmZXJlbmNlc1xuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgTVVUQVRFUyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHByZXZpb3VzRGF0YVxuICogQHBhcmFtIHtBcnJheX0gY3VycmVudERhdGFcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KSB7XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgocHJldmlvdXNEYXRhLndpZHRoLCBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgY29uc3QgcHJldmlvdXNJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBwcmV2aW91c0RhdGEsIG1heFdpZHRoIC0gcHJldmlvdXNEYXRhLndpZHRoKTtcblxuICBjb25zdCBjdXJyZW50SW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgY3VycmVudERhdGEsIG1heFdpZHRoIC0gY3VycmVudERhdGEud2lkdGgpO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogMjAgfSk7XG5cbiAgYWxpZ24oe1xuICAgIHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgIGN1cnJlbnRJbWFnZURhdGEsXG4gIH0pO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogODUgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogOTggfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50RGF0YToge1xuICAgICAgZGF0YTogY3VycmVudEltYWdlRGF0YSxcbiAgICAgIGhlaWdodDogY3VycmVudEltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgICBwcmV2aW91c0RhdGE6IHtcbiAgICAgIGRhdGE6IHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgfTtcbn1cblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YTogeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0gfSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBzZWxmLnBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n return solution;\n}\n\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n ai--;\n bi--;\n } else if (movement === MOVEMENT.horizontal) {\n a.splice([ai], 0, '+');\n bi--;\n } else if (movement === MOVEMENT.vertical) {\n b.splice([bi], 0, '+');\n ai--;\n }\n movement = solution[ai][bi];\n }\n}\n\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n applySolution(lcsSolution, a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJhcHBseVNvbHV0aW9uIiwibW92ZW1lbnQiLCJhaSIsImJpIiwic3BsaWNlIiwibGNzU29sdXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQStFd0JBLFc7QUEvRXhCLElBQU1DLFdBQVc7QUFDZkMsUUFBTSxDQURTO0FBRWZDLFlBQVUsQ0FGSztBQUdmQyxZQUFVLENBSEs7QUFJZkMsY0FBWTtBQUpHLENBQWpCOztBQU9BLFNBQVNDLFVBQVQsQ0FBb0JDLE1BQXBCLEVBQTRCQyxLQUE1QixFQUFtQztBQUNqQyxNQUFNQyxPQUFPLElBQUlDLEtBQUosQ0FBVUgsTUFBVixDQUFiO0FBQ0EsT0FBSyxJQUFJSSxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLEtBQUtHLE1BQXpCLEVBQWlDRCxHQUFqQyxFQUFzQztBQUNwQ0YsU0FBS0UsQ0FBTCxJQUFVLElBQUlFLFVBQUosQ0FBZUwsS0FBZixDQUFWO0FBQ0Q7QUFDRCxTQUFPQyxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0ssd0JBQVQsQ0FBa0NDLENBQWxDLEVBQXFDQyxDQUFyQyxFQUF3QztBQUN0QztBQUNBO0FBQ0EsTUFBTUMsVUFBVUYsRUFBRUgsTUFBbEI7QUFDQSxNQUFNTSxVQUFVRixFQUFFSixNQUFsQjtBQUNBLE1BQU1PLE9BQU9iLFdBQVdXLFVBQVUsQ0FBckIsRUFBd0JDLFVBQVUsQ0FBbEMsQ0FBYjtBQUNBLE1BQU1FLFdBQVdkLFdBQVdXLFVBQVUsQ0FBckIsRUFBd0JDLFVBQVUsQ0FBbEMsQ0FBakI7O0FBRUE7QUFDQSxPQUFLLElBQUlQLElBQUksQ0FBYixFQUFnQkEsS0FBS00sT0FBckIsRUFBOEJOLEdBQTlCLEVBQW1DO0FBQ2pDLFNBQUssSUFBSVUsSUFBSSxDQUFiLEVBQWdCQSxLQUFLSCxPQUFyQixFQUE4QkcsR0FBOUIsRUFBbUM7QUFDakMsVUFBSU4sRUFBRUosSUFBSSxDQUFOLE1BQWFLLEVBQUVLLElBQUksQ0FBTixDQUFqQixFQUEyQjtBQUN6QjtBQUNBRixhQUFLUixDQUFMLEVBQVFVLENBQVIsSUFBYUYsS0FBS1IsSUFBSSxDQUFULEVBQVlVLElBQUksQ0FBaEIsSUFBcUIsQ0FBbEM7QUFDQUQsaUJBQVNULENBQVQsRUFBWVUsQ0FBWixJQUFpQnBCLFNBQVNFLFFBQTFCO0FBQ0QsT0FKRCxNQUlPO0FBQ0xnQixhQUFLUixDQUFMLEVBQVFVLENBQVIsSUFBYUMsS0FBS0MsR0FBTCxDQUFTSixLQUFLUixJQUFJLENBQVQsRUFBWVUsQ0FBWixDQUFULEVBQXlCRixLQUFLUixDQUFMLEVBQVFVLElBQUksQ0FBWixDQUF6QixDQUFiO0FBQ0EsWUFBSUYsS0FBS1IsQ0FBTCxFQUFRVSxDQUFSLE1BQWVGLEtBQUtSLElBQUksQ0FBVCxFQUFZVSxDQUFaLENBQW5CLEVBQW1DO0FBQ2pDRCxtQkFBU1QsQ0FBVCxFQUFZVSxDQUFaLElBQWlCcEIsU0FBU0csUUFBMUI7QUFDRCxTQUZELE1BRU87QUFDTGdCLG1CQUFTVCxDQUFULEVBQVlVLENBQVosSUFBaUJwQixTQUFTSSxVQUExQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGO0FBQ0QsU0FBT2UsUUFBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFBLFNBQVNJLGFBQVQsQ0FBdUJKLFFBQXZCLEVBQWlDTCxDQUFqQyxFQUFvQ0MsQ0FBcEMsRUFBdUM7QUFDckMsTUFBSVMsV0FBV0wsU0FBU0wsRUFBRUgsTUFBWCxFQUFtQkksRUFBRUosTUFBckIsQ0FBZjtBQUNBLE1BQUljLEtBQUtYLEVBQUVILE1BQVg7QUFDQSxNQUFJZSxLQUFLWCxFQUFFSixNQUFYOztBQUVBLFNBQU9hLGFBQWF4QixTQUFTQyxJQUE3QixFQUFtQztBQUNqQyxRQUFJdUIsYUFBYXhCLFNBQVNFLFFBQTFCLEVBQW9DO0FBQ2xDdUI7QUFDQUM7QUFDRCxLQUhELE1BR08sSUFBSUYsYUFBYXhCLFNBQVNJLFVBQTFCLEVBQXNDO0FBQzNDVSxRQUFFYSxNQUFGLENBQVMsQ0FBQ0YsRUFBRCxDQUFULEVBQWUsQ0FBZixFQUFrQixHQUFsQjtBQUNBQztBQUNELEtBSE0sTUFHQSxJQUFJRixhQUFheEIsU0FBU0csUUFBMUIsRUFBb0M7QUFDekNZLFFBQUVZLE1BQUYsQ0FBUyxDQUFDRCxFQUFELENBQVQsRUFBZSxDQUFmLEVBQWtCLEdBQWxCO0FBQ0FEO0FBQ0Q7QUFDREQsZUFBV0wsU0FBU00sRUFBVCxFQUFhQyxFQUFiLENBQVg7QUFDRDtBQUNGOztBQUVEOzs7Ozs7OztBQVFlLFNBQVMzQixXQUFULENBQXFCZSxDQUFyQixFQUF3QkMsQ0FBeEIsRUFBMkI7QUFDeEMsTUFBTWEsY0FBY2YseUJBQXlCQyxDQUF6QixFQUE0QkMsQ0FBNUIsQ0FBcEI7QUFDQVEsZ0JBQWNLLFdBQWQsRUFBMkJkLENBQTNCLEVBQThCQyxDQUE5QjtBQUNEIiwiZmlsZSI6IjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBNT1ZFTUVOVCA9IHtcbiAgbm9uZTogMCxcbiAgZGlhZ29uYWw6IDEsXG4gIHZlcnRpY2FsOiAyLFxuICBob3Jpem9udGFsOiAzLFxufTtcblxuZnVuY3Rpb24gaW5pdE1hdHJpeChoZWlnaHQsIHdpZHRoKSB7XG4gIGNvbnN0IHJvd3MgPSBuZXcgQXJyYXkoaGVpZ2h0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgcm93c1tpXSA9IG5ldyBJbnQzMkFycmF5KHdpZHRoKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlKGEsIGIpIHtcbiAgLy8gYWRhcHRlZCBmcm9tXG4gIC8vIGh0dHA6Ly9hbGdvcml0aG1zLnR1dG9yaWFsaG9yaXpvbi5jb20vZHluYW1pYy1wcm9ncmFtbWluZy1sb25nZXN0LWNvbW1vbi1zdWJzZXF1ZW5jZS9cbiAgY29uc3QgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICBjb25zdCBiTGVuZ3RoID0gYi5sZW5ndGg7XG4gIGNvbnN0IG1lbW8gPSBpbml0TWF0cml4KGFMZW5ndGggKyAxLCBiTGVuZ3RoICsgMSk7XG4gIGNvbnN0IHNvbHV0aW9uID0gaW5pdE1hdHJpeChhTGVuZ3RoICsgMSwgYkxlbmd0aCArIDEpO1xuXG4gIC8vIExvb3AgYW5kIGZpbmQgdGhlIHNvbHV0aW9uXG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IGFMZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGJMZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFbaSAtIDFdID09PSBiW2ogLSAxXSkge1xuICAgICAgICAvLyBkaWFnb25hbFxuICAgICAgICBtZW1vW2ldW2pdID0gbWVtb1tpIC0gMV1baiAtIDFdICsgMTtcbiAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC5kaWFnb25hbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1heChtZW1vW2kgLSAxXVtqXSwgbWVtb1tpXVtqIC0gMV0pO1xuICAgICAgICBpZiAobWVtb1tpXVtqXSA9PT0gbWVtb1tpIC0gMV1bal0pIHtcbiAgICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULnZlcnRpY2FsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQuaG9yaXpvbnRhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc29sdXRpb247XG59XG5cbi8qKlxuICogQXBwbHkgYW4gbGNzIHNvbHV0aW9uIHRvIGFycmF5cy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBNVVRBVEUgdGhlIGFycmF5cyxcbiAqIGluamVjdGluZyBcIitcIiB3aGVyZSBnYXBzIGFyZSBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxBcnJheT59IHNvbHV0aW9uIGFzIGNvbXB1dGVkIGJ5IGBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2VgXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U29sdXRpb24oc29sdXRpb24sIGEsIGIpIHtcbiAgbGV0IG1vdmVtZW50ID0gc29sdXRpb25bYS5sZW5ndGhdW2IubGVuZ3RoXTtcbiAgbGV0IGFpID0gYS5sZW5ndGg7XG4gIGxldCBiaSA9IGIubGVuZ3RoO1xuXG4gIHdoaWxlIChtb3ZlbWVudCAhPT0gTU9WRU1FTlQubm9uZSkge1xuICAgIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQuZGlhZ29uYWwpIHtcbiAgICAgIGFpLS07XG4gICAgICBiaS0tO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULmhvcml6b250YWwpIHtcbiAgICAgIGEuc3BsaWNlKFthaV0sIDAsICcrJyk7XG4gICAgICBiaS0tO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULnZlcnRpY2FsKSB7XG4gICAgICBiLnNwbGljZShbYmldLCAwLCAnKycpO1xuICAgICAgYWktLTtcbiAgICB9XG4gICAgbW92ZW1lbnQgPSBzb2x1dGlvblthaV1bYmldO1xuICB9XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlIG9mIHR3byBhcnJheXMsIHRoZW4gdXNlcyB0aGF0XG4gKiBzb2x1dGlvbiB0byBpbmplY3QgZ2FwcyBpbnRvIHRoZSBhcnJheXMsIG1ha2luZyB0aGVtIGFsaWduIG9uIGNvbW1vblxuICogc3Vic2VxdWVuY2VzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFcbiAqIEBwYXJhbSB7QXJyYXl9IGJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWxpZ25BcnJheXMoYSwgYikge1xuICBjb25zdCBsY3NTb2x1dGlvbiA9IGxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZShhLCBiKTtcbiAgYXBwbHlTb2x1dGlvbihsY3NTb2x1dGlvbiwgYSwgYik7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9hbGlnbkFycmF5cy5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
54
+
55
+ /***/ }
56
+ /******/ ]);
@@ -0,0 +1,56 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n var maxWidth = _ref2.maxWidth;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibWF4V2lkdGgiLCJoYXNoZWRQcmV2aW91c0RhdGEiLCJtYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZiIsInBvc3RNZXNzYWdlIiwicHJvZ3Jlc3MiLCJoYXNoZWRDdXJyZW50RGF0YSIsInRyYW5zcGFyZW50TGluZSIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxuICBtYXhXaWR0aCxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgaGFzaGVkUHJldmlvdXNEYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShpLCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBhbGlnbih7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgICBtYXhXaWR0aCxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n console.log(memo);\n return solution;\n}\n\nfunction placeholders(count) {\n var result = new Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = '+';\n }\n return result;\n}\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n var diffI = ai - bi;\n console.log(ai, bi, diffI);\n if (diffI < 0) {\n b.splice.apply(b, [bi, 0].concat(_toConsumableArray(placeholders(diffI))));\n } else if (diffI > 0) {\n a.splice.apply(a, [ai, 0].concat(_toConsumableArray(placeholders(Math.abs(diffI)))));\n }\n ai--;\n bi--;\n } else if (movement === MOVEMENT.horizontal) {\n bi--;\n } else if (movement === MOVEMENT.vertical) {\n ai--;\n }\n movement = solution[ai][bi];\n }\n}\n\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n applySolution(lcsSolution, a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJjb25zb2xlIiwibG9nIiwicGxhY2Vob2xkZXJzIiwiY291bnQiLCJyZXN1bHQiLCJhcHBseVNvbHV0aW9uIiwibW92ZW1lbnQiLCJhaSIsImJpIiwiZGlmZkkiLCJzcGxpY2UiLCJhYnMiLCJsY3NTb2x1dGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBNEZ3QkEsVzs7OztBQTVGeEIsSUFBTUMsV0FBVztBQUNmQyxRQUFNLENBRFM7QUFFZkMsWUFBVSxDQUZLO0FBR2ZDLFlBQVUsQ0FISztBQUlmQyxjQUFZO0FBSkcsQ0FBakI7O0FBT0EsU0FBU0MsVUFBVCxDQUFvQkMsTUFBcEIsRUFBNEJDLEtBQTVCLEVBQW1DO0FBQ2pDLE1BQU1DLE9BQU8sSUFBSUMsS0FBSixDQUFVSCxNQUFWLENBQWI7QUFDQSxPQUFLLElBQUlJLElBQUksQ0FBYixFQUFnQkEsSUFBSUYsS0FBS0csTUFBekIsRUFBaUNELEdBQWpDLEVBQXNDO0FBQ3BDRixTQUFLRSxDQUFMLElBQVUsSUFBSUUsVUFBSixDQUFlTCxLQUFmLENBQVY7QUFDRDtBQUNELFNBQU9DLElBQVA7QUFDRDs7QUFFRCxTQUFTSyx3QkFBVCxDQUFrQ0MsQ0FBbEMsRUFBcUNDLENBQXJDLEVBQXdDO0FBQ3RDO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixFQUFFSCxNQUFsQjtBQUNBLE1BQU1NLFVBQVVGLEVBQUVKLE1B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QUFDRDtBQUNGOztBQUVEOzs7Ozs7OztBQVFlLFNBQVNoQyxXQUFULENBQXFCZSxDQUFyQixFQUF3QkMsQ0FBeEIsRUFBMkI7QUFDeEMsTUFBTW9CLGNBQWN0Qix5QkFBeUJDLENBQXpCLEVBQTRCQyxDQUE1QixDQUFwQjtBQUNBYSxnQkFBY08sV0FBZCxFQUEyQnJCLENBQTNCLEVBQThCQyxDQUE5QjtBQUNEIiwiZmlsZSI6IjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBNT1ZFTUVOVCA9IHtcbiAgbm9uZTogMCxcbiAgZGlhZ29uYWw6IDEsXG4gIHZlcnRpY2FsOiAyLFxuICBob3Jpem9udGFsOiAzLFxufTtcblxuZnVuY3Rpb24gaW5pdE1hdHJpeChoZWlnaHQsIHdpZHRoKSB7XG4gIGNvbnN0IHJvd3MgPSBuZXcgQXJyYXkoaGVpZ2h0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgcm93c1tpXSA9IG5ldyBJbnQzMkFycmF5KHdpZHRoKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlKGEsIGIpIHtcbiAgLy8gYWRhcHRlZCBmcm9tXG4gIC8vIGh0dHA6Ly9hbGdvcml0aG1zLnR1dG9yaWFsaG9yaXpvbi5jb20vZHluYW1pYy1wcm9ncmFtbWluZy1sb25nZXN0LWNvbW1vbi1zdWJzZXF1ZW5jZS9cbiAgY29uc3QgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICBjb25zdCBiTGVuZ3RoID0gYi5sZW5ndGg7XG4gIGNvbnN0IG1lbW8gPSBpbml0TWF0cml4KGFMZW5ndGggKyAxLCBiTGVuZ3RoICsgMSk7XG4gIGNvbnN0IHNvbHV0aW9uID0gaW5pdE1hdHJpeChhTGVuZ3RoICsgMSwgYkxlbmd0aCArIDEpO1xuXG4gIC8vIExvb3AgYW5kIGZpbmQgdGhlIHNvbHV0aW9uXG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IGFMZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGJMZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFbaSAtIDFdID09PSBiW2ogLSAxXSkge1xuICAgICAgICAvLyBkaWFnb25hbFxuICAgICAgICBtZW1vW2ldW2pdID0gbWVtb1tpIC0gMV1baiAtIDFdICsgMTtcbiAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC5kaWFnb25hbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1heChtZW1vW2kgLSAxXVtqXSwgbWVtb1tpXVtqIC0gMV0pO1xuICAgICAgICBpZiAobWVtb1tpXVtqXSA9PT0gbWVtb1tpIC0gMV1bal0pIHtcbiAgICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULnZlcnRpY2FsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQuaG9yaXpvbnRhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zb2xlLmxvZyhtZW1vKVxuICByZXR1cm4gc29sdXRpb247XG59XG5cbmZ1bmN0aW9uIHBsYWNlaG9sZGVycyhjb3VudCkge1xuICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoY291bnQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSAnKyc7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQXBwbHkgYW4gbGNzIHNvbHV0aW9uIHRvIGFycmF5cy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBNVVRBVEUgdGhlIGFycmF5cyxcbiAqIGluamVjdGluZyBcIitcIiB3aGVyZSBnYXBzIGFyZSBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxBcnJheT59IHNvbHV0aW9uIGFzIGNvbXB1dGVkIGJ5IGBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2VgXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U29sdXRpb24oc29sdXRpb24sIGEsIGIpIHtcbiAgbGV0IG1vdmVtZW50ID0gc29sdXRpb25bYS5sZW5ndGhdW2IubGVuZ3RoXTtcbiAgbGV0IGFpID0gYS5sZW5ndGg7XG4gIGxldCBiaSA9IGIubGVuZ3RoO1xuXG4gIHdoaWxlIChtb3ZlbWVudCAhPT0gTU9WRU1FTlQubm9uZSkge1xuICAgIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQuZGlhZ29uYWwpIHtcbiAgICAgIGNvbnN0IGRpZmZJID0gYWkgLSBiaTtcbiAgICAgIGNvbnNvbGUubG9nKGFpLCBiaSwgZGlmZkkpXG4gICAgICBpZiAoZGlmZkkgPCAwKSB7XG4gICAgICAgIGIuc3BsaWNlKGJpLCAwLCAuLi5wbGFjZWhvbGRlcnMoZGlmZkkpKTtcbiAgICAgIH0gZWxzZSBpZiAoZGlmZkkgPiAwKSB7XG4gICAgICAgIGEuc3BsaWNlKGFpLCAwLCAuLi5wbGFjZWhvbGRlcnMoTWF0aC5hYnMoZGlmZkkpKSk7XG4gICAgICB9XG4gICAgICBhaS0tO1xuICAgICAgYmktLTtcbiAgICB9IGVsc2UgaWYgKG1vdmVtZW50ID09PSBNT1ZFTUVOVC5ob3Jpem9udGFsKSB7XG4gICAgICBiaS0tO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULnZlcnRpY2FsKSB7XG4gICAgICBhaS0tO1xuICAgIH1cbiAgICBtb3ZlbWVudCA9IHNvbHV0aW9uW2FpXVtiaV07XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9uZ2VzdCBjb21tb24gc3Vic2VxdWVuY2Ugb2YgdHdvIGFycmF5cywgdGhlbiB1c2VzIHRoYXRcbiAqIHNvbHV0aW9uIHRvIGluamVjdCBnYXBzIGludG8gdGhlIGFycmF5cywgbWFraW5nIHRoZW0gYWxpZ24gb24gY29tbW9uXG4gKiBzdWJzZXF1ZW5jZXMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYVxuICogQHBhcmFtIHtBcnJheX0gYlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhbGlnbkFycmF5cyhhLCBiKSB7XG4gIGNvbnN0IGxjc1NvbHV0aW9uID0gbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlKGEsIGIpO1xuICBhcHBseVNvbHV0aW9uKGxjc1NvbHV0aW9uLCBhLCBiKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2FsaWduQXJyYXlzLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ }
56
+ /******/ ]);
@@ -87,6 +87,13 @@ module Happo
87
87
  previous: '/full-page-large-previous.png',
88
88
  height: 718,
89
89
  },
90
+ {
91
+ description: 'Globe',
92
+ viewport: 'large',
93
+ current: '/globe-current.png',
94
+ previous: '/globe-previous.png',
95
+ height: 1200,
96
+ },
90
97
  {
91
98
  description: 'Completely different',
92
99
  viewport: 'small',
@@ -1,4 +1,4 @@
1
1
  # Defines the gem version.
2
2
  module Happo
3
- VERSION = '2.8.1'
3
+ VERSION = '2.8.2'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: happo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.1
4
+ version: 2.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henric Trotzig
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-09-23 00:00:00.000000000 Z
12
+ date: 2016-09-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chunky_png
@@ -132,77 +132,129 @@ files:
132
132
  - lib/happo.rb
133
133
  - lib/happo/logger.rb
134
134
  - lib/happo/public/0144a92667ed2e8a8b13.worker.js
135
+ - lib/happo/public/026c001beac0620bb23a.worker.js
136
+ - lib/happo/public/05ad45a945afc6882286.worker.js
135
137
  - lib/happo/public/05bf9fb3d7f0192e7194.worker.js
136
138
  - lib/happo/public/06bf22e3fa348f77a82f.worker.js
137
139
  - lib/happo/public/08ccdc92f4d8ed3cff76.worker.js
138
140
  - lib/happo/public/0b94c9757c981bfc9fd7.worker.js
139
141
  - lib/happo/public/0d036738a62c01299743.worker.js
142
+ - lib/happo/public/0dd329b74ed90a207896.worker.js
140
143
  - lib/happo/public/0e32a5b5219342a9aa1e.worker.js
141
144
  - lib/happo/public/105bb978b49beac37583.worker.js
142
145
  - lib/happo/public/1172b74983f510409e2d.worker.js
143
146
  - lib/happo/public/13d0677d081eefd8c8bb.worker.js
144
147
  - lib/happo/public/15b1495833b5b13f5f51.worker.js
145
148
  - lib/happo/public/1635684653e1a1979bea.worker.js
149
+ - lib/happo/public/174b944ab9e9053c766d.worker.js
150
+ - lib/happo/public/196b75660e2791fda25a.worker.js
146
151
  - lib/happo/public/1bb6a3a6bba3c02df491.worker.js
147
152
  - lib/happo/public/1c48c5a95c9c5331c65f.worker.js
148
153
  - lib/happo/public/1d1049629f51e72af69f.worker.js
154
+ - lib/happo/public/1d5c0eb9c479f44f0ec2.worker.js
155
+ - lib/happo/public/1d6c41b4828b191ae315.worker.js
149
156
  - lib/happo/public/1fd046493403de128de1.worker.js
150
157
  - lib/happo/public/20c34bdb9a226c485df8.worker.js
158
+ - lib/happo/public/212269d558f1f8b1bc63.worker.js
151
159
  - lib/happo/public/220e711d4abdbc4bd32f.worker.js
152
160
  - lib/happo/public/23686d1b2fc3f4f86d12.worker.js
153
161
  - lib/happo/public/238307cd4525e692bc79.worker.js
162
+ - lib/happo/public/25426637d793045ccb77.worker.js
163
+ - lib/happo/public/28537ac53e64479763ba.worker.js
154
164
  - lib/happo/public/2c643331ceb20b73e255.worker.js
155
165
  - lib/happo/public/2db6b1d7219028bac961.worker.js
156
166
  - lib/happo/public/2fbe9cf56ab2c3ab9a4a.worker.js
167
+ - lib/happo/public/30e3af0e8f974da2885c.worker.js
157
168
  - lib/happo/public/30ee387dd21d6b20a927.worker.js
169
+ - lib/happo/public/32fc2a09f98d30cb2a06.worker.js
170
+ - lib/happo/public/33c43f9f1296a6c3b236.worker.js
158
171
  - lib/happo/public/34c08770d9dc4981b2a2.worker.js
159
172
  - lib/happo/public/35d8e219a4200e27adf9.worker.js
160
173
  - lib/happo/public/360e0acb872760f43b07.worker.js
161
174
  - lib/happo/public/385cc56a00d991287244.worker.js
162
175
  - lib/happo/public/38e90e6329f74e2d681a.worker.js
163
176
  - lib/happo/public/3a1ce5368a835b999d55.worker.js
177
+ - lib/happo/public/3a6592504d8ee1810017.worker.js
164
178
  - lib/happo/public/3a7567174ad2bd91c107.worker.js
179
+ - lib/happo/public/3a8bedd3121a2cdacb6d.worker.js
165
180
  - lib/happo/public/3b63d7abc667a23e0a2b.worker.js
166
181
  - lib/happo/public/3bdf5dcbba8864a7dcae.worker.js
182
+ - lib/happo/public/3d9ed68ca315896c8ec7.worker.js
183
+ - lib/happo/public/3da88471c60703398f95.worker.js
167
184
  - lib/happo/public/3ee7268990c5d4183ad1.worker.js
185
+ - lib/happo/public/40c1aadf458bda245630.worker.js
186
+ - lib/happo/public/41749e1ff9db63f87a1e.worker.js
168
187
  - lib/happo/public/41d90eebc5449581b92a.worker.js
188
+ - lib/happo/public/42bc2c20d61979a23a2f.worker.js
189
+ - lib/happo/public/447f3bfe79be8a67b9cc.worker.js
190
+ - lib/happo/public/4580dd75ba5a064f4366.worker.js
169
191
  - lib/happo/public/46a8fcf803fae37aa259.worker.js
170
192
  - lib/happo/public/46ef1d4f416d92b92cab.worker.js
171
193
  - lib/happo/public/4960a52eba13a73eb069.worker.js
194
+ - lib/happo/public/4975b25fe791d85e9827.worker.js
172
195
  - lib/happo/public/49c762dec74fb3e7c638.worker.js
196
+ - lib/happo/public/4b23fa5d7875a8fba618.worker.js
197
+ - lib/happo/public/4ecbb720788698ce7a9b.worker.js
198
+ - lib/happo/public/4ef2e26b666b08b7411a.worker.js
173
199
  - lib/happo/public/507ef3ea49332d42f582.worker.js
174
200
  - lib/happo/public/511d7e03fd683c618a22.worker.js
201
+ - lib/happo/public/51ac7ca571ae07cd9d7a.worker.js
175
202
  - lib/happo/public/527516eb649429b011f7.worker.js
176
203
  - lib/happo/public/52e42bbfa68714fd1b26.worker.js
204
+ - lib/happo/public/531d99f56a3343cee5f8.worker.js
205
+ - lib/happo/public/53e6a60c2cf0558157a7.worker.js
177
206
  - lib/happo/public/53e970da89474270e914.worker.js
178
207
  - lib/happo/public/54ba8bc7a595358209d2.worker.js
208
+ - lib/happo/public/55d488167040d5350534.worker.js
179
209
  - lib/happo/public/572846c1173405e57d7d.worker.js
180
210
  - lib/happo/public/578cb8199b43c9f746ec.worker.js
211
+ - lib/happo/public/588f7a6b784ef2b87932.worker.js
181
212
  - lib/happo/public/58ae755db5700fc141d3.worker.js
213
+ - lib/happo/public/59d03b8990473ae492e0.worker.js
214
+ - lib/happo/public/5aded6f9af816e819a2b.worker.js
182
215
  - lib/happo/public/5b7ffa7e0cfb69ac4952.worker.js
183
216
  - lib/happo/public/5cbf9957eb776724a5b6.worker.js
217
+ - lib/happo/public/5e6771e4a41f597c26a9.worker.js
184
218
  - lib/happo/public/612cb8b078897547b091.worker.js
219
+ - lib/happo/public/61e924aed1761ec05ca0.worker.js
185
220
  - lib/happo/public/6368c448d11a203d506b.worker.js
221
+ - lib/happo/public/65e7608bb10d0f2250d1.worker.js
186
222
  - lib/happo/public/69d16a4997e4170af4ee.worker.js
187
223
  - lib/happo/public/69fdd0bf1915b19115d6.worker.js
224
+ - lib/happo/public/6a71a1273a0cf4065e1e.worker.js
225
+ - lib/happo/public/727ca4589d56ddcb9c7f.worker.js
188
226
  - lib/happo/public/74309d94f574207e4e79.worker.js
189
227
  - lib/happo/public/74882ef02b7b28391aac.worker.js
228
+ - lib/happo/public/769883a4d5abfa7384d4.worker.js
190
229
  - lib/happo/public/785285eac660735ef3e0.worker.js
230
+ - lib/happo/public/78fea81d29830297df57.worker.js
231
+ - lib/happo/public/7bf45d52cf57b1949851.worker.js
232
+ - lib/happo/public/7d4a4086de8530abe101.worker.js
191
233
  - lib/happo/public/7d7551366f97adda7b5b.worker.js
234
+ - lib/happo/public/7e330bc3ee246ab39910.worker.js
192
235
  - lib/happo/public/7e53176d18c890a5424c.worker.js
193
236
  - lib/happo/public/818ac008a4a7d62aa55c.worker.js
194
237
  - lib/happo/public/823340592678aeab5317.worker.js
238
+ - lib/happo/public/84f3a66517b77798456d.worker.js
239
+ - lib/happo/public/856dbe98c40d8f4bd452.worker.js
195
240
  - lib/happo/public/8cc13e3a447ea341f962.worker.js
196
241
  - lib/happo/public/8d0d79f0c81652bfb3f1.worker.js
197
242
  - lib/happo/public/9037f52c590941a75440.worker.js
243
+ - lib/happo/public/90a4b81e4d7c2da63973.worker.js
244
+ - lib/happo/public/92dd03e7cbe827a2df45.worker.js
198
245
  - lib/happo/public/935b279f09cf3c4046ec.worker.js
199
246
  - lib/happo/public/945f54dcc60d8b7abc9d.worker.js
247
+ - lib/happo/public/94976fe48214f2bc68d6.worker.js
200
248
  - lib/happo/public/94ff43f0e47ff2759712.worker.js
201
249
  - lib/happo/public/95a6641585f90432e282.worker.js
202
250
  - lib/happo/public/95ae334beb5125d1b4ce.worker.js
203
251
  - lib/happo/public/95b52fcff8f5732b1902.worker.js
252
+ - lib/happo/public/95f3e6e7eec59c0af3e5.worker.js
253
+ - lib/happo/public/96c4c2f5df8175649a67.worker.js
254
+ - lib/happo/public/973a6ae106ac4e664858.worker.js
204
255
  - lib/happo/public/984f0e2d0e896c2f4048.worker.js
205
256
  - lib/happo/public/988f633191766eef664a.worker.js
257
+ - lib/happo/public/989e9ba236891bdfcf46.worker.js
206
258
  - lib/happo/public/99af2b663636fee65291.worker.js
207
259
  - lib/happo/public/9c8f5ee8dfa77750be8c.worker.js
208
260
  - lib/happo/public/9d57ea9c2af229a03119.worker.js
@@ -211,6 +263,7 @@ files:
211
263
  - lib/happo/public/HappoApp.bundle.js
212
264
  - lib/happo/public/HappoApp.bundle.js.map
213
265
  - lib/happo/public/a3574ff725014ef26602.worker.js
266
+ - lib/happo/public/a50e9af74a422839a15c.worker.js
214
267
  - lib/happo/public/a5564ec6a5def9e7a95a.worker.js
215
268
  - lib/happo/public/a59e639dbf2bc03792c2.worker.js
216
269
  - lib/happo/public/a6de7e3f4866c4d4af09.worker.js
@@ -220,44 +273,79 @@ files:
220
273
  - lib/happo/public/a8d9429cf3dd094aa190.worker.js
221
274
  - lib/happo/public/ab952692e7c4df03d3b8.worker.js
222
275
  - lib/happo/public/aca1442707a8e088ec9e.worker.js
276
+ - lib/happo/public/ad4fdfa82741585ce164.worker.js
223
277
  - lib/happo/public/adc1f6a613d0d2eda4b8.worker.js
278
+ - lib/happo/public/ae0622a81101951ac112.worker.js
279
+ - lib/happo/public/ae223678cdbfac88d9be.worker.js
224
280
  - lib/happo/public/b2a65c76321af7bc6d89.worker.js
225
281
  - lib/happo/public/b2a81bbc8e6f0ddb3432.worker.js
226
282
  - lib/happo/public/b41bd9a6b659bfe3096f.worker.js
283
+ - lib/happo/public/b441a6c1393a5d39b5ff.worker.js
284
+ - lib/happo/public/b4c84506199d5745d950.worker.js
285
+ - lib/happo/public/b5176c936b696653a407.worker.js
227
286
  - lib/happo/public/b66da676446fdda1a58c.worker.js
287
+ - lib/happo/public/b86b963a72892d8f0fd1.worker.js
288
+ - lib/happo/public/ba50214d2b6ac001493b.worker.js
289
+ - lib/happo/public/bb6413d1cea030ba7a1e.worker.js
290
+ - lib/happo/public/bc084ad60fb7dbbe0818.worker.js
291
+ - lib/happo/public/c15e6b44ae496af6af9b.worker.js
228
292
  - lib/happo/public/c1dd7c953827ff9578f0.worker.js
229
293
  - lib/happo/public/c2297ce40f0d071ec173.worker.js
294
+ - lib/happo/public/c4393394848f5242932e.worker.js
230
295
  - lib/happo/public/c556b6ede3bbd230cebd.worker.js
296
+ - lib/happo/public/c60ceaff7849b394e27a.worker.js
297
+ - lib/happo/public/c67c76de1e4def5019d5.worker.js
298
+ - lib/happo/public/c7969739b50b79043b86.worker.js
231
299
  - lib/happo/public/ca172f55a8f34b526853.worker.js
232
300
  - lib/happo/public/card-current.png
233
301
  - lib/happo/public/card-previous.png
234
302
  - lib/happo/public/cbc31c846bebca5538bf.worker.js
303
+ - lib/happo/public/cc82d7609935eb1d2738.worker.js
235
304
  - lib/happo/public/ce2440f84aa6708e51d4.worker.js
305
+ - lib/happo/public/d135dda9b0318be75e3c.worker.js
306
+ - lib/happo/public/d2aded5d63912f5b7e1b.worker.js
307
+ - lib/happo/public/d2be644581f8f67b207d.worker.js
236
308
  - lib/happo/public/d4d18f5ac12fd3309c03.worker.js
237
309
  - lib/happo/public/d5ec9230a58d0929fe2d.worker.js
238
310
  - lib/happo/public/d650ec5f5ee0203de80a.worker.js
239
311
  - lib/happo/public/d6dbbb2aeed75685efa1.worker.js
312
+ - lib/happo/public/d6e037d3891cfb95fbca.worker.js
240
313
  - lib/happo/public/d7403b48b365a76148a2.worker.js
314
+ - lib/happo/public/d7440908d264133044bb.worker.js
241
315
  - lib/happo/public/d75350c7043f58e46d0c.worker.js
242
316
  - lib/happo/public/d899e9318500e6115f21.worker.js
243
317
  - lib/happo/public/d8fefa1bd98baa4e38da.worker.js
318
+ - lib/happo/public/da071c51e9a641ed805c.worker.js
319
+ - lib/happo/public/dbe8eef9555ef0d43469.worker.js
244
320
  - lib/happo/public/df0d03d918e87308e3e3.worker.js
245
321
  - lib/happo/public/dialog-current.png
246
322
  - lib/happo/public/dialog-previous.png
323
+ - lib/happo/public/e1cbbfd7a3d705049eb0.worker.js
324
+ - lib/happo/public/e3882591e6710cf03ed4.worker.js
247
325
  - lib/happo/public/e39e8636909998d394e8.worker.js
326
+ - lib/happo/public/e414c768d66b9bcf86bb.worker.js
248
327
  - lib/happo/public/e5c91be22eaad28e7e82.worker.js
249
328
  - lib/happo/public/e65a11af21a63b0c66df.worker.js
329
+ - lib/happo/public/e85bc4bb461158f5561d.worker.js
250
330
  - lib/happo/public/e8d18bed99776d3eabfd.worker.js
331
+ - lib/happo/public/ed6256235d0a2b11aaf6.worker.js
332
+ - lib/happo/public/edcc84bf4483670ba23e.worker.js
251
333
  - lib/happo/public/f0a047027dca5832b680.worker.js
252
334
  - lib/happo/public/f18c5838c7ec92d4a291.worker.js
253
335
  - lib/happo/public/f1b8838f395f31ff14a0.worker.js
336
+ - lib/happo/public/f3d33d482a4326121c45.worker.js
337
+ - lib/happo/public/f67e23a954230ea878be.worker.js
338
+ - lib/happo/public/f800c3a1d9200926bde6.worker.js
339
+ - lib/happo/public/f8954fa2849952175e2c.worker.js
254
340
  - lib/happo/public/favicon.ico
255
341
  - lib/happo/public/fb955bccd11761291311.worker.js
342
+ - lib/happo/public/fde5a206ff86c3d7ab10.worker.js
256
343
  - lib/happo/public/full-page-large-current.png
257
344
  - lib/happo/public/full-page-large-previous.png
258
345
  - lib/happo/public/full-page-small-current.png
259
346
  - lib/happo/public/full-page-small-previous.png
260
- - lib/happo/public/happo-logo.svg
347
+ - lib/happo/public/globe-current.png
348
+ - lib/happo/public/globe-previous.png
261
349
  - lib/happo/public/happo-runner.js
262
350
  - lib/happo/public/happo-styles.css
263
351
  - lib/happo/public/major-diff-large-current.png