happo 2.8.0 → 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. checksums.yaml +4 -4
  2. data/lib/happo/public/05bf9fb3d7f0192e7194.worker.js +56 -0
  3. data/lib/happo/public/06bf22e3fa348f77a82f.worker.js +56 -0
  4. data/lib/happo/public/08ccdc92f4d8ed3cff76.worker.js +62 -0
  5. data/lib/happo/public/0b94c9757c981bfc9fd7.worker.js +62 -0
  6. data/lib/happo/public/0d036738a62c01299743.worker.js +56 -0
  7. data/lib/happo/public/{203272bf00c349325c60.worker.js → 0e32a5b5219342a9aa1e.worker.js} +1 -1
  8. data/lib/happo/public/105bb978b49beac37583.worker.js +62 -0
  9. data/lib/happo/public/1172b74983f510409e2d.worker.js +62 -0
  10. data/lib/happo/public/13d0677d081eefd8c8bb.worker.js +62 -0
  11. data/lib/happo/public/1635684653e1a1979bea.worker.js +56 -0
  12. data/lib/happo/public/{4f6b0faf1b43e93a1404.worker.js → 1bb6a3a6bba3c02df491.worker.js} +1 -1
  13. data/lib/happo/public/1c48c5a95c9c5331c65f.worker.js +56 -0
  14. data/lib/happo/public/{1a86029ce53b1aa81f68.worker.js → 1d1049629f51e72af69f.worker.js} +1 -1
  15. data/lib/happo/public/{423ba9f549f3829873e6.worker.js → 1fd046493403de128de1.worker.js} +1 -1
  16. data/lib/happo/public/20c34bdb9a226c485df8.worker.js +56 -0
  17. data/lib/happo/public/23686d1b2fc3f4f86d12.worker.js +56 -0
  18. data/lib/happo/public/238307cd4525e692bc79.worker.js +56 -0
  19. data/lib/happo/public/2c643331ceb20b73e255.worker.js +56 -0
  20. data/lib/happo/public/2db6b1d7219028bac961.worker.js +62 -0
  21. data/lib/happo/public/2fbe9cf56ab2c3ab9a4a.worker.js +62 -0
  22. data/lib/happo/public/30ee387dd21d6b20a927.worker.js +62 -0
  23. data/lib/happo/public/34c08770d9dc4981b2a2.worker.js +62 -0
  24. data/lib/happo/public/35d8e219a4200e27adf9.worker.js +62 -0
  25. data/lib/happo/public/360e0acb872760f43b07.worker.js +1 -1
  26. data/lib/happo/public/385cc56a00d991287244.worker.js +62 -0
  27. data/lib/happo/public/38e90e6329f74e2d681a.worker.js +56 -0
  28. data/lib/happo/public/3a1ce5368a835b999d55.worker.js +62 -0
  29. data/lib/happo/public/3a7567174ad2bd91c107.worker.js +56 -0
  30. data/lib/happo/public/3b63d7abc667a23e0a2b.worker.js +56 -0
  31. data/lib/happo/public/3bdf5dcbba8864a7dcae.worker.js +62 -0
  32. data/lib/happo/public/{463eb0ecadbb11365ca4.worker.js → 3ee7268990c5d4183ad1.worker.js} +1 -1
  33. data/lib/happo/public/41d90eebc5449581b92a.worker.js +56 -0
  34. data/lib/happo/public/46a8fcf803fae37aa259.worker.js +62 -0
  35. data/lib/happo/public/46ef1d4f416d92b92cab.worker.js +62 -0
  36. data/lib/happo/public/4960a52eba13a73eb069.worker.js +56 -0
  37. data/lib/happo/public/49c762dec74fb3e7c638.worker.js +62 -0
  38. data/lib/happo/public/507ef3ea49332d42f582.worker.js +62 -0
  39. data/lib/happo/public/511d7e03fd683c618a22.worker.js +56 -0
  40. data/lib/happo/public/527516eb649429b011f7.worker.js +68 -0
  41. data/lib/happo/public/52e42bbfa68714fd1b26.worker.js +62 -0
  42. data/lib/happo/public/53e970da89474270e914.worker.js +56 -0
  43. data/lib/happo/public/572846c1173405e57d7d.worker.js +62 -0
  44. data/lib/happo/public/578cb8199b43c9f746ec.worker.js +62 -0
  45. data/lib/happo/public/58ae755db5700fc141d3.worker.js +62 -0
  46. data/lib/happo/public/5b7ffa7e0cfb69ac4952.worker.js +56 -0
  47. data/lib/happo/public/{62c7585d1d23297b316f.worker.js → 5cbf9957eb776724a5b6.worker.js} +1 -1
  48. data/lib/happo/public/612cb8b078897547b091.worker.js +62 -0
  49. data/lib/happo/public/{9cdd6f0763fd866a5118.worker.js → 6368c448d11a203d506b.worker.js} +1 -1
  50. data/lib/happo/public/69d16a4997e4170af4ee.worker.js +1 -0
  51. data/lib/happo/public/69fdd0bf1915b19115d6.worker.js +62 -0
  52. data/lib/happo/public/74309d94f574207e4e79.worker.js +62 -0
  53. data/lib/happo/public/74882ef02b7b28391aac.worker.js +62 -0
  54. data/lib/happo/public/785285eac660735ef3e0.worker.js +56 -0
  55. data/lib/happo/public/{730c035f5c2b404ff225.worker.js → 7d7551366f97adda7b5b.worker.js} +2 -2
  56. data/lib/happo/public/7e53176d18c890a5424c.worker.js +56 -0
  57. data/lib/happo/public/{b20a32590dfe259f4fe3.worker.js → 818ac008a4a7d62aa55c.worker.js} +2 -2
  58. data/lib/happo/public/823340592678aeab5317.worker.js +56 -0
  59. data/lib/happo/public/8cc13e3a447ea341f962.worker.js +56 -0
  60. data/lib/happo/public/8d0d79f0c81652bfb3f1.worker.js +1 -0
  61. data/lib/happo/public/9037f52c590941a75440.worker.js +62 -0
  62. data/lib/happo/public/{9472102d9a6d2577f988.worker.js → 935b279f09cf3c4046ec.worker.js} +1 -1
  63. data/lib/happo/public/{4e685162de1d8a9b102d.worker.js → 945f54dcc60d8b7abc9d.worker.js} +1 -1
  64. data/lib/happo/public/{f81ed0eec7edfa2dfadb.worker.js → 94ff43f0e47ff2759712.worker.js} +1 -1
  65. data/lib/happo/public/95a6641585f90432e282.worker.js +1 -0
  66. data/lib/happo/public/95ae334beb5125d1b4ce.worker.js +62 -0
  67. data/lib/happo/public/95b52fcff8f5732b1902.worker.js +62 -0
  68. data/lib/happo/public/984f0e2d0e896c2f4048.worker.js +62 -0
  69. data/lib/happo/public/988f633191766eef664a.worker.js +56 -0
  70. data/lib/happo/public/99af2b663636fee65291.worker.js +62 -0
  71. data/lib/happo/public/9c8f5ee8dfa77750be8c.worker.js +62 -0
  72. data/lib/happo/public/9d57ea9c2af229a03119.worker.js +56 -0
  73. data/lib/happo/public/9d7be8cf3aadb0b77624.worker.js +62 -0
  74. data/lib/happo/public/9e6b804a33c6799809cf.worker.js +62 -0
  75. data/lib/happo/public/HappoApp.bundle.js.map +1 -0
  76. data/lib/happo/public/a3574ff725014ef26602.worker.js +56 -0
  77. data/lib/happo/public/a5564ec6a5def9e7a95a.worker.js +1 -0
  78. data/lib/happo/public/a59e639dbf2bc03792c2.worker.js +56 -0
  79. data/lib/happo/public/a6de7e3f4866c4d4af09.worker.js +62 -0
  80. data/lib/happo/public/a79d520c7469920c10a2.worker.js +62 -0
  81. data/lib/happo/public/a7da9c5111db811b9535.worker.js +62 -0
  82. data/lib/happo/public/a8d9429cf3dd094aa190.worker.js +62 -0
  83. data/lib/happo/public/ab952692e7c4df03d3b8.worker.js +56 -0
  84. data/lib/happo/public/{80009e8bc0ffd29d3390.worker.js → aca1442707a8e088ec9e.worker.js} +1 -1
  85. data/lib/happo/public/{28237f0668f12dfb456c.worker.js → adc1f6a613d0d2eda4b8.worker.js} +1 -7
  86. data/lib/happo/public/b2a65c76321af7bc6d89.worker.js +62 -0
  87. data/lib/happo/public/b2a81bbc8e6f0ddb3432.worker.js +62 -0
  88. data/lib/happo/public/{e247eaa7506f44b5b847.worker.js → b41bd9a6b659bfe3096f.worker.js} +2 -2
  89. data/lib/happo/public/b66da676446fdda1a58c.worker.js +56 -0
  90. data/lib/happo/public/c1dd7c953827ff9578f0.worker.js +68 -0
  91. data/lib/happo/public/{3818f1c91ce4d4d8b724.worker.js → c556b6ede3bbd230cebd.worker.js} +1 -1
  92. data/lib/happo/public/ca172f55a8f34b526853.worker.js +62 -0
  93. data/lib/happo/public/{830db6cc9c99c2e8e9c1.worker.js → cbc31c846bebca5538bf.worker.js} +1 -1
  94. data/lib/happo/public/ce2440f84aa6708e51d4.worker.js +56 -0
  95. data/lib/happo/public/d4d18f5ac12fd3309c03.worker.js +56 -0
  96. data/lib/happo/public/d5ec9230a58d0929fe2d.worker.js +62 -0
  97. data/lib/happo/public/d650ec5f5ee0203de80a.worker.js +1 -0
  98. data/lib/happo/public/d6dbbb2aeed75685efa1.worker.js +62 -0
  99. data/lib/happo/public/d7403b48b365a76148a2.worker.js +56 -0
  100. data/lib/happo/public/d75350c7043f58e46d0c.worker.js +62 -0
  101. data/lib/happo/public/d899e9318500e6115f21.worker.js +62 -0
  102. data/lib/happo/public/df0d03d918e87308e3e3.worker.js +62 -0
  103. data/lib/happo/public/e39e8636909998d394e8.worker.js +56 -0
  104. data/lib/happo/public/e5c91be22eaad28e7e82.worker.js +56 -0
  105. data/lib/happo/public/e65a11af21a63b0c66df.worker.js +62 -0
  106. data/lib/happo/public/e8d18bed99776d3eabfd.worker.js +62 -0
  107. data/lib/happo/public/f0a047027dca5832b680.worker.js +62 -0
  108. data/lib/happo/public/f18c5838c7ec92d4a291.worker.js +62 -0
  109. data/lib/happo/public/f1b8838f395f31ff14a0.worker.js +62 -0
  110. data/lib/happo/public/fb955bccd11761291311.worker.js +62 -0
  111. data/lib/happo/public/happo-logo.svg +1 -0
  112. data/lib/happo/uploader.rb +3 -1
  113. data/lib/happo/version.rb +1 -1
  114. metadata +111 -80
  115. data/lib/happo/public/0622a1eb2a5b4dab0d7d.worker.js +0 -62
  116. data/lib/happo/public/088cc9d4615d51d37661.worker.js +0 -68
  117. data/lib/happo/public/11b439cedd6aa6a01e71.worker.js +0 -68
  118. data/lib/happo/public/167f0a5b59a8c27815fe.worker.js +0 -62
  119. data/lib/happo/public/19f5f7403fb4a2ba42e2.worker.js +0 -62
  120. data/lib/happo/public/1b6803fbc7b07f61cba2.worker.js +0 -74
  121. data/lib/happo/public/1d3dc560f1f39393dafe.worker.js +0 -62
  122. data/lib/happo/public/25ad7a1e52bd424ca81d.worker.js +0 -62
  123. data/lib/happo/public/26d95a76207ba0fe6c25.worker.js +0 -74
  124. data/lib/happo/public/2a7a935f3b9526c6f7ab.worker.js +0 -74
  125. data/lib/happo/public/2c00cb8d0a2eb5dd4078.worker.js +0 -68
  126. data/lib/happo/public/2c71ddb5b15a755d4644.worker.js +0 -68
  127. data/lib/happo/public/32648d3dfb22995f4066.worker.js +0 -68
  128. data/lib/happo/public/3452650686a8096b2bb7.worker.js +0 -68
  129. data/lib/happo/public/346cefcc1572890455b8.worker.js +0 -68
  130. data/lib/happo/public/35bd63f58bb69ac267ea.worker.js +0 -68
  131. data/lib/happo/public/3cc2e649d9b6ff62f4ab.worker.js +0 -62
  132. data/lib/happo/public/3deccedc8fbb96bb1aa7.worker.js +0 -68
  133. data/lib/happo/public/3e672be26a7a8864a342.worker.js +0 -68
  134. data/lib/happo/public/41aa7471344a79ff98f2.worker.js +0 -68
  135. data/lib/happo/public/47c52ff0e060fedb841f.worker.js +0 -62
  136. data/lib/happo/public/4eea1b4008ed68e41f82.worker.js +0 -62
  137. data/lib/happo/public/589c2f9547d240ac8a57.worker.js +0 -68
  138. data/lib/happo/public/5a8c0588ca745d7904f7.worker.js +0 -68
  139. data/lib/happo/public/5b3cabd81f7d8688f7a5.worker.js +0 -62
  140. data/lib/happo/public/5f5c9f07cb5117c523a2.worker.js +0 -68
  141. data/lib/happo/public/5fb8c7066659ea1b57e2.worker.js +0 -62
  142. data/lib/happo/public/5fb962cc191a60b42af0.worker.js +0 -68
  143. data/lib/happo/public/62e676d31cbf8aaa9359.worker.js +0 -68
  144. data/lib/happo/public/65efcf6aee5e3ef33539.worker.js +0 -68
  145. data/lib/happo/public/693d4918a5dae465c134.worker.js +0 -68
  146. data/lib/happo/public/69d106b071dd31ad86de.worker.js +0 -68
  147. data/lib/happo/public/7609088c49b73ee2e3e1.worker.js +0 -68
  148. data/lib/happo/public/76161d401db5bb36980a.worker.js +0 -62
  149. data/lib/happo/public/7d9febb46b37ddffa2d5.worker.js +0 -62
  150. data/lib/happo/public/7f29af56bd0ea82d77d9.worker.js +0 -68
  151. data/lib/happo/public/85ad69599657de02d20d.worker.js +0 -68
  152. data/lib/happo/public/875e790f3e64476b3aa0.worker.js +0 -68
  153. data/lib/happo/public/8fa9a7b2a5f19075eedc.worker.js +0 -74
  154. data/lib/happo/public/906ce908877052838b8e.worker.js +0 -62
  155. data/lib/happo/public/9ac309ab34f48e7af07c.worker.js +0 -68
  156. data/lib/happo/public/aa7ae8013f9780eb8acb.worker.js +0 -68
  157. data/lib/happo/public/b25ebdd4e2d2dee8c7b1.worker.js +0 -68
  158. data/lib/happo/public/b7a49d603b1d50f535b2.worker.js +0 -68
  159. data/lib/happo/public/b8e667564ad96f5c77f4.worker.js +0 -68
  160. data/lib/happo/public/b913c562805ec9a01635.worker.js +0 -68
  161. data/lib/happo/public/bab832c7110d15a5f43b.worker.js +0 -62
  162. data/lib/happo/public/bfcf99c9b2bf3d58ec7f.worker.js +0 -62
  163. data/lib/happo/public/c0aeff8b32c9911c8547.worker.js +0 -68
  164. data/lib/happo/public/c3d7b17359c21ff82281.worker.js +0 -68
  165. data/lib/happo/public/c9f7adcce3de80eb759a.worker.js +0 -68
  166. data/lib/happo/public/d7b87aec5f1e4f2a7a5d.worker.js +0 -68
  167. data/lib/happo/public/db617ae6458966f4acae.worker.js +0 -68
  168. data/lib/happo/public/e92bb4e1e06843fa771e.worker.js +0 -62
  169. data/lib/happo/public/e9e2d97848e0059e15c5.worker.js +0 -62
  170. data/lib/happo/public/ea87c48552c960ed7a1c.worker.js +0 -74
  171. data/lib/happo/public/eb5aafba8d16a397517a.worker.js +0 -68
  172. data/lib/happo/public/edc218b655b9ef694b3e.worker.js +0 -74
  173. data/lib/happo/public/eea64a6efa0620a576d7.worker.js +0 -68
  174. data/lib/happo/public/f269a8e7ffca13e9366a.worker.js +0 -68
  175. data/lib/happo/public/fcd20ee3e5a10e8667bb.worker.js +0 -68
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9566789ffa0a31de9ff986e11424a10c222259eb
4
- data.tar.gz: 8e6ae034781cc9dd0258574ce9498d4411db594b
3
+ metadata.gz: 3f6c9d4bd5dd3b4c13623aefd31b0e44eb5667bd
4
+ data.tar.gz: 33eaf52012b3410c9f0be7163b7ba5cedab428a1
5
5
  SHA512:
6
- metadata.gz: 7d51844c05f2a24667c77f611910f98ace535b5ba7b1397aa764be4ff8ff5001111cc5fa0a49c567ec68912bc835411c81bdf7f244e0ee638990ef756b95093a
7
- data.tar.gz: 7d3176e11cef94c2d3f6a21fad84ff9be1a19de32e92698ba63bde4756a05f5f1a7f51a6f541e11db3b38f3a5067c86b2756aa8c4dbbbaab1cfc447affa52afa
6
+ metadata.gz: 61198c14b79ff9709c76decac7ca8aac49d89d489a5787210b15666945b3f539aecea92ca8af1f928d0eb2fe0c3581b99862212b19719c42210c5b55db00c8d4
7
+ data.tar.gz: 759e49006bdbafca900b0cccc18622ffff17aa6ff9142662584e15c4a8d2da100e537375f2f14d419237746da379111c64c85d009c019a831c5f5e6fef73384a
@@ -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 _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\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\n/**\n * Construct a line of pixels of a certain rgba color\n *\n * @param {Array} rgba\n * @param {Number} width\n * @return {Array}\n */\nfunction constructColoredLine(rgba, width) {\n var line = [];\n for (var i = 0; i < width; i++) {\n line.push(rgba);\n }\n return line;\n}\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 var getPixelAt = function getPixelAt(x, y) {\n var startIndex = y * rowSize + x * 4;\n return [data[startIndex], data[startIndex + 1], data[startIndex + 2], data[startIndex + 3]];\n };\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = [];\n for (var col = 0; col < width; col++) {\n pixelsInRow.push(getPixelAt(col, row));\n }\n for (var pad = 0; pad < paddingRight; pad++) {\n pixelsInRow.push([0, 0, 0, 0]);\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction flattenImageData(imageData) {\n var result = [];\n imageData.forEach(function (row) {\n row.forEach(function (pixel) {\n result.push.apply(result, _toConsumableArray(pixel));\n });\n });\n return Uint8ClampedArray.from(result);\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(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var redLine = constructColoredLine([255, 0, 0, 255], maxWidth);\n var greenLine = constructColoredLine([0, 255, 0, 255], maxWidth);\n\n var start = performance.now();\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n console.log('(internal) image creation took', performance.now() - start);\n\n start = performance.now();\n var adiffResults = _adiff2.default.diff(previousImageData.map(function (d) {\n return btoa(d);\n }), currentImageData.map(function (d) {\n return btoa(d);\n }));\n console.log('(internal) adiffing took', performance.now() - start);\n\n start = performance.now();\n // iterate and apply changes to previous data\n adiffResults.forEach(function (instruction) {\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < deletedItems) {\n // ignore, we just keep the old line\n } else {\n // add a green line to signal an addition\n previousImageData.splice(atIndex + y, 0, greenLine);\n }\n }\n });\n console.log('(internal) image prep took', performance.now() - start);\n\n // iterate backwards and apply changes to current data\n for (var i = adiffResults.length - 1; i >= 0; i--) {\n var instruction = adiffResults[i];\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < addedItems) {\n // ignore, we just keep the old line\n } else {\n // add a red line to signal a deletion\n currentImageData.splice(atIndex + y, 0, redLine);\n }\n }\n }\n\n return {\n currentData: {\n data: flattenImageData(currentImageData),\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: flattenImageData(previousImageData),\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref3) {\n var _ref3$data = _ref3.data;\n var previousData = _ref3$data.previousData;\n var currentData = _ref3$data.currentData;\n\n var start = performance.now();\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n console.log('(internal) ComputeAndInjectDiffsWorker took', performance.now() - start);\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiZmxhdHRlbkltYWdlRGF0YSIsImltYWdlRGF0YSIsInJlc3VsdCIsImZvckVhY2giLCJwaXhlbCIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiZnJvbSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwibWF4V2lkdGgiLCJNYXRoIiwibWF4IiwicmVkTGluZSIsImdyZWVuTGluZSIsInN0YXJ0IiwicGVyZm9ybWFuY2UiLCJub3ciLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJjb25zb2xlIiwibG9nIiwiYWRpZmZSZXN1bHRzIiwiZGlmZiIsIm1hcCIsImJ0b2EiLCJkIiwiaW5zdHJ1Y3Rpb24iLCJhdEluZGV4IiwiZGVsZXRlZEl0ZW1zIiwiYWRkZWRJdGVtcyIsImxlbmd0aCIsInNwbGljZSIsInNlbGYiLCJhZGRFdmVudExpc3RlbmVyIiwicG9zdE1lc3NhZ2UiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7QUFFQTs7Ozs7OztBQU9BLFNBQVNBLG9CQUFULENBQThCQyxJQUE5QixFQUFvQ0MsS0FBcEMsRUFBMkM7QUFDekMsTUFBTUMsT0FBTyxFQUFiO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLEtBQXBCLEVBQTJCRSxHQUEzQixFQUFnQztBQUM5QkQsU0FBS0UsSUFBTCxDQUFVSixJQUFWO0FBQ0Q7QUFDRCxTQUFPRSxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0csY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JOLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCTyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVUixRQUFRLENBQXhCO0FBQ0EsTUFBTVMsYUFBYSxTQUFiQSxVQUFhLENBQUNDLENBQUQsRUFBSUMsQ0FBSixFQUFVO0FBQzNCLFFBQU1DLGFBQWNELElBQUlILE9BQUwsR0FBaUJFLElBQUksQ0FBeEM7QUFDQSxXQUFPLENBQ0xKLEtBQUtNLFVBQUwsQ0FESyxFQUVMTixLQUFLTSxhQUFhLENBQWxCLENBRkssRUFHTE4sS0FBS00sYUFBYSxDQUFsQixDQUhLLEVBSUxOLEtBQUtNLGFBQWEsQ0FBbEIsQ0FKSyxDQUFQO0FBTUQsR0FSRDs7QUFVQSxNQUFNQyxVQUFVLEVBQWhCO0FBQ0EsT0FBSyxJQUFJQyxNQUFNLENBQWYsRUFBa0JBLE1BQU1QLE1BQXhCLEVBQWdDTyxLQUFoQyxFQUF1QztBQUNyQyxRQUFNQyxjQUFjLEVBQXBCO0FBQ0EsU0FBSyxJQUFJQyxNQUFNLENBQWYsRUFBa0JBLE1BQU1oQixLQUF4QixFQUErQmdCLEtBQS9CLEVBQXNDO0FBQ3BDRCxrQkFBWVosSUFBWixDQUFpQk0sV0FBV08sR0FBWCxFQUFnQkYsR0FBaEIsQ0FBakI7QUFDRDtBQUNELFNBQUssSUFBSUcsTUFBTSxDQUFmLEVBQWtCQSxNQUFNWixZQUF4QixFQUFzQ1ksS0FBdEMsRUFBNkM7QUFDM0NGLGtCQUFZWixJQUFaLENBQWlCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQUFqQjtBQUNEO0FBQ0RVLFlBQVFWLElBQVIsQ0FBYVksV0FBYjtBQUNEO0FBQ0QsU0FBT0YsT0FBUDtBQUNEOztBQUVELFNBQVNLLGdCQUFULENBQTBCQyxTQUExQixFQUFxQztBQUNuQyxNQUFNQyxTQUFTLEVBQWY7QUFDQUQsWUFBVUUsT0FBVixDQUFrQixVQUFDUCxHQUFELEVBQVM7QUFDekJBLFFBQUlPLE9BQUosQ0FBWSxVQUFDQyxLQUFELEVBQVc7QUFDckJGLGFBQU9qQixJQUFQLGtDQUFlbUIsS0FBZjtBQUNELEtBRkQ7QUFHRCxHQUpEO0FBS0EsU0FBT0Msa0JBQWtCQyxJQUFsQixDQUF1QkosTUFBdkIsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7OztBQVdBLFNBQVNLLHFCQUFULFFBQThEO0FBQUEsTUFBN0JDLFlBQTZCLFNBQTdCQSxZQUE2QjtBQUFBLE1BQWZDLFdBQWUsU0FBZkEsV0FBZTs7QUFDNUQsTUFBTUMsV0FBV0MsS0FBS0MsR0FBTCxDQUFTSixhQUFhMUIsS0FBdEIsRUFBNkIyQixZQUFZM0IsS0FBekMsQ0FBakI7O0FBRUEsTUFBTStCLFVBQVVqQyxxQkFBcUIsQ0FBQyxHQUFELEVBQU0sQ0FBTixFQUFTLENBQVQsRUFBWSxHQUFaLENBQXJCLEVBQXVDOEIsUUFBdkMsQ0FBaEI7QUFDQSxNQUFNSSxZQUFZbEMscUJBQXFCLENBQUMsQ0FBRCxFQUFJLEdBQUosRUFBUyxDQUFULEVBQVksR0FBWixDQUFyQixFQUF1QzhCLFFBQXZDLENBQWxCOztBQUVBLE1BQUlLLFFBQVFDLFlBQVlDLEdBQVosRUFBWjtBQUNBLE1BQU1DLG9CQUFvQmhDLGVBQ3hCc0IsWUFEd0IsRUFDVkUsV0FBV0YsYUFBYTFCLEtBRGQsQ0FBMUI7O0FBR0EsTUFBTXFDLG1CQUFtQmpDLGVBQ3ZCdUIsV0FEdUIsRUFDVkMsV0FBV0QsWUFBWTNCLEtBRGIsQ0FBekI7QUFFQXNDLFVBQVFDLEdBQVIsQ0FBWSxnQ0FBWixFQUE4Q0wsWUFBWUMsR0FBWixLQUFvQkYsS0FBbEU7O0FBRUFBLFVBQVFDLFlBQVlDLEdBQVosRUFBUjtBQUNBLE1BQU1LLGVBQWUsZ0JBQU1DLElBQU4sQ0FDbkJMLGtCQUFrQk0sR0FBbEIsQ0FBc0I7QUFBQSxXQUFLQyxLQUFLQyxDQUFMLENBQUw7QUFBQSxHQUF0QixDQURtQixFQUVuQlAsaUJBQWlCSyxHQUFqQixDQUFxQjtBQUFBLFdBQUtDLEtBQUtDLENBQUwsQ0FBTDtBQUFBLEdBQXJCLENBRm1CLENBQXJCO0FBSUFOLFVBQVFDLEdBQVIsQ0FBWSwwQkFBWixFQUF3Q0wsWUFBWUMsR0FBWixLQUFvQkYsS0FBNUQ7O0FBRUFBLFVBQVFDLFlBQVlDLEdBQVosRUFBUjtBQUNBO0FBQ0FLLGVBQWFuQixPQUFiLENBQXFCLFVBQUN3QixXQUFELEVBQWlCO0FBQ3BDLFFBQU1DLFVBQVVELFlBQVksQ0FBWixDQUFoQjtBQUNBLFFBQU1FLGVBQWVGLFlBQVksQ0FBWixDQUFyQjtBQUNBLFFBQU1HLGFBQWFILFlBQVlJLE1BQVosR0FBcUIsQ0FBeEM7O0FBRUEsU0FBSyxJQUFJdEMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJa0IsS0FBS0MsR0FBTCxDQUFTaUIsWUFBVCxFQUF1QkMsVUFBdkIsQ0FBcEIsRUFBd0RyQyxHQUF4RCxFQUE2RDtBQUMzRCxVQUFJQSxJQUFJb0MsWUFBUixFQUFzQjtBQUNwQjtBQUNELE9BRkQsTUFFTztBQUNMO0FBQ0FYLDBCQUFrQmMsTUFBbEIsQ0FBeUJKLFVBQVVuQyxDQUFuQyxFQUFzQyxDQUF0QyxFQUF5Q3FCLFNBQXpDO0FBQ0Q7QUFDRjtBQUNGLEdBYkQ7QUFjQU0sVUFBUUMsR0FBUixDQUFZLDRCQUFaLEVBQTBDTCxZQUFZQyxHQUFaLEtBQW9CRixLQUE5RDs7QUFFQTtBQUNBLE9BQUssSUFBSS9CLElBQUlzQyxhQUFhUyxNQUFiLEdBQXNCLENBQW5DLEVBQXNDL0MsS0FBSyxDQUEzQyxFQUE4Q0EsR0FBOUMsRUFBbUQ7QUFDakQsUUFBTTJDLGNBQWNMLGFBQWF0QyxDQUFiLENBQXBCO0FBQ0EsUUFBTTRDLFVBQVVELFlBQVksQ0FBWixDQUFoQjtBQUNBLFFBQU1FLGVBQWVGLFlBQVksQ0FBWixDQUFyQjtBQUNBLFFBQU1HLGFBQWFILFlBQVlJLE1BQVosR0FBcUIsQ0FBeEM7O0FBRUEsU0FBSyxJQUFJdEMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJa0IsS0FBS0MsR0FBTCxDQUFTaUIsWUFBVCxFQUF1QkMsVUFBdkIsQ0FBcEIsRUFBd0RyQyxHQUF4RCxFQUE2RDtBQUMzRCxVQUFJQSxJQUFJcUMsVUFBUixFQUFvQjtBQUNsQjtBQUNELE9BRkQsTUFFTztBQUNMO0FBQ0FYLHlCQUFpQmEsTUFBakIsQ0FBd0JKLFVBQVVuQyxDQUFsQyxFQUFxQyxDQUFyQyxFQUF3Q29CLE9BQXhDO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFNBQU87QUFDTEosaUJBQWE7QUFDWHJCLFlBQU1ZLGlCQUFpQm1CLGdCQUFqQixDQURLO0FBRVg5QixjQUFROEIsaUJBQWlCWSxNQUZkO0FBR1hqRCxhQUFPNEI7QUFISSxLQURSO0FBTUxGLGtCQUFjO0FBQ1pwQixZQUFNWSxpQkFBaUJrQixpQkFBakIsQ0FETTtBQUVaN0IsY0FBUTZCLGtCQUFrQmEsTUFGZDtBQUdaakQsYUFBTzRCO0FBSEs7QUFOVCxHQUFQO0FBWUQ7O0FBRUR1QixLQUFLQyxnQkFBTCxDQUFzQixTQUF0QixFQUFpQyxpQkFBNkM7QUFBQSx5QkFBMUM5QyxJQUEwQztBQUFBLE1BQWxDb0IsWUFBa0MsY0FBbENBLFlBQWtDO0FBQUEsTUFBcEJDLFdBQW9CLGNBQXBCQSxXQUFvQjs7QUFDNUUsTUFBTU0sUUFBUUMsWUFBWUMsR0FBWixFQUFkO0FBQ0EsTUFBTWYsU0FBU0ssc0JBQXNCLEVBQUVDLDBCQUFGLEVBQWdCQyx3QkFBaEIsRUFBdEIsQ0FBZjtBQUNBVyxVQUFRQyxHQUFSLENBQVksNkNBQVosRUFBMkRMLFlBQVlDLEdBQVosS0FBb0JGLEtBQS9FO0FBQ0FrQixPQUFLRSxXQUFMLENBQWlCakMsTUFBakI7QUFDQStCLE9BQUtHLEtBQUw7QUFDRCxDQU5EIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYWRpZmYgZnJvbSAnYWRpZmYnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIGxpbmUgb2YgcGl4ZWxzIG9mIGEgY2VydGFpbiByZ2JhIGNvbG9yXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcmdiYVxuICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0Q29sb3JlZExpbmUocmdiYSwgd2lkdGgpIHtcbiAgY29uc3QgbGluZSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICBsaW5lLnB1c2gocmdiYSk7XG4gIH1cbiAgcmV0dXJuIGxpbmU7XG59XG5cbmZ1bmN0aW9uIGltYWdlVG8yREFycmF5KHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9LCBwYWRkaW5nUmlnaHQpIHtcbiAgLy8gVGhlIGltYWdlRGF0YSBpcyBhIDFEIGFycmF5LiBFYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIGFcbiAgLy8gZGVjaW1hbCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgb25lIG9mIHRoZSBSR0JBIGNoYW5uZWxzIGZvciB0aGF0IHBpeGVsLlxuICBjb25zdCByb3dTaXplID0gd2lkdGggKiA0O1xuICBjb25zdCBnZXRQaXhlbEF0ID0gKHgsIHkpID0+IHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHkgKiByb3dTaXplKSArICh4ICogNCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGRhdGFbc3RhcnRJbmRleF0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAxXSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDJdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgM10sXG4gICAgXTtcbiAgfTtcblxuICBjb25zdCBuZXdEYXRhID0gW107XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHtcbiAgICBjb25zdCBwaXhlbHNJblJvdyA9IFtdO1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChnZXRQaXhlbEF0KGNvbCwgcm93KSk7XG4gICAgfVxuICAgIGZvciAobGV0IHBhZCA9IDA7IHBhZCA8IHBhZGRpbmdSaWdodDsgcGFkKyspIHtcbiAgICAgIHBpeGVsc0luUm93LnB1c2goWzAsIDAsIDAsIDBdKTtcbiAgICB9XG4gICAgbmV3RGF0YS5wdXNoKHBpeGVsc0luUm93KTtcbiAgfVxuICByZXR1cm4gbmV3RGF0YTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbkltYWdlRGF0YShpbWFnZURhdGEpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGltYWdlRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICByb3cuZm9yRWFjaCgocGl4ZWwpID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLnBpeGVsKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBVaW50OENsYW1wZWRBcnJheS5mcm9tKHJlc3VsdCk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCByZWRMaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzI1NSwgMCwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuICBjb25zdCBncmVlbkxpbmUgPSBjb25zdHJ1Y3RDb2xvcmVkTGluZShbMCwgMjU1LCAwLCAyNTVdLCBtYXhXaWR0aCk7XG5cbiAgbGV0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IHByZXZpb3VzSW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgcHJldmlvdXNEYXRhLCBtYXhXaWR0aCAtIHByZXZpb3VzRGF0YS53aWR0aCk7XG5cbiAgY29uc3QgY3VycmVudEltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIGN1cnJlbnREYXRhLCBtYXhXaWR0aCAtIGN1cnJlbnREYXRhLndpZHRoKTtcbiAgY29uc29sZS5sb2coJyhpbnRlcm5hbCkgaW1hZ2UgY3JlYXRpb24gdG9vaycsIHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQpO1xuXG4gIHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IGFkaWZmUmVzdWx0cyA9IGFkaWZmLmRpZmYoXG4gICAgcHJldmlvdXNJbWFnZURhdGEubWFwKGQgPT4gYnRvYShkKSksXG4gICAgY3VycmVudEltYWdlRGF0YS5tYXAoZCA9PiBidG9hKGQpKVxuICApO1xuICBjb25zb2xlLmxvZygnKGludGVybmFsKSBhZGlmZmluZyB0b29rJywgcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCk7XG5cbiAgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgLy8gaXRlcmF0ZSBhbmQgYXBwbHkgY2hhbmdlcyB0byBwcmV2aW91cyBkYXRhXG4gIGFkaWZmUmVzdWx0cy5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGRlbGV0ZWRJdGVtcykge1xuICAgICAgICAvLyBpZ25vcmUsIHdlIGp1c3Qga2VlcCB0aGUgb2xkIGxpbmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFkZCBhIGdyZWVuIGxpbmUgdG8gc2lnbmFsIGFuIGFkZGl0aW9uXG4gICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhLnNwbGljZShhdEluZGV4ICsgeSwgMCwgZ3JlZW5MaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBjb25zb2xlLmxvZygnKGludGVybmFsKSBpbWFnZSBwcmVwIHRvb2snLCBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KTtcblxuICAvLyBpdGVyYXRlIGJhY2t3YXJkcyBhbmQgYXBwbHkgY2hhbmdlcyB0byBjdXJyZW50IGRhdGFcbiAgZm9yIChsZXQgaSA9IGFkaWZmUmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gYWRpZmZSZXN1bHRzW2ldO1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGFkZGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgYSByZWQgbGluZSB0byBzaWduYWwgYSBkZWxldGlvblxuICAgICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShhdEluZGV4ICsgeSwgMCwgcmVkTGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50RGF0YToge1xuICAgICAgZGF0YTogZmxhdHRlbkltYWdlRGF0YShjdXJyZW50SW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogY3VycmVudEltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgICBwcmV2aW91c0RhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEocHJldmlvdXNJbWFnZURhdGEpLFxuICAgICAgaGVpZ2h0OiBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgfTtcbn1cblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YTogeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0gfSkgPT4ge1xuICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICBjb25zdCByZXN1bHQgPSBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBjb25zb2xlLmxvZygnKGludGVybmFsKSBDb21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIgdG9vaycsIHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQpO1xuICBzZWxmLnBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("function head (a) {\n return a[0]\n}\n\nfunction last (a) {\n return a[a.length - 1]\n}\n\nfunction tail(a) {\n return a.slice(1)\n}\n\nfunction retreat (e) {\n return e.pop()\n}\n\nfunction hasLength (e) {\n return e.length\n}\n\nfunction any(ary, test) {\n for(var i=0;i<ary.length;i++)\n if(test(ary[i]))\n return true\n return false\n}\n\nfunction score (a) {\n return a.reduce(function (s, a) {\n return s + a.length + a[1] + 1\n }, 0)\n}\n\nfunction best (a, b) {\n return score(a) <= score(b) ? a : b\n}\n\n\nvar _rules // set at the bottom \n\n// note, naive implementation. will break on circular objects.\n\nfunction _equal(a, b) {\n if(a && !b) return false\n if(Array.isArray(a))\n if(a.length != b.length) return false\n if(a && 'object' == typeof a) {\n for(var i in a)\n if(!_equal(a[i], b[i])) return false\n for(var i in b)\n if(!_equal(a[i], b[i])) return false\n return true\n }\n return a == b\n}\n\nfunction getArgs(args) {\n return args.length == 1 ? args[0] : [].slice.call(args)\n}\n\n// return the index of the element not like the others, or -1\nfunction oddElement(ary, cmp) {\n var c\n function guess(a) {\n var odd = -1\n c = 0\n for (var i = a; i < ary.length; i ++) {\n if(!cmp(ary[a], ary[i])) {\n odd = i, c++\n }\n }\n return c > 1 ? -1 : odd\n }\n //assume that it is the first element.\n var g = guess(0)\n if(-1 != g) return g\n //0 was the odd one, then all the other elements are equal\n //else there more than one different element\n guess(1)\n return c == 0 ? 0 : -1\n}\nvar exports = module.exports = function (deps, exports) {\n var equal = (deps && deps.equal) || _equal\n exports = exports || {} \n exports.lcs = \n function lcs() {\n var cache = {}\n var args = getArgs(arguments)\n var a = args[0], b = args[1]\n\n function key (a,b){\n return a.length + ':' + b.length\n }\n\n //find length that matches at the head\n\n if(args.length > 2) {\n //if called with multiple sequences\n //recurse, since lcs(a, b, c, d) == lcs(lcs(a,b), lcs(c,d))\n args.push(lcs(args.shift(), args.shift()))\n return lcs(args)\n }\n \n //this would be improved by truncating input first\n //and not returning an lcs as an intermediate step.\n //untill that is a performance problem.\n\n var start = 0, end = 0\n for(var i = 0; i < a.length && i < b.length \n && equal(a[i], b[i])\n ; i ++\n )\n start = i + 1\n\n if(a.length === start)\n return a.slice()\n\n for(var i = 0; i < a.length - start && i < b.length - start\n && equal(a[a.length - 1 - i], b[b.length - 1 - i])\n ; i ++\n )\n end = i\n\n function recurse (a, b) {\n if(!a.length || !b.length) return []\n //avoid exponential time by caching the results\n if(cache[key(a, b)]) return cache[key(a, b)]\n\n if(equal(a[0], b[0]))\n return [head(a)].concat(recurse(tail(a), tail(b)))\n else { \n var _a = recurse(tail(a), b)\n var _b = recurse(a, tail(b))\n return cache[key(a,b)] = _a.length > _b.length ? _a : _b \n }\n }\n \n var middleA = a.slice(start, a.length - end)\n var middleB = b.slice(start, b.length - end)\n\n return (\n a.slice(0, start).concat(\n recurse(middleA, middleB)\n ).concat(a.slice(a.length - end))\n )\n }\n\n // given n sequences, calc the lcs, and then chunk strings into stable and unstable sections.\n // unstable chunks are passed to build\n exports.chunk =\n function (q, build) {\n var q = q.map(function (e) { return e.slice() })\n var lcs = exports.lcs.apply(null, q)\n var all = [lcs].concat(q)\n\n function matchLcs (e) {\n if(e.length && !lcs.length || !e.length && lcs.length)\n return false //incase the last item is null\n return equal(last(e), last(lcs)) || ((e.length + lcs.length) === 0)\n }\n\n while(any(q, hasLength)) {\n //if each element is at the lcs then this chunk is stable.\n while(q.every(matchLcs) && q.every(hasLength))\n all.forEach(retreat)\n //collect the changes in each array upto the next match with the lcs\n var c = false\n var unstable = q.map(function (e) {\n var change = []\n while(!matchLcs(e)) {\n change.unshift(retreat(e))\n c = true\n }\n return change\n })\n if(c) build(q[0].length, unstable)\n }\n }\n\n //calculate a diff this is only updates\n exports.optimisticDiff =\n function (a, b) {\n var M = Math.max(a.length, b.length)\n var m = Math.min(a.length, b.length)\n var patch = []\n for(var i = 0; i < M; i++)\n if(a[i] !== b[i]) {\n var cur = [i,0], deletes = 0\n while(a[i] !== b[i] && i < m) {\n cur[1] = ++deletes\n cur.push(b[i++])\n }\n //the rest are deletes or inserts\n if(i >= m) {\n //the rest are deletes\n if(a.length > b.length)\n cur[1] += a.length - b.length\n //the rest are inserts\n else if(a.length < b.length)\n cur = cur.concat(b.slice(a.length))\n }\n patch.push(cur)\n }\n\n return patch\n }\n\n exports.diff =\n function (a, b) {\n var optimistic = exports.optimisticDiff(a, b)\n var changes = []\n exports.chunk([a, b], function (index, unstable) {\n var del = unstable.shift().length\n var insert = unstable.shift()\n changes.push([index, del].concat(insert))\n })\n return best(optimistic, changes)\n }\n\n exports.patch = function (a, changes, mutate) {\n if(mutate !== true) a = a.slice(a)//copy a\n changes.forEach(function (change) {\n [].splice.apply(a, change)\n })\n return a\n }\n\n // http://en.wikipedia.org/wiki/Concestor\n // me, concestor, you...\n exports.merge = function () {\n var args = getArgs(arguments)\n var patch = exports.diff3(args)\n return exports.patch(args[0], patch)\n }\n\n exports.diff3 = function () {\n var args = getArgs(arguments)\n var r = []\n exports.chunk(args, function (index, unstable) {\n var mine = unstable[0]\n var insert = resolve(unstable)\n if(equal(mine, insert)) return \n r.push([index, mine.length].concat(insert)) \n })\n return r\n }\n exports.oddOneOut =\n function oddOneOut (changes) {\n changes = changes.slice()\n //put the concestor first\n changes.unshift(changes.splice(1,1)[0])\n var i = oddElement(changes, equal)\n if(i == 0) // concestor was different, 'false conflict'\n return changes[1]\n if (~i)\n return changes[i] \n }\n exports.insertMergeOverDelete = \n //i've implemented this as a seperate rule,\n //because I had second thoughts about this.\n function insertMergeOverDelete (changes) {\n changes = changes.slice()\n changes.splice(1,1)// remove concestor\n \n //if there is only one non empty change thats okay.\n //else full confilct\n for (var i = 0, nonempty; i < changes.length; i++)\n if(changes[i].length) \n if(!nonempty) nonempty = changes[i]\n else return // full conflict\n return nonempty\n }\n\n var rules = (deps && deps.rules) || [exports.oddOneOut, exports.insertMergeOverDelete]\n\n function resolve (changes) {\n var l = rules.length\n for (var i in rules) { // first\n \n var c = rules[i] && rules[i](changes)\n if(c) return c\n }\n changes.splice(1,1) // remove concestor\n //returning the conflicts as an object is a really bad idea,\n // because == will not detect they are the same. and conflicts build.\n // better to use\n // '<<<<<<<<<<<<<'\n // of course, i wrote this before i started on snob, so i didn't know that then.\n /*var conflict = ['>>>>>>>>>>>>>>>>']\n while(changes.length)\n conflict = conflict.concat(changes.shift()).concat('============')\n conflict.pop()\n conflict.push ('<<<<<<<<<<<<<<<')\n changes.unshift ('>>>>>>>>>>>>>>>')\n return conflict*/\n //nah, better is just to use an equal can handle objects\n return {'?': changes}\n }\n return exports\n}\nexports(null, exports)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2FkaWZmL2luZGV4LmpzPzA0ZDYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0Isb0JBQW9CO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaGVhZCAoYSkge1xuICByZXR1cm4gYVswXVxufVxuXG5mdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhW2EubGVuZ3RoIC0gMV1cbn1cblxuZnVuY3Rpb24gdGFpbChhKSB7XG4gIHJldHVybiBhLnNsaWNlKDEpXG59XG5cbmZ1bmN0aW9uIHJldHJlYXQgKGUpIHtcbiAgcmV0dXJuIGUucG9wKClcbn1cblxuZnVuY3Rpb24gaGFzTGVuZ3RoIChlKSB7XG4gIHJldHVybiBlLmxlbmd0aFxufVxuXG5mdW5jdGlvbiBhbnkoYXJ5LCB0ZXN0KSB7XG4gIGZvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspXG4gICAgaWYodGVzdChhcnlbaV0pKVxuICAgICAgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHNjb3JlIChhKSB7XG4gIHJldHVybiBhLnJlZHVjZShmdW5jdGlvbiAocywgYSkge1xuICAgICAgcmV0dXJuIHMgKyBhLmxlbmd0aCArIGFbMV0gKyAxXG4gIH0sIDApXG59XG5cbmZ1bmN0aW9uIGJlc3QgKGEsIGIpIHtcbiAgcmV0dXJuIHNjb3JlKGEpIDw9IHNjb3JlKGIpID8gYSA6IGJcbn1cblxuXG52YXIgX3J1bGVzIC8vIHNldCBhdCB0aGUgYm90dG9tICBcblxuLy8gbm90ZSwgbmFpdmUgaW1wbGVtZW50YXRpb24uIHdpbGwgYnJlYWsgb24gY2lyY3VsYXIgb2JqZWN0cy5cblxuZnVuY3Rpb24gX2VxdWFsKGEsIGIpIHtcbiAgaWYoYSAmJiAhYikgcmV0dXJuIGZhbHNlXG4gIGlmKEFycmF5LmlzQXJyYXkoYSkpXG4gICAgaWYoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBpZihhICYmICdvYmplY3QnID09IHR5cGVvZiBhKSB7XG4gICAgZm9yKHZhciBpIGluIGEpXG4gICAgICBpZighX2VxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2VcbiAgICBmb3IodmFyIGkgaW4gYilcbiAgICAgIGlmKCFfZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGEgPT0gYlxufVxuXG5mdW5jdGlvbiBnZXRBcmdzKGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID09IDEgPyBhcmdzWzBdIDogW10uc2xpY2UuY2FsbChhcmdzKVxufVxuXG4vLyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IG5vdCBsaWtlIHRoZSBvdGhlcnMsIG9yIC0xXG5mdW5jdGlvbiBvZGRFbGVtZW50KGFyeSwgY21wKSB7XG4gIHZhciBjXG4gIGZ1bmN0aW9uIGd1ZXNzKGEpIHtcbiAgICB2YXIgb2RkID0gLTFcbiAgICBjID0gMFxuICAgIGZvciAodmFyIGkgPSBhOyBpIDwgYXJ5Lmxlbmd0aDsgaSArKykge1xuICAgICAgaWYoIWNtcChhcnlbYV0sIGFyeVtpXSkpIHtcbiAgICAgICAgb2RkID0gaSwgYysrXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjID4gMSA/IC0xIDogb2RkXG4gIH1cbiAgLy9hc3N1bWUgdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudC5cbiAgdmFyIGcgPSBndWVzcygwKVxuICBpZigtMSAhPSBnKSByZXR1cm4gZ1xuICAvLzAgd2FzIHRoZSBvZGQgb25lLCB0aGVuIGFsbCB0aGUgb3RoZXIgZWxlbWVudHMgYXJlIGVxdWFsXG4gIC8vZWxzZSB0aGVyZSBtb3JlIHRoYW4gb25lIGRpZmZlcmVudCBlbGVtZW50XG4gIGd1ZXNzKDEpXG4gIHJldHVybiBjID09IDAgPyAwIDogLTFcbn1cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVwcywgZXhwb3J0cykge1xuICB2YXIgZXF1YWwgPSAoZGVwcyAmJiBkZXBzLmVxdWFsKSB8fCBfZXF1YWxcbiAgZXhwb3J0cyA9IGV4cG9ydHMgfHwge30gXG4gIGV4cG9ydHMubGNzID0gXG4gIGZ1bmN0aW9uIGxjcygpIHtcbiAgICB2YXIgY2FjaGUgPSB7fVxuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIGEgPSBhcmdzWzBdLCBiID0gYXJnc1sxXVxuXG4gICAgZnVuY3Rpb24ga2V5IChhLGIpe1xuICAgICAgcmV0dXJuIGEubGVuZ3RoICsgJzonICsgYi5sZW5ndGhcbiAgICB9XG5cbiAgICAvL2ZpbmQgbGVuZ3RoIHRoYXQgbWF0Y2hlcyBhdCB0aGUgaGVhZFxuXG4gICAgaWYoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAvL2lmIGNhbGxlZCB3aXRoIG11bHRpcGxlIHNlcXVlbmNlc1xuICAgICAgLy9yZWN1cnNlLCBzaW5jZSBsY3MoYSwgYiwgYywgZCkgPT0gbGNzKGxjcyhhLGIpLCBsY3MoYyxkKSlcbiAgICAgIGFyZ3MucHVzaChsY3MoYXJncy5zaGlmdCgpLCBhcmdzLnNoaWZ0KCkpKVxuICAgICAgcmV0dXJuIGxjcyhhcmdzKVxuICAgIH1cbiAgICBcbiAgICAvL3RoaXMgd291bGQgYmUgaW1wcm92ZWQgYnkgdHJ1bmNhdGluZyBpbnB1dCBmaXJzdFxuICAgIC8vYW5kIG5vdCByZXR1cm5pbmcgYW4gbGNzIGFzIGFuIGludGVybWVkaWF0ZSBzdGVwLlxuICAgIC8vdW50aWxsIHRoYXQgaXMgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLlxuXG4gICAgdmFyIHN0YXJ0ID0gMCwgZW5kID0gMFxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aCAmJiBpIDwgYi5sZW5ndGggXG4gICAgICAmJiBlcXVhbChhW2ldLCBiW2ldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgc3RhcnQgPSBpICsgMVxuXG4gICAgaWYoYS5sZW5ndGggPT09IHN0YXJ0KVxuICAgICAgcmV0dXJuIGEuc2xpY2UoKVxuXG4gICAgZm9yKHZhciBpID0gMDsgIGkgPCBhLmxlbmd0aCAtIHN0YXJ0ICYmIGkgPCBiLmxlbmd0aCAtIHN0YXJ0XG4gICAgICAmJiBlcXVhbChhW2EubGVuZ3RoIC0gMSAtIGldLCBiW2IubGVuZ3RoIC0gMSAtIGldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgZW5kID0gaVxuXG4gICAgZnVuY3Rpb24gcmVjdXJzZSAoYSwgYikge1xuICAgICAgaWYoIWEubGVuZ3RoIHx8ICFiLmxlbmd0aCkgcmV0dXJuIFtdXG4gICAgICAvL2F2b2lkIGV4cG9uZW50aWFsIHRpbWUgYnkgY2FjaGluZyB0aGUgcmVzdWx0c1xuICAgICAgaWYoY2FjaGVba2V5KGEsIGIpXSkgcmV0dXJuIGNhY2hlW2tleShhLCBiKV1cblxuICAgICAgaWYoZXF1YWwoYVswXSwgYlswXSkpXG4gICAgICAgIHJldHVybiBbaGVhZChhKV0uY29uY2F0KHJlY3Vyc2UodGFpbChhKSwgdGFpbChiKSkpXG4gICAgICBlbHNlIHsgXG4gICAgICAgIHZhciBfYSA9IHJlY3Vyc2UodGFpbChhKSwgYilcbiAgICAgICAgdmFyIF9iID0gcmVjdXJzZShhLCB0YWlsKGIpKVxuICAgICAgICByZXR1cm4gY2FjaGVba2V5KGEsYildID0gX2EubGVuZ3RoID4gX2IubGVuZ3RoID8gX2EgOiBfYiAgXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhciBtaWRkbGVBID0gYS5zbGljZShzdGFydCwgYS5sZW5ndGggLSBlbmQpXG4gICAgdmFyIG1pZGRsZUIgPSBiLnNsaWNlKHN0YXJ0LCBiLmxlbmd0aCAtIGVuZClcblxuICAgIHJldHVybiAoXG4gICAgICBhLnNsaWNlKDAsIHN0YXJ0KS5jb25jYXQoXG4gICAgICAgIHJlY3Vyc2UobWlkZGxlQSwgbWlkZGxlQilcbiAgICAgICkuY29uY2F0KGEuc2xpY2UoYS5sZW5ndGggLSBlbmQpKVxuICAgIClcbiAgfVxuXG4gIC8vIGdpdmVuIG4gc2VxdWVuY2VzLCBjYWxjIHRoZSBsY3MsIGFuZCB0aGVuIGNodW5rIHN0cmluZ3MgaW50byBzdGFibGUgYW5kIHVuc3RhYmxlIHNlY3Rpb25zLlxuICAvLyB1bnN0YWJsZSBjaHVua3MgYXJlIHBhc3NlZCB0byBidWlsZFxuICBleHBvcnRzLmNodW5rID1cbiAgZnVuY3Rpb24gKHEsIGJ1aWxkKSB7XG4gICAgdmFyIHEgPSBxLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5zbGljZSgpIH0pXG4gICAgdmFyIGxjcyA9IGV4cG9ydHMubGNzLmFwcGx5KG51bGwsIHEpXG4gICAgdmFyIGFsbCA9IFtsY3NdLmNvbmNhdChxKVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hMY3MgKGUpIHtcbiAgICAgIGlmKGUubGVuZ3RoICYmICFsY3MubGVuZ3RoIHx8ICFlLmxlbmd0aCAmJiBsY3MubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2UgLy9pbmNhc2UgdGhlIGxhc3QgaXRlbSBpcyBudWxsXG4gICAgICByZXR1cm4gZXF1YWwobGFzdChlKSwgbGFzdChsY3MpKSB8fCAoKGUubGVuZ3RoICsgbGNzLmxlbmd0aCkgPT09IDApXG4gICAgfVxuXG4gICAgd2hpbGUoYW55KHEsIGhhc0xlbmd0aCkpIHtcbiAgICAgIC8vaWYgZWFjaCBlbGVtZW50IGlzIGF0IHRoZSBsY3MgdGhlbiB0aGlzIGNodW5rIGlzIHN0YWJsZS5cbiAgICAgIHdoaWxlKHEuZXZlcnkobWF0Y2hMY3MpICYmIHEuZXZlcnkoaGFzTGVuZ3RoKSlcbiAgICAgICAgYWxsLmZvckVhY2gocmV0cmVhdClcbiAgICAgIC8vY29sbGVjdCB0aGUgY2hhbmdlcyBpbiBlYWNoIGFycmF5IHVwdG8gdGhlIG5leHQgbWF0Y2ggd2l0aCB0aGUgbGNzXG4gICAgICB2YXIgYyA9IGZhbHNlXG4gICAgICB2YXIgdW5zdGFibGUgPSBxLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY2hhbmdlID0gW11cbiAgICAgICAgd2hpbGUoIW1hdGNoTGNzKGUpKSB7XG4gICAgICAgICAgY2hhbmdlLnVuc2hpZnQocmV0cmVhdChlKSlcbiAgICAgICAgICBjID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgIH0pXG4gICAgICBpZihjKSBidWlsZChxWzBdLmxlbmd0aCwgdW5zdGFibGUpXG4gICAgfVxuICB9XG5cbiAgLy9jYWxjdWxhdGUgYSBkaWZmIHRoaXMgaXMgb25seSB1cGRhdGVzXG4gIGV4cG9ydHMub3B0aW1pc3RpY0RpZmYgPVxuICBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBNID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBtID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBwYXRjaCA9IFtdXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IE07IGkrKylcbiAgICAgIGlmKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgdmFyIGN1ciA9IFtpLDBdLCBkZWxldGVzID0gMFxuICAgICAgICB3aGlsZShhW2ldICE9PSBiW2ldICYmIGkgPCBtKSB7XG4gICAgICAgICAgY3VyWzFdID0gKytkZWxldGVzXG4gICAgICAgICAgY3VyLnB1c2goYltpKytdKVxuICAgICAgICB9XG4gICAgICAgIC8vdGhlIHJlc3QgYXJlIGRlbGV0ZXMgb3IgaW5zZXJ0c1xuICAgICAgICBpZihpID49IG0pIHtcbiAgICAgICAgICAvL3RoZSByZXN0IGFyZSBkZWxldGVzXG4gICAgICAgICAgaWYoYS5sZW5ndGggPiBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1clsxXSArPSBhLmxlbmd0aCAtIGIubGVuZ3RoXG4gICAgICAgICAgLy90aGUgcmVzdCBhcmUgaW5zZXJ0c1xuICAgICAgICAgIGVsc2UgaWYoYS5sZW5ndGggPCBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1ciA9IGN1ci5jb25jYXQoYi5zbGljZShhLmxlbmd0aCkpXG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2gucHVzaChjdXIpXG4gICAgICB9XG5cbiAgICByZXR1cm4gcGF0Y2hcbiAgfVxuXG4gIGV4cG9ydHMuZGlmZiA9XG4gIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIG9wdGltaXN0aWMgPSBleHBvcnRzLm9wdGltaXN0aWNEaWZmKGEsIGIpXG4gICAgdmFyIGNoYW5nZXMgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoW2EsIGJdLCBmdW5jdGlvbiAoaW5kZXgsIHVuc3RhYmxlKSB7XG4gICAgICB2YXIgZGVsID0gdW5zdGFibGUuc2hpZnQoKS5sZW5ndGhcbiAgICAgIHZhciBpbnNlcnQgPSB1bnN0YWJsZS5zaGlmdCgpXG4gICAgICBjaGFuZ2VzLnB1c2goW2luZGV4LCBkZWxdLmNvbmNhdChpbnNlcnQpKVxuICAgIH0pXG4gICAgcmV0dXJuIGJlc3Qob3B0aW1pc3RpYywgY2hhbmdlcylcbiAgfVxuXG4gIGV4cG9ydHMucGF0Y2ggPSBmdW5jdGlvbiAoYSwgY2hhbmdlcywgbXV0YXRlKSB7XG4gICAgaWYobXV0YXRlICE9PSB0cnVlKSBhID0gYS5zbGljZShhKS8vY29weSBhXG4gICAgY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2UpIHtcbiAgICAgIFtdLnNwbGljZS5hcHBseShhLCBjaGFuZ2UpXG4gICAgfSlcbiAgICByZXR1cm4gYVxuICB9XG5cbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db25jZXN0b3JcbiAgLy8gbWUsIGNvbmNlc3RvciwgeW91Li4uXG4gIGV4cG9ydHMubWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBnZXRBcmdzKGFyZ3VtZW50cylcbiAgICB2YXIgcGF0Y2ggPSBleHBvcnRzLmRpZmYzKGFyZ3MpXG4gICAgcmV0dXJuIGV4cG9ydHMucGF0Y2goYXJnc1swXSwgcGF0Y2gpXG4gIH1cblxuICBleHBvcnRzLmRpZmYzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIHIgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoYXJncywgZnVuY3Rpb24gKGluZGV4LCB1bnN0YWJsZSkge1xuICAgICAgdmFyIG1pbmUgPSB1bnN0YWJsZVswXVxuICAgICAgdmFyIGluc2VydCA9IHJlc29sdmUodW5zdGFibGUpXG4gICAgICBpZihlcXVhbChtaW5lLCBpbnNlcnQpKSByZXR1cm4gXG4gICAgICByLnB1c2goW2luZGV4LCBtaW5lLmxlbmd0aF0uY29uY2F0KGluc2VydCkpIFxuICAgIH0pXG4gICAgcmV0dXJuIHJcbiAgfVxuICBleHBvcnRzLm9kZE9uZU91dCA9XG4gICAgZnVuY3Rpb24gb2RkT25lT3V0IChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICAvL3B1dCB0aGUgY29uY2VzdG9yIGZpcnN0XG4gICAgICBjaGFuZ2VzLnVuc2hpZnQoY2hhbmdlcy5zcGxpY2UoMSwxKVswXSlcbiAgICAgIHZhciBpID0gb2RkRWxlbWVudChjaGFuZ2VzLCBlcXVhbClcbiAgICAgIGlmKGkgPT0gMCkgLy8gY29uY2VzdG9yIHdhcyBkaWZmZXJlbnQsICdmYWxzZSBjb25mbGljdCdcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbMV1cbiAgICAgIGlmICh+aSlcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbaV0gXG4gICAgfVxuICBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZSA9IFxuICAgIC8vaSd2ZSBpbXBsZW1lbnRlZCB0aGlzIGFzIGEgc2VwZXJhdGUgcnVsZSxcbiAgICAvL2JlY2F1c2UgSSBoYWQgc2Vjb25kIHRob3VnaHRzIGFib3V0IHRoaXMuXG4gICAgZnVuY3Rpb24gaW5zZXJ0TWVyZ2VPdmVyRGVsZXRlIChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICBjaGFuZ2VzLnNwbGljZSgxLDEpLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgICAgXG4gICAgICAvL2lmIHRoZXJlIGlzIG9ubHkgb25lIG5vbiBlbXB0eSBjaGFuZ2UgdGhhdHMgb2theS5cbiAgICAgIC8vZWxzZSBmdWxsIGNvbmZpbGN0XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9uZW1wdHk7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZihjaGFuZ2VzW2ldLmxlbmd0aCkgXG4gICAgICAgICAgaWYoIW5vbmVtcHR5KSBub25lbXB0eSA9IGNoYW5nZXNbaV1cbiAgICAgICAgICBlbHNlIHJldHVybiAvLyBmdWxsIGNvbmZsaWN0XG4gICAgICByZXR1cm4gbm9uZW1wdHlcbiAgICB9XG5cbiAgdmFyIHJ1bGVzID0gKGRlcHMgJiYgZGVwcy5ydWxlcykgfHwgW2V4cG9ydHMub2RkT25lT3V0LCBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZV1cblxuICBmdW5jdGlvbiByZXNvbHZlIChjaGFuZ2VzKSB7XG4gICAgdmFyIGwgPSBydWxlcy5sZW5ndGhcbiAgICBmb3IgKHZhciBpIGluIHJ1bGVzKSB7IC8vIGZpcnN0XG4gICAgICBcbiAgICAgIHZhciBjID0gcnVsZXNbaV0gJiYgcnVsZXNbaV0oY2hhbmdlcylcbiAgICAgIGlmKGMpIHJldHVybiBjXG4gICAgfVxuICAgIGNoYW5nZXMuc3BsaWNlKDEsMSkgLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgIC8vcmV0dXJuaW5nIHRoZSBjb25mbGljdHMgYXMgYW4gb2JqZWN0IGlzIGEgcmVhbGx5IGJhZCBpZGVhLFxuICAgIC8vIGJlY2F1c2UgPT0gd2lsbCBub3QgZGV0ZWN0IHRoZXkgYXJlIHRoZSBzYW1lLiBhbmQgY29uZmxpY3RzIGJ1aWxkLlxuICAgIC8vIGJldHRlciB0byB1c2VcbiAgICAvLyAnPDw8PDw8PDw8PDw8PCdcbiAgICAvLyBvZiBjb3Vyc2UsIGkgd3JvdGUgdGhpcyBiZWZvcmUgaSBzdGFydGVkIG9uIHNub2IsIHNvIGkgZGlkbid0IGtub3cgdGhhdCB0aGVuLlxuICAgIC8qdmFyIGNvbmZsaWN0ID0gWyc+Pj4+Pj4+Pj4+Pj4+Pj4+J11cbiAgICB3aGlsZShjaGFuZ2VzLmxlbmd0aClcbiAgICAgIGNvbmZsaWN0ID0gY29uZmxpY3QuY29uY2F0KGNoYW5nZXMuc2hpZnQoKSkuY29uY2F0KCc9PT09PT09PT09PT0nKVxuICAgIGNvbmZsaWN0LnBvcCgpXG4gICAgY29uZmxpY3QucHVzaCAgICAgICAgICAoJzw8PDw8PDw8PDw8PDw8PCcpXG4gICAgY2hhbmdlcy51bnNoaWZ0ICAgICAgICgnPj4+Pj4+Pj4+Pj4+Pj4+JylcbiAgICByZXR1cm4gY29uZmxpY3QqL1xuICAgIC8vbmFoLCBiZXR0ZXIgaXMganVzdCB0byB1c2UgYW4gZXF1YWwgY2FuIGhhbmRsZSBvYmplY3RzXG4gICAgcmV0dXJuIHsnPyc6IGNoYW5nZXN9XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHNcbn1cbmV4cG9ydHMobnVsbCwgZXhwb3J0cylcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FkaWZmL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
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 _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\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\n/**\n * Construct a line of pixels of a certain rgba color\n *\n * @param {Array} rgba\n * @param {Number} width\n * @return {Array}\n */\nfunction constructColoredLine(rgba, width) {\n var line = [];\n for (var i = 0; i < width; i++) {\n line.push(rgba);\n }\n return line;\n}\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 var getPixelAt = function getPixelAt(x, y) {\n var startIndex = y * rowSize + x * 4;\n return [data[startIndex], data[startIndex + 1], data[startIndex + 2], data[startIndex + 3]];\n };\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = [];\n for (var col = 0; col < width; col++) {\n pixelsInRow.push(getPixelAt(col, row));\n }\n for (var pad = 0; pad < paddingRight; pad++) {\n pixelsInRow.push([0, 0, 0, 0]);\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction flattenImageData(imageData) {\n var result = [];\n imageData.forEach(function (row) {\n row.forEach(function (pixel) {\n result.push.apply(result, _toConsumableArray(pixel));\n });\n });\n return Uint8ClampedArray.from(result);\n}\n\nvar start = void 0;\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(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var redLine = constructColoredLine([255, 0, 0, 255], maxWidth);\n var greenLine = constructColoredLine([0, 255, 0, 255], maxWidth);\n\n start = performance.now();\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n console.log('(internal) image creation took', performance.now() - start);\n\n var hashedPreviousImageData = previousImageData.map(function (d) {\n return btoa(d);\n });\n var hashedCurrentImageData = currentImageData.map(function (d) {\n return btoa(d);\n });\n start = performance.now();\n var adiffResults = _adiff2.default.diff(hashedPreviousImageData, hashedCurrentImageData);\n console.log('(internal) adiffing took', performance.now() - start);\n\n start = performance.now();\n // iterate and apply changes to previous data\n adiffResults.forEach(function (instruction) {\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < deletedItems) {\n // ignore, we just keep the old line\n } else {\n // add a green line to signal an addition\n previousImageData.splice(atIndex + y, 0, greenLine);\n }\n }\n });\n\n // iterate backwards and apply changes to current data\n for (var i = adiffResults.length - 1; i >= 0; i--) {\n var instruction = adiffResults[i];\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < addedItems) {\n // ignore, we just keep the old line\n } else {\n // add a red line to signal a deletion\n currentImageData.splice(atIndex + y, 0, redLine);\n }\n }\n }\n console.log('(internal) image prep took', performance.now() - start);\n\n start = performance.now();\n return {\n currentData: {\n data: flattenImageData(currentImageData),\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: flattenImageData(previousImageData),\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref3) {\n var _ref3$data = _ref3.data;\n var previousData = _ref3$data.previousData;\n var currentData = _ref3$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n console.log('(internal) flattening took', performance.now() - start);\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiZmxhdHRlbkltYWdlRGF0YSIsImltYWdlRGF0YSIsInJlc3VsdCIsImZvckVhY2giLCJwaXhlbCIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiZnJvbSIsInN0YXJ0IiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJtYXhXaWR0aCIsIk1hdGgiLCJtYXgiLCJyZWRMaW5lIiwiZ3JlZW5MaW5lIiwicGVyZm9ybWFuY2UiLCJub3ciLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJjb25zb2xlIiwibG9nIiwiaGFzaGVkUHJldmlvdXNJbWFnZURhdGEiLCJtYXAiLCJidG9hIiwiZCIsImhhc2hlZEN1cnJlbnRJbWFnZURhdGEiLCJhZGlmZlJlc3VsdHMiLCJkaWZmIiwiaW5zdHJ1Y3Rpb24iLCJhdEluZGV4IiwiZGVsZXRlZEl0ZW1zIiwiYWRkZWRJdGVtcyIsImxlbmd0aCIsInNwbGljZSIsInNlbGYiLCJhZGRFdmVudExpc3RlbmVyIiwicG9zdE1lc3NhZ2UiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7QUFFQTs7Ozs7OztBQU9BLFNBQVNBLG9CQUFULENBQThCQyxJQUE5QixFQUFvQ0MsS0FBcEMsRUFBMkM7QUFDekMsTUFBTUMsT0FBTyxFQUFiO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIs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anMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYWRpZmYgZnJvbSAnYWRpZmYnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIGxpbmUgb2YgcGl4ZWxzIG9mIGEgY2VydGFpbiByZ2JhIGNvbG9yXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcmdiYVxuICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0Q29sb3JlZExpbmUocmdiYSwgd2lkdGgpIHtcbiAgY29uc3QgbGluZSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICBsaW5lLnB1c2gocmdiYSk7XG4gIH1cbiAgcmV0dXJuIGxpbmU7XG59XG5cbmZ1bmN0aW9uIGltYWdlVG8yREFycmF5KHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9LCBwYWRkaW5nUmlnaHQpIHtcbiAgLy8gVGhlIGltYWdlRGF0YSBpcyBhIDFEIGFycmF5LiBFYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIGFcbiAgLy8gZGVjaW1hbCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgb25lIG9mIHRoZSBSR0JBIGNoYW5uZWxzIGZvciB0aGF0IHBpeGVsLlxuICBjb25zdCByb3dTaXplID0gd2lkdGggKiA0O1xuICBjb25zdCBnZXRQaXhlbEF0ID0gKHgsIHkpID0+IHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHkgKiByb3dTaXplKSArICh4ICogNCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGRhdGFbc3RhcnRJbmRleF0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAxXSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDJdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgM10sXG4gICAgXTtcbiAgfTtcblxuICBjb25zdCBuZXdEYXRhID0gW107XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHtcbiAgICBjb25zdCBwaXhlbHNJblJvdyA9IFtdO1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChnZXRQaXhlbEF0KGNvbCwgcm93KSk7XG4gICAgfVxuICAgIGZvciAobGV0IHBhZCA9IDA7IHBhZCA8IHBhZGRpbmdSaWdodDsgcGFkKyspIHtcbiAgICAgIHBpeGVsc0luUm93LnB1c2goWzAsIDAsIDAsIDBdKTtcbiAgICB9XG4gICAgbmV3RGF0YS5wdXNoKHBpeGVsc0luUm93KTtcbiAgfVxuICByZXR1cm4gbmV3RGF0YTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbkltYWdlRGF0YShpbWFnZURhdGEpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGltYWdlRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICByb3cuZm9yRWFjaCgocGl4ZWwpID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLnBpeGVsKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBVaW50OENsYW1wZWRBcnJheS5mcm9tKHJlc3VsdCk7XG59XG5cbmxldCBzdGFydDtcbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCByZWRMaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzI1NSwgMCwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuICBjb25zdCBncmVlbkxpbmUgPSBjb25zdHJ1Y3RDb2xvcmVkTGluZShbMCwgMjU1LCAwLCAyNTVdLCBtYXhXaWR0aCk7XG5cbiAgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY29uc3QgcHJldmlvdXNJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBwcmV2aW91c0RhdGEsIG1heFdpZHRoIC0gcHJldmlvdXNEYXRhLndpZHRoKTtcblxuICBjb25zdCBjdXJyZW50SW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgY3VycmVudERhdGEsIG1heFdpZHRoIC0gY3VycmVudERhdGEud2lkdGgpO1xuICBjb25zb2xlLmxvZygnKGludGVybmFsKSBpbWFnZSBjcmVhdGlvbiB0b29rJywgcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCk7XG5cbiAgY29uc3QgaGFzaGVkUHJldmlvdXNJbWFnZURhdGEgPSBwcmV2aW91c0ltYWdlRGF0YS5tYXAoZCA9PiBidG9hKGQpKTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudEltYWdlRGF0YSA9IGN1cnJlbnRJbWFnZURhdGEubWFwKGQgPT4gYnRvYShkKSk7XG4gIHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IGFkaWZmUmVzdWx0cyA9IGFkaWZmLmRpZmYoXG4gICAgaGFzaGVkUHJldmlvdXNJbWFnZURhdGEsXG4gICAgaGFzaGVkQ3VycmVudEltYWdlRGF0YVxuICApO1xuICBjb25zb2xlLmxvZygnKGludGVybmFsKSBhZGlmZmluZyB0b29rJywgcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCk7XG5cbiAgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgLy8gaXRlcmF0ZSBhbmQgYXBwbHkgY2hhbmdlcyB0byBwcmV2aW91cyBkYXRhXG4gIGFkaWZmUmVzdWx0cy5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGRlbGV0ZWRJdGVtcykge1xuICAgICAgICAvLyBpZ25vcmUsIHdlIGp1c3Qga2VlcCB0aGUgb2xkIGxpbmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFkZCBhIGdyZWVuIGxpbmUgdG8gc2lnbmFsIGFuIGFkZGl0aW9uXG4gICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhLnNwbGljZShhdEluZGV4ICsgeSwgMCwgZ3JlZW5MaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vIGl0ZXJhdGUgYmFja3dhcmRzIGFuZCBhcHBseSBjaGFuZ2VzIHRvIGN1cnJlbnQgZGF0YVxuICBmb3IgKGxldCBpID0gYWRpZmZSZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBhZGlmZlJlc3VsdHNbaV07XG4gICAgY29uc3QgYXRJbmRleCA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGRlbGV0ZWRJdGVtcyA9IGluc3RydWN0aW9uWzFdO1xuICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBpbnN0cnVjdGlvbi5sZW5ndGggLSAyO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBNYXRoLm1heChkZWxldGVkSXRlbXMsIGFkZGVkSXRlbXMpOyB5KyspIHtcbiAgICAgIGlmICh5IDwgYWRkZWRJdGVtcykge1xuICAgICAgICAvLyBpZ25vcmUsIHdlIGp1c3Qga2VlcCB0aGUgb2xkIGxpbmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFkZCBhIHJlZCBsaW5lIHRvIHNpZ25hbCBhIGRlbGV0aW9uXG4gICAgICAgIGN1cnJlbnRJbWFnZURhdGEuc3BsaWNlKGF0SW5kZXggKyB5LCAwLCByZWRMaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc29sZS5sb2coJyhpbnRlcm5hbCkgaW1hZ2UgcHJlcCB0b29rJywgcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCk7XG5cbiAgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50RGF0YToge1xuICAgICAgZGF0YTogZmxhdHRlbkltYWdlRGF0YShjdXJyZW50SW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogY3VycmVudEltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgICBwcmV2aW91c0RhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEocHJldmlvdXNJbWFnZURhdGEpLFxuICAgICAgaGVpZ2h0OiBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgfTtcbn1cblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YTogeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0gfSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBjb25zb2xlLmxvZygnKGludGVybmFsKSBmbGF0dGVuaW5nIHRvb2snLCBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KTtcbiAgc2VsZi5wb3N0TWVzc2FnZShyZXN1bHQpO1xuICBzZWxmLmNsb3NlKCk7XG59KTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL3dvcmtlcnMvQ29tcHV0ZUFuZEluamVjdERpZmZzV29ya2VyLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("function head (a) {\n return a[0]\n}\n\nfunction last (a) {\n return a[a.length - 1]\n}\n\nfunction tail(a) {\n return a.slice(1)\n}\n\nfunction retreat (e) {\n return e.pop()\n}\n\nfunction hasLength (e) {\n return e.length\n}\n\nfunction any(ary, test) {\n for(var i=0;i<ary.length;i++)\n if(test(ary[i]))\n return true\n return false\n}\n\nfunction score (a) {\n return a.reduce(function (s, a) {\n return s + a.length + a[1] + 1\n }, 0)\n}\n\nfunction best (a, b) {\n return score(a) <= score(b) ? a : b\n}\n\n\nvar _rules // set at the bottom \n\n// note, naive implementation. will break on circular objects.\n\nfunction _equal(a, b) {\n if(a && !b) return false\n if(Array.isArray(a))\n if(a.length != b.length) return false\n if(a && 'object' == typeof a) {\n for(var i in a)\n if(!_equal(a[i], b[i])) return false\n for(var i in b)\n if(!_equal(a[i], b[i])) return false\n return true\n }\n return a == b\n}\n\nfunction getArgs(args) {\n return args.length == 1 ? args[0] : [].slice.call(args)\n}\n\n// return the index of the element not like the others, or -1\nfunction oddElement(ary, cmp) {\n var c\n function guess(a) {\n var odd = -1\n c = 0\n for (var i = a; i < ary.length; i ++) {\n if(!cmp(ary[a], ary[i])) {\n odd = i, c++\n }\n }\n return c > 1 ? -1 : odd\n }\n //assume that it is the first element.\n var g = guess(0)\n if(-1 != g) return g\n //0 was the odd one, then all the other elements are equal\n //else there more than one different element\n guess(1)\n return c == 0 ? 0 : -1\n}\nvar exports = module.exports = function (deps, exports) {\n var equal = (deps && deps.equal) || _equal\n exports = exports || {} \n exports.lcs = \n function lcs() {\n var cache = {}\n var args = getArgs(arguments)\n var a = args[0], b = args[1]\n\n function key (a,b){\n return a.length + ':' + b.length\n }\n\n //find length that matches at the head\n\n if(args.length > 2) {\n //if called with multiple sequences\n //recurse, since lcs(a, b, c, d) == lcs(lcs(a,b), lcs(c,d))\n args.push(lcs(args.shift(), args.shift()))\n return lcs(args)\n }\n \n //this would be improved by truncating input first\n //and not returning an lcs as an intermediate step.\n //untill that is a performance problem.\n\n var start = 0, end = 0\n for(var i = 0; i < a.length && i < b.length \n && equal(a[i], b[i])\n ; i ++\n )\n start = i + 1\n\n if(a.length === start)\n return a.slice()\n\n for(var i = 0; i < a.length - start && i < b.length - start\n && equal(a[a.length - 1 - i], b[b.length - 1 - i])\n ; i ++\n )\n end = i\n\n function recurse (a, b) {\n if(!a.length || !b.length) return []\n //avoid exponential time by caching the results\n if(cache[key(a, b)]) return cache[key(a, b)]\n\n if(equal(a[0], b[0]))\n return [head(a)].concat(recurse(tail(a), tail(b)))\n else { \n var _a = recurse(tail(a), b)\n var _b = recurse(a, tail(b))\n return cache[key(a,b)] = _a.length > _b.length ? _a : _b \n }\n }\n \n var middleA = a.slice(start, a.length - end)\n var middleB = b.slice(start, b.length - end)\n\n return (\n a.slice(0, start).concat(\n recurse(middleA, middleB)\n ).concat(a.slice(a.length - end))\n )\n }\n\n // given n sequences, calc the lcs, and then chunk strings into stable and unstable sections.\n // unstable chunks are passed to build\n exports.chunk =\n function (q, build) {\n var q = q.map(function (e) { return e.slice() })\n var lcs = exports.lcs.apply(null, q)\n var all = [lcs].concat(q)\n\n function matchLcs (e) {\n if(e.length && !lcs.length || !e.length && lcs.length)\n return false //incase the last item is null\n return equal(last(e), last(lcs)) || ((e.length + lcs.length) === 0)\n }\n\n while(any(q, hasLength)) {\n //if each element is at the lcs then this chunk is stable.\n while(q.every(matchLcs) && q.every(hasLength))\n all.forEach(retreat)\n //collect the changes in each array upto the next match with the lcs\n var c = false\n var unstable = q.map(function (e) {\n var change = []\n while(!matchLcs(e)) {\n change.unshift(retreat(e))\n c = true\n }\n return change\n })\n if(c) build(q[0].length, unstable)\n }\n }\n\n //calculate a diff this is only updates\n exports.optimisticDiff =\n function (a, b) {\n var M = Math.max(a.length, b.length)\n var m = Math.min(a.length, b.length)\n var patch = []\n for(var i = 0; i < M; i++)\n if(a[i] !== b[i]) {\n var cur = [i,0], deletes = 0\n while(a[i] !== b[i] && i < m) {\n cur[1] = ++deletes\n cur.push(b[i++])\n }\n //the rest are deletes or inserts\n if(i >= m) {\n //the rest are deletes\n if(a.length > b.length)\n cur[1] += a.length - b.length\n //the rest are inserts\n else if(a.length < b.length)\n cur = cur.concat(b.slice(a.length))\n }\n patch.push(cur)\n }\n\n return patch\n }\n\n exports.diff =\n function (a, b) {\n var optimistic = exports.optimisticDiff(a, b)\n var changes = []\n exports.chunk([a, b], function (index, unstable) {\n var del = unstable.shift().length\n var insert = unstable.shift()\n changes.push([index, del].concat(insert))\n })\n return best(optimistic, changes)\n }\n\n exports.patch = function (a, changes, mutate) {\n if(mutate !== true) a = a.slice(a)//copy a\n changes.forEach(function (change) {\n [].splice.apply(a, change)\n })\n return a\n }\n\n // http://en.wikipedia.org/wiki/Concestor\n // me, concestor, you...\n exports.merge = function () {\n var args = getArgs(arguments)\n var patch = exports.diff3(args)\n return exports.patch(args[0], patch)\n }\n\n exports.diff3 = function () {\n var args = getArgs(arguments)\n var r = []\n exports.chunk(args, function (index, unstable) {\n var mine = unstable[0]\n var insert = resolve(unstable)\n if(equal(mine, insert)) return \n r.push([index, mine.length].concat(insert)) \n })\n return r\n }\n exports.oddOneOut =\n function oddOneOut (changes) {\n changes = changes.slice()\n //put the concestor first\n changes.unshift(changes.splice(1,1)[0])\n var i = oddElement(changes, equal)\n if(i == 0) // concestor was different, 'false conflict'\n return changes[1]\n if (~i)\n return changes[i] \n }\n exports.insertMergeOverDelete = \n //i've implemented this as a seperate rule,\n //because I had second thoughts about this.\n function insertMergeOverDelete (changes) {\n changes = changes.slice()\n changes.splice(1,1)// remove concestor\n \n //if there is only one non empty change thats okay.\n //else full confilct\n for (var i = 0, nonempty; i < changes.length; i++)\n if(changes[i].length) \n if(!nonempty) nonempty = changes[i]\n else return // full conflict\n return nonempty\n }\n\n var rules = (deps && deps.rules) || [exports.oddOneOut, exports.insertMergeOverDelete]\n\n function resolve (changes) {\n var l = rules.length\n for (var i in rules) { // first\n \n var c = rules[i] && rules[i](changes)\n if(c) return c\n }\n changes.splice(1,1) // remove concestor\n //returning the conflicts as an object is a really bad idea,\n // because == will not detect they are the same. and conflicts build.\n // better to use\n // '<<<<<<<<<<<<<'\n // of course, i wrote this before i started on snob, so i didn't know that then.\n /*var conflict = ['>>>>>>>>>>>>>>>>']\n while(changes.length)\n conflict = conflict.concat(changes.shift()).concat('============')\n conflict.pop()\n conflict.push ('<<<<<<<<<<<<<<<')\n changes.unshift ('>>>>>>>>>>>>>>>')\n return conflict*/\n //nah, better is just to use an equal can handle objects\n return {'?': changes}\n }\n return exports\n}\nexports(null, exports)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2FkaWZmL2luZGV4LmpzPzA0ZDYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0Isb0JBQW9CO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaGVhZCAoYSkge1xuICByZXR1cm4gYVswXVxufVxuXG5mdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhW2EubGVuZ3RoIC0gMV1cbn1cblxuZnVuY3Rpb24gdGFpbChhKSB7XG4gIHJldHVybiBhLnNsaWNlKDEpXG59XG5cbmZ1bmN0aW9uIHJldHJlYXQgKGUpIHtcbiAgcmV0dXJuIGUucG9wKClcbn1cblxuZnVuY3Rpb24gaGFzTGVuZ3RoIChlKSB7XG4gIHJldHVybiBlLmxlbmd0aFxufVxuXG5mdW5jdGlvbiBhbnkoYXJ5LCB0ZXN0KSB7XG4gIGZvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspXG4gICAgaWYodGVzdChhcnlbaV0pKVxuICAgICAgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHNjb3JlIChhKSB7XG4gIHJldHVybiBhLnJlZHVjZShmdW5jdGlvbiAocywgYSkge1xuICAgICAgcmV0dXJuIHMgKyBhLmxlbmd0aCArIGFbMV0gKyAxXG4gIH0sIDApXG59XG5cbmZ1bmN0aW9uIGJlc3QgKGEsIGIpIHtcbiAgcmV0dXJuIHNjb3JlKGEpIDw9IHNjb3JlKGIpID8gYSA6IGJcbn1cblxuXG52YXIgX3J1bGVzIC8vIHNldCBhdCB0aGUgYm90dG9tICBcblxuLy8gbm90ZSwgbmFpdmUgaW1wbGVtZW50YXRpb24uIHdpbGwgYnJlYWsgb24gY2lyY3VsYXIgb2JqZWN0cy5cblxuZnVuY3Rpb24gX2VxdWFsKGEsIGIpIHtcbiAgaWYoYSAmJiAhYikgcmV0dXJuIGZhbHNlXG4gIGlmKEFycmF5LmlzQXJyYXkoYSkpXG4gICAgaWYoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBpZihhICYmICdvYmplY3QnID09IHR5cGVvZiBhKSB7XG4gICAgZm9yKHZhciBpIGluIGEpXG4gICAgICBpZighX2VxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2VcbiAgICBmb3IodmFyIGkgaW4gYilcbiAgICAgIGlmKCFfZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGEgPT0gYlxufVxuXG5mdW5jdGlvbiBnZXRBcmdzKGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID09IDEgPyBhcmdzWzBdIDogW10uc2xpY2UuY2FsbChhcmdzKVxufVxuXG4vLyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IG5vdCBsaWtlIHRoZSBvdGhlcnMsIG9yIC0xXG5mdW5jdGlvbiBvZGRFbGVtZW50KGFyeSwgY21wKSB7XG4gIHZhciBjXG4gIGZ1bmN0aW9uIGd1ZXNzKGEpIHtcbiAgICB2YXIgb2RkID0gLTFcbiAgICBjID0gMFxuICAgIGZvciAodmFyIGkgPSBhOyBpIDwgYXJ5Lmxlbmd0aDsgaSArKykge1xuICAgICAgaWYoIWNtcChhcnlbYV0sIGFyeVtpXSkpIHtcbiAgICAgICAgb2RkID0gaSwgYysrXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjID4gMSA/IC0xIDogb2RkXG4gIH1cbiAgLy9hc3N1bWUgdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudC5cbiAgdmFyIGcgPSBndWVzcygwKVxuICBpZigtMSAhPSBnKSByZXR1cm4gZ1xuICAvLzAgd2FzIHRoZSBvZGQgb25lLCB0aGVuIGFsbCB0aGUgb3RoZXIgZWxlbWVudHMgYXJlIGVxdWFsXG4gIC8vZWxzZSB0aGVyZSBtb3JlIHRoYW4gb25lIGRpZmZlcmVudCBlbGVtZW50XG4gIGd1ZXNzKDEpXG4gIHJldHVybiBjID09IDAgPyAwIDogLTFcbn1cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVwcywgZXhwb3J0cykge1xuICB2YXIgZXF1YWwgPSAoZGVwcyAmJiBkZXBzLmVxdWFsKSB8fCBfZXF1YWxcbiAgZXhwb3J0cyA9IGV4cG9ydHMgfHwge30gXG4gIGV4cG9ydHMubGNzID0gXG4gIGZ1bmN0aW9uIGxjcygpIHtcbiAgICB2YXIgY2FjaGUgPSB7fVxuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIGEgPSBhcmdzWzBdLCBiID0gYXJnc1sxXVxuXG4gICAgZnVuY3Rpb24ga2V5IChhLGIpe1xuICAgICAgcmV0dXJuIGEubGVuZ3RoICsgJzonICsgYi5sZW5ndGhcbiAgICB9XG5cbiAgICAvL2ZpbmQgbGVuZ3RoIHRoYXQgbWF0Y2hlcyBhdCB0aGUgaGVhZFxuXG4gICAgaWYoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAvL2lmIGNhbGxlZCB3aXRoIG11bHRpcGxlIHNlcXVlbmNlc1xuICAgICAgLy9yZWN1cnNlLCBzaW5jZSBsY3MoYSwgYiwgYywgZCkgPT0gbGNzKGxjcyhhLGIpLCBsY3MoYyxkKSlcbiAgICAgIGFyZ3MucHVzaChsY3MoYXJncy5zaGlmdCgpLCBhcmdzLnNoaWZ0KCkpKVxuICAgICAgcmV0dXJuIGxjcyhhcmdzKVxuICAgIH1cbiAgICBcbiAgICAvL3RoaXMgd291bGQgYmUgaW1wcm92ZWQgYnkgdHJ1bmNhdGluZyBpbnB1dCBmaXJzdFxuICAgIC8vYW5kIG5vdCByZXR1cm5pbmcgYW4gbGNzIGFzIGFuIGludGVybWVkaWF0ZSBzdGVwLlxuICAgIC8vdW50aWxsIHRoYXQgaXMgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLlxuXG4gICAgdmFyIHN0YXJ0ID0gMCwgZW5kID0gMFxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aCAmJiBpIDwgYi5sZW5ndGggXG4gICAgICAmJiBlcXVhbChhW2ldLCBiW2ldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgc3RhcnQgPSBpICsgMVxuXG4gICAgaWYoYS5sZW5ndGggPT09IHN0YXJ0KVxuICAgICAgcmV0dXJuIGEuc2xpY2UoKVxuXG4gICAgZm9yKHZhciBpID0gMDsgIGkgPCBhLmxlbmd0aCAtIHN0YXJ0ICYmIGkgPCBiLmxlbmd0aCAtIHN0YXJ0XG4gICAgICAmJiBlcXVhbChhW2EubGVuZ3RoIC0gMSAtIGldLCBiW2IubGVuZ3RoIC0gMSAtIGldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgZW5kID0gaVxuXG4gICAgZnVuY3Rpb24gcmVjdXJzZSAoYSwgYikge1xuICAgICAgaWYoIWEubGVuZ3RoIHx8ICFiLmxlbmd0aCkgcmV0dXJuIFtdXG4gICAgICAvL2F2b2lkIGV4cG9uZW50aWFsIHRpbWUgYnkgY2FjaGluZyB0aGUgcmVzdWx0c1xuICAgICAgaWYoY2FjaGVba2V5KGEsIGIpXSkgcmV0dXJuIGNhY2hlW2tleShhLCBiKV1cblxuICAgICAgaWYoZXF1YWwoYVswXSwgYlswXSkpXG4gICAgICAgIHJldHVybiBbaGVhZChhKV0uY29uY2F0KHJlY3Vyc2UodGFpbChhKSwgdGFpbChiKSkpXG4gICAgICBlbHNlIHsgXG4gICAgICAgIHZhciBfYSA9IHJlY3Vyc2UodGFpbChhKSwgYilcbiAgICAgICAgdmFyIF9iID0gcmVjdXJzZShhLCB0YWlsKGIpKVxuICAgICAgICByZXR1cm4gY2FjaGVba2V5KGEsYildID0gX2EubGVuZ3RoID4gX2IubGVuZ3RoID8gX2EgOiBfYiAgXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhciBtaWRkbGVBID0gYS5zbGljZShzdGFydCwgYS5sZW5ndGggLSBlbmQpXG4gICAgdmFyIG1pZGRsZUIgPSBiLnNsaWNlKHN0YXJ0LCBiLmxlbmd0aCAtIGVuZClcblxuICAgIHJldHVybiAoXG4gICAgICBhLnNsaWNlKDAsIHN0YXJ0KS5jb25jYXQoXG4gICAgICAgIHJlY3Vyc2UobWlkZGxlQSwgbWlkZGxlQilcbiAgICAgICkuY29uY2F0KGEuc2xpY2UoYS5sZW5ndGggLSBlbmQpKVxuICAgIClcbiAgfVxuXG4gIC8vIGdpdmVuIG4gc2VxdWVuY2VzLCBjYWxjIHRoZSBsY3MsIGFuZCB0aGVuIGNodW5rIHN0cmluZ3MgaW50byBzdGFibGUgYW5kIHVuc3RhYmxlIHNlY3Rpb25zLlxuICAvLyB1bnN0YWJsZSBjaHVua3MgYXJlIHBhc3NlZCB0byBidWlsZFxuICBleHBvcnRzLmNodW5rID1cbiAgZnVuY3Rpb24gKHEsIGJ1aWxkKSB7XG4gICAgdmFyIHEgPSBxLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5zbGljZSgpIH0pXG4gICAgdmFyIGxjcyA9IGV4cG9ydHMubGNzLmFwcGx5KG51bGwsIHEpXG4gICAgdmFyIGFsbCA9IFtsY3NdLmNvbmNhdChxKVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hMY3MgKGUpIHtcbiAgICAgIGlmKGUubGVuZ3RoICYmICFsY3MubGVuZ3RoIHx8ICFlLmxlbmd0aCAmJiBsY3MubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2UgLy9pbmNhc2UgdGhlIGxhc3QgaXRlbSBpcyBudWxsXG4gICAgICByZXR1cm4gZXF1YWwobGFzdChlKSwgbGFzdChsY3MpKSB8fCAoKGUubGVuZ3RoICsgbGNzLmxlbmd0aCkgPT09IDApXG4gICAgfVxuXG4gICAgd2hpbGUoYW55KHEsIGhhc0xlbmd0aCkpIHtcbiAgICAgIC8vaWYgZWFjaCBlbGVtZW50IGlzIGF0IHRoZSBsY3MgdGhlbiB0aGlzIGNodW5rIGlzIHN0YWJsZS5cbiAgICAgIHdoaWxlKHEuZXZlcnkobWF0Y2hMY3MpICYmIHEuZXZlcnkoaGFzTGVuZ3RoKSlcbiAgICAgICAgYWxsLmZvckVhY2gocmV0cmVhdClcbiAgICAgIC8vY29sbGVjdCB0aGUgY2hhbmdlcyBpbiBlYWNoIGFycmF5IHVwdG8gdGhlIG5leHQgbWF0Y2ggd2l0aCB0aGUgbGNzXG4gICAgICB2YXIgYyA9IGZhbHNlXG4gICAgICB2YXIgdW5zdGFibGUgPSBxLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY2hhbmdlID0gW11cbiAgICAgICAgd2hpbGUoIW1hdGNoTGNzKGUpKSB7XG4gICAgICAgICAgY2hhbmdlLnVuc2hpZnQocmV0cmVhdChlKSlcbiAgICAgICAgICBjID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgIH0pXG4gICAgICBpZihjKSBidWlsZChxWzBdLmxlbmd0aCwgdW5zdGFibGUpXG4gICAgfVxuICB9XG5cbiAgLy9jYWxjdWxhdGUgYSBkaWZmIHRoaXMgaXMgb25seSB1cGRhdGVzXG4gIGV4cG9ydHMub3B0aW1pc3RpY0RpZmYgPVxuICBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBNID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBtID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBwYXRjaCA9IFtdXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IE07IGkrKylcbiAgICAgIGlmKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgdmFyIGN1ciA9IFtpLDBdLCBkZWxldGVzID0gMFxuICAgICAgICB3aGlsZShhW2ldICE9PSBiW2ldICYmIGkgPCBtKSB7XG4gICAgICAgICAgY3VyWzFdID0gKytkZWxldGVzXG4gICAgICAgICAgY3VyLnB1c2goYltpKytdKVxuICAgICAgICB9XG4gICAgICAgIC8vdGhlIHJlc3QgYXJlIGRlbGV0ZXMgb3IgaW5zZXJ0c1xuICAgICAgICBpZihpID49IG0pIHtcbiAgICAgICAgICAvL3RoZSByZXN0IGFyZSBkZWxldGVzXG4gICAgICAgICAgaWYoYS5sZW5ndGggPiBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1clsxXSArPSBhLmxlbmd0aCAtIGIubGVuZ3RoXG4gICAgICAgICAgLy90aGUgcmVzdCBhcmUgaW5zZXJ0c1xuICAgICAgICAgIGVsc2UgaWYoYS5sZW5ndGggPCBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1ciA9IGN1ci5jb25jYXQoYi5zbGljZShhLmxlbmd0aCkpXG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2gucHVzaChjdXIpXG4gICAgICB9XG5cbiAgICByZXR1cm4gcGF0Y2hcbiAgfVxuXG4gIGV4cG9ydHMuZGlmZiA9XG4gIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIG9wdGltaXN0aWMgPSBleHBvcnRzLm9wdGltaXN0aWNEaWZmKGEsIGIpXG4gICAgdmFyIGNoYW5nZXMgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoW2EsIGJdLCBmdW5jdGlvbiAoaW5kZXgsIHVuc3RhYmxlKSB7XG4gICAgICB2YXIgZGVsID0gdW5zdGFibGUuc2hpZnQoKS5sZW5ndGhcbiAgICAgIHZhciBpbnNlcnQgPSB1bnN0YWJsZS5zaGlmdCgpXG4gICAgICBjaGFuZ2VzLnB1c2goW2luZGV4LCBkZWxdLmNvbmNhdChpbnNlcnQpKVxuICAgIH0pXG4gICAgcmV0dXJuIGJlc3Qob3B0aW1pc3RpYywgY2hhbmdlcylcbiAgfVxuXG4gIGV4cG9ydHMucGF0Y2ggPSBmdW5jdGlvbiAoYSwgY2hhbmdlcywgbXV0YXRlKSB7XG4gICAgaWYobXV0YXRlICE9PSB0cnVlKSBhID0gYS5zbGljZShhKS8vY29weSBhXG4gICAgY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2UpIHtcbiAgICAgIFtdLnNwbGljZS5hcHBseShhLCBjaGFuZ2UpXG4gICAgfSlcbiAgICByZXR1cm4gYVxuICB9XG5cbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db25jZXN0b3JcbiAgLy8gbWUsIGNvbmNlc3RvciwgeW91Li4uXG4gIGV4cG9ydHMubWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBnZXRBcmdzKGFyZ3VtZW50cylcbiAgICB2YXIgcGF0Y2ggPSBleHBvcnRzLmRpZmYzKGFyZ3MpXG4gICAgcmV0dXJuIGV4cG9ydHMucGF0Y2goYXJnc1swXSwgcGF0Y2gpXG4gIH1cblxuICBleHBvcnRzLmRpZmYzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIHIgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoYXJncywgZnVuY3Rpb24gKGluZGV4LCB1bnN0YWJsZSkge1xuICAgICAgdmFyIG1pbmUgPSB1bnN0YWJsZVswXVxuICAgICAgdmFyIGluc2VydCA9IHJlc29sdmUodW5zdGFibGUpXG4gICAgICBpZihlcXVhbChtaW5lLCBpbnNlcnQpKSByZXR1cm4gXG4gICAgICByLnB1c2goW2luZGV4LCBtaW5lLmxlbmd0aF0uY29uY2F0KGluc2VydCkpIFxuICAgIH0pXG4gICAgcmV0dXJuIHJcbiAgfVxuICBleHBvcnRzLm9kZE9uZU91dCA9XG4gICAgZnVuY3Rpb24gb2RkT25lT3V0IChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICAvL3B1dCB0aGUgY29uY2VzdG9yIGZpcnN0XG4gICAgICBjaGFuZ2VzLnVuc2hpZnQoY2hhbmdlcy5zcGxpY2UoMSwxKVswXSlcbiAgICAgIHZhciBpID0gb2RkRWxlbWVudChjaGFuZ2VzLCBlcXVhbClcbiAgICAgIGlmKGkgPT0gMCkgLy8gY29uY2VzdG9yIHdhcyBkaWZmZXJlbnQsICdmYWxzZSBjb25mbGljdCdcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbMV1cbiAgICAgIGlmICh+aSlcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbaV0gXG4gICAgfVxuICBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZSA9IFxuICAgIC8vaSd2ZSBpbXBsZW1lbnRlZCB0aGlzIGFzIGEgc2VwZXJhdGUgcnVsZSxcbiAgICAvL2JlY2F1c2UgSSBoYWQgc2Vjb25kIHRob3VnaHRzIGFib3V0IHRoaXMuXG4gICAgZnVuY3Rpb24gaW5zZXJ0TWVyZ2VPdmVyRGVsZXRlIChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICBjaGFuZ2VzLnNwbGljZSgxLDEpLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgICAgXG4gICAgICAvL2lmIHRoZXJlIGlzIG9ubHkgb25lIG5vbiBlbXB0eSBjaGFuZ2UgdGhhdHMgb2theS5cbiAgICAgIC8vZWxzZSBmdWxsIGNvbmZpbGN0XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9uZW1wdHk7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZihjaGFuZ2VzW2ldLmxlbmd0aCkgXG4gICAgICAgICAgaWYoIW5vbmVtcHR5KSBub25lbXB0eSA9IGNoYW5nZXNbaV1cbiAgICAgICAgICBlbHNlIHJldHVybiAvLyBmdWxsIGNvbmZsaWN0XG4gICAgICByZXR1cm4gbm9uZW1wdHlcbiAgICB9XG5cbiAgdmFyIHJ1bGVzID0gKGRlcHMgJiYgZGVwcy5ydWxlcykgfHwgW2V4cG9ydHMub2RkT25lT3V0LCBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZV1cblxuICBmdW5jdGlvbiByZXNvbHZlIChjaGFuZ2VzKSB7XG4gICAgdmFyIGwgPSBydWxlcy5sZW5ndGhcbiAgICBmb3IgKHZhciBpIGluIHJ1bGVzKSB7IC8vIGZpcnN0XG4gICAgICBcbiAgICAgIHZhciBjID0gcnVsZXNbaV0gJiYgcnVsZXNbaV0oY2hhbmdlcylcbiAgICAgIGlmKGMpIHJldHVybiBjXG4gICAgfVxuICAgIGNoYW5nZXMuc3BsaWNlKDEsMSkgLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgIC8vcmV0dXJuaW5nIHRoZSBjb25mbGljdHMgYXMgYW4gb2JqZWN0IGlzIGEgcmVhbGx5IGJhZCBpZGVhLFxuICAgIC8vIGJlY2F1c2UgPT0gd2lsbCBub3QgZGV0ZWN0IHRoZXkgYXJlIHRoZSBzYW1lLiBhbmQgY29uZmxpY3RzIGJ1aWxkLlxuICAgIC8vIGJldHRlciB0byB1c2VcbiAgICAvLyAnPDw8PDw8PDw8PDw8PCdcbiAgICAvLyBvZiBjb3Vyc2UsIGkgd3JvdGUgdGhpcyBiZWZvcmUgaSBzdGFydGVkIG9uIHNub2IsIHNvIGkgZGlkbid0IGtub3cgdGhhdCB0aGVuLlxuICAgIC8qdmFyIGNvbmZsaWN0ID0gWyc+Pj4+Pj4+Pj4+Pj4+Pj4+J11cbiAgICB3aGlsZShjaGFuZ2VzLmxlbmd0aClcbiAgICAgIGNvbmZsaWN0ID0gY29uZmxpY3QuY29uY2F0KGNoYW5nZXMuc2hpZnQoKSkuY29uY2F0KCc9PT09PT09PT09PT0nKVxuICAgIGNvbmZsaWN0LnBvcCgpXG4gICAgY29uZmxpY3QucHVzaCAgICAgICAgICAoJzw8PDw8PDw8PDw8PDw8PCcpXG4gICAgY2hhbmdlcy51bnNoaWZ0ICAgICAgICgnPj4+Pj4+Pj4+Pj4+Pj4+JylcbiAgICByZXR1cm4gY29uZmxpY3QqL1xuICAgIC8vbmFoLCBiZXR0ZXIgaXMganVzdCB0byB1c2UgYW4gZXF1YWwgY2FuIGhhbmRsZSBvYmplY3RzXG4gICAgcmV0dXJuIHsnPyc6IGNoYW5nZXN9XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHNcbn1cbmV4cG9ydHMobnVsbCwgZXhwb3J0cylcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FkaWZmL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ }
56
+ /******/ ]);
@@ -0,0 +1,62 @@
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 _getDiffPixel = __webpack_require__(1);\n\nvar _getDiffPixel2 = _interopRequireDefault(_getDiffPixel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nself.addEventListener('message', function (_ref) {\n var _ref$data = _ref.data;\n var previous = _ref$data.previous;\n var current = _ref$data.current;\n\n var data = new Uint8ClampedArray(previous.length);\n\n console.log('max', previous.length);\n var i = void 0;\n for (i = 0; i < previous.length; i += 4) {\n var pixel = (0, _getDiffPixel2.default)(previous.slice(i, i + 4), current.slice(i, i + 4));\n data[i + 0] = pixel[0]; // r\n data[i + 1] = pixel[1]; // g\n data[i + 2] = pixel[2]; // b\n data[i + 3] = pixel[3]; // a\n }\n console.log('last', i);\n self.postMessage(data);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanM/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91cyIsImN1cnJlbnQiLCJVaW50OENsYW1wZWRBcnJheSIsImxlbmd0aCIsImNvbnNvbGUiLCJsb2ciLCJpIiwicGl4ZWwiLCJzbGljZSIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBQSxLQUFLQyxnQkFBTCxDQUFzQixTQUF0QixFQUFpQyxnQkFBcUM7QUFBQSx1QkFBbENDLElBQWtDO0FBQUEsTUFBMUJDLFFBQTBCLGFBQTFCQSxRQUEwQjtBQUFBLE1BQWhCQyxPQUFnQixhQUFoQkEsT0FBZ0I7O0FBQ3BFLE1BQU1GLE9BQU8sSUFBSUcsaUJBQUosQ0FBc0JGLFNBQVNHLE1BQS9CLENBQWI7O0FBRUFDLFVBQVFDLEdBQVIsQ0FBWSxLQUFaLEVBQW1CTCxTQUFTRyxNQUE1QjtBQUNBLE1BQUlHLFVBQUo7QUFDQSxPQUFLQSxJQUFJLENBQVQsRUFBWUEsSUFBSU4sU0FBU0csTUFBekIsRUFBaUNHLEtBQUssQ0FBdEMsRUFBeUM7QUFDdkMsUUFBTUMsUUFBUSw0QkFDWlAsU0FBU1EsS0FBVCxDQUFlRixDQUFmLEVBQWtCQSxJQUFJLENBQXRCLENBRFksRUFFWkwsUUFBUU8sS0FBUixDQUFjRixDQUFkLEVBQWlCQSxJQUFJLENBQXJCLENBRlksQ0FBZDtBQUlBUCxTQUFLTyxJQUFJLENBQVQsSUFBY0MsTUFBTSxDQUFOLENBQWQsQ0FMdUMsQ0FLZjtBQUN4QlIsU0FBS08sSUFBSSxDQUFULElBQWNDLE1BQU0sQ0FBTixDQUFkLENBTnVDLENBTWY7QUFDeEJSLFNBQUtPLElBQUksQ0FBVCxJQUFjQyxNQUFNLENBQU4sQ0FBZCxDQVB1QyxDQU9mO0FBQ3hCUixTQUFLTyxJQUFJLENBQVQsSUFBY0MsTUFBTSxDQUFOLENBQWQsQ0FSdUMsQ0FRZjtBQUN6QjtBQUNESCxVQUFRQyxHQUFSLENBQVksTUFBWixFQUFvQkMsQ0FBcEI7QUFDQVQsT0FBS1ksV0FBTCxDQUFpQlYsSUFBakI7QUFDQUYsT0FBS2EsS0FBTDtBQUNELENBbEJEIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2V0RGlmZlBpeGVsIGZyb20gJy4uL2dldERpZmZQaXhlbCc7XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGE6IHsgcHJldmlvdXMsIGN1cnJlbnQgfSB9KSA9PiB7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocHJldmlvdXMubGVuZ3RoKTtcblxuICBjb25zb2xlLmxvZygnbWF4JywgcHJldmlvdXMubGVuZ3RoKVxuICBsZXQgaTtcbiAgZm9yIChpID0gMDsgaSA8IHByZXZpb3VzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgY29uc3QgcGl4ZWwgPSBnZXREaWZmUGl4ZWwoXG4gICAgICBwcmV2aW91cy5zbGljZShpLCBpICsgNCksXG4gICAgICBjdXJyZW50LnNsaWNlKGksIGkgKyA0KVxuICAgICk7XG4gICAgZGF0YVtpICsgMF0gPSBwaXhlbFswXTsgLy8gclxuICAgIGRhdGFbaSArIDFdID0gcGl4ZWxbMV07IC8vIGdcbiAgICBkYXRhW2kgKyAyXSA9IHBpeGVsWzJdOyAvLyBiXG4gICAgZGF0YVtpICsgM10gPSBwaXhlbFszXTsgLy8gYVxuICB9XG4gIGNvbnNvbGUubG9nKCdsYXN0JywgaSlcbiAgc2VsZi5wb3N0TWVzc2FnZShkYXRhKTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0ltYWdlRGlmZldvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports, __webpack_require__) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getDiffPixel;\n\nvar _euclideanDistance = __webpack_require__(2);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getDiffPixel(previousPixel, currentPixel) {\n if (!previousPixel) {\n return currentPixel;\n }\n\n if (!currentPixel) {\n return previousPixel;\n }\n\n var diff = (0, _euclideanDistance2.default)(previousPixel, currentPixel);\n if (diff === 0) {\n return [currentPixel[0], currentPixel[1], currentPixel[2], 50];\n }\n\n if (diff < 0.2) {\n diff = 0.2;\n }\n return [255, 0, 0, 255 * diff]; // TODO don't use red here\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwicHJldmlvdXNQaXhlbCIsImN1cnJlbnRQaXhlbCIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUV3QkEsWTs7QUFGeEI7Ozs7OztBQUVlLFNBQVNBLFlBQVQsQ0FBc0JDLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQsTUFBSUUsT0FBTyxpQ0FBa0JGLGFBQWxCLEVBQWlDQyxZQUFqQyxDQUFYO0FBQ0EsTUFBSUMsU0FBUyxDQUFiLEVBQWdCO0FBQ2QsV0FBTyxDQUNMRCxhQUFhLENBQWIsQ0FESyxFQUVMQSxhQUFhLENBQWIsQ0FGSyxFQUdMQSxhQUFhLENBQWIsQ0FISyxFQUlMLEVBSkssQ0FBUDtBQU1EOztBQUVELE1BQUlDLE9BQU8sR0FBWCxFQUFnQjtBQUNkQSxXQUFPLEdBQVA7QUFDRDtBQUNELFNBQU8sQ0FBQyxHQUFELEVBQU0sQ0FBTixFQUFTLENBQVQsRUFBWSxNQUFNQSxJQUFsQixDQUFQLENBdEJnRSxDQXNCaEM7QUFDakMiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBldWNsaWRlYW5EaXN0YW5jZSBmcm9tICcuL2V1Y2xpZGVhbkRpc3RhbmNlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RGlmZlBpeGVsKHByZXZpb3VzUGl4ZWwsIGN1cnJlbnRQaXhlbCkge1xuICBpZiAoIXByZXZpb3VzUGl4ZWwpIHtcbiAgICByZXR1cm4gY3VycmVudFBpeGVsO1xuICB9XG5cbiAgaWYgKCFjdXJyZW50UGl4ZWwpIHtcbiAgICByZXR1cm4gcHJldmlvdXNQaXhlbDtcbiAgfVxuXG4gIGxldCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKTtcbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3VycmVudFBpeGVsWzBdLFxuICAgICAgY3VycmVudFBpeGVsWzFdLFxuICAgICAgY3VycmVudFBpeGVsWzJdLFxuICAgICAgNTAsXG4gICAgXTtcbiAgfVxuXG4gIGlmIChkaWZmIDwgMC4yKSB7XG4gICAgZGlmZiA9IDAuMjtcbiAgfVxuICByZXR1cm4gWzI1NSwgMCwgMCwgMjU1ICogZGlmZl07IC8vIFRPRE8gZG9uJ3QgdXNlIHJlZCBoZXJlXG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9nZXREaWZmUGl4ZWwuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = euclideanDistance;\n/**\n * Compute a score that represents the difference between 2 pixels\n *\n * This method simply takes the Euclidean distance between the RGBA channels\n * of 2 colors over the maximum possible Euclidean distance. This gives us a\n * percentage of how different the two colors are.\n *\n * Although it would be more perceptually accurate to calculate a proper\n * Delta E in Lab colorspace, we probably don't need perceptual accuracy for\n * this application, and it is nice to avoid the overhead of converting RGBA\n * to Lab.\n *\n * Returns a float number between 0 and 1 where 1 is completely different\n * and 0 is no difference\n */\nfunction euclideanDistance(rgba1, rgba2) {\n var distance = (rgba1[0] - rgba2[0]) * (rgba1[0] - rgba2[0]) + (rgba1[1] - rgba2[1]) * (rgba1[1] - rgba2[1]) + (rgba1[2] - rgba2[2]) * (rgba1[2] - rgba2[2]) + (rgba1[3] - rgba2[3]) * (rgba1[3] - rgba2[3]);\n\n return Math.sqrt(distance) / 4 / 255;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJkaXN0YW5jZSIsIk1hdGgiLCJzcXJ0Il0sIm1hcHBpbmdzIjoiOzs7OztrQkFld0JBLGlCO0FBZnhCOzs7Ozs7Ozs7Ozs7Ozs7QUFlZSxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELE1BQU1DLFdBQVksQ0FBQ0YsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFaLEtBQXlCRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBDLENBQUQsR0FDQyxDQUFDRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQVosS0FBeUJELE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBcEMsQ0FERCxHQUVDLENBQUNELE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBWixLQUF5QkQsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQyxDQUZELEdBR0MsQ0FBQ0QsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFaLEtBQXlCRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBDLENBSGxCOztBQUtBLFNBQVFFLEtBQUtDLElBQUwsQ0FBVUYsUUFBVixJQUFzQixDQUF2QixHQUE0QixHQUFuQztBQUNEIiwiZmlsZSI6IjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXB1dGUgYSBzY29yZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAyIHBpeGVsc1xuICpcbiAqIFRoaXMgbWV0aG9kIHNpbXBseSB0YWtlcyB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdGhlIFJHQkEgY2hhbm5lbHNcbiAqIG9mIDIgY29sb3JzIG92ZXIgdGhlIG1heGltdW0gcG9zc2libGUgRXVjbGlkZWFuIGRpc3RhbmNlLiBUaGlzIGdpdmVzIHVzIGFcbiAqIHBlcmNlbnRhZ2Ugb2YgaG93IGRpZmZlcmVudCB0aGUgdHdvIGNvbG9ycyBhcmUuXG4gKlxuICogQWx0aG91Z2ggaXQgd291bGQgYmUgbW9yZSBwZXJjZXB0dWFsbHkgYWNjdXJhdGUgdG8gY2FsY3VsYXRlIGEgcHJvcGVyXG4gKiBEZWx0YSBFIGluIExhYiBjb2xvcnNwYWNlLCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHBlcmNlcHR1YWwgYWNjdXJhY3kgZm9yXG4gKiB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgaXQgaXMgbmljZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY29udmVydGluZyBSR0JBXG4gKiB0byBMYWIuXG4gKlxuICogUmV0dXJucyBhIGZsb2F0IG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgd2hlcmUgMSBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudFxuICogYW5kIDAgaXMgbm8gZGlmZmVyZW5jZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgY29uc3QgZGlzdGFuY2UgPSAoKHJnYmExWzBdIC0gcmdiYTJbMF0pICogKHJnYmExWzBdIC0gcmdiYTJbMF0pKVxuICAgICAgICAgICAgICAgICArICgocmdiYTFbMV0gLSByZ2JhMlsxXSkgKiAocmdiYTFbMV0gLSByZ2JhMlsxXSkpXG4gICAgICAgICAgICAgICAgICsgKChyZ2JhMVsyXSAtIHJnYmEyWzJdKSAqIChyZ2JhMVsyXSAtIHJnYmEyWzJdKSlcbiAgICAgICAgICAgICAgICAgKyAoKHJnYmExWzNdIC0gcmdiYTJbM10pICogKHJnYmExWzNdIC0gcmdiYTJbM10pKTtcblxuICByZXR1cm4gKE1hdGguc3FydChkaXN0YW5jZSkgLyA0KSAvIDI1NTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2V1Y2xpZGVhbkRpc3RhbmNlLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
60
+
61
+ /***/ }
62
+ /******/ ]);
@@ -0,0 +1,62 @@
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 _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nvar _flattenImageData = __webpack_require__(2);\n\nvar _flattenImageData2 = _interopRequireDefault(_flattenImageData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Construct a line of pixels of a certain rgba color\n *\n * @param {Array} rgba\n * @param {Number} width\n * @return {Array}\n */\nfunction constructColoredLine(rgba, width) {\n var line = [];\n for (var i = 0; i < width; i++) {\n line.push(rgba);\n }\n return line;\n}\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 var getPixelAt = function getPixelAt(x, y) {\n var startIndex = y * rowSize + x * 4;\n return [data[startIndex], data[startIndex + 1], data[startIndex + 2], data[startIndex + 3]];\n };\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = [];\n for (var col = 0; col < width; col++) {\n pixelsInRow.push(getPixelAt(col, row));\n }\n for (var pad = 0; pad < paddingRight; pad++) {\n pixelsInRow.push([0, 0, 0, 0]);\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction getAdiffResults(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.currentData;\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n\n if (previousData.width !== currentData.width) {\n // we know that all rows will be different here, so we can take a shortcut\n var diff = [0, // diff starts at index 0\n previousData.height];\n diff.length = currentData.height + 2; // number of additions\n return [diff];\n }\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n\n return _adiff2.default.diff(hashedPreviousData, hashedCurrentData);\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 redLine = constructColoredLine([255, 0, 0, 255], maxWidth);\n var greenLine = constructColoredLine([0, 255, 0, 255], maxWidth);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 30 });\n\n var adiffResults = getAdiffResults({\n previousData: previousData,\n currentData: currentData,\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n self.postMessage({ progress: 75 });\n\n // iterate and apply changes to previous data\n adiffResults.forEach(function (instruction) {\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < deletedItems) {\n // ignore, we just keep the old line\n } else {\n // add a green line to signal an addition\n previousImageData.splice(atIndex + y, 0, greenLine);\n }\n }\n });\n self.postMessage({ progress: 80 });\n\n // iterate backwards and apply changes to current data\n for (var i = adiffResults.length - 1; i >= 0; i--) {\n var instruction = adiffResults[i];\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < addedItems) {\n // ignore, we just keep the old line\n } else {\n // add a red line to signal a deletion\n currentImageData.splice(atIndex + y, 0, redLine);\n }\n }\n }\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: (0, _flattenImageData2.default)(currentImageData),\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: (0, _flattenImageData2.default)(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/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiZ2V0QWRpZmZSZXN1bHRzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJkaWZmIiwibGVuZ3RoIiwiaGFzaGVkUHJldmlvdXNEYXRhIiwibWFwIiwiSlNPTiIsInN0cmluZ2lmeSIsImhhc2hlZEN1cnJlbnREYXRhIiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwibWF4V2lkdGgiLCJNYXRoIiwibWF4IiwicmVkTGluZSIsImdyZWVuTGluZSIsInNlbGYiLCJwb3N0TWVzc2FnZSIsInByb2dyZXNzIiwiYWRpZmZSZXN1bHRzIiwiZm9yRWFjaCIsImluc3RydWN0aW9uIiwiYXRJbmRleCIsImRlbGV0ZWRJdGVtcyIsImFkZGVkSXRlbXMiLCJzcGxpY2UiLCJhZGRFdmVudExpc3RlbmVyIiwicmVzdWx0IiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFFQTs7Ozs7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTQSxvQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0NDLEtBQXBDLEVBQTJDO0FBQ3pDLE1BQU1DLE9BQU8sRUFBYjtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixLQUFwQixFQUEyQkUsR0FBM0IsRUFBZ0M7QUFDOUJELFNBQUtFLElBQUwsQ0FBVUosSUFBVjtBQUNEO0FBQ0Qs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LEdBQXFCLENBQXhDOztBQUVBLFNBQUssSUFBSWIsSUFBSSxDQUFiLEVBQWdCQSxJQUFJcUIsS0FBS0MsR0FBTCxDQUFTVSxZQUFULEVBQXVCQyxVQUF2QixDQUFwQixFQUF3RGpDLEdBQXhELEVBQTZEO0FBQzNELFVBQUlBLElBQUlpQyxVQUFSLEVBQW9CO0FBQ2xCO0FBQ0QsT0FGRCxNQUVPO0FBQ0w7QUFDQXRCLHlCQUFpQnVCLE1BQWpCLENBQXdCSCxVQUFVL0IsQ0FBbEMsRUFBcUMsQ0FBckMsRUFBd0N1QixPQUF4QztBQUNEO0FBQ0Y7QUFDRjtBQUNERSxPQUFLQyxXQUFMLENBQWlCLEVBQUVDLFVBQVUsRUFBWixFQUFqQjs7QUFFQSxTQUFPO0FBQ0xsQixpQkFBYTtBQUNYZCxZQUFNLGdDQUFpQmdCLGdCQUFqQixDQURLO0FBRVhmLGNBQVFlLGlCQUFpQkUsTUFGZDtBQUdYeEIsYUFBTytCO0FBSEksS0FEUjtBQU1MWixrQkFBYztBQUNaYixZQUFNLGdDQUFpQmUsaUJBQWpCLENBRE07QUFFWmQsY0FBUWMsa0JBQWtCRyxNQUZkO0FBR1p4QixhQUFPK0I7QUFISztBQU5ULEdBQVA7QUFZRDs7QUFFREssS0FBS1UsZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsaUJBQTZDO0FBQUEseUJBQTFDeEMsSUFBMEM7QUFBQSxNQUFsQ2EsWUFBa0MsY0FBbENBLFlBQWtDO0FBQUEsTUFBcEJDLFdBQW9CLGNBQXBCQSxXQUFvQjs7QUFDNUUsTUFBTTJCLFNBQVNqQixzQkFBc0IsRUFBRVgsMEJBQUYsRUFBZ0JDLHdCQUFoQixFQUF0QixDQUFmO0FBQ0FnQixPQUFLQyxXQUFMLENBQWlCVSxNQUFqQjtBQUNBWCxPQUFLWSxLQUFMO0FBQ0QsQ0FKRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFkaWZmIGZyb20gJ2FkaWZmJztcblxuaW1wb3J0IGZsYXR0ZW5JbWFnZURhdGEgZnJvbSAnLi4vZmxhdHRlbkltYWdlRGF0YSc7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgbGluZSBvZiBwaXhlbHMgb2YgYSBjZXJ0YWluIHJnYmEgY29sb3JcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSByZ2JhXG4gKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RDb2xvcmVkTGluZShyZ2JhLCB3aWR0aCkge1xuICBjb25zdCBsaW5lID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgIGxpbmUucHVzaChyZ2JhKTtcbiAgfVxuICByZXR1cm4gbGluZTtcbn1cblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG4gIGNvbnN0IGdldFBpeGVsQXQgPSAoeCwgeSkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAoeSAqIHJvd1NpemUpICsgKHggKiA0KTtcbiAgICByZXR1cm4gW1xuICAgICAgZGF0YVtzdGFydEluZGV4XSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDFdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgMl0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAzXSxcbiAgICBdO1xuICB9O1xuXG4gIGNvbnN0IG5ld0RhdGEgPSBbXTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHBpeGVsc0luUm93ID0gW107XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7XG4gICAgICBwaXhlbHNJblJvdy5wdXNoKGdldFBpeGVsQXQoY29sLCByb3cpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgcGFkID0gMDsgcGFkIDwgcGFkZGluZ1JpZ2h0OyBwYWQrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChbMCwgMCwgMCwgMF0pO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBnZXRBZGlmZlJlc3VsdHMoe1xuICBwcmV2aW91c0RhdGEsXG4gIGN1cnJlbnREYXRhLFxuICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgY3VycmVudEltYWdlRGF0YSxcbn0pIHtcbiAgaWYgKHByZXZpb3VzRGF0YS53aWR0aCAhPT0gY3VycmVudERhdGEud2lkdGgpIHtcbiAgICAvLyB3ZSBrbm93IHRoYXQgYWxsIHJvd3Mgd2lsbCBiZSBkaWZmZXJlbnQgaGVyZSwgc28gd2UgY2FuIHRha2UgYSBzaG9ydGN1dFxuICAgIGNvbnN0IGRpZmYgPSBbXG4gICAgICAwLCAvLyBkaWZmIHN0YXJ0cyBhdCBpbmRleCAwXG4gICAgICBwcmV2aW91c0RhdGEuaGVpZ2h0LCAvLyBudW1iZXIgb2YgZGVsZXRpb25zXG4gICAgXTtcbiAgICBkaWZmLmxlbmd0aCA9IGN1cnJlbnREYXRhLmhlaWdodCArIDI7IC8vIG51bWJlciBvZiBhZGRpdGlvbnNcbiAgICByZXR1cm4gW2RpZmZdO1xuICB9XG5cbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG5cbiAgcmV0dXJuIGFkaWZmLmRpZmYoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCByZWRMaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzI1NSwgMCwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuICBjb25zdCBncmVlbkxpbmUgPSBjb25zdHJ1Y3RDb2xvcmVkTGluZShbMCwgMjU1LCAwLCAyNTVdLCBtYXhXaWR0aCk7XG5cbiAgY29uc3QgcHJldmlvdXNJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBwcmV2aW91c0RhdGEsIG1heFdpZHRoIC0gcHJldmlvdXNEYXRhLndpZHRoKTtcblxuICBjb25zdCBjdXJyZW50SW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgY3VycmVudERhdGEsIG1heFdpZHRoIC0gY3VycmVudERhdGEud2lkdGgpO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogMzAgfSk7XG5cbiAgY29uc3QgYWRpZmZSZXN1bHRzID0gZ2V0QWRpZmZSZXN1bHRzKHtcbiAgICBwcmV2aW91c0RhdGEsXG4gICAgY3VycmVudERhdGEsXG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA3NSB9KTtcblxuICAvLyBpdGVyYXRlIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHByZXZpb3VzIGRhdGFcbiAgYWRpZmZSZXN1bHRzLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgY29uc3QgYXRJbmRleCA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGRlbGV0ZWRJdGVtcyA9IGluc3RydWN0aW9uWzFdO1xuICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBpbnN0cnVjdGlvbi5sZW5ndGggLSAyO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBNYXRoLm1heChkZWxldGVkSXRlbXMsIGFkZGVkSXRlbXMpOyB5KyspIHtcbiAgICAgIGlmICh5IDwgZGVsZXRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgZ3JlZW4gbGluZSB0byBzaWduYWwgYW4gYWRkaXRpb25cbiAgICAgICAgcHJldmlvdXNJbWFnZURhdGEuc3BsaWNlKGF0SW5kZXggKyB5LCAwLCBncmVlbkxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogODAgfSk7XG5cbiAgLy8gaXRlcmF0ZSBiYWNrd2FyZHMgYW5kIGFwcGx5IGNoYW5nZXMgdG8gY3VycmVudCBkYXRhXG4gIGZvciAobGV0IGkgPSBhZGlmZlJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGFkaWZmUmVzdWx0c1tpXTtcbiAgICBjb25zdCBhdEluZGV4ID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb25bMV07XG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IGluc3RydWN0aW9uLmxlbmd0aCAtIDI7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IE1hdGgubWF4KGRlbGV0ZWRJdGVtcywgYWRkZWRJdGVtcyk7IHkrKykge1xuICAgICAgaWYgKHkgPCBhZGRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgcmVkIGxpbmUgdG8gc2lnbmFsIGEgZGVsZXRpb25cbiAgICAgICAgY3VycmVudEltYWdlRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIHJlZExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzZWxmLnBvc3RNZXNzYWdlKHsgcHJvZ3Jlc3M6IDg1IH0pO1xuXG4gIHJldHVybiB7XG4gICAgY3VycmVudERhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEoY3VycmVudEltYWdlRGF0YSksXG4gICAgICBoZWlnaHQ6IGN1cnJlbnRJbWFnZURhdGEubGVuZ3RoLFxuICAgICAgd2lkdGg6IG1heFdpZHRoLFxuICAgIH0sXG4gICAgcHJldmlvdXNEYXRhOiB7XG4gICAgICBkYXRhOiBmbGF0dGVuSW1hZ2VEYXRhKHByZXZpb3VzSW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogcHJldmlvdXNJbWFnZURhdGEubGVuZ3RoLFxuICAgICAgd2lkdGg6IG1heFdpZHRoLFxuICAgIH0sXG4gIH07XG59XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGE6IHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9IH0pID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KTtcbiAgc2VsZi5wb3N0TWVzc2FnZShyZXN1bHQpO1xuICBzZWxmLmNsb3NlKCk7XG59KTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL3dvcmtlcnMvQ29tcHV0ZUFuZEluamVjdERpZmZzV29ya2VyLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("function head (a) {\n return a[0]\n}\n\nfunction last (a) {\n return a[a.length - 1]\n}\n\nfunction tail(a) {\n return a.slice(1)\n}\n\nfunction retreat (e) {\n return e.pop()\n}\n\nfunction hasLength (e) {\n return e.length\n}\n\nfunction any(ary, test) {\n for(var i=0;i<ary.length;i++)\n if(test(ary[i]))\n return true\n return false\n}\n\nfunction score (a) {\n return a.reduce(function (s, a) {\n return s + a.length + a[1] + 1\n }, 0)\n}\n\nfunction best (a, b) {\n return score(a) <= score(b) ? a : b\n}\n\n\nvar _rules // set at the bottom \n\n// note, naive implementation. will break on circular objects.\n\nfunction _equal(a, b) {\n if(a && !b) return false\n if(Array.isArray(a))\n if(a.length != b.length) return false\n if(a && 'object' == typeof a) {\n for(var i in a)\n if(!_equal(a[i], b[i])) return false\n for(var i in b)\n if(!_equal(a[i], b[i])) return false\n return true\n }\n return a == b\n}\n\nfunction getArgs(args) {\n return args.length == 1 ? args[0] : [].slice.call(args)\n}\n\n// return the index of the element not like the others, or -1\nfunction oddElement(ary, cmp) {\n var c\n function guess(a) {\n var odd = -1\n c = 0\n for (var i = a; i < ary.length; i ++) {\n if(!cmp(ary[a], ary[i])) {\n odd = i, c++\n }\n }\n return c > 1 ? -1 : odd\n }\n //assume that it is the first element.\n var g = guess(0)\n if(-1 != g) return g\n //0 was the odd one, then all the other elements are equal\n //else there more than one different element\n guess(1)\n return c == 0 ? 0 : -1\n}\nvar exports = module.exports = function (deps, exports) {\n var equal = (deps && deps.equal) || _equal\n exports = exports || {} \n exports.lcs = \n function lcs() {\n var cache = {}\n var args = getArgs(arguments)\n var a = args[0], b = args[1]\n\n function key (a,b){\n return a.length + ':' + b.length\n }\n\n //find length that matches at the head\n\n if(args.length > 2) {\n //if called with multiple sequences\n //recurse, since lcs(a, b, c, d) == lcs(lcs(a,b), lcs(c,d))\n args.push(lcs(args.shift(), args.shift()))\n return lcs(args)\n }\n \n //this would be improved by truncating input first\n //and not returning an lcs as an intermediate step.\n //untill that is a performance problem.\n\n var start = 0, end = 0\n for(var i = 0; i < a.length && i < b.length \n && equal(a[i], b[i])\n ; i ++\n )\n start = i + 1\n\n if(a.length === start)\n return a.slice()\n\n for(var i = 0; i < a.length - start && i < b.length - start\n && equal(a[a.length - 1 - i], b[b.length - 1 - i])\n ; i ++\n )\n end = i\n\n function recurse (a, b) {\n if(!a.length || !b.length) return []\n //avoid exponential time by caching the results\n if(cache[key(a, b)]) return cache[key(a, b)]\n\n if(equal(a[0], b[0]))\n return [head(a)].concat(recurse(tail(a), tail(b)))\n else { \n var _a = recurse(tail(a), b)\n var _b = recurse(a, tail(b))\n return cache[key(a,b)] = _a.length > _b.length ? _a : _b \n }\n }\n \n var middleA = a.slice(start, a.length - end)\n var middleB = b.slice(start, b.length - end)\n\n return (\n a.slice(0, start).concat(\n recurse(middleA, middleB)\n ).concat(a.slice(a.length - end))\n )\n }\n\n // given n sequences, calc the lcs, and then chunk strings into stable and unstable sections.\n // unstable chunks are passed to build\n exports.chunk =\n function (q, build) {\n var q = q.map(function (e) { return e.slice() })\n var lcs = exports.lcs.apply(null, q)\n var all = [lcs].concat(q)\n\n function matchLcs (e) {\n if(e.length && !lcs.length || !e.length && lcs.length)\n return false //incase the last item is null\n return equal(last(e), last(lcs)) || ((e.length + lcs.length) === 0)\n }\n\n while(any(q, hasLength)) {\n //if each element is at the lcs then this chunk is stable.\n while(q.every(matchLcs) && q.every(hasLength))\n all.forEach(retreat)\n //collect the changes in each array upto the next match with the lcs\n var c = false\n var unstable = q.map(function (e) {\n var change = []\n while(!matchLcs(e)) {\n change.unshift(retreat(e))\n c = true\n }\n return change\n })\n if(c) build(q[0].length, unstable)\n }\n }\n\n //calculate a diff this is only updates\n exports.optimisticDiff =\n function (a, b) {\n var M = Math.max(a.length, b.length)\n var m = Math.min(a.length, b.length)\n var patch = []\n for(var i = 0; i < M; i++)\n if(a[i] !== b[i]) {\n var cur = [i,0], deletes = 0\n while(a[i] !== b[i] && i < m) {\n cur[1] = ++deletes\n cur.push(b[i++])\n }\n //the rest are deletes or inserts\n if(i >= m) {\n //the rest are deletes\n if(a.length > b.length)\n cur[1] += a.length - b.length\n //the rest are inserts\n else if(a.length < b.length)\n cur = cur.concat(b.slice(a.length))\n }\n patch.push(cur)\n }\n\n return patch\n }\n\n exports.diff =\n function (a, b) {\n var optimistic = exports.optimisticDiff(a, b)\n var changes = []\n exports.chunk([a, b], function (index, unstable) {\n var del = unstable.shift().length\n var insert = unstable.shift()\n changes.push([index, del].concat(insert))\n })\n return best(optimistic, changes)\n }\n\n exports.patch = function (a, changes, mutate) {\n if(mutate !== true) a = a.slice(a)//copy a\n changes.forEach(function (change) {\n [].splice.apply(a, change)\n })\n return a\n }\n\n // http://en.wikipedia.org/wiki/Concestor\n // me, concestor, you...\n exports.merge = function () {\n var args = getArgs(arguments)\n var patch = exports.diff3(args)\n return exports.patch(args[0], patch)\n }\n\n exports.diff3 = function () {\n var args = getArgs(arguments)\n var r = []\n exports.chunk(args, function (index, unstable) {\n var mine = unstable[0]\n var insert = resolve(unstable)\n if(equal(mine, insert)) return \n r.push([index, mine.length].concat(insert)) \n })\n return r\n }\n exports.oddOneOut =\n function oddOneOut (changes) {\n changes = changes.slice()\n //put the concestor first\n changes.unshift(changes.splice(1,1)[0])\n var i = oddElement(changes, equal)\n if(i == 0) // concestor was different, 'false conflict'\n return changes[1]\n if (~i)\n return changes[i] \n }\n exports.insertMergeOverDelete = \n //i've implemented this as a seperate rule,\n //because I had second thoughts about this.\n function insertMergeOverDelete (changes) {\n changes = changes.slice()\n changes.splice(1,1)// remove concestor\n \n //if there is only one non empty change thats okay.\n //else full confilct\n for (var i = 0, nonempty; i < changes.length; i++)\n if(changes[i].length) \n if(!nonempty) nonempty = changes[i]\n else return // full conflict\n return nonempty\n }\n\n var rules = (deps && deps.rules) || [exports.oddOneOut, exports.insertMergeOverDelete]\n\n function resolve (changes) {\n var l = rules.length\n for (var i in rules) { // first\n \n var c = rules[i] && rules[i](changes)\n if(c) return c\n }\n changes.splice(1,1) // remove concestor\n //returning the conflicts as an object is a really bad idea,\n // because == will not detect they are the same. and conflicts build.\n // better to use\n // '<<<<<<<<<<<<<'\n // of course, i wrote this before i started on snob, so i didn't know that then.\n /*var conflict = ['>>>>>>>>>>>>>>>>']\n while(changes.length)\n conflict = conflict.concat(changes.shift()).concat('============')\n conflict.pop()\n conflict.push ('<<<<<<<<<<<<<<<')\n changes.unshift ('>>>>>>>>>>>>>>>')\n return conflict*/\n //nah, better is just to use an equal can handle objects\n return {'?': changes}\n }\n return exports\n}\nexports(null, exports)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2FkaWZmL2luZGV4LmpzPzA0ZDYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0Isb0JBQW9CO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaGVhZCAoYSkge1xuICByZXR1cm4gYVswXVxufVxuXG5mdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhW2EubGVuZ3RoIC0gMV1cbn1cblxuZnVuY3Rpb24gdGFpbChhKSB7XG4gIHJldHVybiBhLnNsaWNlKDEpXG59XG5cbmZ1bmN0aW9uIHJldHJlYXQgKGUpIHtcbiAgcmV0dXJuIGUucG9wKClcbn1cblxuZnVuY3Rpb24gaGFzTGVuZ3RoIChlKSB7XG4gIHJldHVybiBlLmxlbmd0aFxufVxuXG5mdW5jdGlvbiBhbnkoYXJ5LCB0ZXN0KSB7XG4gIGZvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspXG4gICAgaWYodGVzdChhcnlbaV0pKVxuICAgICAgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHNjb3JlIChhKSB7XG4gIHJldHVybiBhLnJlZHVjZShmdW5jdGlvbiAocywgYSkge1xuICAgICAgcmV0dXJuIHMgKyBhLmxlbmd0aCArIGFbMV0gKyAxXG4gIH0sIDApXG59XG5cbmZ1bmN0aW9uIGJlc3QgKGEsIGIpIHtcbiAgcmV0dXJuIHNjb3JlKGEpIDw9IHNjb3JlKGIpID8gYSA6IGJcbn1cblxuXG52YXIgX3J1bGVzIC8vIHNldCBhdCB0aGUgYm90dG9tICBcblxuLy8gbm90ZSwgbmFpdmUgaW1wbGVtZW50YXRpb24uIHdpbGwgYnJlYWsgb24gY2lyY3VsYXIgb2JqZWN0cy5cblxuZnVuY3Rpb24gX2VxdWFsKGEsIGIpIHtcbiAgaWYoYSAmJiAhYikgcmV0dXJuIGZhbHNlXG4gIGlmKEFycmF5LmlzQXJyYXkoYSkpXG4gICAgaWYoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBpZihhICYmICdvYmplY3QnID09IHR5cGVvZiBhKSB7XG4gICAgZm9yKHZhciBpIGluIGEpXG4gICAgICBpZighX2VxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2VcbiAgICBmb3IodmFyIGkgaW4gYilcbiAgICAgIGlmKCFfZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGEgPT0gYlxufVxuXG5mdW5jdGlvbiBnZXRBcmdzKGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID09IDEgPyBhcmdzWzBdIDogW10uc2xpY2UuY2FsbChhcmdzKVxufVxuXG4vLyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IG5vdCBsaWtlIHRoZSBvdGhlcnMsIG9yIC0xXG5mdW5jdGlvbiBvZGRFbGVtZW50KGFyeSwgY21wKSB7XG4gIHZhciBjXG4gIGZ1bmN0aW9uIGd1ZXNzKGEpIHtcbiAgICB2YXIgb2RkID0gLTFcbiAgICBjID0gMFxuICAgIGZvciAodmFyIGkgPSBhOyBpIDwgYXJ5Lmxlbmd0aDsgaSArKykge1xuICAgICAgaWYoIWNtcChhcnlbYV0sIGFyeVtpXSkpIHtcbiAgICAgICAgb2RkID0gaSwgYysrXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjID4gMSA/IC0xIDogb2RkXG4gIH1cbiAgLy9hc3N1bWUgdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudC5cbiAgdmFyIGcgPSBndWVzcygwKVxuICBpZigtMSAhPSBnKSByZXR1cm4gZ1xuICAvLzAgd2FzIHRoZSBvZGQgb25lLCB0aGVuIGFsbCB0aGUgb3RoZXIgZWxlbWVudHMgYXJlIGVxdWFsXG4gIC8vZWxzZSB0aGVyZSBtb3JlIHRoYW4gb25lIGRpZmZlcmVudCBlbGVtZW50XG4gIGd1ZXNzKDEpXG4gIHJldHVybiBjID09IDAgPyAwIDogLTFcbn1cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVwcywgZXhwb3J0cykge1xuICB2YXIgZXF1YWwgPSAoZGVwcyAmJiBkZXBzLmVxdWFsKSB8fCBfZXF1YWxcbiAgZXhwb3J0cyA9IGV4cG9ydHMgfHwge30gXG4gIGV4cG9ydHMubGNzID0gXG4gIGZ1bmN0aW9uIGxjcygpIHtcbiAgICB2YXIgY2FjaGUgPSB7fVxuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIGEgPSBhcmdzWzBdLCBiID0gYXJnc1sxXVxuXG4gICAgZnVuY3Rpb24ga2V5IChhLGIpe1xuICAgICAgcmV0dXJuIGEubGVuZ3RoICsgJzonICsgYi5sZW5ndGhcbiAgICB9XG5cbiAgICAvL2ZpbmQgbGVuZ3RoIHRoYXQgbWF0Y2hlcyBhdCB0aGUgaGVhZFxuXG4gICAgaWYoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAvL2lmIGNhbGxlZCB3aXRoIG11bHRpcGxlIHNlcXVlbmNlc1xuICAgICAgLy9yZWN1cnNlLCBzaW5jZSBsY3MoYSwgYiwgYywgZCkgPT0gbGNzKGxjcyhhLGIpLCBsY3MoYyxkKSlcbiAgICAgIGFyZ3MucHVzaChsY3MoYXJncy5zaGlmdCgpLCBhcmdzLnNoaWZ0KCkpKVxuICAgICAgcmV0dXJuIGxjcyhhcmdzKVxuICAgIH1cbiAgICBcbiAgICAvL3RoaXMgd291bGQgYmUgaW1wcm92ZWQgYnkgdHJ1bmNhdGluZyBpbnB1dCBmaXJzdFxuICAgIC8vYW5kIG5vdCByZXR1cm5pbmcgYW4gbGNzIGFzIGFuIGludGVybWVkaWF0ZSBzdGVwLlxuICAgIC8vdW50aWxsIHRoYXQgaXMgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLlxuXG4gICAgdmFyIHN0YXJ0ID0gMCwgZW5kID0gMFxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aCAmJiBpIDwgYi5sZW5ndGggXG4gICAgICAmJiBlcXVhbChhW2ldLCBiW2ldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgc3RhcnQgPSBpICsgMVxuXG4gICAgaWYoYS5sZW5ndGggPT09IHN0YXJ0KVxuICAgICAgcmV0dXJuIGEuc2xpY2UoKVxuXG4gICAgZm9yKHZhciBpID0gMDsgIGkgPCBhLmxlbmd0aCAtIHN0YXJ0ICYmIGkgPCBiLmxlbmd0aCAtIHN0YXJ0XG4gICAgICAmJiBlcXVhbChhW2EubGVuZ3RoIC0gMSAtIGldLCBiW2IubGVuZ3RoIC0gMSAtIGldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgZW5kID0gaVxuXG4gICAgZnVuY3Rpb24gcmVjdXJzZSAoYSwgYikge1xuICAgICAgaWYoIWEubGVuZ3RoIHx8ICFiLmxlbmd0aCkgcmV0dXJuIFtdXG4gICAgICAvL2F2b2lkIGV4cG9uZW50aWFsIHRpbWUgYnkgY2FjaGluZyB0aGUgcmVzdWx0c1xuICAgICAgaWYoY2FjaGVba2V5KGEsIGIpXSkgcmV0dXJuIGNhY2hlW2tleShhLCBiKV1cblxuICAgICAgaWYoZXF1YWwoYVswXSwgYlswXSkpXG4gICAgICAgIHJldHVybiBbaGVhZChhKV0uY29uY2F0KHJlY3Vyc2UodGFpbChhKSwgdGFpbChiKSkpXG4gICAgICBlbHNlIHsgXG4gICAgICAgIHZhciBfYSA9IHJlY3Vyc2UodGFpbChhKSwgYilcbiAgICAgICAgdmFyIF9iID0gcmVjdXJzZShhLCB0YWlsKGIpKVxuICAgICAgICByZXR1cm4gY2FjaGVba2V5KGEsYildID0gX2EubGVuZ3RoID4gX2IubGVuZ3RoID8gX2EgOiBfYiAgXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhciBtaWRkbGVBID0gYS5zbGljZShzdGFydCwgYS5sZW5ndGggLSBlbmQpXG4gICAgdmFyIG1pZGRsZUIgPSBiLnNsaWNlKHN0YXJ0LCBiLmxlbmd0aCAtIGVuZClcblxuICAgIHJldHVybiAoXG4gICAgICBhLnNsaWNlKDAsIHN0YXJ0KS5jb25jYXQoXG4gICAgICAgIHJlY3Vyc2UobWlkZGxlQSwgbWlkZGxlQilcbiAgICAgICkuY29uY2F0KGEuc2xpY2UoYS5sZW5ndGggLSBlbmQpKVxuICAgIClcbiAgfVxuXG4gIC8vIGdpdmVuIG4gc2VxdWVuY2VzLCBjYWxjIHRoZSBsY3MsIGFuZCB0aGVuIGNodW5rIHN0cmluZ3MgaW50byBzdGFibGUgYW5kIHVuc3RhYmxlIHNlY3Rpb25zLlxuICAvLyB1bnN0YWJsZSBjaHVua3MgYXJlIHBhc3NlZCB0byBidWlsZFxuICBleHBvcnRzLmNodW5rID1cbiAgZnVuY3Rpb24gKHEsIGJ1aWxkKSB7XG4gICAgdmFyIHEgPSBxLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5zbGljZSgpIH0pXG4gICAgdmFyIGxjcyA9IGV4cG9ydHMubGNzLmFwcGx5KG51bGwsIHEpXG4gICAgdmFyIGFsbCA9IFtsY3NdLmNvbmNhdChxKVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hMY3MgKGUpIHtcbiAgICAgIGlmKGUubGVuZ3RoICYmICFsY3MubGVuZ3RoIHx8ICFlLmxlbmd0aCAmJiBsY3MubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2UgLy9pbmNhc2UgdGhlIGxhc3QgaXRlbSBpcyBudWxsXG4gICAgICByZXR1cm4gZXF1YWwobGFzdChlKSwgbGFzdChsY3MpKSB8fCAoKGUubGVuZ3RoICsgbGNzLmxlbmd0aCkgPT09IDApXG4gICAgfVxuXG4gICAgd2hpbGUoYW55KHEsIGhhc0xlbmd0aCkpIHtcbiAgICAgIC8vaWYgZWFjaCBlbGVtZW50IGlzIGF0IHRoZSBsY3MgdGhlbiB0aGlzIGNodW5rIGlzIHN0YWJsZS5cbiAgICAgIHdoaWxlKHEuZXZlcnkobWF0Y2hMY3MpICYmIHEuZXZlcnkoaGFzTGVuZ3RoKSlcbiAgICAgICAgYWxsLmZvckVhY2gocmV0cmVhdClcbiAgICAgIC8vY29sbGVjdCB0aGUgY2hhbmdlcyBpbiBlYWNoIGFycmF5IHVwdG8gdGhlIG5leHQgbWF0Y2ggd2l0aCB0aGUgbGNzXG4gICAgICB2YXIgYyA9IGZhbHNlXG4gICAgICB2YXIgdW5zdGFibGUgPSBxLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY2hhbmdlID0gW11cbiAgICAgICAgd2hpbGUoIW1hdGNoTGNzKGUpKSB7XG4gICAgICAgICAgY2hhbmdlLnVuc2hpZnQocmV0cmVhdChlKSlcbiAgICAgICAgICBjID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgIH0pXG4gICAgICBpZihjKSBidWlsZChxWzBdLmxlbmd0aCwgdW5zdGFibGUpXG4gICAgfVxuICB9XG5cbiAgLy9jYWxjdWxhdGUgYSBkaWZmIHRoaXMgaXMgb25seSB1cGRhdGVzXG4gIGV4cG9ydHMub3B0aW1pc3RpY0RpZmYgPVxuICBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBNID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBtID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBwYXRjaCA9IFtdXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IE07IGkrKylcbiAgICAgIGlmKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgdmFyIGN1ciA9IFtpLDBdLCBkZWxldGVzID0gMFxuICAgICAgICB3aGlsZShhW2ldICE9PSBiW2ldICYmIGkgPCBtKSB7XG4gICAgICAgICAgY3VyWzFdID0gKytkZWxldGVzXG4gICAgICAgICAgY3VyLnB1c2goYltpKytdKVxuICAgICAgICB9XG4gICAgICAgIC8vdGhlIHJlc3QgYXJlIGRlbGV0ZXMgb3IgaW5zZXJ0c1xuICAgICAgICBpZihpID49IG0pIHtcbiAgICAgICAgICAvL3RoZSByZXN0IGFyZSBkZWxldGVzXG4gICAgICAgICAgaWYoYS5sZW5ndGggPiBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1clsxXSArPSBhLmxlbmd0aCAtIGIubGVuZ3RoXG4gICAgICAgICAgLy90aGUgcmVzdCBhcmUgaW5zZXJ0c1xuICAgICAgICAgIGVsc2UgaWYoYS5sZW5ndGggPCBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1ciA9IGN1ci5jb25jYXQoYi5zbGljZShhLmxlbmd0aCkpXG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2gucHVzaChjdXIpXG4gICAgICB9XG5cbiAgICByZXR1cm4gcGF0Y2hcbiAgfVxuXG4gIGV4cG9ydHMuZGlmZiA9XG4gIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIG9wdGltaXN0aWMgPSBleHBvcnRzLm9wdGltaXN0aWNEaWZmKGEsIGIpXG4gICAgdmFyIGNoYW5nZXMgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoW2EsIGJdLCBmdW5jdGlvbiAoaW5kZXgsIHVuc3RhYmxlKSB7XG4gICAgICB2YXIgZGVsID0gdW5zdGFibGUuc2hpZnQoKS5sZW5ndGhcbiAgICAgIHZhciBpbnNlcnQgPSB1bnN0YWJsZS5zaGlmdCgpXG4gICAgICBjaGFuZ2VzLnB1c2goW2luZGV4LCBkZWxdLmNvbmNhdChpbnNlcnQpKVxuICAgIH0pXG4gICAgcmV0dXJuIGJlc3Qob3B0aW1pc3RpYywgY2hhbmdlcylcbiAgfVxuXG4gIGV4cG9ydHMucGF0Y2ggPSBmdW5jdGlvbiAoYSwgY2hhbmdlcywgbXV0YXRlKSB7XG4gICAgaWYobXV0YXRlICE9PSB0cnVlKSBhID0gYS5zbGljZShhKS8vY29weSBhXG4gICAgY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2UpIHtcbiAgICAgIFtdLnNwbGljZS5hcHBseShhLCBjaGFuZ2UpXG4gICAgfSlcbiAgICByZXR1cm4gYVxuICB9XG5cbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db25jZXN0b3JcbiAgLy8gbWUsIGNvbmNlc3RvciwgeW91Li4uXG4gIGV4cG9ydHMubWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBnZXRBcmdzKGFyZ3VtZW50cylcbiAgICB2YXIgcGF0Y2ggPSBleHBvcnRzLmRpZmYzKGFyZ3MpXG4gICAgcmV0dXJuIGV4cG9ydHMucGF0Y2goYXJnc1swXSwgcGF0Y2gpXG4gIH1cblxuICBleHBvcnRzLmRpZmYzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIHIgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoYXJncywgZnVuY3Rpb24gKGluZGV4LCB1bnN0YWJsZSkge1xuICAgICAgdmFyIG1pbmUgPSB1bnN0YWJsZVswXVxuICAgICAgdmFyIGluc2VydCA9IHJlc29sdmUodW5zdGFibGUpXG4gICAgICBpZihlcXVhbChtaW5lLCBpbnNlcnQpKSByZXR1cm4gXG4gICAgICByLnB1c2goW2luZGV4LCBtaW5lLmxlbmd0aF0uY29uY2F0KGluc2VydCkpIFxuICAgIH0pXG4gICAgcmV0dXJuIHJcbiAgfVxuICBleHBvcnRzLm9kZE9uZU91dCA9XG4gICAgZnVuY3Rpb24gb2RkT25lT3V0IChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICAvL3B1dCB0aGUgY29uY2VzdG9yIGZpcnN0XG4gICAgICBjaGFuZ2VzLnVuc2hpZnQoY2hhbmdlcy5zcGxpY2UoMSwxKVswXSlcbiAgICAgIHZhciBpID0gb2RkRWxlbWVudChjaGFuZ2VzLCBlcXVhbClcbiAgICAgIGlmKGkgPT0gMCkgLy8gY29uY2VzdG9yIHdhcyBkaWZmZXJlbnQsICdmYWxzZSBjb25mbGljdCdcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbMV1cbiAgICAgIGlmICh+aSlcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbaV0gXG4gICAgfVxuICBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZSA9IFxuICAgIC8vaSd2ZSBpbXBsZW1lbnRlZCB0aGlzIGFzIGEgc2VwZXJhdGUgcnVsZSxcbiAgICAvL2JlY2F1c2UgSSBoYWQgc2Vjb25kIHRob3VnaHRzIGFib3V0IHRoaXMuXG4gICAgZnVuY3Rpb24gaW5zZXJ0TWVyZ2VPdmVyRGVsZXRlIChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICBjaGFuZ2VzLnNwbGljZSgxLDEpLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgICAgXG4gICAgICAvL2lmIHRoZXJlIGlzIG9ubHkgb25lIG5vbiBlbXB0eSBjaGFuZ2UgdGhhdHMgb2theS5cbiAgICAgIC8vZWxzZSBmdWxsIGNvbmZpbGN0XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9uZW1wdHk7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZihjaGFuZ2VzW2ldLmxlbmd0aCkgXG4gICAgICAgICAgaWYoIW5vbmVtcHR5KSBub25lbXB0eSA9IGNoYW5nZXNbaV1cbiAgICAgICAgICBlbHNlIHJldHVybiAvLyBmdWxsIGNvbmZsaWN0XG4gICAgICByZXR1cm4gbm9uZW1wdHlcbiAgICB9XG5cbiAgdmFyIHJ1bGVzID0gKGRlcHMgJiYgZGVwcy5ydWxlcykgfHwgW2V4cG9ydHMub2RkT25lT3V0LCBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZV1cblxuICBmdW5jdGlvbiByZXNvbHZlIChjaGFuZ2VzKSB7XG4gICAgdmFyIGwgPSBydWxlcy5sZW5ndGhcbiAgICBmb3IgKHZhciBpIGluIHJ1bGVzKSB7IC8vIGZpcnN0XG4gICAgICBcbiAgICAgIHZhciBjID0gcnVsZXNbaV0gJiYgcnVsZXNbaV0oY2hhbmdlcylcbiAgICAgIGlmKGMpIHJldHVybiBjXG4gICAgfVxuICAgIGNoYW5nZXMuc3BsaWNlKDEsMSkgLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgIC8vcmV0dXJuaW5nIHRoZSBjb25mbGljdHMgYXMgYW4gb2JqZWN0IGlzIGEgcmVhbGx5IGJhZCBpZGVhLFxuICAgIC8vIGJlY2F1c2UgPT0gd2lsbCBub3QgZGV0ZWN0IHRoZXkgYXJlIHRoZSBzYW1lLiBhbmQgY29uZmxpY3RzIGJ1aWxkLlxuICAgIC8vIGJldHRlciB0byB1c2VcbiAgICAvLyAnPDw8PDw8PDw8PDw8PCdcbiAgICAvLyBvZiBjb3Vyc2UsIGkgd3JvdGUgdGhpcyBiZWZvcmUgaSBzdGFydGVkIG9uIHNub2IsIHNvIGkgZGlkbid0IGtub3cgdGhhdCB0aGVuLlxuICAgIC8qdmFyIGNvbmZsaWN0ID0gWyc+Pj4+Pj4+Pj4+Pj4+Pj4+J11cbiAgICB3aGlsZShjaGFuZ2VzLmxlbmd0aClcbiAgICAgIGNvbmZsaWN0ID0gY29uZmxpY3QuY29uY2F0KGNoYW5nZXMuc2hpZnQoKSkuY29uY2F0KCc9PT09PT09PT09PT0nKVxuICAgIGNvbmZsaWN0LnBvcCgpXG4gICAgY29uZmxpY3QucHVzaCAgICAgICAgICAoJzw8PDw8PDw8PDw8PDw8PCcpXG4gICAgY2hhbmdlcy51bnNoaWZ0ICAgICAgICgnPj4+Pj4+Pj4+Pj4+Pj4+JylcbiAgICByZXR1cm4gY29uZmxpY3QqL1xuICAgIC8vbmFoLCBiZXR0ZXIgaXMganVzdCB0byB1c2UgYW4gZXF1YWwgY2FuIGhhbmRsZSBvYmplY3RzXG4gICAgcmV0dXJuIHsnPyc6IGNoYW5nZXN9XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHNcbn1cbmV4cG9ydHMobnVsbCwgZXhwb3J0cylcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FkaWZmL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = flattenImageData;\n/**\n * @param {Array} imageData a 2d array\n * @return {Uint8ClampedArray}\n */\nfunction flattenImageData(imageData) {\n var width = imageData[0].length;\n var result = new Uint8ClampedArray(imageData.length * width * 4);\n imageData.forEach(function (row, y) {\n row.forEach(function (pixel, x) {\n var index = y * width * 4 + x * 4;\n result[index] = pixel[0];\n result[index + 1] = pixel[1];\n result[index + 2] = pixel[2];\n result[index + 3] = pixel[3];\n });\n });\n return result;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qcz8yZGRiIl0sIm5hbWVzIjpbImZsYXR0ZW5JbWFnZURhdGEiLCJpbWFnZURhdGEiLCJ3aWR0aCIsImxlbmd0aCIsInJlc3VsdCIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiZm9yRWFjaCIsInJvdyIsInkiLCJwaXhlbCIsIngiLCJpbmRleCJdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBSXdCQSxnQjtBQUp4Qjs7OztBQUllLFNBQVNBLGdCQUFULENBQTBCQyxTQUExQixFQUFxQztBQUNsRCxNQUFNQyxRQUFRRCxVQUFVLENBQVYsRUFBYUUsTUFBM0I7QUFDQSxNQUFNQyxTQUFTLElBQUlDLGlCQUFKLENBQXNCSixVQUFVRSxNQUFWLEdBQW1CRCxLQUFuQixHQUEyQixDQUFqRCxDQUFmO0FBQ0FELFlBQVVLLE9BQVYsQ0FBa0IsVUFBQ0MsR0FBRCxFQUFNQyxDQUFOLEVBQVk7QUFDNUJELFFBQUlELE9BQUosQ0FBWSxVQUFDRyxLQUFELEVBQVFDLENBQVIsRUFBYztBQUN4QixVQUFNQyxRQUFTSCxJQUFJTixLQUFKLEdBQVksQ0FBYixHQUFtQlEsSUFBSSxDQUFyQztBQUNBTixhQUFPTyxLQUFQLElBQWdCRixNQUFNLENBQU4sQ0FBaEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDRCxLQU5EO0FBT0QsR0FSRDtBQVNBLFNBQU9MLE1BQVA7QUFDRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBpbWFnZURhdGEgYSAyZCBhcnJheVxuICogQHJldHVybiB7VWludDhDbGFtcGVkQXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZsYXR0ZW5JbWFnZURhdGEoaW1hZ2VEYXRhKSB7XG4gIGNvbnN0IHdpZHRoID0gaW1hZ2VEYXRhWzBdLmxlbmd0aDtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGltYWdlRGF0YS5sZW5ndGggKiB3aWR0aCAqIDQpO1xuICBpbWFnZURhdGEuZm9yRWFjaCgocm93LCB5KSA9PiB7XG4gICAgcm93LmZvckVhY2goKHBpeGVsLCB4KSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9ICh5ICogd2lkdGggKiA0KSArICh4ICogNCk7XG4gICAgICByZXN1bHRbaW5kZXhdID0gcGl4ZWxbMF07XG4gICAgICByZXN1bHRbaW5kZXggKyAxXSA9IHBpeGVsWzFdO1xuICAgICAgcmVzdWx0W2luZGV4ICsgMl0gPSBwaXhlbFsyXTtcbiAgICAgIHJlc3VsdFtpbmRleCArIDNdID0gcGl4ZWxbM107XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
60
+
61
+ /***/ }
62
+ /******/ ]);
@@ -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 _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Construct a line of pixels of a certain rgba color\n *\n * @param {Array} rgba\n * @param {Number} width\n * @return {Array}\n */\nfunction constructColoredLine(rgba, width) {\n var line = [];\n for (var i = 0; i < width; i++) {\n line.push(rgba);\n }\n return line;\n}\n\nfunction imageTo2DArray(_ref) {\n var imageData = _ref.imageData;\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 var getPixelAt = function getPixelAt(x, y) {\n if (x > width || y > height) {\n return undefined;\n }\n\n var startIndex = y * rowSize + x * 4;\n return [imageData[startIndex], imageData[startIndex + 1], imageData[startIndex + 2], imageData[startIndex + 3]];\n };\n\n var data = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = [];\n for (var col = 0; col < width; col++) {\n pixelsInRow.push(getPixelAt(col, row));\n }\n data.push(pixelsInRow);\n }\n return data;\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(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.currentData;\n\n var maxWidth = Math.max(previousData[0].length, currentData[0].length);\n\n var redLine = constructColoredLine([255, 0, 0, 255], maxWidth);\n var greenLine = constructColoredLine([0, 255, 0, 255], maxWidth);\n\n var adiffResults = _adiff2.default.diff(previousData.map(function (d) {\n return btoa(d);\n }), currentData.map(function (d) {\n return btoa(d);\n }));\n\n // iterate and apply changes to previous data\n adiffResults.forEach(function (instruction) {\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < deletedItems) {\n // ignore, we just keep the old line\n } else {\n // add a green line to signal an addition\n previousData.splice(atIndex + y, 0, greenLine);\n }\n }\n });\n\n // iterate backwards and apply changes to current data\n for (var i = adiffResults.length - 1; i >= 0; i--) {\n var instruction = adiffResults[i];\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < addedItems) {\n // ignore, we just keep the old line\n } else {\n // add a red line to signal a deletion\n currentData.splice(atIndex + y, 0, redLine);\n }\n }\n }\n}\n\nself.addEventListener('message', function (_ref3) {\n var _ref3$data = _ref3.data;\n var previousData = _ref3$data.previousData;\n var currentData = _ref3$data.currentData;\n\n computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage({ previousData: previousData, currentData: currentData });\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwiaW1hZ2VEYXRhIiwiaGVpZ2h0Iiwicm93U2l6ZSIsImdldFBpeGVsQXQiLCJ4IiwieSIsInVuZGVmaW5lZCIsInN0YXJ0SW5kZXgiLCJkYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJjb2wiLCJjb21wdXRlQW5kSW5qZWN0RGlmZnMiLCJwcmV2aW91c0RhdGEiLCJjdXJyZW50RGF0YSIsIm1heFdpZHRoIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsInJlZExpbmUiLCJncmVlbkxpbmUiLCJhZGlmZlJlc3VsdHMiLCJkaWZmIiwibWFwIiwiYnRvYSIsImQiLCJmb3JFYWNoIiwiaW5zdHJ1Y3Rpb24iLCJhdEluZGV4IiwiZGVsZXRlZEl0ZW1zIiwiYWRkZWRJdGVtcyIsInNwbGljZSIsInNlbGYiLCJhZGRFdmVudExpc3RlbmVyIiwicG9zdE1lc3NhZ2UiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTQSxvQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0NDLEtBQXBDLEVBQTJDO0FBQ3pDLE1BQU1DLE9BQU8sRUFBYjtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixLQUFwQixFQUEyQkUsR0FBM0IsRUFBZ0M7QUFDOUJELFNBQUtFLElBQUwsQ0FBVUosSUFBVjtBQUNEO0FBQ0QsU0FBT0UsSUFBUDtBQUNEOztBQUVELFNBQVNHLGNBQVQsT0FBc0Q7QUFBQSxNQUE1QkMsU0FBNEIsUUFBNUJBLFNBQTRCO0FBQUEsTUFBakJMLEtBQWlCLFFBQWpCQSxLQUFpQjtBQUFBLE1BQVZNLE1BQVUsUUFBVkEsTUFBVTs7QUFDcEQ7QUFDQTtB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SUFBSWIsSUFBSSxDQUFiLEVBQWdCQSxJQUFJVyxLQUFLQyxHQUFMLENBQVNZLFlBQVQsRUFBdUJDLFVBQXZCLENBQXBCLEVBQXdEekIsR0FBeEQsRUFBNkQ7QUFDM0QsVUFBSUEsSUFBSXlCLFVBQVIsRUFBb0I7QUFDbEI7QUFDRCxPQUZELE1BRU87QUFDTDtBQUNBaEIsb0JBQVlpQixNQUFaLENBQW1CSCxVQUFVdkIsQ0FBN0IsRUFBZ0MsQ0FBaEMsRUFBbUNjLE9BQW5DO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7O0FBRURhLEtBQUtDLGdCQUFMLENBQXNCLFNBQXRCLEVBQWlDLGlCQUE2QztBQUFBLHlCQUExQ3pCLElBQTBDO0FBQUEsTUFBbENLLFlBQWtDLGNBQWxDQSxZQUFrQztBQUFBLE1BQXBCQyxXQUFvQixjQUFwQkEsV0FBb0I7O0FBQzVFRix3QkFBc0IsRUFBRUMsMEJBQUYsRUFBZ0JDLHdCQUFoQixFQUF0QjtBQUNBa0IsT0FBS0UsV0FBTCxDQUFpQixFQUFFckIsMEJBQUYsRUFBZ0JDLHdCQUFoQixFQUFqQjtBQUNBa0IsT0FBS0csS0FBTDtBQUNELENBSkQiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhZGlmZiBmcm9tICdhZGlmZic7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgbGluZSBvZiBwaXhlbHMgb2YgYSBjZXJ0YWluIHJnYmEgY29sb3JcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSByZ2JhXG4gKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RDb2xvcmVkTGluZShyZ2JhLCB3aWR0aCkge1xuICBjb25zdCBsaW5lID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgIGxpbmUucHVzaChyZ2JhKTtcbiAgfVxuICByZXR1cm4gbGluZTtcbn1cblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBpbWFnZURhdGEsIHdpZHRoLCBoZWlnaHQgfSkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG4gIGNvbnN0IGdldFBpeGVsQXQgPSAoeCwgeSkgPT4ge1xuICAgIGlmICh4ID4gd2lkdGggfHwgeSA+IGhlaWdodCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHkgKiByb3dTaXplKSArICh4ICogNCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGltYWdlRGF0YVtzdGFydEluZGV4XSxcbiAgICAgIGltYWdlRGF0YVtzdGFydEluZGV4ICsgMV0sXG4gICAgICBpbWFnZURhdGFbc3RhcnRJbmRleCArIDJdLFxuICAgICAgaW1hZ2VEYXRhW3N0YXJ0SW5kZXggKyAzXSxcbiAgICBdO1xuICB9O1xuXG4gIGNvbnN0IGRhdGEgPSBbXTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHBpeGVsc0luUm93ID0gW107XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7XG4gICAgICBwaXhlbHNJblJvdy5wdXNoKGdldFBpeGVsQXQoY29sLCByb3cpKTtcbiAgICB9XG4gICAgZGF0YS5wdXNoKHBpeGVsc0luUm93KTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBUYWtlcyB0d28gMmQgaW1hZ2VzLCBjb21wdXRlcyB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28sIGFuZCBpbmplY3RzIHBpeGVscyB0b1xuICogYm90aCBpbiBvcmRlciB0bzpcbiAqIGEpIG1ha2UgYm90aCBpbWFnZXMgdGhlIHNhbWUgaGVpZ2h0XG4gKiBiKSBwcm9wZXJseSB2aXN1YWxpemUgZGlmZmVyZW5jZXNcbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbWV0aG9kIE1VVEFURVMgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwcmV2aW91c0RhdGFcbiAqIEBwYXJhbSB7QXJyYXl9IGN1cnJlbnREYXRhXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSkge1xuICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWF4KFxuICAgIHByZXZpb3VzRGF0YVswXS5sZW5ndGgsIGN1cnJlbnREYXRhWzBdLmxlbmd0aCk7XG5cbiAgY29uc3QgcmVkTGluZSA9IGNvbnN0cnVjdENvbG9yZWRMaW5lKFsyNTUsIDAsIDAsIDI1NV0sIG1heFdpZHRoKTtcbiAgY29uc3QgZ3JlZW5MaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzAsIDI1NSwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuXG4gIGNvbnN0IGFkaWZmUmVzdWx0cyA9IGFkaWZmLmRpZmYoXG4gICAgcHJldmlvdXNEYXRhLm1hcChkID0+IGJ0b2EoZCkpLCBjdXJyZW50RGF0YS5tYXAoZCA9PiBidG9hKGQpKSk7XG5cbiAgLy8gaXRlcmF0ZSBhbmQgYXBwbHkgY2hhbmdlcyB0byBwcmV2aW91cyBkYXRhXG4gIGFkaWZmUmVzdWx0cy5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGRlbGV0ZWRJdGVtcykge1xuICAgICAgICAvLyBpZ25vcmUsIHdlIGp1c3Qga2VlcCB0aGUgb2xkIGxpbmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFkZCBhIGdyZWVuIGxpbmUgdG8gc2lnbmFsIGFuIGFkZGl0aW9uXG4gICAgICAgIHByZXZpb3VzRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIGdyZWVuTGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBpdGVyYXRlIGJhY2t3YXJkcyBhbmQgYXBwbHkgY2hhbmdlcyB0byBjdXJyZW50IGRhdGFcbiAgZm9yIChsZXQgaSA9IGFkaWZmUmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gYWRpZmZSZXN1bHRzW2ldO1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGFkZGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgYSByZWQgbGluZSB0byBzaWduYWwgYSBkZWxldGlvblxuICAgICAgICBjdXJyZW50RGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIHJlZExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBzZWxmLmNsb3NlKCk7XG59KTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL3dvcmtlcnMvQ29tcHV0ZUFuZEluamVjdERpZmZzV29ya2VyLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("function head (a) {\n return a[0]\n}\n\nfunction last (a) {\n return a[a.length - 1]\n}\n\nfunction tail(a) {\n return a.slice(1)\n}\n\nfunction retreat (e) {\n return e.pop()\n}\n\nfunction hasLength (e) {\n return e.length\n}\n\nfunction any(ary, test) {\n for(var i=0;i<ary.length;i++)\n if(test(ary[i]))\n return true\n return false\n}\n\nfunction score (a) {\n return a.reduce(function (s, a) {\n return s + a.length + a[1] + 1\n }, 0)\n}\n\nfunction best (a, b) {\n return score(a) <= score(b) ? a : b\n}\n\n\nvar _rules // set at the bottom \n\n// note, naive implementation. will break on circular objects.\n\nfunction _equal(a, b) {\n if(a && !b) return false\n if(Array.isArray(a))\n if(a.length != b.length) return false\n if(a && 'object' == typeof a) {\n for(var i in a)\n if(!_equal(a[i], b[i])) return false\n for(var i in b)\n if(!_equal(a[i], b[i])) return false\n return true\n }\n return a == b\n}\n\nfunction getArgs(args) {\n return args.length == 1 ? args[0] : [].slice.call(args)\n}\n\n// return the index of the element not like the others, or -1\nfunction oddElement(ary, cmp) {\n var c\n function guess(a) {\n var odd = -1\n c = 0\n for (var i = a; i < ary.length; i ++) {\n if(!cmp(ary[a], ary[i])) {\n odd = i, c++\n }\n }\n return c > 1 ? -1 : odd\n }\n //assume that it is the first element.\n var g = guess(0)\n if(-1 != g) return g\n //0 was the odd one, then all the other elements are equal\n //else there more than one different element\n guess(1)\n return c == 0 ? 0 : -1\n}\nvar exports = module.exports = function (deps, exports) {\n var equal = (deps && deps.equal) || _equal\n exports = exports || {} \n exports.lcs = \n function lcs() {\n var cache = {}\n var args = getArgs(arguments)\n var a = args[0], b = args[1]\n\n function key (a,b){\n return a.length + ':' + b.length\n }\n\n //find length that matches at the head\n\n if(args.length > 2) {\n //if called with multiple sequences\n //recurse, since lcs(a, b, c, d) == lcs(lcs(a,b), lcs(c,d))\n args.push(lcs(args.shift(), args.shift()))\n return lcs(args)\n }\n \n //this would be improved by truncating input first\n //and not returning an lcs as an intermediate step.\n //untill that is a performance problem.\n\n var start = 0, end = 0\n for(var i = 0; i < a.length && i < b.length \n && equal(a[i], b[i])\n ; i ++\n )\n start = i + 1\n\n if(a.length === start)\n return a.slice()\n\n for(var i = 0; i < a.length - start && i < b.length - start\n && equal(a[a.length - 1 - i], b[b.length - 1 - i])\n ; i ++\n )\n end = i\n\n function recurse (a, b) {\n if(!a.length || !b.length) return []\n //avoid exponential time by caching the results\n if(cache[key(a, b)]) return cache[key(a, b)]\n\n if(equal(a[0], b[0]))\n return [head(a)].concat(recurse(tail(a), tail(b)))\n else { \n var _a = recurse(tail(a), b)\n var _b = recurse(a, tail(b))\n return cache[key(a,b)] = _a.length > _b.length ? _a : _b \n }\n }\n \n var middleA = a.slice(start, a.length - end)\n var middleB = b.slice(start, b.length - end)\n\n return (\n a.slice(0, start).concat(\n recurse(middleA, middleB)\n ).concat(a.slice(a.length - end))\n )\n }\n\n // given n sequences, calc the lcs, and then chunk strings into stable and unstable sections.\n // unstable chunks are passed to build\n exports.chunk =\n function (q, build) {\n var q = q.map(function (e) { return e.slice() })\n var lcs = exports.lcs.apply(null, q)\n var all = [lcs].concat(q)\n\n function matchLcs (e) {\n if(e.length && !lcs.length || !e.length && lcs.length)\n return false //incase the last item is null\n return equal(last(e), last(lcs)) || ((e.length + lcs.length) === 0)\n }\n\n while(any(q, hasLength)) {\n //if each element is at the lcs then this chunk is stable.\n while(q.every(matchLcs) && q.every(hasLength))\n all.forEach(retreat)\n //collect the changes in each array upto the next match with the lcs\n var c = false\n var unstable = q.map(function (e) {\n var change = []\n while(!matchLcs(e)) {\n change.unshift(retreat(e))\n c = true\n }\n return change\n })\n if(c) build(q[0].length, unstable)\n }\n }\n\n //calculate a diff this is only updates\n exports.optimisticDiff =\n function (a, b) {\n var M = Math.max(a.length, b.length)\n var m = Math.min(a.length, b.length)\n var patch = []\n for(var i = 0; i < M; i++)\n if(a[i] !== b[i]) {\n var cur = [i,0], deletes = 0\n while(a[i] !== b[i] && i < m) {\n cur[1] = ++deletes\n cur.push(b[i++])\n }\n //the rest are deletes or inserts\n if(i >= m) {\n //the rest are deletes\n if(a.length > b.length)\n cur[1] += a.length - b.length\n //the rest are inserts\n else if(a.length < b.length)\n cur = cur.concat(b.slice(a.length))\n }\n patch.push(cur)\n }\n\n return patch\n }\n\n exports.diff =\n function (a, b) {\n var optimistic = exports.optimisticDiff(a, b)\n var changes = []\n exports.chunk([a, b], function (index, unstable) {\n var del = unstable.shift().length\n var insert = unstable.shift()\n changes.push([index, del].concat(insert))\n })\n return best(optimistic, changes)\n }\n\n exports.patch = function (a, changes, mutate) {\n if(mutate !== true) a = a.slice(a)//copy a\n changes.forEach(function (change) {\n [].splice.apply(a, change)\n })\n return a\n }\n\n // http://en.wikipedia.org/wiki/Concestor\n // me, concestor, you...\n exports.merge = function () {\n var args = getArgs(arguments)\n var patch = exports.diff3(args)\n return exports.patch(args[0], patch)\n }\n\n exports.diff3 = function () {\n var args = getArgs(arguments)\n var r = []\n exports.chunk(args, function (index, unstable) {\n var mine = unstable[0]\n var insert = resolve(unstable)\n if(equal(mine, insert)) return \n r.push([index, mine.length].concat(insert)) \n })\n return r\n }\n exports.oddOneOut =\n function oddOneOut (changes) {\n changes = changes.slice()\n //put the concestor first\n changes.unshift(changes.splice(1,1)[0])\n var i = oddElement(changes, equal)\n if(i == 0) // concestor was different, 'false conflict'\n return changes[1]\n if (~i)\n return changes[i] \n }\n exports.insertMergeOverDelete = \n //i've implemented this as a seperate rule,\n //because I had second thoughts about this.\n function insertMergeOverDelete (changes) {\n changes = changes.slice()\n changes.splice(1,1)// remove concestor\n \n //if there is only one non empty change thats okay.\n //else full confilct\n for (var i = 0, nonempty; i < changes.length; i++)\n if(changes[i].length) \n if(!nonempty) nonempty = changes[i]\n else return // full conflict\n return nonempty\n }\n\n var rules = (deps && deps.rules) || [exports.oddOneOut, exports.insertMergeOverDelete]\n\n function resolve (changes) {\n var l = rules.length\n for (var i in rules) { // first\n \n var c = rules[i] && rules[i](changes)\n if(c) return c\n }\n changes.splice(1,1) // remove concestor\n //returning the conflicts as an object is a really bad idea,\n // because == will not detect they are the same. and conflicts build.\n // better to use\n // '<<<<<<<<<<<<<'\n // of course, i wrote this before i started on snob, so i didn't know that then.\n /*var conflict = ['>>>>>>>>>>>>>>>>']\n while(changes.length)\n conflict = conflict.concat(changes.shift()).concat('============')\n conflict.pop()\n conflict.push ('<<<<<<<<<<<<<<<')\n changes.unshift ('>>>>>>>>>>>>>>>')\n return conflict*/\n //nah, better is just to use an equal can handle objects\n return {'?': changes}\n }\n return exports\n}\nexports(null, exports)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2FkaWZmL2luZGV4LmpzPzA0ZDYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0Isb0JBQW9CO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaGVhZCAoYSkge1xuICByZXR1cm4gYVswXVxufVxuXG5mdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhW2EubGVuZ3RoIC0gMV1cbn1cblxuZnVuY3Rpb24gdGFpbChhKSB7XG4gIHJldHVybiBhLnNsaWNlKDEpXG59XG5cbmZ1bmN0aW9uIHJldHJlYXQgKGUpIHtcbiAgcmV0dXJuIGUucG9wKClcbn1cblxuZnVuY3Rpb24gaGFzTGVuZ3RoIChlKSB7XG4gIHJldHVybiBlLmxlbmd0aFxufVxuXG5mdW5jdGlvbiBhbnkoYXJ5LCB0ZXN0KSB7XG4gIGZvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspXG4gICAgaWYodGVzdChhcnlbaV0pKVxuICAgICAgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHNjb3JlIChhKSB7XG4gIHJldHVybiBhLnJlZHVjZShmdW5jdGlvbiAocywgYSkge1xuICAgICAgcmV0dXJuIHMgKyBhLmxlbmd0aCArIGFbMV0gKyAxXG4gIH0sIDApXG59XG5cbmZ1bmN0aW9uIGJlc3QgKGEsIGIpIHtcbiAgcmV0dXJuIHNjb3JlKGEpIDw9IHNjb3JlKGIpID8gYSA6IGJcbn1cblxuXG52YXIgX3J1bGVzIC8vIHNldCBhdCB0aGUgYm90dG9tICBcblxuLy8gbm90ZSwgbmFpdmUgaW1wbGVtZW50YXRpb24uIHdpbGwgYnJlYWsgb24gY2lyY3VsYXIgb2JqZWN0cy5cblxuZnVuY3Rpb24gX2VxdWFsKGEsIGIpIHtcbiAgaWYoYSAmJiAhYikgcmV0dXJuIGZhbHNlXG4gIGlmKEFycmF5LmlzQXJyYXkoYSkpXG4gICAgaWYoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBpZihhICYmICdvYmplY3QnID09IHR5cGVvZiBhKSB7XG4gICAgZm9yKHZhciBpIGluIGEpXG4gICAgICBpZighX2VxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2VcbiAgICBmb3IodmFyIGkgaW4gYilcbiAgICAgIGlmKCFfZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGEgPT0gYlxufVxuXG5mdW5jdGlvbiBnZXRBcmdzKGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID09IDEgPyBhcmdzWzBdIDogW10uc2xpY2UuY2FsbChhcmdzKVxufVxuXG4vLyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IG5vdCBsaWtlIHRoZSBvdGhlcnMsIG9yIC0xXG5mdW5jdGlvbiBvZGRFbGVtZW50KGFyeSwgY21wKSB7XG4gIHZhciBjXG4gIGZ1bmN0aW9uIGd1ZXNzKGEpIHtcbiAgICB2YXIgb2RkID0gLTFcbiAgICBjID0gMFxuICAgIGZvciAodmFyIGkgPSBhOyBpIDwgYXJ5Lmxlbmd0aDsgaSArKykge1xuICAgICAgaWYoIWNtcChhcnlbYV0sIGFyeVtpXSkpIHtcbiAgICAgICAgb2RkID0gaSwgYysrXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjID4gMSA/IC0xIDogb2RkXG4gIH1cbiAgLy9hc3N1bWUgdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudC5cbiAgdmFyIGcgPSBndWVzcygwKVxuICBpZigtMSAhPSBnKSByZXR1cm4gZ1xuICAvLzAgd2FzIHRoZSBvZGQgb25lLCB0aGVuIGFsbCB0aGUgb3RoZXIgZWxlbWVudHMgYXJlIGVxdWFsXG4gIC8vZWxzZSB0aGVyZSBtb3JlIHRoYW4gb25lIGRpZmZlcmVudCBlbGVtZW50XG4gIGd1ZXNzKDEpXG4gIHJldHVybiBjID09IDAgPyAwIDogLTFcbn1cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVwcywgZXhwb3J0cykge1xuICB2YXIgZXF1YWwgPSAoZGVwcyAmJiBkZXBzLmVxdWFsKSB8fCBfZXF1YWxcbiAgZXhwb3J0cyA9IGV4cG9ydHMgfHwge30gXG4gIGV4cG9ydHMubGNzID0gXG4gIGZ1bmN0aW9uIGxjcygpIHtcbiAgICB2YXIgY2FjaGUgPSB7fVxuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIGEgPSBhcmdzWzBdLCBiID0gYXJnc1sxXVxuXG4gICAgZnVuY3Rpb24ga2V5IChhLGIpe1xuICAgICAgcmV0dXJuIGEubGVuZ3RoICsgJzonICsgYi5sZW5ndGhcbiAgICB9XG5cbiAgICAvL2ZpbmQgbGVuZ3RoIHRoYXQgbWF0Y2hlcyBhdCB0aGUgaGVhZFxuXG4gICAgaWYoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAvL2lmIGNhbGxlZCB3aXRoIG11bHRpcGxlIHNlcXVlbmNlc1xuICAgICAgLy9yZWN1cnNlLCBzaW5jZSBsY3MoYSwgYiwgYywgZCkgPT0gbGNzKGxjcyhhLGIpLCBsY3MoYyxkKSlcbiAgICAgIGFyZ3MucHVzaChsY3MoYXJncy5zaGlmdCgpLCBhcmdzLnNoaWZ0KCkpKVxuICAgICAgcmV0dXJuIGxjcyhhcmdzKVxuICAgIH1cbiAgICBcbiAgICAvL3RoaXMgd291bGQgYmUgaW1wcm92ZWQgYnkgdHJ1bmNhdGluZyBpbnB1dCBmaXJzdFxuICAgIC8vYW5kIG5vdCByZXR1cm5pbmcgYW4gbGNzIGFzIGFuIGludGVybWVkaWF0ZSBzdGVwLlxuICAgIC8vdW50aWxsIHRoYXQgaXMgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLlxuXG4gICAgdmFyIHN0YXJ0ID0gMCwgZW5kID0gMFxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aCAmJiBpIDwgYi5sZW5ndGggXG4gICAgICAmJiBlcXVhbChhW2ldLCBiW2ldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgc3RhcnQgPSBpICsgMVxuXG4gICAgaWYoYS5sZW5ndGggPT09IHN0YXJ0KVxuICAgICAgcmV0dXJuIGEuc2xpY2UoKVxuXG4gICAgZm9yKHZhciBpID0gMDsgIGkgPCBhLmxlbmd0aCAtIHN0YXJ0ICYmIGkgPCBiLmxlbmd0aCAtIHN0YXJ0XG4gICAgICAmJiBlcXVhbChhW2EubGVuZ3RoIC0gMSAtIGldLCBiW2IubGVuZ3RoIC0gMSAtIGldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgZW5kID0gaVxuXG4gICAgZnVuY3Rpb24gcmVjdXJzZSAoYSwgYikge1xuICAgICAgaWYoIWEubGVuZ3RoIHx8ICFiLmxlbmd0aCkgcmV0dXJuIFtdXG4gICAgICAvL2F2b2lkIGV4cG9uZW50aWFsIHRpbWUgYnkgY2FjaGluZyB0aGUgcmVzdWx0c1xuICAgICAgaWYoY2FjaGVba2V5KGEsIGIpXSkgcmV0dXJuIGNhY2hlW2tleShhLCBiKV1cblxuICAgICAgaWYoZXF1YWwoYVswXSwgYlswXSkpXG4gICAgICAgIHJldHVybiBbaGVhZChhKV0uY29uY2F0KHJlY3Vyc2UodGFpbChhKSwgdGFpbChiKSkpXG4gICAgICBlbHNlIHsgXG4gICAgICAgIHZhciBfYSA9IHJlY3Vyc2UodGFpbChhKSwgYilcbiAgICAgICAgdmFyIF9iID0gcmVjdXJzZShhLCB0YWlsKGIpKVxuICAgICAgICByZXR1cm4gY2FjaGVba2V5KGEsYildID0gX2EubGVuZ3RoID4gX2IubGVuZ3RoID8gX2EgOiBfYiAgXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhciBtaWRkbGVBID0gYS5zbGljZShzdGFydCwgYS5sZW5ndGggLSBlbmQpXG4gICAgdmFyIG1pZGRsZUIgPSBiLnNsaWNlKHN0YXJ0LCBiLmxlbmd0aCAtIGVuZClcblxuICAgIHJldHVybiAoXG4gICAgICBhLnNsaWNlKDAsIHN0YXJ0KS5jb25jYXQoXG4gICAgICAgIHJlY3Vyc2UobWlkZGxlQSwgbWlkZGxlQilcbiAgICAgICkuY29uY2F0KGEuc2xpY2UoYS5sZW5ndGggLSBlbmQpKVxuICAgIClcbiAgfVxuXG4gIC8vIGdpdmVuIG4gc2VxdWVuY2VzLCBjYWxjIHRoZSBsY3MsIGFuZCB0aGVuIGNodW5rIHN0cmluZ3MgaW50byBzdGFibGUgYW5kIHVuc3RhYmxlIHNlY3Rpb25zLlxuICAvLyB1bnN0YWJsZSBjaHVua3MgYXJlIHBhc3NlZCB0byBidWlsZFxuICBleHBvcnRzLmNodW5rID1cbiAgZnVuY3Rpb24gKHEsIGJ1aWxkKSB7XG4gICAgdmFyIHEgPSBxLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5zbGljZSgpIH0pXG4gICAgdmFyIGxjcyA9IGV4cG9ydHMubGNzLmFwcGx5KG51bGwsIHEpXG4gICAgdmFyIGFsbCA9IFtsY3NdLmNvbmNhdChxKVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hMY3MgKGUpIHtcbiAgICAgIGlmKGUubGVuZ3RoICYmICFsY3MubGVuZ3RoIHx8ICFlLmxlbmd0aCAmJiBsY3MubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2UgLy9pbmNhc2UgdGhlIGxhc3QgaXRlbSBpcyBudWxsXG4gICAgICByZXR1cm4gZXF1YWwobGFzdChlKSwgbGFzdChsY3MpKSB8fCAoKGUubGVuZ3RoICsgbGNzLmxlbmd0aCkgPT09IDApXG4gICAgfVxuXG4gICAgd2hpbGUoYW55KHEsIGhhc0xlbmd0aCkpIHtcbiAgICAgIC8vaWYgZWFjaCBlbGVtZW50IGlzIGF0IHRoZSBsY3MgdGhlbiB0aGlzIGNodW5rIGlzIHN0YWJsZS5cbiAgICAgIHdoaWxlKHEuZXZlcnkobWF0Y2hMY3MpICYmIHEuZXZlcnkoaGFzTGVuZ3RoKSlcbiAgICAgICAgYWxsLmZvckVhY2gocmV0cmVhdClcbiAgICAgIC8vY29sbGVjdCB0aGUgY2hhbmdlcyBpbiBlYWNoIGFycmF5IHVwdG8gdGhlIG5leHQgbWF0Y2ggd2l0aCB0aGUgbGNzXG4gICAgICB2YXIgYyA9IGZhbHNlXG4gICAgICB2YXIgdW5zdGFibGUgPSBxLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY2hhbmdlID0gW11cbiAgICAgICAgd2hpbGUoIW1hdGNoTGNzKGUpKSB7XG4gICAgICAgICAgY2hhbmdlLnVuc2hpZnQocmV0cmVhdChlKSlcbiAgICAgICAgICBjID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgIH0pXG4gICAgICBpZihjKSBidWlsZChxWzBdLmxlbmd0aCwgdW5zdGFibGUpXG4gICAgfVxuICB9XG5cbiAgLy9jYWxjdWxhdGUgYSBkaWZmIHRoaXMgaXMgb25seSB1cGRhdGVzXG4gIGV4cG9ydHMub3B0aW1pc3RpY0RpZmYgPVxuICBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBNID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBtID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBwYXRjaCA9IFtdXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IE07IGkrKylcbiAgICAgIGlmKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgdmFyIGN1ciA9IFtpLDBdLCBkZWxldGVzID0gMFxuICAgICAgICB3aGlsZShhW2ldICE9PSBiW2ldICYmIGkgPCBtKSB7XG4gICAgICAgICAgY3VyWzFdID0gKytkZWxldGVzXG4gICAgICAgICAgY3VyLnB1c2goYltpKytdKVxuICAgICAgICB9XG4gICAgICAgIC8vdGhlIHJlc3QgYXJlIGRlbGV0ZXMgb3IgaW5zZXJ0c1xuICAgICAgICBpZihpID49IG0pIHtcbiAgICAgICAgICAvL3RoZSByZXN0IGFyZSBkZWxldGVzXG4gICAgICAgICAgaWYoYS5sZW5ndGggPiBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1clsxXSArPSBhLmxlbmd0aCAtIGIubGVuZ3RoXG4gICAgICAgICAgLy90aGUgcmVzdCBhcmUgaW5zZXJ0c1xuICAgICAgICAgIGVsc2UgaWYoYS5sZW5ndGggPCBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1ciA9IGN1ci5jb25jYXQoYi5zbGljZShhLmxlbmd0aCkpXG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2gucHVzaChjdXIpXG4gICAgICB9XG5cbiAgICByZXR1cm4gcGF0Y2hcbiAgfVxuXG4gIGV4cG9ydHMuZGlmZiA9XG4gIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIG9wdGltaXN0aWMgPSBleHBvcnRzLm9wdGltaXN0aWNEaWZmKGEsIGIpXG4gICAgdmFyIGNoYW5nZXMgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoW2EsIGJdLCBmdW5jdGlvbiAoaW5kZXgsIHVuc3RhYmxlKSB7XG4gICAgICB2YXIgZGVsID0gdW5zdGFibGUuc2hpZnQoKS5sZW5ndGhcbiAgICAgIHZhciBpbnNlcnQgPSB1bnN0YWJsZS5zaGlmdCgpXG4gICAgICBjaGFuZ2VzLnB1c2goW2luZGV4LCBkZWxdLmNvbmNhdChpbnNlcnQpKVxuICAgIH0pXG4gICAgcmV0dXJuIGJlc3Qob3B0aW1pc3RpYywgY2hhbmdlcylcbiAgfVxuXG4gIGV4cG9ydHMucGF0Y2ggPSBmdW5jdGlvbiAoYSwgY2hhbmdlcywgbXV0YXRlKSB7XG4gICAgaWYobXV0YXRlICE9PSB0cnVlKSBhID0gYS5zbGljZShhKS8vY29weSBhXG4gICAgY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2UpIHtcbiAgICAgIFtdLnNwbGljZS5hcHBseShhLCBjaGFuZ2UpXG4gICAgfSlcbiAgICByZXR1cm4gYVxuICB9XG5cbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db25jZXN0b3JcbiAgLy8gbWUsIGNvbmNlc3RvciwgeW91Li4uXG4gIGV4cG9ydHMubWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBnZXRBcmdzKGFyZ3VtZW50cylcbiAgICB2YXIgcGF0Y2ggPSBleHBvcnRzLmRpZmYzKGFyZ3MpXG4gICAgcmV0dXJuIGV4cG9ydHMucGF0Y2goYXJnc1swXSwgcGF0Y2gpXG4gIH1cblxuICBleHBvcnRzLmRpZmYzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIHIgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoYXJncywgZnVuY3Rpb24gKGluZGV4LCB1bnN0YWJsZSkge1xuICAgICAgdmFyIG1pbmUgPSB1bnN0YWJsZVswXVxuICAgICAgdmFyIGluc2VydCA9IHJlc29sdmUodW5zdGFibGUpXG4gICAgICBpZihlcXVhbChtaW5lLCBpbnNlcnQpKSByZXR1cm4gXG4gICAgICByLnB1c2goW2luZGV4LCBtaW5lLmxlbmd0aF0uY29uY2F0KGluc2VydCkpIFxuICAgIH0pXG4gICAgcmV0dXJuIHJcbiAgfVxuICBleHBvcnRzLm9kZE9uZU91dCA9XG4gICAgZnVuY3Rpb24gb2RkT25lT3V0IChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICAvL3B1dCB0aGUgY29uY2VzdG9yIGZpcnN0XG4gICAgICBjaGFuZ2VzLnVuc2hpZnQoY2hhbmdlcy5zcGxpY2UoMSwxKVswXSlcbiAgICAgIHZhciBpID0gb2RkRWxlbWVudChjaGFuZ2VzLCBlcXVhbClcbiAgICAgIGlmKGkgPT0gMCkgLy8gY29uY2VzdG9yIHdhcyBkaWZmZXJlbnQsICdmYWxzZSBjb25mbGljdCdcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbMV1cbiAgICAgIGlmICh+aSlcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbaV0gXG4gICAgfVxuICBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZSA9IFxuICAgIC8vaSd2ZSBpbXBsZW1lbnRlZCB0aGlzIGFzIGEgc2VwZXJhdGUgcnVsZSxcbiAgICAvL2JlY2F1c2UgSSBoYWQgc2Vjb25kIHRob3VnaHRzIGFib3V0IHRoaXMuXG4gICAgZnVuY3Rpb24gaW5zZXJ0TWVyZ2VPdmVyRGVsZXRlIChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICBjaGFuZ2VzLnNwbGljZSgxLDEpLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgICAgXG4gICAgICAvL2lmIHRoZXJlIGlzIG9ubHkgb25lIG5vbiBlbXB0eSBjaGFuZ2UgdGhhdHMgb2theS5cbiAgICAgIC8vZWxzZSBmdWxsIGNvbmZpbGN0XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9uZW1wdHk7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZihjaGFuZ2VzW2ldLmxlbmd0aCkgXG4gICAgICAgICAgaWYoIW5vbmVtcHR5KSBub25lbXB0eSA9IGNoYW5nZXNbaV1cbiAgICAgICAgICBlbHNlIHJldHVybiAvLyBmdWxsIGNvbmZsaWN0XG4gICAgICByZXR1cm4gbm9uZW1wdHlcbiAgICB9XG5cbiAgdmFyIHJ1bGVzID0gKGRlcHMgJiYgZGVwcy5ydWxlcykgfHwgW2V4cG9ydHMub2RkT25lT3V0LCBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZV1cblxuICBmdW5jdGlvbiByZXNvbHZlIChjaGFuZ2VzKSB7XG4gICAgdmFyIGwgPSBydWxlcy5sZW5ndGhcbiAgICBmb3IgKHZhciBpIGluIHJ1bGVzKSB7IC8vIGZpcnN0XG4gICAgICBcbiAgICAgIHZhciBjID0gcnVsZXNbaV0gJiYgcnVsZXNbaV0oY2hhbmdlcylcbiAgICAgIGlmKGMpIHJldHVybiBjXG4gICAgfVxuICAgIGNoYW5nZXMuc3BsaWNlKDEsMSkgLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgIC8vcmV0dXJuaW5nIHRoZSBjb25mbGljdHMgYXMgYW4gb2JqZWN0IGlzIGEgcmVhbGx5IGJhZCBpZGVhLFxuICAgIC8vIGJlY2F1c2UgPT0gd2lsbCBub3QgZGV0ZWN0IHRoZXkgYXJlIHRoZSBzYW1lLiBhbmQgY29uZmxpY3RzIGJ1aWxkLlxuICAgIC8vIGJldHRlciB0byB1c2VcbiAgICAvLyAnPDw8PDw8PDw8PDw8PCdcbiAgICAvLyBvZiBjb3Vyc2UsIGkgd3JvdGUgdGhpcyBiZWZvcmUgaSBzdGFydGVkIG9uIHNub2IsIHNvIGkgZGlkbid0IGtub3cgdGhhdCB0aGVuLlxuICAgIC8qdmFyIGNvbmZsaWN0ID0gWyc+Pj4+Pj4+Pj4+Pj4+Pj4+J11cbiAgICB3aGlsZShjaGFuZ2VzLmxlbmd0aClcbiAgICAgIGNvbmZsaWN0ID0gY29uZmxpY3QuY29uY2F0KGNoYW5nZXMuc2hpZnQoKSkuY29uY2F0KCc9PT09PT09PT09PT0nKVxuICAgIGNvbmZsaWN0LnBvcCgpXG4gICAgY29uZmxpY3QucHVzaCAgICAgICAgICAoJzw8PDw8PDw8PDw8PDw8PCcpXG4gICAgY2hhbmdlcy51bnNoaWZ0ICAgICAgICgnPj4+Pj4+Pj4+Pj4+Pj4+JylcbiAgICByZXR1cm4gY29uZmxpY3QqL1xuICAgIC8vbmFoLCBiZXR0ZXIgaXMganVzdCB0byB1c2UgYW4gZXF1YWwgY2FuIGhhbmRsZSBvYmplY3RzXG4gICAgcmV0dXJuIHsnPyc6IGNoYW5nZXN9XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHNcbn1cbmV4cG9ydHMobnVsbCwgZXhwb3J0cylcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FkaWZmL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ }
56
+ /******/ ]);
@@ -44,7 +44,7 @@
44
44
  /* 0 */
45
45
  /***/ function(module, exports, __webpack_require__) {
46
46
 
47
- eval("'use strict';\n\nvar _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nvar _flattenImageData = __webpack_require__(2);\n\nvar _flattenImageData2 = _interopRequireDefault(_flattenImageData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TRANSPARENT_PIXEL = [0, 0, 0, 0];\n\n/**\n * Construct a line of transparent pixels\n *\n * @param {Number} width\n * @return {Array}\n */\nfunction constructColoredLine(width) {\n var line = [];\n for (var i = 0; i < width; i++) {\n line.push(TRANSPARENT_PIXEL);\n }\n return line;\n}\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 var getPixelAt = function getPixelAt(x, y) {\n var startIndex = y * rowSize + x * 4;\n return [data[startIndex], data[startIndex + 1], data[startIndex + 2], data[startIndex + 3]];\n };\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = [];\n for (var col = 0; col < width; col++) {\n pixelsInRow.push(getPixelAt(col, row));\n }\n for (var pad = 0; pad < paddingRight; pad++) {\n pixelsInRow.push([0, 0, 0, 0]);\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction getAdiffResults(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.currentData;\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n\n if (previousData.width !== currentData.width) {\n // we know that all rows will be different here, so we can take a shortcut\n var diff = [0, // diff starts at index 0\n previousData.height];\n diff.length = currentData.height + 2; // number of additions\n return [diff];\n }\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 return _adiff2.default.diff(hashedPreviousData, hashedCurrentData);\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 redLine = constructColoredLine([255, 0, 0, 255], maxWidth);\n var greenLine = constructColoredLine([0, 255, 0, 255], maxWidth);\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 var adiffResults = getAdiffResults({\n previousData: previousData,\n currentData: currentData,\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n self.postMessage({ progress: 85 });\n\n // iterate and apply changes to previous data\n adiffResults.forEach(function (instruction) {\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < deletedItems) {\n // ignore, we just keep the old line\n } else {\n // add a green line to signal an addition\n previousImageData.splice(atIndex + y, 0, greenLine);\n }\n }\n });\n self.postMessage({ progress: 95 });\n\n // iterate backwards and apply changes to current data\n for (var i = adiffResults.length - 1; i >= 0; i--) {\n var instruction = adiffResults[i];\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < addedItems) {\n // ignore, we just keep the old line\n } else {\n // add a red line to signal a deletion\n currentImageData.splice(atIndex + y, 0, redLine);\n }\n }\n }\n self.postMessage({ progress: 98 });\n\n return {\n currentData: {\n data: (0, _flattenImageData2.default)(currentImageData),\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: (0, _flattenImageData2.default)(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/ZGRiNSJdLCJuYW1lcyI6WyJUUkFOU1BBUkVOVF9QSVhFTCIsImNvbnN0cnVjdENvbG9yZWRMaW5lIiwid2lkdGgiLCJsaW5lIiwiaSIsInB1c2giLCJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJoZWlnaHQiLCJyb3dTaXplIiwiZ2V0UGl4ZWxBdCIsIngiLCJ5Iiwic3RhcnRJbmRleCIsIm5ld0RhdGEiLCJyb3ciLCJwaXhlbHNJblJvdyIsImNvbCIsInBhZCIsImdldEFkaWZmUmVzdWx0cyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwiZGlmZiIsImxlbmd0aCIsImhhc2hlZFByZXZpb3VzRGF0YSIsIm1hcCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzZWxmIiwicG9zdE1lc3NhZ2UiLCJwcm9ncmVzcyIsImhhc2hlZEN1cnJlbnREYXRhIiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwibWF4V2lkdGgiLCJNYXRoIiwibWF4IiwicmVkTGluZSIsImdyZWVuTGluZSIsImFkaWZmUmVzdWx0cyIsImZvckVhY2giLCJpbnN0cnVjdGlvbiIsImF0SW5kZXgiLCJkZWxldGVkSXRlbXMiLCJhZGRlZEl0ZW1zIiwic3BsaWNlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc3VsdCIsImNsb3NlIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7O0FBRUE7Ozs7OztBQUVBLElBQU1BLG9CQUFvQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FBMUI7O0FBRUE7Ozs7OztBQU1BLFNBQVNDLG9CQUFULENBQThCQyxLQUE5QixFQUFxQztBQUNuQyxNQUFNQyxPQUFPLEVBQWI7QUFDQSxPQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUYs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TDtBQUNELENBSkQiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhZGlmZiBmcm9tICdhZGlmZic7XG5cbmltcG9ydCBmbGF0dGVuSW1hZ2VEYXRhIGZyb20gJy4uL2ZsYXR0ZW5JbWFnZURhdGEnO1xuXG5jb25zdCBUUkFOU1BBUkVOVF9QSVhFTCA9IFswLCAwLCAwLCAwXTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBsaW5lIG9mIHRyYW5zcGFyZW50IHBpeGVsc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdENvbG9yZWRMaW5lKHdpZHRoKSB7XG4gIGNvbnN0IGxpbmUgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgbGluZS5wdXNoKFRSQU5TUEFSRU5UX1BJWEVMKTtcbiAgfVxuICByZXR1cm4gbGluZTtcbn1cblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG4gIGNvbnN0IGdldFBpeGVsQXQgPSAoeCwgeSkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAoeSAqIHJvd1NpemUpICsgKHggKiA0KTtcbiAgICByZXR1cm4gW1xuICAgICAgZGF0YVtzdGFydEluZGV4XSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDFdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgMl0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAzXSxcbiAgICBdO1xuICB9O1xuXG4gIGNvbnN0IG5ld0RhdGEgPSBbXTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHBpeGVsc0luUm93ID0gW107XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7XG4gICAgICBwaXhlbHNJblJvdy5wdXNoKGdldFBpeGVsQXQoY29sLCByb3cpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgcGFkID0gMDsgcGFkIDwgcGFkZGluZ1JpZ2h0OyBwYWQrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChbMCwgMCwgMCwgMF0pO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBnZXRBZGlmZlJlc3VsdHMoe1xuICBwcmV2aW91c0RhdGEsXG4gIGN1cnJlbnREYXRhLFxuICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgY3VycmVudEltYWdlRGF0YSxcbn0pIHtcbiAgaWYgKHByZXZpb3VzRGF0YS53aWR0aCAhPT0gY3VycmVudERhdGEud2lkdGgpIHtcbiAgICAvLyB3ZSBrbm93IHRoYXQgYWxsIHJvd3Mgd2lsbCBiZSBkaWZmZXJlbnQgaGVyZSwgc28gd2UgY2FuIHRha2UgYSBzaG9ydGN1dFxuICAgIGNvbnN0IGRpZmYgPSBbXG4gICAgICAwLCAvLyBkaWZmIHN0YXJ0cyBhdCBpbmRleCAwXG4gICAgICBwcmV2aW91c0RhdGEuaGVpZ2h0LCAvLyBudW1iZXIgb2YgZGVsZXRpb25zXG4gICAgXTtcbiAgICBkaWZmLmxlbmd0aCA9IGN1cnJlbnREYXRhLmhlaWdodCArIDI7IC8vIG51bWJlciBvZiBhZGRpdGlvbnNcbiAgICByZXR1cm4gW2RpZmZdO1xuICB9XG5cbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgcmV0dXJuIGFkaWZmLmRpZmYoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCByZWRMaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzI1NSwgMCwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuICBjb25zdCBncmVlbkxpbmUgPSBjb25zdHJ1Y3RDb2xvcmVkTGluZShbMCwgMjU1LCAwLCAyNTVdLCBtYXhXaWR0aCk7XG5cbiAgY29uc3QgcHJldmlvdXNJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBwcmV2aW91c0RhdGEsIG1heFdpZHRoIC0gcHJldmlvdXNEYXRhLndpZHRoKTtcblxuICBjb25zdCBjdXJyZW50SW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgY3VycmVudERhdGEsIG1heFdpZHRoIC0gY3VycmVudERhdGEud2lkdGgpO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogMjAgfSk7XG5cbiAgY29uc3QgYWRpZmZSZXN1bHRzID0gZ2V0QWRpZmZSZXN1bHRzKHtcbiAgICBwcmV2aW91c0RhdGEsXG4gICAgY3VycmVudERhdGEsXG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICAvLyBpdGVyYXRlIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHByZXZpb3VzIGRhdGFcbiAgYWRpZmZSZXN1bHRzLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgY29uc3QgYXRJbmRleCA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGRlbGV0ZWRJdGVtcyA9IGluc3RydWN0aW9uWzFdO1xuICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBpbnN0cnVjdGlvbi5sZW5ndGggLSAyO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBNYXRoLm1heChkZWxldGVkSXRlbXMsIGFkZGVkSXRlbXMpOyB5KyspIHtcbiAgICAgIGlmICh5IDwgZGVsZXRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgZ3JlZW4gbGluZSB0byBzaWduYWwgYW4gYWRkaXRpb25cbiAgICAgICAgcHJldmlvdXNJbWFnZURhdGEuc3BsaWNlKGF0SW5kZXggKyB5LCAwLCBncmVlbkxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogOTUgfSk7XG5cbiAgLy8gaXRlcmF0ZSBiYWNrd2FyZHMgYW5kIGFwcGx5IGNoYW5nZXMgdG8gY3VycmVudCBkYXRhXG4gIGZvciAobGV0IGkgPSBhZGlmZlJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGFkaWZmUmVzdWx0c1tpXTtcbiAgICBjb25zdCBhdEluZGV4ID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb25bMV07XG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IGluc3RydWN0aW9uLmxlbmd0aCAtIDI7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IE1hdGgubWF4KGRlbGV0ZWRJdGVtcywgYWRkZWRJdGVtcyk7IHkrKykge1xuICAgICAgaWYgKHkgPCBhZGRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgcmVkIGxpbmUgdG8gc2lnbmFsIGEgZGVsZXRpb25cbiAgICAgICAgY3VycmVudEltYWdlRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIHJlZExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzZWxmLnBvc3RNZXNzYWdlKHsgcHJvZ3Jlc3M6IDk4IH0pO1xuXG4gIHJldHVybiB7XG4gICAgY3VycmVudERhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEoY3VycmVudEltYWdlRGF0YSksXG4gICAgICBoZWlnaHQ6IGN1cnJlbnRJbWFnZURhdGEubGVuZ3RoLFxuICAgICAgd2lkdGg6IG1heFdpZHRoLFxuICAgIH0sXG4gICAgcHJldmlvdXNEYXRhOiB7XG4gICAgICBkYXRhOiBmbGF0dGVuSW1hZ2VEYXRhKHByZXZpb3VzSW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogcHJldmlvdXNJbWFnZURhdGEubGVuZ3RoLFxuICAgICAgd2lkdGg6IG1heFdpZHRoLFxuICAgIH0sXG4gIH07XG59XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGE6IHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9IH0pID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KTtcbiAgc2VsZi5wb3N0TWVzc2FnZShyZXN1bHQpO1xuICBzZWxmLmNsb3NlKCk7XG59KTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL3dvcmtlcnMvQ29tcHV0ZUFuZEluamVjdERpZmZzV29ya2VyLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
47
+ eval("'use strict';\n\nvar _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nvar _flattenImageData = __webpack_require__(2);\n\nvar _flattenImageData2 = _interopRequireDefault(_flattenImageData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Construct a line of pixels of a certain rgba color\n *\n * @param {Array} rgba\n * @param {Number} width\n * @return {Array}\n */\nfunction constructColoredLine(rgba, width) {\n var line = [];\n for (var i = 0; i < width; i++) {\n line.push(rgba);\n }\n return line;\n}\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 var getPixelAt = function getPixelAt(x, y) {\n var startIndex = y * rowSize + x * 4;\n return [data[startIndex], data[startIndex + 1], data[startIndex + 2], data[startIndex + 3]];\n };\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = [];\n for (var col = 0; col < width; col++) {\n pixelsInRow.push(getPixelAt(col, row));\n }\n for (var pad = 0; pad < paddingRight; pad++) {\n pixelsInRow.push([0, 0, 0, 0]);\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction hash(a) {\n var res = 0;\n for (var i = 0; i < a.length; i++) {\n res += a[i];\n }\n}\n\nfunction getAdiffResults(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.currentData;\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n\n if (previousData.width !== currentData.width) {\n // we know that all rows will be different here, so we can take a shortcut\n var diff = [0, // diff starts at index 0\n previousData.height];\n diff.length = currentData.height + 2; // number of additions\n return [diff];\n }\n var start = performance.now();\n var p = previousImageData.map(hash);\n var c = currentImageData.map(hash);\n\n console.log('hashing', performance.now() - start);\n\n var r = _adiff2.default.diff(p, c);\n console.log('total', performance.now() - start);\n return r;\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 redLine = constructColoredLine([255, 0, 0, 255], maxWidth);\n var greenLine = constructColoredLine([0, 255, 0, 255], maxWidth);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n var adiffResults = getAdiffResults({\n previousData: previousData,\n currentData: currentData,\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n // iterate and apply changes to previous data\n adiffResults.forEach(function (instruction) {\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < deletedItems) {\n // ignore, we just keep the old line\n } else {\n // add a green line to signal an addition\n previousImageData.splice(atIndex + y, 0, greenLine);\n }\n }\n });\n\n // iterate backwards and apply changes to current data\n for (var i = adiffResults.length - 1; i >= 0; i--) {\n var instruction = adiffResults[i];\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < addedItems) {\n // ignore, we just keep the old line\n } else {\n // add a red line to signal a deletion\n currentImageData.splice(atIndex + y, 0, redLine);\n }\n }\n }\n\n return {\n currentData: {\n data: (0, _flattenImageData2.default)(currentImageData),\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: (0, _flattenImageData2.default)(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/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiaGFzaCIsImEiLCJyZXMiLCJsZW5ndGgiLCJnZXRBZGlmZlJlc3VsdHMiLCJwcmV2aW91c0RhdGEiLCJjdXJyZW50RGF0YSIsInByZXZpb3VzSW1hZ2VEYXRhIiwiY3VycmVudEltYWdlRGF0YSIsImRpZmYiLCJzdGFydCIsInBlcmZvcm1hbmNlIiwibm93IiwicCIsIm1hcCIsImMiLCJjb25zb2xlIiwibG9nIiwiciIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsIm1heFdpZHRoIiwiTWF0aCIsIm1heCIsInJlZExpbmUiLCJncmVlbkxpbmUiLCJhZGlmZlJlc3VsdHMiLCJmb3JFYWNoIiwiaW5zdHJ1Y3Rpb24iLCJhdEluZGV4IiwiZGVsZXRlZEl0ZW1zIiwiYWRkZWRJdGVtcyIsInNwbGljZSIsInNlbGYiLCJhZGRFdmVudExpc3RlbmVyIiwicmVzdWx0IiwicG9zdE1lc3NhZ2UiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7OztBQUVBOzs7Ozs7QUFFQTs7Ozs7OztBQU9BLFNBQVNBLG9CQUFULENBQThCQyxJQUE5QixFQUFvQ0MsS0FBcEMsRUFBMkM7QUFDekMsTUFBTUMsT0FBTyxFQUFiO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLEtBQXBCLEVBQTJCRSxHQUEzQixFQUFnQztBQUM5QkQsU0FBS0UsSUFBTCxDQUFVSixJQUFWO0FBQ0Q7QUFDRCxTQUFPRSxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0csY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JOLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCTyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVUixRQUFRLENBQXhCO0FBQ0EsTUFBTVMsYUFBYSxTQUFiQSxVQUFhLENBQUNDLENBQUQsRUFBSUMsQ0FBSixFQUFVO0FBQzNCLFFBQU1DLGFBQWNELElBQUlILE9BQUwsR0FBaUJFLElBQUksQ0FBeEM7QUFDQSxXQUFPLENBQ0xKLEtBQUtNLFVBQUwsQ0FESyxFQUVMTixLQUFLTSxhQUFhLENBQWxCLENBRkssRUFHTE4sS0FBS00sYUFBYSxDQUFsQixDQUhLLEVBSUxOLEtBQUtNLGFBQWEsQ0FBbEIsQ0FKSyxDQUFQO0FBTUQsR0FSRDs7QUFVQSxNQUFNQyxVQUFVLEVBQWhCO0FBQ0EsT0FBSyxJQUFJQyxNQUFNLENBQWYsRUFBa0JBLE1BQU1QLE1BQXhCLEVBQWdDTyxLQUFoQyxFQUF1QztBQUNyQyxRQUFNQyxjQUFjLEVBQXBCO0FBQ0EsU0FBSyxJQUFJQyxNQUFNLENBQWYsRUFBa0JBLE1BQU1oQixLQUF4QixFQUErQmdCLEtBQS9CLEVBQXNDO0FBQ3BDRCxrQkFBWVosSUFBWixDQUFpQk0sV0FBV08sR0FBWCxFQUFnQkYsR0FBaEIsQ0FBakI7QUFDRDtBQUNELFNBQUssSUFBSUcsTUFBTSxDQUFmLEVBQWtCQSxNQUFNWixZQUF4QixFQUFzQ1ksS0FBdEMsRUFBNkM7QUFDM0NGLGtCQUFZWixJQUFaLENBQWlCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQUFqQjtBQUNEO0FBQ0RVLFlBQVFWLElBQVIsQ0FBYVksV0FBYjtBQUNEO0FBQ0QsU0FBT0YsT0FBUDtBQUNEOztBQUVELFNBQVNLLElBQVQsQ0FBY0MsQ0FBZCxFQUFpQjtBQUNmLE1BQUlDLE1BQU0sQ0FBVjtBQUNBLE9BQUssSUFBSWxCLElBQUksQ0FBYixFQUFnQkEsSUFBSWlCLEVBQUVFLE1BQXRCLEVBQThCbkIsR0FBOUIsRUFBbUM7QUFDakNrQixXQUFPRCxFQUFFakIsQ0FBRixDQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTb0IsZUFBVCxRQUtHO0FBQUEsTUFKREMsWUFJQyxTQUpEQSxZQUlDO0FBQUEsTUFIREMsV0FHQyxTQUhEQSxXQUdDO0FBQUEsTUFGREMsaUJBRUMsU0FGREEsaUJBRUM7QUFBQSxNQUREQyxnQkFDQyxTQUREQSxnQkFDQzs7QUFDRCxNQUFJSCxhQUFhdkIsS0FBYixLQUF1QndCLFlBQVl4QixLQUF2QyxFQUE4QztBQUM1QztBQUNBLFFBQU0yQixPQUFPLENBQ1gsQ0FEVyxFQUNSO0FBQ0hKLGlCQUFhaEIsTUFGRixDQUFiO0FBSUFvQixTQUFLTixNQUFMLEdBQWNHLFlBQVlqQixNQUFaLEdBQXFCLENBQW5DLENBTjRDLENBTU47QUFDdEMsV0FBTyxDQUFDb0IsSUFBRCxDQUFQO0FBQ0Q7QUFDRCxNQUFNQyxRQUFRQyxZQUFZQyxHQUFaLEVBQWQ7QUFDQSxNQUFNQyxJQUFJTixrQkFBa0JPLEdBQWxCLENBQXNCZCxJQUF0QixDQUFWO0FBQ0EsTUFBTWUsSUFBSVAsaUJBQWlCTSxHQUFqQixDQUFxQmQsSUFBckIsQ0FBVjs7QUFFQWdCLFVBQVFDLEdBQVIsQ0FBWSxTQUFaLEVBQXVCTixZQUFZQyxHQUFaLEtBQW9CRixLQUEzQzs7QUFFQSxNQUFNUSxJQUFJLGdCQUFNVCxJQUFOLENBQVdJLENBQVgsRUFBY0UsQ0FBZCxDQUFWO0FBQ0FDLFVBQVFDLEdBQVIsQ0FBWSxPQUFaLEVBQXFCTixZQUFZQyxHQUFaLEtBQW9CRixLQUF6QztBQUNBLFNBQU9RLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7Ozs7QUFXQSxTQUFTQyxxQkFBVCxRQUE4RDtBQUFBLE1BQTdCZCxZQUE2QixTQUE3QkEsWUFBNkI7QUFBQSxNQUFmQyxXQUFlLFNBQWZBLFdBQWU7O0FBQzVELE1BQU1jLFdBQVdDLEtBQUtDLEdBQUwsQ0FBU2pCLGFBQWF2QixLQUF0QixFQUE2QndCLFlBQVl4QixLQUF6QyxDQUFqQjs7QUFFQSxNQUFNeUMsVUFBVTNDLHFCQUFxQixDQUFDLEdBQUQsRUFBTSxDQUFOLEVBQVMsQ0FBVCxFQUFZLEdBQVosQ0FBckIsRUFBdUN3QyxRQUF2QyxDQUFoQjtBQUNBLE1BQU1JLFlBQVk1QyxxQkFBcUIsQ0FBQyxDQUFELEVBQUksR0FBSixFQUFTLENBQVQsRUFBWSxHQUFaLENBQXJCLEVBQXVDd0MsUUFBdkMsQ0FBbEI7O0FBRUEsTUFBTWIsb0JBQW9CckIsZUFDeEJtQixZQUR3QixFQUNWZSxXQUFXZixhQUFhdkIsS0FEZCxDQUExQjs7QUFHQSxNQUFNMEIsbUJBQW1CdEIsZUFDdkJvQixXQUR1QixFQUNWYyxXQUFXZCxZQUFZeEIsS0FEYixDQUF6Qjs7QUFHQSxNQUFNMkMsZUFBZXJCLGdCQUFnQjtBQUNuQ0MsOEJBRG1DO0FBRW5DQyw0QkFGbUM7QUFHbkNDLHdDQUhtQztBQUluQ0M7QUFKbUMsR0FBaEIsQ0FBckI7O0FBT0E7QUFDQWlCLGVBQWFDLE9BQWIsQ0FBcUIsVUFBQ0MsV0FBRCxFQUFpQjtBQUNwQyxRQUFNQyxVQUFVRCxZQUFZLENBQVosQ0FBaEI7QUFDQSxRQUFNRSxlQUFlRixZQUFZLENBQVosQ0FBckI7QUFDQSxRQUFNRyxhQUFhSCxZQUFZeEIsTUFBWixHQUFxQixDQUF4Qzs7QUFFQSxTQUFLLElBQUlWLElBQUksQ0FBYixFQUFnQkEsSUFBSTRCLEtBQUtDLEdBQUwsQ0FBU08sWUFBVCxFQUF1QkMsVUFBdkIsQ0FBcEIsRUFBd0RyQyxHQUF4RCxFQUE2RDtBQUMzRCxVQUFJQSxJQUFJb0MsWUFBUixFQUFzQjtBQUNwQjtBQUNELE9BRkQsTUFFTztBQUNMO0FBQ0F0QiwwQkFBa0J3QixNQUFsQixDQUF5QkgsVUFBVW5DLENBQW5DLEVBQXNDLENBQXRDLEVBQXlDK0IsU0FBekM7QUFDRDtBQUNGO0FBQ0YsR0FiRDs7QUFlQTtBQUNBLE9BQUssSUFBSXhDLElBQUl5QyxhQUFhdEIsTUFBYixHQUFzQixDQUFuQyxFQUFzQ25CLEtBQUssQ0FBM0MsRUFBOENBLEdBQTlDLEVBQW1EO0FBQ2pELFFBQU0yQyxjQUFjRixhQUFhekMsQ0FBYixDQUFwQjtBQUNBLFFBQU00QyxVQUFVRCxZQUFZLENBQVosQ0FBaEI7QUFDQSxRQUFNRSxlQUFlRixZQUFZLENBQVosQ0FBckI7QUFDQSxRQUFNRyxhQUFhSCxZQUFZeEIsTUFBWixHQUFxQixDQUF4Qzs7QUFFQSxTQUFLLElBQUlWLElBQUksQ0FBYixFQUFnQkEsSUFBSTRCLEtBQUtDLEdBQUwsQ0FBU08sWUFBVCxFQUF1QkMsVUFBdkIsQ0FBcEIsRUFBd0RyQyxHQUF4RCxFQUE2RDtBQUMzRCxVQUFJQSxJQUFJcUMsVUFBUixFQUFvQjtBQUNsQjtBQUNELE9BRkQsTUFFTztBQUNMO0FBQ0F0Qix5QkFBaUJ1QixNQUFqQixDQUF3QkgsVUFBVW5DLENBQWxDLEVBQXFDLENBQXJDLEVBQXdDOEIsT0FBeEM7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsU0FBTztBQUNMakIsaUJBQWE7QUFDWGxCLFlBQU0sZ0NBQWlCb0IsZ0JBQWpCLENBREs7QUFFWG5CLGNBQVFtQixpQkFBaUJMLE1BRmQ7QUFHWHJCLGFBQU9zQztBQUhJLEtBRFI7QUFNTGYsa0JBQWM7QUFDWmpCLFlBQU0sZ0NBQWlCbUIsaUJBQWpCLENBRE07QUFFWmxCLGNBQVFrQixrQkFBa0JKLE1BRmQ7QUFHWnJCLGFBQU9zQztBQUhLO0FBTlQsR0FBUDtBQVlEOztBQUVEWSxLQUFLQyxnQkFBTCxDQUFzQixTQUF0QixFQUFpQyxpQkFBNkM7QUFBQSx5QkFBMUM3QyxJQUEwQztBQUFBLE1BQWxDaUIsWUFBa0MsY0FBbENBLFlBQWtDO0FBQUEsTUFBcEJDLFdBQW9CLGNBQXBCQSxXQUFvQjs7QUFDNUUsTUFBTTRCLFNBQVNmLHNCQUFzQixFQUFFZCwwQkFBRixFQUFnQkMsd0JBQWhCLEVBQXRCLENBQWY7QUFDQTBCLE9BQUtHLFdBQUwsQ0FBaUJELE1BQWpCO0FBQ0FGLE9BQUtJLEtBQUw7QUFDRCxDQUpEIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYWRpZmYgZnJvbSAnYWRpZmYnO1xuXG5pbXBvcnQgZmxhdHRlbkltYWdlRGF0YSBmcm9tICcuLi9mbGF0dGVuSW1hZ2VEYXRhJztcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBsaW5lIG9mIHBpeGVscyBvZiBhIGNlcnRhaW4gcmdiYSBjb2xvclxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHJnYmFcbiAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdENvbG9yZWRMaW5lKHJnYmEsIHdpZHRoKSB7XG4gIGNvbnN0IGxpbmUgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgbGluZS5wdXNoKHJnYmEpO1xuICB9XG4gIHJldHVybiBsaW5lO1xufVxuXG5mdW5jdGlvbiBpbWFnZVRvMkRBcnJheSh7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfSwgcGFkZGluZ1JpZ2h0KSB7XG4gIC8vIFRoZSBpbWFnZURhdGEgaXMgYSAxRCBhcnJheS4gRWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhXG4gIC8vIGRlY2ltYWwgdmFsdWUgdGhhdCByZXByZXNlbnRzIG9uZSBvZiB0aGUgUkdCQSBjaGFubmVscyBmb3IgdGhhdCBwaXhlbC5cbiAgY29uc3Qgcm93U2l6ZSA9IHdpZHRoICogNDtcbiAgY29uc3QgZ2V0UGl4ZWxBdCA9ICh4LCB5KSA9PiB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9ICh5ICogcm93U2l6ZSkgKyAoeCAqIDQpO1xuICAgIHJldHVybiBbXG4gICAgICBkYXRhW3N0YXJ0SW5kZXhdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgMV0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAyXSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDNdLFxuICAgIF07XG4gIH07XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBbXTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHtcbiAgICAgIHBpeGVsc0luUm93LnB1c2goZ2V0UGl4ZWxBdChjb2wsIHJvdykpO1xuICAgIH1cbiAgICBmb3IgKGxldCBwYWQgPSAwOyBwYWQgPCBwYWRkaW5nUmlnaHQ7IHBhZCsrKSB7XG4gICAgICBwaXhlbHNJblJvdy5wdXNoKFswLCAwLCAwLCAwXSk7XG4gICAgfVxuICAgIG5ld0RhdGEucHVzaChwaXhlbHNJblJvdyk7XG4gIH1cbiAgcmV0dXJuIG5ld0RhdGE7XG59XG5cbmZ1bmN0aW9uIGhhc2goYSkge1xuICBsZXQgcmVzID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzICs9IGFbaV07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWRpZmZSZXN1bHRzKHtcbiAgcHJldmlvdXNEYXRhLFxuICBjdXJyZW50RGF0YSxcbiAgcHJldmlvdXNJbWFnZURhdGEsXG4gIGN1cnJlbnRJbWFnZURhdGEsXG59KSB7XG4gIGlmIChwcmV2aW91c0RhdGEud2lkdGggIT09IGN1cnJlbnREYXRhLndpZHRoKSB7XG4gICAgLy8gd2Uga25vdyB0aGF0IGFsbCByb3dzIHdpbGwgYmUgZGlmZmVyZW50IGhlcmUsIHNvIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXRcbiAgICBjb25zdCBkaWZmID0gW1xuICAgICAgMCwgLy8gZGlmZiBzdGFydHMgYXQgaW5kZXggMFxuICAgICAgcHJldmlvdXNEYXRhLmhlaWdodCwgLy8gbnVtYmVyIG9mIGRlbGV0aW9uc1xuICAgIF07XG4gICAgZGlmZi5sZW5ndGggPSBjdXJyZW50RGF0YS5oZWlnaHQgKyAyOyAvLyBudW1iZXIgb2YgYWRkaXRpb25zXG4gICAgcmV0dXJuIFtkaWZmXTtcbiAgfVxuICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICBjb25zdCBwID0gcHJldmlvdXNJbWFnZURhdGEubWFwKGhhc2gpO1xuICBjb25zdCBjID0gY3VycmVudEltYWdlRGF0YS5tYXAoaGFzaCk7XG5cbiAgY29uc29sZS5sb2coJ2hhc2hpbmcnLCBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KTtcblxuICBjb25zdCByID0gYWRpZmYuZGlmZihwLCBjKTtcbiAgY29uc29sZS5sb2coJ3RvdGFsJywgcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCk7XG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIFRha2VzIHR3byAyZCBpbWFnZXMsIGNvbXB1dGVzIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3bywgYW5kIGluamVjdHMgcGl4ZWxzIHRvXG4gKiBib3RoIGluIG9yZGVyIHRvOlxuICogYSkgbWFrZSBib3RoIGltYWdlcyB0aGUgc2FtZSBoZWlnaHRcbiAqIGIpIHByb3Blcmx5IHZpc3VhbGl6ZSBkaWZmZXJlbmNlc1xuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgTVVUQVRFUyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHByZXZpb3VzRGF0YVxuICogQHBhcmFtIHtBcnJheX0gY3VycmVudERhdGFcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KSB7XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgocHJldmlvdXNEYXRhLndpZHRoLCBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgY29uc3QgcmVkTGluZSA9IGNvbnN0cnVjdENvbG9yZWRMaW5lKFsyNTUsIDAsIDAsIDI1NV0sIG1heFdpZHRoKTtcbiAgY29uc3QgZ3JlZW5MaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzAsIDI1NSwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuXG4gIGNvbnN0IHByZXZpb3VzSW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgcHJldmlvdXNEYXRhLCBtYXhXaWR0aCAtIHByZXZpb3VzRGF0YS53aWR0aCk7XG5cbiAgY29uc3QgY3VycmVudEltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIGN1cnJlbnREYXRhLCBtYXhXaWR0aCAtIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBhZGlmZlJlc3VsdHMgPSBnZXRBZGlmZlJlc3VsdHMoe1xuICAgIHByZXZpb3VzRGF0YSxcbiAgICBjdXJyZW50RGF0YSxcbiAgICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgICBjdXJyZW50SW1hZ2VEYXRhLFxuICB9KTtcblxuICAvLyBpdGVyYXRlIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHByZXZpb3VzIGRhdGFcbiAgYWRpZmZSZXN1bHRzLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgY29uc3QgYXRJbmRleCA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGRlbGV0ZWRJdGVtcyA9IGluc3RydWN0aW9uWzFdO1xuICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBpbnN0cnVjdGlvbi5sZW5ndGggLSAyO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBNYXRoLm1heChkZWxldGVkSXRlbXMsIGFkZGVkSXRlbXMpOyB5KyspIHtcbiAgICAgIGlmICh5IDwgZGVsZXRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgZ3JlZW4gbGluZSB0byBzaWduYWwgYW4gYWRkaXRpb25cbiAgICAgICAgcHJldmlvdXNJbWFnZURhdGEuc3BsaWNlKGF0SW5kZXggKyB5LCAwLCBncmVlbkxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gaXRlcmF0ZSBiYWNrd2FyZHMgYW5kIGFwcGx5IGNoYW5nZXMgdG8gY3VycmVudCBkYXRhXG4gIGZvciAobGV0IGkgPSBhZGlmZlJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGFkaWZmUmVzdWx0c1tpXTtcbiAgICBjb25zdCBhdEluZGV4ID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb25bMV07XG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IGluc3RydWN0aW9uLmxlbmd0aCAtIDI7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IE1hdGgubWF4KGRlbGV0ZWRJdGVtcywgYWRkZWRJdGVtcyk7IHkrKykge1xuICAgICAgaWYgKHkgPCBhZGRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgcmVkIGxpbmUgdG8gc2lnbmFsIGEgZGVsZXRpb25cbiAgICAgICAgY3VycmVudEltYWdlRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIHJlZExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3VycmVudERhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEoY3VycmVudEltYWdlRGF0YSksXG4gICAgICBoZWlnaHQ6IGN1cnJlbnRJbWFnZURhdGEubGVuZ3RoLFxuICAgICAgd2lkdGg6IG1heFdpZHRoLFxuICAgIH0sXG4gICAgcHJldmlvdXNEYXRhOiB7XG4gICAgICBkYXRhOiBmbGF0dGVuSW1hZ2VEYXRhKHByZXZpb3VzSW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogcHJldmlvdXNJbWFnZURhdGEubGVuZ3RoLFxuICAgICAgd2lkdGg6IG1heFdpZHRoLFxuICAgIH0sXG4gIH07XG59XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGE6IHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9IH0pID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KTtcbiAgc2VsZi5wb3N0TWVzc2FnZShyZXN1bHQpO1xuICBzZWxmLmNsb3NlKCk7XG59KTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL3dvcmtlcnMvQ29tcHV0ZUFuZEluamVjdERpZmZzV29ya2VyLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
48
48
 
49
49
  /***/ },
50
50
  /* 1 */
@@ -0,0 +1,62 @@
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 _getDiffPixel = __webpack_require__(1);\n\nvar _getDiffPixel2 = _interopRequireDefault(_getDiffPixel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nself.addEventListener('message', function (_ref) {\n var _ref$data = _ref.data;\n var previous = _ref$data.previous;\n var current = _ref$data.current;\n var offset = _ref$data.offset;\n var chunkSize = _ref$data.chunkSize;\n\n var data = new Uint8ClampedArray(previous.length);\n\n for (var i = offset; i < chunkSize; i += 4) {\n var pixel = (0, _getDiffPixel2.default)(previous.slice(i, i + 4), current.slice(i, i + 4));\n data[i + 0] = pixel[0]; // r\n data[i + 1] = pixel[1]; // g\n data[i + 2] = pixel[2]; // b\n data[i + 3] = pixel[3]; // a\n }\n self.postMessage(data);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanM/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91cyIsImN1cnJlbnQiLCJvZmZzZXQiLCJjaHVua1NpemUiLCJVaW50OENsYW1wZWRBcnJheSIsImxlbmd0aCIsImkiLCJwaXhlbCIsInNsaWNlIiwicG9zdE1lc3NhZ2UiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUFBLEtBQUtDLGdCQUFMLENBQXNCLFNBQXRCLEVBQWlDLGdCQUt6QjtBQUFBLHVCQUw0QkMsSUFLNUI7QUFBQSxNQUpOQyxRQUlNLGFBSk5BLFFBSU07QUFBQSxNQUhOQyxPQUdNLGFBSE5BLE9BR007QUFBQSxNQUZOQyxNQUVNLGFBRk5BLE1BRU07QUFBQSxNQUROQyxTQUNNLGFBRE5BLFNBQ007O0FBQ04sTUFBTUosT0FBTyxJQUFJSyxpQkFBSixDQUFzQkosU0FBU0ssTUFBL0IsQ0FBYjs7QUFFQSxPQUFLLElBQUlDLElBQUlKLE1BQWIsRUFBcUJJLElBQUlILFNBQXpCLEVBQW9DRyxLQUFLLENBQXpDLEVBQTRDO0FBQzFDLFFBQU1DLFFBQVEsNEJBQ1pQLFNBQVNRLEtBQVQsQ0FBZUYsQ0FBZixFQUFrQkEsSUFBSSxDQUF0QixDQURZLEVBRVpMLFFBQVFPLEtBQVIsQ0FBY0YsQ0FBZCxFQUFpQkEsSUFBSSxDQUFyQixDQUZZLENBQWQ7QUFJQVAsU0FBS08sSUFBSSxDQUFULElBQWNDLE1BQU0sQ0FBTixDQUFkLENBTDBDLENBS2xCO0FBQ3hCUixTQUFLTyxJQUFJLENBQVQsSUFBY0MsTUFBTSxDQUFOLENBQWQsQ0FOMEMsQ0FNbEI7QUFDeEJSLFNBQUtPLElBQUksQ0FBVCxJQUFjQyxNQUFNLENBQU4sQ0FBZCxDQVAwQyxDQU9sQjtBQUN4QlIsU0FBS08sSUFBSSxDQUFULElBQWNDLE1BQU0sQ0FBTixDQUFkLENBUjBDLENBUWxCO0FBQ3pCO0FBQ0RWLE9BQUtZLFdBQUwsQ0FBaUJWLElBQWpCO0FBQ0FGLE9BQUthLEtBQUw7QUFDRCxDQXBCRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGdldERpZmZQaXhlbCBmcm9tICcuLi9nZXREaWZmUGl4ZWwnO1xuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7XG4gIHByZXZpb3VzLFxuICBjdXJyZW50LFxuICBvZmZzZXQsXG4gIGNodW5rU2l6ZSxcbn0gfSkgPT4ge1xuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHByZXZpb3VzLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IGNodW5rU2l6ZTsgaSArPSA0KSB7XG4gICAgY29uc3QgcGl4ZWwgPSBnZXREaWZmUGl4ZWwoXG4gICAgICBwcmV2aW91cy5zbGljZShpLCBpICsgNCksXG4gICAgICBjdXJyZW50LnNsaWNlKGksIGkgKyA0KVxuICAgICk7XG4gICAgZGF0YVtpICsgMF0gPSBwaXhlbFswXTsgLy8gclxuICAgIGRhdGFbaSArIDFdID0gcGl4ZWxbMV07IC8vIGdcbiAgICBkYXRhW2kgKyAyXSA9IHBpeGVsWzJdOyAvLyBiXG4gICAgZGF0YVtpICsgM10gPSBwaXhlbFszXTsgLy8gYVxuICB9XG4gIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports, __webpack_require__) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getDiffPixel;\n\nvar _euclideanDistance = __webpack_require__(2);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getDiffPixel(previousPixel, currentPixel) {\n if (!previousPixel) {\n return currentPixel;\n }\n\n if (!currentPixel) {\n return previousPixel;\n }\n\n var diff = (0, _euclideanDistance2.default)(previousPixel, currentPixel);\n if (diff === 0) {\n return [currentPixel[0], currentPixel[1], currentPixel[2], 50];\n }\n\n if (diff < 0.2) {\n diff = 0.2;\n }\n return [255, 0, 0, 255 * diff]; // TODO don't use red here\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwicHJldmlvdXNQaXhlbCIsImN1cnJlbnRQaXhlbCIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUV3QkEsWTs7QUFGeEI7Ozs7OztBQUVlLFNBQVNBLFlBQVQsQ0FBc0JDLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQsTUFBSUUsT0FBTyxpQ0FBa0JGLGFBQWxCLEVBQWlDQyxZQUFqQyxDQUFYO0FBQ0EsTUFBSUMsU0FBUyxDQUFiLEVBQWdCO0FBQ2QsV0FBTyxDQUNMRCxhQUFhLENBQWIsQ0FESyxFQUVMQSxhQUFhLENBQWIsQ0FGSyxFQUdMQSxhQUFhLENBQWIsQ0FISyxFQUlMLEVBSkssQ0FBUDtBQU1EOztBQUVELE1BQUlDLE9BQU8sR0FBWCxFQUFnQjtBQUNkQSxXQUFPLEdBQVA7QUFDRDtBQUNELFNBQU8sQ0FBQyxHQUFELEVBQU0sQ0FBTixFQUFTLENBQVQsRUFBWSxNQUFNQSxJQUFsQixDQUFQLENBdEJnRSxDQXNCaEM7QUFDakMiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBldWNsaWRlYW5EaXN0YW5jZSBmcm9tICcuL2V1Y2xpZGVhbkRpc3RhbmNlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RGlmZlBpeGVsKHByZXZpb3VzUGl4ZWwsIGN1cnJlbnRQaXhlbCkge1xuICBpZiAoIXByZXZpb3VzUGl4ZWwpIHtcbiAgICByZXR1cm4gY3VycmVudFBpeGVsO1xuICB9XG5cbiAgaWYgKCFjdXJyZW50UGl4ZWwpIHtcbiAgICByZXR1cm4gcHJldmlvdXNQaXhlbDtcbiAgfVxuXG4gIGxldCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKTtcbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3VycmVudFBpeGVsWzBdLFxuICAgICAgY3VycmVudFBpeGVsWzFdLFxuICAgICAgY3VycmVudFBpeGVsWzJdLFxuICAgICAgNTAsXG4gICAgXTtcbiAgfVxuXG4gIGlmIChkaWZmIDwgMC4yKSB7XG4gICAgZGlmZiA9IDAuMjtcbiAgfVxuICByZXR1cm4gWzI1NSwgMCwgMCwgMjU1ICogZGlmZl07IC8vIFRPRE8gZG9uJ3QgdXNlIHJlZCBoZXJlXG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9nZXREaWZmUGl4ZWwuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = euclideanDistance;\n/**\n * Compute a score that represents the difference between 2 pixels\n *\n * This method simply takes the Euclidean distance between the RGBA channels\n * of 2 colors over the maximum possible Euclidean distance. This gives us a\n * percentage of how different the two colors are.\n *\n * Although it would be more perceptually accurate to calculate a proper\n * Delta E in Lab colorspace, we probably don't need perceptual accuracy for\n * this application, and it is nice to avoid the overhead of converting RGBA\n * to Lab.\n *\n * Returns a float number between 0 and 1 where 1 is completely different\n * and 0 is no difference\n */\nfunction euclideanDistance(rgba1, rgba2) {\n var distance = (rgba1[0] - rgba2[0]) * (rgba1[0] - rgba2[0]) + (rgba1[1] - rgba2[1]) * (rgba1[1] - rgba2[1]) + (rgba1[2] - rgba2[2]) * (rgba1[2] - rgba2[2]) + (rgba1[3] - rgba2[3]) * (rgba1[3] - rgba2[3]);\n\n return Math.sqrt(distance) / 4 / 255;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJkaXN0YW5jZSIsIk1hdGgiLCJzcXJ0Il0sIm1hcHBpbmdzIjoiOzs7OztrQkFld0JBLGlCO0FBZnhCOzs7Ozs7Ozs7Ozs7Ozs7QUFlZSxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELE1BQU1DLFdBQVksQ0FBQ0YsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFaLEtBQXlCRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBDLENBQUQsR0FDQyxDQUFDRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQVosS0FBeUJELE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBcEMsQ0FERCxHQUVDLENBQUNELE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBWixLQUF5QkQsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQyxDQUZELEdBR0MsQ0FBQ0QsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFaLEtBQXlCRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBDLENBSGxCOztBQUtBLFNBQVFFLEtBQUtDLElBQUwsQ0FBVUYsUUFBVixJQUFzQixDQUF2QixHQUE0QixHQUFuQztBQUNEIiwiZmlsZSI6IjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXB1dGUgYSBzY29yZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAyIHBpeGVsc1xuICpcbiAqIFRoaXMgbWV0aG9kIHNpbXBseSB0YWtlcyB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdGhlIFJHQkEgY2hhbm5lbHNcbiAqIG9mIDIgY29sb3JzIG92ZXIgdGhlIG1heGltdW0gcG9zc2libGUgRXVjbGlkZWFuIGRpc3RhbmNlLiBUaGlzIGdpdmVzIHVzIGFcbiAqIHBlcmNlbnRhZ2Ugb2YgaG93IGRpZmZlcmVudCB0aGUgdHdvIGNvbG9ycyBhcmUuXG4gKlxuICogQWx0aG91Z2ggaXQgd291bGQgYmUgbW9yZSBwZXJjZXB0dWFsbHkgYWNjdXJhdGUgdG8gY2FsY3VsYXRlIGEgcHJvcGVyXG4gKiBEZWx0YSBFIGluIExhYiBjb2xvcnNwYWNlLCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHBlcmNlcHR1YWwgYWNjdXJhY3kgZm9yXG4gKiB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgaXQgaXMgbmljZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY29udmVydGluZyBSR0JBXG4gKiB0byBMYWIuXG4gKlxuICogUmV0dXJucyBhIGZsb2F0IG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgd2hlcmUgMSBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudFxuICogYW5kIDAgaXMgbm8gZGlmZmVyZW5jZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgY29uc3QgZGlzdGFuY2UgPSAoKHJnYmExWzBdIC0gcmdiYTJbMF0pICogKHJnYmExWzBdIC0gcmdiYTJbMF0pKVxuICAgICAgICAgICAgICAgICArICgocmdiYTFbMV0gLSByZ2JhMlsxXSkgKiAocmdiYTFbMV0gLSByZ2JhMlsxXSkpXG4gICAgICAgICAgICAgICAgICsgKChyZ2JhMVsyXSAtIHJnYmEyWzJdKSAqIChyZ2JhMVsyXSAtIHJnYmEyWzJdKSlcbiAgICAgICAgICAgICAgICAgKyAoKHJnYmExWzNdIC0gcmdiYTJbM10pICogKHJnYmExWzNdIC0gcmdiYTJbM10pKTtcblxuICByZXR1cm4gKE1hdGguc3FydChkaXN0YW5jZSkgLyA0KSAvIDI1NTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2V1Y2xpZGVhbkRpc3RhbmNlLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
60
+
61
+ /***/ }
62
+ /******/ ]);
@@ -0,0 +1,62 @@
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 _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nvar _flattenImageData = __webpack_require__(2);\n\nvar _flattenImageData2 = _interopRequireDefault(_flattenImageData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Construct a line of pixels of a certain rgba color\n *\n * @param {Array} rgba\n * @param {Number} width\n * @return {Array}\n */\nfunction constructColoredLine(rgba, width) {\n var line = [];\n for (var i = 0; i < width; i++) {\n line.push(rgba);\n }\n return line;\n}\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 var getPixelAt = function getPixelAt(x, y) {\n var startIndex = y * rowSize + x * 4;\n return [data[startIndex], data[startIndex + 1], data[startIndex + 2], data[startIndex + 3]];\n };\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = [];\n for (var col = 0; col < width; col++) {\n pixelsInRow.push(getPixelAt(col, row));\n }\n for (var pad = 0; pad < paddingRight; pad++) {\n pixelsInRow.push([0, 0, 0, 0]);\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction getAdiffResults(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.currentData;\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n\n if (previousData.width !== currentData.width) {\n // we know that all rows will be different here, so we can take a shortcut\n var diff = [0, // diff starts at index 0\n previousData.height];\n diff.length = currentData.height + 2; // number of additions\n }\n return _adiff2.default.diff(previousImageData.map(function (d) {\n return btoa(d);\n }), currentImageData.map(function (d) {\n return btoa(d);\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 redLine = constructColoredLine([255, 0, 0, 255], maxWidth);\n var greenLine = constructColoredLine([0, 255, 0, 255], maxWidth);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n var adiffResults = getAdiffResults({\n previousData: previousData,\n currentData: currentData,\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n // iterate and apply changes to previous data\n adiffResults.forEach(function (instruction) {\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < deletedItems) {\n // ignore, we just keep the old line\n } else {\n // add a green line to signal an addition\n previousImageData.splice(atIndex + y, 0, greenLine);\n }\n }\n });\n\n // iterate backwards and apply changes to current data\n for (var i = adiffResults.length - 1; i >= 0; i--) {\n var instruction = adiffResults[i];\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < addedItems) {\n // ignore, we just keep the old line\n } else {\n // add a red line to signal a deletion\n currentImageData.splice(atIndex + y, 0, redLine);\n }\n }\n }\n\n return {\n currentData: {\n data: (0, _flattenImageData2.default)(currentImageData),\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: (0, _flattenImageData2.default)(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/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiZ2V0QWRpZmZSZXN1bHRzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJkaWZmIiwibGVuZ3RoIiwibWFwIiwiYnRvYSIsImQiLCJjb21wdXRlQW5kSW5qZWN0RGlmZnMiLCJtYXhXaWR0aCIsIk1hdGgiLCJtYXgiLCJyZWRMaW5lIiwiZ3JlZW5MaW5lIiwiYWRpZmZSZXN1bHRzIiwiZm9yRWFjaCIsImluc3RydWN0aW9uIiwiYXRJbmRleCIsImRlbGV0ZWRJdGVtcyIsImFkZGVkSXRlbXMiLCJzcGxpY2UiLCJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc3VsdCIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFFQTs7Ozs7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTQSxvQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0NDLEtBQXBDLEVBQTJDO0FBQ3pDLE1BQU1DLE9BQU8sRUFBYjtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixLQUFwQixFQUEyQkUsR0FBM0IsRUFBZ0M7QUFDOUJELFNBQUtFLElBQUwsQ0FBVUosSUFBVjtBQUNEO0FBQ0QsU0FBT0UsSUFBUDtBQUNEOztBQUVELFNBQVNHLGNBQVQsT0FBaURDLFlBQWpELEVBQStEO0FBQUEsTUFB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Q3FCLE9BQXhDO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFNBQU87QUFDTFosaUJBQWE7QUFDWGQsWUFBTSxnQ0FBaUJnQixnQkFBakIsQ0FESztBQUVYZixjQUFRZSxpQkFBaUJFLE1BRmQ7QUFHWHhCLGFBQU82QjtBQUhJLEtBRFI7QUFNTFYsa0JBQWM7QUFDWmIsWUFBTSxnQ0FBaUJlLGlCQUFqQixDQURNO0FBRVpkLGNBQVFjLGtCQUFrQkcsTUFGZDtBQUdaeEIsYUFBTzZCO0FBSEs7QUFOVCxHQUFQO0FBWUQ7O0FBRURZLEtBQUtDLGdCQUFMLENBQXNCLFNBQXRCLEVBQWlDLGlCQUE2QztBQUFBLHlCQUExQ3BDLElBQTBDO0FBQUEsTUFBbENhLFlBQWtDLGNBQWxDQSxZQUFrQztBQUFBLE1BQXBCQyxXQUFvQixjQUFwQkEsV0FBb0I7O0FBQzVFLE1BQU11QixTQUFTZixzQkFBc0IsRUFBRVQsMEJBQUYsRUFBZ0JDLHdCQUFoQixFQUF0QixDQUFmO0FBQ0FxQixPQUFLRyxXQUFMLENBQWlCRCxNQUFqQjtBQUNBRixPQUFLSSxLQUFMO0FBQ0QsQ0FKRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFkaWZmIGZyb20gJ2FkaWZmJztcblxuaW1wb3J0IGZsYXR0ZW5JbWFnZURhdGEgZnJvbSAnLi4vZmxhdHRlbkltYWdlRGF0YSc7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgbGluZSBvZiBwaXhlbHMgb2YgYSBjZXJ0YWluIHJnYmEgY29sb3JcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSByZ2JhXG4gKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RDb2xvcmVkTGluZShyZ2JhLCB3aWR0aCkge1xuICBjb25zdCBsaW5lID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgIGxpbmUucHVzaChyZ2JhKTtcbiAgfVxuICByZXR1cm4gbGluZTtcbn1cblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG4gIGNvbnN0IGdldFBpeGVsQXQgPSAoeCwgeSkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAoeSAqIHJvd1NpemUpICsgKHggKiA0KTtcbiAgICByZXR1cm4gW1xuICAgICAgZGF0YVtzdGFydEluZGV4XSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDFdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgMl0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAzXSxcbiAgICBdO1xuICB9O1xuXG4gIGNvbnN0IG5ld0RhdGEgPSBbXTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHBpeGVsc0luUm93ID0gW107XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7XG4gICAgICBwaXhlbHNJblJvdy5wdXNoKGdldFBpeGVsQXQoY29sLCByb3cpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgcGFkID0gMDsgcGFkIDwgcGFkZGluZ1JpZ2h0OyBwYWQrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChbMCwgMCwgMCwgMF0pO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBnZXRBZGlmZlJlc3VsdHMoe1xuICBwcmV2aW91c0RhdGEsXG4gIGN1cnJlbnREYXRhLFxuICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgY3VycmVudEltYWdlRGF0YSxcbn0pIHtcbiAgaWYgKHByZXZpb3VzRGF0YS53aWR0aCAhPT0gY3VycmVudERhdGEud2lkdGgpIHtcbiAgICAvLyB3ZSBrbm93IHRoYXQgYWxsIHJvd3Mgd2lsbCBiZSBkaWZmZXJlbnQgaGVyZSwgc28gd2UgY2FuIHRha2UgYSBzaG9ydGN1dFxuICAgIGNvbnN0IGRpZmYgPSBbXG4gICAgICAwLCAvLyBkaWZmIHN0YXJ0cyBhdCBpbmRleCAwXG4gICAgICBwcmV2aW91c0RhdGEuaGVpZ2h0LCAvLyBudW1iZXIgb2YgZGVsZXRpb25zXG4gICAgXTtcbiAgICBkaWZmLmxlbmd0aCA9IGN1cnJlbnREYXRhLmhlaWdodCArIDI7IC8vIG51bWJlciBvZiBhZGRpdGlvbnNcbiAgfVxuICByZXR1cm4gYWRpZmYuZGlmZihcbiAgICBwcmV2aW91c0ltYWdlRGF0YS5tYXAoZCA9PiBidG9hKGQpKSxcbiAgICBjdXJyZW50SW1hZ2VEYXRhLm1hcChkID0+IGJ0b2EoZCkpXG4gICk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCByZWRMaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzI1NSwgMCwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuICBjb25zdCBncmVlbkxpbmUgPSBjb25zdHJ1Y3RDb2xvcmVkTGluZShbMCwgMjU1LCAwLCAyNTVdLCBtYXhXaWR0aCk7XG5cbiAgY29uc3QgcHJldmlvdXNJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBwcmV2aW91c0RhdGEsIG1heFdpZHRoIC0gcHJldmlvdXNEYXRhLndpZHRoKTtcblxuICBjb25zdCBjdXJyZW50SW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgY3VycmVudERhdGEsIG1heFdpZHRoIC0gY3VycmVudERhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGFkaWZmUmVzdWx0cyA9IGdldEFkaWZmUmVzdWx0cyh7XG4gICAgcHJldmlvdXNEYXRhLFxuICAgIGN1cnJlbnREYXRhLFxuICAgIHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgIGN1cnJlbnRJbWFnZURhdGEsXG4gIH0pO1xuXG4gIC8vIGl0ZXJhdGUgYW5kIGFwcGx5IGNoYW5nZXMgdG8gcHJldmlvdXMgZGF0YVxuICBhZGlmZlJlc3VsdHMuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICBjb25zdCBhdEluZGV4ID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb25bMV07XG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IGluc3RydWN0aW9uLmxlbmd0aCAtIDI7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IE1hdGgubWF4KGRlbGV0ZWRJdGVtcywgYWRkZWRJdGVtcyk7IHkrKykge1xuICAgICAgaWYgKHkgPCBkZWxldGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgYSBncmVlbiBsaW5lIHRvIHNpZ25hbCBhbiBhZGRpdGlvblxuICAgICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIGdyZWVuTGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBpdGVyYXRlIGJhY2t3YXJkcyBhbmQgYXBwbHkgY2hhbmdlcyB0byBjdXJyZW50IGRhdGFcbiAgZm9yIChsZXQgaSA9IGFkaWZmUmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gYWRpZmZSZXN1bHRzW2ldO1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGFkZGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgYSByZWQgbGluZSB0byBzaWduYWwgYSBkZWxldGlvblxuICAgICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShhdEluZGV4ICsgeSwgMCwgcmVkTGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50RGF0YToge1xuICAgICAgZGF0YTogZmxhdHRlbkltYWdlRGF0YShjdXJyZW50SW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogY3VycmVudEltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgICBwcmV2aW91c0RhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEocHJldmlvdXNJbWFnZURhdGEpLFxuICAgICAgaGVpZ2h0OiBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgfTtcbn1cblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YTogeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0gfSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBzZWxmLnBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("function head (a) {\n return a[0]\n}\n\nfunction last (a) {\n return a[a.length - 1]\n}\n\nfunction tail(a) {\n return a.slice(1)\n}\n\nfunction retreat (e) {\n return e.pop()\n}\n\nfunction hasLength (e) {\n return e.length\n}\n\nfunction any(ary, test) {\n for(var i=0;i<ary.length;i++)\n if(test(ary[i]))\n return true\n return false\n}\n\nfunction score (a) {\n return a.reduce(function (s, a) {\n return s + a.length + a[1] + 1\n }, 0)\n}\n\nfunction best (a, b) {\n return score(a) <= score(b) ? a : b\n}\n\n\nvar _rules // set at the bottom \n\n// note, naive implementation. will break on circular objects.\n\nfunction _equal(a, b) {\n if(a && !b) return false\n if(Array.isArray(a))\n if(a.length != b.length) return false\n if(a && 'object' == typeof a) {\n for(var i in a)\n if(!_equal(a[i], b[i])) return false\n for(var i in b)\n if(!_equal(a[i], b[i])) return false\n return true\n }\n return a == b\n}\n\nfunction getArgs(args) {\n return args.length == 1 ? args[0] : [].slice.call(args)\n}\n\n// return the index of the element not like the others, or -1\nfunction oddElement(ary, cmp) {\n var c\n function guess(a) {\n var odd = -1\n c = 0\n for (var i = a; i < ary.length; i ++) {\n if(!cmp(ary[a], ary[i])) {\n odd = i, c++\n }\n }\n return c > 1 ? -1 : odd\n }\n //assume that it is the first element.\n var g = guess(0)\n if(-1 != g) return g\n //0 was the odd one, then all the other elements are equal\n //else there more than one different element\n guess(1)\n return c == 0 ? 0 : -1\n}\nvar exports = module.exports = function (deps, exports) {\n var equal = (deps && deps.equal) || _equal\n exports = exports || {} \n exports.lcs = \n function lcs() {\n var cache = {}\n var args = getArgs(arguments)\n var a = args[0], b = args[1]\n\n function key (a,b){\n return a.length + ':' + b.length\n }\n\n //find length that matches at the head\n\n if(args.length > 2) {\n //if called with multiple sequences\n //recurse, since lcs(a, b, c, d) == lcs(lcs(a,b), lcs(c,d))\n args.push(lcs(args.shift(), args.shift()))\n return lcs(args)\n }\n \n //this would be improved by truncating input first\n //and not returning an lcs as an intermediate step.\n //untill that is a performance problem.\n\n var start = 0, end = 0\n for(var i = 0; i < a.length && i < b.length \n && equal(a[i], b[i])\n ; i ++\n )\n start = i + 1\n\n if(a.length === start)\n return a.slice()\n\n for(var i = 0; i < a.length - start && i < b.length - start\n && equal(a[a.length - 1 - i], b[b.length - 1 - i])\n ; i ++\n )\n end = i\n\n function recurse (a, b) {\n if(!a.length || !b.length) return []\n //avoid exponential time by caching the results\n if(cache[key(a, b)]) return cache[key(a, b)]\n\n if(equal(a[0], b[0]))\n return [head(a)].concat(recurse(tail(a), tail(b)))\n else { \n var _a = recurse(tail(a), b)\n var _b = recurse(a, tail(b))\n return cache[key(a,b)] = _a.length > _b.length ? _a : _b \n }\n }\n \n var middleA = a.slice(start, a.length - end)\n var middleB = b.slice(start, b.length - end)\n\n return (\n a.slice(0, start).concat(\n recurse(middleA, middleB)\n ).concat(a.slice(a.length - end))\n )\n }\n\n // given n sequences, calc the lcs, and then chunk strings into stable and unstable sections.\n // unstable chunks are passed to build\n exports.chunk =\n function (q, build) {\n var q = q.map(function (e) { return e.slice() })\n var lcs = exports.lcs.apply(null, q)\n var all = [lcs].concat(q)\n\n function matchLcs (e) {\n if(e.length && !lcs.length || !e.length && lcs.length)\n return false //incase the last item is null\n return equal(last(e), last(lcs)) || ((e.length + lcs.length) === 0)\n }\n\n while(any(q, hasLength)) {\n //if each element is at the lcs then this chunk is stable.\n while(q.every(matchLcs) && q.every(hasLength))\n all.forEach(retreat)\n //collect the changes in each array upto the next match with the lcs\n var c = false\n var unstable = q.map(function (e) {\n var change = []\n while(!matchLcs(e)) {\n change.unshift(retreat(e))\n c = true\n }\n return change\n })\n if(c) build(q[0].length, unstable)\n }\n }\n\n //calculate a diff this is only updates\n exports.optimisticDiff =\n function (a, b) {\n var M = Math.max(a.length, b.length)\n var m = Math.min(a.length, b.length)\n var patch = []\n for(var i = 0; i < M; i++)\n if(a[i] !== b[i]) {\n var cur = [i,0], deletes = 0\n while(a[i] !== b[i] && i < m) {\n cur[1] = ++deletes\n cur.push(b[i++])\n }\n //the rest are deletes or inserts\n if(i >= m) {\n //the rest are deletes\n if(a.length > b.length)\n cur[1] += a.length - b.length\n //the rest are inserts\n else if(a.length < b.length)\n cur = cur.concat(b.slice(a.length))\n }\n patch.push(cur)\n }\n\n return patch\n }\n\n exports.diff =\n function (a, b) {\n var optimistic = exports.optimisticDiff(a, b)\n var changes = []\n exports.chunk([a, b], function (index, unstable) {\n var del = unstable.shift().length\n var insert = unstable.shift()\n changes.push([index, del].concat(insert))\n })\n return best(optimistic, changes)\n }\n\n exports.patch = function (a, changes, mutate) {\n if(mutate !== true) a = a.slice(a)//copy a\n changes.forEach(function (change) {\n [].splice.apply(a, change)\n })\n return a\n }\n\n // http://en.wikipedia.org/wiki/Concestor\n // me, concestor, you...\n exports.merge = function () {\n var args = getArgs(arguments)\n var patch = exports.diff3(args)\n return exports.patch(args[0], patch)\n }\n\n exports.diff3 = function () {\n var args = getArgs(arguments)\n var r = []\n exports.chunk(args, function (index, unstable) {\n var mine = unstable[0]\n var insert = resolve(unstable)\n if(equal(mine, insert)) return \n r.push([index, mine.length].concat(insert)) \n })\n return r\n }\n exports.oddOneOut =\n function oddOneOut (changes) {\n changes = changes.slice()\n //put the concestor first\n changes.unshift(changes.splice(1,1)[0])\n var i = oddElement(changes, equal)\n if(i == 0) // concestor was different, 'false conflict'\n return changes[1]\n if (~i)\n return changes[i] \n }\n exports.insertMergeOverDelete = \n //i've implemented this as a seperate rule,\n //because I had second thoughts about this.\n function insertMergeOverDelete (changes) {\n changes = changes.slice()\n changes.splice(1,1)// remove concestor\n \n //if there is only one non empty change thats okay.\n //else full confilct\n for (var i = 0, nonempty; i < changes.length; i++)\n if(changes[i].length) \n if(!nonempty) nonempty = changes[i]\n else return // full conflict\n return nonempty\n }\n\n var rules = (deps && deps.rules) || [exports.oddOneOut, exports.insertMergeOverDelete]\n\n function resolve (changes) {\n var l = rules.length\n for (var i in rules) { // first\n \n var c = rules[i] && rules[i](changes)\n if(c) return c\n }\n changes.splice(1,1) // remove concestor\n //returning the conflicts as an object is a really bad idea,\n // because == will not detect they are the same. and conflicts build.\n // better to use\n // '<<<<<<<<<<<<<'\n // of course, i wrote this before i started on snob, so i didn't know that then.\n /*var conflict = ['>>>>>>>>>>>>>>>>']\n while(changes.length)\n conflict = conflict.concat(changes.shift()).concat('============')\n conflict.pop()\n conflict.push ('<<<<<<<<<<<<<<<')\n changes.unshift ('>>>>>>>>>>>>>>>')\n return conflict*/\n //nah, better is just to use an equal can handle objects\n return {'?': changes}\n }\n return exports\n}\nexports(null, exports)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2FkaWZmL2luZGV4LmpzPzA0ZDYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0Isb0JBQW9CO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaGVhZCAoYSkge1xuICByZXR1cm4gYVswXVxufVxuXG5mdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhW2EubGVuZ3RoIC0gMV1cbn1cblxuZnVuY3Rpb24gdGFpbChhKSB7XG4gIHJldHVybiBhLnNsaWNlKDEpXG59XG5cbmZ1bmN0aW9uIHJldHJlYXQgKGUpIHtcbiAgcmV0dXJuIGUucG9wKClcbn1cblxuZnVuY3Rpb24gaGFzTGVuZ3RoIChlKSB7XG4gIHJldHVybiBlLmxlbmd0aFxufVxuXG5mdW5jdGlvbiBhbnkoYXJ5LCB0ZXN0KSB7XG4gIGZvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspXG4gICAgaWYodGVzdChhcnlbaV0pKVxuICAgICAgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHNjb3JlIChhKSB7XG4gIHJldHVybiBhLnJlZHVjZShmdW5jdGlvbiAocywgYSkge1xuICAgICAgcmV0dXJuIHMgKyBhLmxlbmd0aCArIGFbMV0gKyAxXG4gIH0sIDApXG59XG5cbmZ1bmN0aW9uIGJlc3QgKGEsIGIpIHtcbiAgcmV0dXJuIHNjb3JlKGEpIDw9IHNjb3JlKGIpID8gYSA6IGJcbn1cblxuXG52YXIgX3J1bGVzIC8vIHNldCBhdCB0aGUgYm90dG9tICBcblxuLy8gbm90ZSwgbmFpdmUgaW1wbGVtZW50YXRpb24uIHdpbGwgYnJlYWsgb24gY2lyY3VsYXIgb2JqZWN0cy5cblxuZnVuY3Rpb24gX2VxdWFsKGEsIGIpIHtcbiAgaWYoYSAmJiAhYikgcmV0dXJuIGZhbHNlXG4gIGlmKEFycmF5LmlzQXJyYXkoYSkpXG4gICAgaWYoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBpZihhICYmICdvYmplY3QnID09IHR5cGVvZiBhKSB7XG4gICAgZm9yKHZhciBpIGluIGEpXG4gICAgICBpZighX2VxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2VcbiAgICBmb3IodmFyIGkgaW4gYilcbiAgICAgIGlmKCFfZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGEgPT0gYlxufVxuXG5mdW5jdGlvbiBnZXRBcmdzKGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID09IDEgPyBhcmdzWzBdIDogW10uc2xpY2UuY2FsbChhcmdzKVxufVxuXG4vLyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IG5vdCBsaWtlIHRoZSBvdGhlcnMsIG9yIC0xXG5mdW5jdGlvbiBvZGRFbGVtZW50KGFyeSwgY21wKSB7XG4gIHZhciBjXG4gIGZ1bmN0aW9uIGd1ZXNzKGEpIHtcbiAgICB2YXIgb2RkID0gLTFcbiAgICBjID0gMFxuICAgIGZvciAodmFyIGkgPSBhOyBpIDwgYXJ5Lmxlbmd0aDsgaSArKykge1xuICAgICAgaWYoIWNtcChhcnlbYV0sIGFyeVtpXSkpIHtcbiAgICAgICAgb2RkID0gaSwgYysrXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjID4gMSA/IC0xIDogb2RkXG4gIH1cbiAgLy9hc3N1bWUgdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudC5cbiAgdmFyIGcgPSBndWVzcygwKVxuICBpZigtMSAhPSBnKSByZXR1cm4gZ1xuICAvLzAgd2FzIHRoZSBvZGQgb25lLCB0aGVuIGFsbCB0aGUgb3RoZXIgZWxlbWVudHMgYXJlIGVxdWFsXG4gIC8vZWxzZSB0aGVyZSBtb3JlIHRoYW4gb25lIGRpZmZlcmVudCBlbGVtZW50XG4gIGd1ZXNzKDEpXG4gIHJldHVybiBjID09IDAgPyAwIDogLTFcbn1cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVwcywgZXhwb3J0cykge1xuICB2YXIgZXF1YWwgPSAoZGVwcyAmJiBkZXBzLmVxdWFsKSB8fCBfZXF1YWxcbiAgZXhwb3J0cyA9IGV4cG9ydHMgfHwge30gXG4gIGV4cG9ydHMubGNzID0gXG4gIGZ1bmN0aW9uIGxjcygpIHtcbiAgICB2YXIgY2FjaGUgPSB7fVxuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIGEgPSBhcmdzWzBdLCBiID0gYXJnc1sxXVxuXG4gICAgZnVuY3Rpb24ga2V5IChhLGIpe1xuICAgICAgcmV0dXJuIGEubGVuZ3RoICsgJzonICsgYi5sZW5ndGhcbiAgICB9XG5cbiAgICAvL2ZpbmQgbGVuZ3RoIHRoYXQgbWF0Y2hlcyBhdCB0aGUgaGVhZFxuXG4gICAgaWYoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAvL2lmIGNhbGxlZCB3aXRoIG11bHRpcGxlIHNlcXVlbmNlc1xuICAgICAgLy9yZWN1cnNlLCBzaW5jZSBsY3MoYSwgYiwgYywgZCkgPT0gbGNzKGxjcyhhLGIpLCBsY3MoYyxkKSlcbiAgICAgIGFyZ3MucHVzaChsY3MoYXJncy5zaGlmdCgpLCBhcmdzLnNoaWZ0KCkpKVxuICAgICAgcmV0dXJuIGxjcyhhcmdzKVxuICAgIH1cbiAgICBcbiAgICAvL3RoaXMgd291bGQgYmUgaW1wcm92ZWQgYnkgdHJ1bmNhdGluZyBpbnB1dCBmaXJzdFxuICAgIC8vYW5kIG5vdCByZXR1cm5pbmcgYW4gbGNzIGFzIGFuIGludGVybWVkaWF0ZSBzdGVwLlxuICAgIC8vdW50aWxsIHRoYXQgaXMgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLlxuXG4gICAgdmFyIHN0YXJ0ID0gMCwgZW5kID0gMFxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aCAmJiBpIDwgYi5sZW5ndGggXG4gICAgICAmJiBlcXVhbChhW2ldLCBiW2ldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgc3RhcnQgPSBpICsgMVxuXG4gICAgaWYoYS5sZW5ndGggPT09IHN0YXJ0KVxuICAgICAgcmV0dXJuIGEuc2xpY2UoKVxuXG4gICAgZm9yKHZhciBpID0gMDsgIGkgPCBhLmxlbmd0aCAtIHN0YXJ0ICYmIGkgPCBiLmxlbmd0aCAtIHN0YXJ0XG4gICAgICAmJiBlcXVhbChhW2EubGVuZ3RoIC0gMSAtIGldLCBiW2IubGVuZ3RoIC0gMSAtIGldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgZW5kID0gaVxuXG4gICAgZnVuY3Rpb24gcmVjdXJzZSAoYSwgYikge1xuICAgICAgaWYoIWEubGVuZ3RoIHx8ICFiLmxlbmd0aCkgcmV0dXJuIFtdXG4gICAgICAvL2F2b2lkIGV4cG9uZW50aWFsIHRpbWUgYnkgY2FjaGluZyB0aGUgcmVzdWx0c1xuICAgICAgaWYoY2FjaGVba2V5KGEsIGIpXSkgcmV0dXJuIGNhY2hlW2tleShhLCBiKV1cblxuICAgICAgaWYoZXF1YWwoYVswXSwgYlswXSkpXG4gICAgICAgIHJldHVybiBbaGVhZChhKV0uY29uY2F0KHJlY3Vyc2UodGFpbChhKSwgdGFpbChiKSkpXG4gICAgICBlbHNlIHsgXG4gICAgICAgIHZhciBfYSA9IHJlY3Vyc2UodGFpbChhKSwgYilcbiAgICAgICAgdmFyIF9iID0gcmVjdXJzZShhLCB0YWlsKGIpKVxuICAgICAgICByZXR1cm4gY2FjaGVba2V5KGEsYildID0gX2EubGVuZ3RoID4gX2IubGVuZ3RoID8gX2EgOiBfYiAgXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhciBtaWRkbGVBID0gYS5zbGljZShzdGFydCwgYS5sZW5ndGggLSBlbmQpXG4gICAgdmFyIG1pZGRsZUIgPSBiLnNsaWNlKHN0YXJ0LCBiLmxlbmd0aCAtIGVuZClcblxuICAgIHJldHVybiAoXG4gICAgICBhLnNsaWNlKDAsIHN0YXJ0KS5jb25jYXQoXG4gICAgICAgIHJlY3Vyc2UobWlkZGxlQSwgbWlkZGxlQilcbiAgICAgICkuY29uY2F0KGEuc2xpY2UoYS5sZW5ndGggLSBlbmQpKVxuICAgIClcbiAgfVxuXG4gIC8vIGdpdmVuIG4gc2VxdWVuY2VzLCBjYWxjIHRoZSBsY3MsIGFuZCB0aGVuIGNodW5rIHN0cmluZ3MgaW50byBzdGFibGUgYW5kIHVuc3RhYmxlIHNlY3Rpb25zLlxuICAvLyB1bnN0YWJsZSBjaHVua3MgYXJlIHBhc3NlZCB0byBidWlsZFxuICBleHBvcnRzLmNodW5rID1cbiAgZnVuY3Rpb24gKHEsIGJ1aWxkKSB7XG4gICAgdmFyIHEgPSBxLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5zbGljZSgpIH0pXG4gICAgdmFyIGxjcyA9IGV4cG9ydHMubGNzLmFwcGx5KG51bGwsIHEpXG4gICAgdmFyIGFsbCA9IFtsY3NdLmNvbmNhdChxKVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hMY3MgKGUpIHtcbiAgICAgIGlmKGUubGVuZ3RoICYmICFsY3MubGVuZ3RoIHx8ICFlLmxlbmd0aCAmJiBsY3MubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2UgLy9pbmNhc2UgdGhlIGxhc3QgaXRlbSBpcyBudWxsXG4gICAgICByZXR1cm4gZXF1YWwobGFzdChlKSwgbGFzdChsY3MpKSB8fCAoKGUubGVuZ3RoICsgbGNzLmxlbmd0aCkgPT09IDApXG4gICAgfVxuXG4gICAgd2hpbGUoYW55KHEsIGhhc0xlbmd0aCkpIHtcbiAgICAgIC8vaWYgZWFjaCBlbGVtZW50IGlzIGF0IHRoZSBsY3MgdGhlbiB0aGlzIGNodW5rIGlzIHN0YWJsZS5cbiAgICAgIHdoaWxlKHEuZXZlcnkobWF0Y2hMY3MpICYmIHEuZXZlcnkoaGFzTGVuZ3RoKSlcbiAgICAgICAgYWxsLmZvckVhY2gocmV0cmVhdClcbiAgICAgIC8vY29sbGVjdCB0aGUgY2hhbmdlcyBpbiBlYWNoIGFycmF5IHVwdG8gdGhlIG5leHQgbWF0Y2ggd2l0aCB0aGUgbGNzXG4gICAgICB2YXIgYyA9IGZhbHNlXG4gICAgICB2YXIgdW5zdGFibGUgPSBxLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY2hhbmdlID0gW11cbiAgICAgICAgd2hpbGUoIW1hdGNoTGNzKGUpKSB7XG4gICAgICAgICAgY2hhbmdlLnVuc2hpZnQocmV0cmVhdChlKSlcbiAgICAgICAgICBjID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgIH0pXG4gICAgICBpZihjKSBidWlsZChxWzBdLmxlbmd0aCwgdW5zdGFibGUpXG4gICAgfVxuICB9XG5cbiAgLy9jYWxjdWxhdGUgYSBkaWZmIHRoaXMgaXMgb25seSB1cGRhdGVzXG4gIGV4cG9ydHMub3B0aW1pc3RpY0RpZmYgPVxuICBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBNID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBtID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBwYXRjaCA9IFtdXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IE07IGkrKylcbiAgICAgIGlmKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgdmFyIGN1ciA9IFtpLDBdLCBkZWxldGVzID0gMFxuICAgICAgICB3aGlsZShhW2ldICE9PSBiW2ldICYmIGkgPCBtKSB7XG4gICAgICAgICAgY3VyWzFdID0gKytkZWxldGVzXG4gICAgICAgICAgY3VyLnB1c2goYltpKytdKVxuICAgICAgICB9XG4gICAgICAgIC8vdGhlIHJlc3QgYXJlIGRlbGV0ZXMgb3IgaW5zZXJ0c1xuICAgICAgICBpZihpID49IG0pIHtcbiAgICAgICAgICAvL3RoZSByZXN0IGFyZSBkZWxldGVzXG4gICAgICAgICAgaWYoYS5sZW5ndGggPiBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1clsxXSArPSBhLmxlbmd0aCAtIGIubGVuZ3RoXG4gICAgICAgICAgLy90aGUgcmVzdCBhcmUgaW5zZXJ0c1xuICAgICAgICAgIGVsc2UgaWYoYS5sZW5ndGggPCBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1ciA9IGN1ci5jb25jYXQoYi5zbGljZShhLmxlbmd0aCkpXG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2gucHVzaChjdXIpXG4gICAgICB9XG5cbiAgICByZXR1cm4gcGF0Y2hcbiAgfVxuXG4gIGV4cG9ydHMuZGlmZiA9XG4gIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIG9wdGltaXN0aWMgPSBleHBvcnRzLm9wdGltaXN0aWNEaWZmKGEsIGIpXG4gICAgdmFyIGNoYW5nZXMgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoW2EsIGJdLCBmdW5jdGlvbiAoaW5kZXgsIHVuc3RhYmxlKSB7XG4gICAgICB2YXIgZGVsID0gdW5zdGFibGUuc2hpZnQoKS5sZW5ndGhcbiAgICAgIHZhciBpbnNlcnQgPSB1bnN0YWJsZS5zaGlmdCgpXG4gICAgICBjaGFuZ2VzLnB1c2goW2luZGV4LCBkZWxdLmNvbmNhdChpbnNlcnQpKVxuICAgIH0pXG4gICAgcmV0dXJuIGJlc3Qob3B0aW1pc3RpYywgY2hhbmdlcylcbiAgfVxuXG4gIGV4cG9ydHMucGF0Y2ggPSBmdW5jdGlvbiAoYSwgY2hhbmdlcywgbXV0YXRlKSB7XG4gICAgaWYobXV0YXRlICE9PSB0cnVlKSBhID0gYS5zbGljZShhKS8vY29weSBhXG4gICAgY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2UpIHtcbiAgICAgIFtdLnNwbGljZS5hcHBseShhLCBjaGFuZ2UpXG4gICAgfSlcbiAgICByZXR1cm4gYVxuICB9XG5cbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db25jZXN0b3JcbiAgLy8gbWUsIGNvbmNlc3RvciwgeW91Li4uXG4gIGV4cG9ydHMubWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBnZXRBcmdzKGFyZ3VtZW50cylcbiAgICB2YXIgcGF0Y2ggPSBleHBvcnRzLmRpZmYzKGFyZ3MpXG4gICAgcmV0dXJuIGV4cG9ydHMucGF0Y2goYXJnc1swXSwgcGF0Y2gpXG4gIH1cblxuICBleHBvcnRzLmRpZmYzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIHIgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoYXJncywgZnVuY3Rpb24gKGluZGV4LCB1bnN0YWJsZSkge1xuICAgICAgdmFyIG1pbmUgPSB1bnN0YWJsZVswXVxuICAgICAgdmFyIGluc2VydCA9IHJlc29sdmUodW5zdGFibGUpXG4gICAgICBpZihlcXVhbChtaW5lLCBpbnNlcnQpKSByZXR1cm4gXG4gICAgICByLnB1c2goW2luZGV4LCBtaW5lLmxlbmd0aF0uY29uY2F0KGluc2VydCkpIFxuICAgIH0pXG4gICAgcmV0dXJuIHJcbiAgfVxuICBleHBvcnRzLm9kZE9uZU91dCA9XG4gICAgZnVuY3Rpb24gb2RkT25lT3V0IChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICAvL3B1dCB0aGUgY29uY2VzdG9yIGZpcnN0XG4gICAgICBjaGFuZ2VzLnVuc2hpZnQoY2hhbmdlcy5zcGxpY2UoMSwxKVswXSlcbiAgICAgIHZhciBpID0gb2RkRWxlbWVudChjaGFuZ2VzLCBlcXVhbClcbiAgICAgIGlmKGkgPT0gMCkgLy8gY29uY2VzdG9yIHdhcyBkaWZmZXJlbnQsICdmYWxzZSBjb25mbGljdCdcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbMV1cbiAgICAgIGlmICh+aSlcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbaV0gXG4gICAgfVxuICBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZSA9IFxuICAgIC8vaSd2ZSBpbXBsZW1lbnRlZCB0aGlzIGFzIGEgc2VwZXJhdGUgcnVsZSxcbiAgICAvL2JlY2F1c2UgSSBoYWQgc2Vjb25kIHRob3VnaHRzIGFib3V0IHRoaXMuXG4gICAgZnVuY3Rpb24gaW5zZXJ0TWVyZ2VPdmVyRGVsZXRlIChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICBjaGFuZ2VzLnNwbGljZSgxLDEpLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgICAgXG4gICAgICAvL2lmIHRoZXJlIGlzIG9ubHkgb25lIG5vbiBlbXB0eSBjaGFuZ2UgdGhhdHMgb2theS5cbiAgICAgIC8vZWxzZSBmdWxsIGNvbmZpbGN0XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9uZW1wdHk7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZihjaGFuZ2VzW2ldLmxlbmd0aCkgXG4gICAgICAgICAgaWYoIW5vbmVtcHR5KSBub25lbXB0eSA9IGNoYW5nZXNbaV1cbiAgICAgICAgICBlbHNlIHJldHVybiAvLyBmdWxsIGNvbmZsaWN0XG4gICAgICByZXR1cm4gbm9uZW1wdHlcbiAgICB9XG5cbiAgdmFyIHJ1bGVzID0gKGRlcHMgJiYgZGVwcy5ydWxlcykgfHwgW2V4cG9ydHMub2RkT25lT3V0LCBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZV1cblxuICBmdW5jdGlvbiByZXNvbHZlIChjaGFuZ2VzKSB7XG4gICAgdmFyIGwgPSBydWxlcy5sZW5ndGhcbiAgICBmb3IgKHZhciBpIGluIHJ1bGVzKSB7IC8vIGZpcnN0XG4gICAgICBcbiAgICAgIHZhciBjID0gcnVsZXNbaV0gJiYgcnVsZXNbaV0oY2hhbmdlcylcbiAgICAgIGlmKGMpIHJldHVybiBjXG4gICAgfVxuICAgIGNoYW5nZXMuc3BsaWNlKDEsMSkgLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgIC8vcmV0dXJuaW5nIHRoZSBjb25mbGljdHMgYXMgYW4gb2JqZWN0IGlzIGEgcmVhbGx5IGJhZCBpZGVhLFxuICAgIC8vIGJlY2F1c2UgPT0gd2lsbCBub3QgZGV0ZWN0IHRoZXkgYXJlIHRoZSBzYW1lLiBhbmQgY29uZmxpY3RzIGJ1aWxkLlxuICAgIC8vIGJldHRlciB0byB1c2VcbiAgICAvLyAnPDw8PDw8PDw8PDw8PCdcbiAgICAvLyBvZiBjb3Vyc2UsIGkgd3JvdGUgdGhpcyBiZWZvcmUgaSBzdGFydGVkIG9uIHNub2IsIHNvIGkgZGlkbid0IGtub3cgdGhhdCB0aGVuLlxuICAgIC8qdmFyIGNvbmZsaWN0ID0gWyc+Pj4+Pj4+Pj4+Pj4+Pj4+J11cbiAgICB3aGlsZShjaGFuZ2VzLmxlbmd0aClcbiAgICAgIGNvbmZsaWN0ID0gY29uZmxpY3QuY29uY2F0KGNoYW5nZXMuc2hpZnQoKSkuY29uY2F0KCc9PT09PT09PT09PT0nKVxuICAgIGNvbmZsaWN0LnBvcCgpXG4gICAgY29uZmxpY3QucHVzaCAgICAgICAgICAoJzw8PDw8PDw8PDw8PDw8PCcpXG4gICAgY2hhbmdlcy51bnNoaWZ0ICAgICAgICgnPj4+Pj4+Pj4+Pj4+Pj4+JylcbiAgICByZXR1cm4gY29uZmxpY3QqL1xuICAgIC8vbmFoLCBiZXR0ZXIgaXMganVzdCB0byB1c2UgYW4gZXF1YWwgY2FuIGhhbmRsZSBvYmplY3RzXG4gICAgcmV0dXJuIHsnPyc6IGNoYW5nZXN9XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHNcbn1cbmV4cG9ydHMobnVsbCwgZXhwb3J0cylcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FkaWZmL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = flattenImageData;\n/**\n * @param {Array} imageData a 2d array\n * @return {Uint8ClampedArray}\n */\nfunction flattenImageData(imageData) {\n var width = imageData[0].length;\n var result = new Uint8ClampedArray(imageData.length * width * 4);\n imageData.forEach(function (row, y) {\n row.forEach(function (pixel, x) {\n var index = y * width * 4 + x * 4;\n result[index] = pixel[0];\n result[index + 1] = pixel[1];\n result[index + 2] = pixel[2];\n result[index + 3] = pixel[3];\n });\n });\n return result;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qcz8yZGRiIl0sIm5hbWVzIjpbImZsYXR0ZW5JbWFnZURhdGEiLCJpbWFnZURhdGEiLCJ3aWR0aCIsImxlbmd0aCIsInJlc3VsdCIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiZm9yRWFjaCIsInJvdyIsInkiLCJwaXhlbCIsIngiLCJpbmRleCJdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBSXdCQSxnQjtBQUp4Qjs7OztBQUllLFNBQVNBLGdCQUFULENBQTBCQyxTQUExQixFQUFxQztBQUNsRCxNQUFNQyxRQUFRRCxVQUFVLENBQVYsRUFBYUUsTUFBM0I7QUFDQSxNQUFNQyxTQUFTLElBQUlDLGlCQUFKLENBQXNCSixVQUFVRSxNQUFWLEdBQW1CRCxLQUFuQixHQUEyQixDQUFqRCxDQUFmO0FBQ0FELFlBQVVLLE9BQVYsQ0FBa0IsVUFBQ0MsR0FBRCxFQUFNQyxDQUFOLEVBQVk7QUFDNUJELFFBQUlELE9BQUosQ0FBWSxVQUFDRyxLQUFELEVBQVFDLENBQVIsRUFBYztBQUN4QixVQUFNQyxRQUFTSCxJQUFJTixLQUFKLEdBQVksQ0FBYixHQUFtQlEsSUFBSSxDQUFyQztBQUNBTixhQUFPTyxLQUFQLElBQWdCRixNQUFNLENBQU4sQ0FBaEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDRCxLQU5EO0FBT0QsR0FSRDtBQVNBLFNBQU9MLE1BQVA7QUFDRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBpbWFnZURhdGEgYSAyZCBhcnJheVxuICogQHJldHVybiB7VWludDhDbGFtcGVkQXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZsYXR0ZW5JbWFnZURhdGEoaW1hZ2VEYXRhKSB7XG4gIGNvbnN0IHdpZHRoID0gaW1hZ2VEYXRhWzBdLmxlbmd0aDtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGltYWdlRGF0YS5sZW5ndGggKiB3aWR0aCAqIDQpO1xuICBpbWFnZURhdGEuZm9yRWFjaCgocm93LCB5KSA9PiB7XG4gICAgcm93LmZvckVhY2goKHBpeGVsLCB4KSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9ICh5ICogd2lkdGggKiA0KSArICh4ICogNCk7XG4gICAgICByZXN1bHRbaW5kZXhdID0gcGl4ZWxbMF07XG4gICAgICByZXN1bHRbaW5kZXggKyAxXSA9IHBpeGVsWzFdO1xuICAgICAgcmVzdWx0W2luZGV4ICsgMl0gPSBwaXhlbFsyXTtcbiAgICAgIHJlc3VsdFtpbmRleCArIDNdID0gcGl4ZWxbM107XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
60
+
61
+ /***/ }
62
+ /******/ ]);
@@ -0,0 +1,62 @@
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 _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nvar _flattenImageData = __webpack_require__(2);\n\nvar _flattenImageData2 = _interopRequireDefault(_flattenImageData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Construct a line of pixels of a certain rgba color\n *\n * @param {Array} rgba\n * @param {Number} width\n * @return {Array}\n */\nfunction constructColoredLine(rgba, width) {\n var line = [];\n for (var i = 0; i < width; i++) {\n line.push(rgba);\n }\n return line;\n}\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 var getPixelAt = function getPixelAt(x, y) {\n var startIndex = y * rowSize + x * 4;\n return [data[startIndex], data[startIndex + 1], data[startIndex + 2], data[startIndex + 3]];\n };\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = [];\n for (var col = 0; col < width; col++) {\n pixelsInRow.push(getPixelAt(col, row));\n }\n for (var pad = 0; pad < paddingRight; pad++) {\n pixelsInRow.push([0, 0, 0, 0]);\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction getAdiffResults(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.currentData;\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n\n var adiffResults = void 0;\n if (previousData.width !== currentData.width) {\n // we know that all rows will be different here, so we can take a shortcut\n return [0, // diff starts at index 0\n previousData.height, // number of deletions\n { length: currentData.height }];\n }\n return _adiff2.default.diff(previousImageData.map(function (d) {\n return btoa(d);\n }), currentImageData.map(function (d) {\n return btoa(d);\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 redLine = constructColoredLine([255, 0, 0, 255], maxWidth);\n var greenLine = constructColoredLine([0, 255, 0, 255], maxWidth);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n var adiffResults = getAdiffResults({\n previousData: previousData,\n currentData: currentData,\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n // iterate and apply changes to previous data\n adiffResults.forEach(function (instruction) {\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < deletedItems) {\n // ignore, we just keep the old line\n } else {\n // add a green line to signal an addition\n previousImageData.splice(atIndex + y, 0, greenLine);\n }\n }\n });\n\n // iterate backwards and apply changes to current data\n for (var i = adiffResults.length - 1; i >= 0; i--) {\n var instruction = adiffResults[i];\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < addedItems) {\n // ignore, we just keep the old line\n } else {\n // add a red line to signal a deletion\n currentImageData.splice(atIndex + y, 0, redLine);\n }\n }\n }\n\n return {\n currentData: {\n data: (0, _flattenImageData2.default)(currentImageData),\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: (0, _flattenImageData2.default)(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/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiZ2V0QWRpZmZSZXN1bHRzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJhZGlmZlJlc3VsdHMiLCJsZW5ndGgiLCJkaWZmIiwibWFwIiwiYnRvYSIsImQiLCJjb21wdXRlQW5kSW5qZWN0RGlmZnMiLCJtYXhXaWR0aCIsIk1hdGgiLCJtYXgiLCJyZWRMaW5lIiwiZ3JlZW5MaW5lIiwiZm9yRWFjaCIsImluc3RydWN0aW9uIiwiYXRJbmRleCIsImRlbGV0ZWRJdGVtcyIsImFkZGVkSXRlbXMiLCJzcGxpY2UiLCJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc3VsdCIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFFQTs7Ozs7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTQSxvQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0NDLEtBQXBDLEVBQTJDO0FBQ3pDLE1BQU1DLE9BQU8sRUFBYjtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixLQUFwQixFQUEyQkUsR0FBM0IsRUFBZ0M7QUFDOUJELFNBQUtFLElBQUwsQ0FBVUosSUFBVjtBQUNEO0FBQ0QsU0FBT0UsSUFBUDtBQUNEOztBQUVELFNBQVNHLGNBQVQsT0FBaURDLFlBQWpELEVBQStEO0FBQUEsTUFB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eEM7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsU0FBTztBQUNMYixpQkFBYTtBQUNYZCxZQUFNLGdDQUFpQmdCLGdCQUFqQixDQURLO0FBRVhmLGNBQVFlLGlCQUFpQkUsTUFGZDtBQUdYeEIsYUFBTzhCO0FBSEksS0FEUjtBQU1MWCxrQkFBYztBQUNaYixZQUFNLGdDQUFpQmUsaUJBQWpCLENBRE07QUFFWmQsY0FBUWMsa0JBQWtCRyxNQUZkO0FBR1p4QixhQUFPOEI7QUFISztBQU5ULEdBQVA7QUFZRDs7QUFFRFcsS0FBS0MsZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsaUJBQTZDO0FBQUEseUJBQTFDcEMsSUFBMEM7QUFBQSxNQUFsQ2EsWUFBa0MsY0FBbENBLFlBQWtDO0FBQUEsTUFBcEJDLFdBQW9CLGNBQXBCQSxXQUFvQjs7QUFDNUUsTUFBTXVCLFNBQVNkLHNCQUFzQixFQUFFViwwQkFBRixFQUFnQkMsd0JBQWhCLEVBQXRCLENBQWY7QUFDQXFCLE9BQUtHLFdBQUwsQ0FBaUJELE1BQWpCO0FBQ0FGLE9BQUtJLEtBQUw7QUFDRCxDQUpEIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYWRpZmYgZnJvbSAnYWRpZmYnO1xuXG5pbXBvcnQgZmxhdHRlbkltYWdlRGF0YSBmcm9tICcuLi9mbGF0dGVuSW1hZ2VEYXRhJztcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBsaW5lIG9mIHBpeGVscyBvZiBhIGNlcnRhaW4gcmdiYSBjb2xvclxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHJnYmFcbiAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdENvbG9yZWRMaW5lKHJnYmEsIHdpZHRoKSB7XG4gIGNvbnN0IGxpbmUgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgbGluZS5wdXNoKHJnYmEpO1xuICB9XG4gIHJldHVybiBsaW5lO1xufVxuXG5mdW5jdGlvbiBpbWFnZVRvMkRBcnJheSh7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfSwgcGFkZGluZ1JpZ2h0KSB7XG4gIC8vIFRoZSBpbWFnZURhdGEgaXMgYSAxRCBhcnJheS4gRWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhXG4gIC8vIGRlY2ltYWwgdmFsdWUgdGhhdCByZXByZXNlbnRzIG9uZSBvZiB0aGUgUkdCQSBjaGFubmVscyBmb3IgdGhhdCBwaXhlbC5cbiAgY29uc3Qgcm93U2l6ZSA9IHdpZHRoICogNDtcbiAgY29uc3QgZ2V0UGl4ZWxBdCA9ICh4LCB5KSA9PiB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9ICh5ICogcm93U2l6ZSkgKyAoeCAqIDQpO1xuICAgIHJldHVybiBbXG4gICAgICBkYXRhW3N0YXJ0SW5kZXhdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgMV0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAyXSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDNdLFxuICAgIF07XG4gIH07XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBbXTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHtcbiAgICAgIHBpeGVsc0luUm93LnB1c2goZ2V0UGl4ZWxBdChjb2wsIHJvdykpO1xuICAgIH1cbiAgICBmb3IgKGxldCBwYWQgPSAwOyBwYWQgPCBwYWRkaW5nUmlnaHQ7IHBhZCsrKSB7XG4gICAgICBwaXhlbHNJblJvdy5wdXNoKFswLCAwLCAwLCAwXSk7XG4gICAgfVxuICAgIG5ld0RhdGEucHVzaChwaXhlbHNJblJvdyk7XG4gIH1cbiAgcmV0dXJuIG5ld0RhdGE7XG59XG5cbmZ1bmN0aW9uIGdldEFkaWZmUmVzdWx0cyh7XG4gIHByZXZpb3VzRGF0YSxcbiAgY3VycmVudERhdGEsXG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxufSkge1xuICBsZXQgYWRpZmZSZXN1bHRzO1xuICBpZiAocHJldmlvdXNEYXRhLndpZHRoICE9PSBjdXJyZW50RGF0YS53aWR0aCkge1xuICAgIC8vIHdlIGtub3cgdGhhdCBhbGwgcm93cyB3aWxsIGJlIGRpZmZlcmVudCBoZXJlLCBzbyB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0XG4gICAgcmV0dXJuIFtcbiAgICAgIDAsIC8vIGRpZmYgc3RhcnRzIGF0IGluZGV4IDBcbiAgICAgIHByZXZpb3VzRGF0YS5oZWlnaHQsIC8vIG51bWJlciBvZiBkZWxldGlvbnNcbiAgICAgIHsgbGVuZ3RoOiBjdXJyZW50RGF0YS5oZWlnaHQgfSwgLy8gbnVtYmVyIG9mIGFkZGl0aW9uc1xuICAgIF07XG4gIH1cbiAgcmV0dXJuIGFkaWZmLmRpZmYoXG4gICAgcHJldmlvdXNJbWFnZURhdGEubWFwKGQgPT4gYnRvYShkKSksXG4gICAgY3VycmVudEltYWdlRGF0YS5tYXAoZCA9PiBidG9hKGQpKVxuICApO1xufVxuXG4vKipcbiAqIFRha2VzIHR3byAyZCBpbWFnZXMsIGNvbXB1dGVzIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3bywgYW5kIGluamVjdHMgcGl4ZWxzIHRvXG4gKiBib3RoIGluIG9yZGVyIHRvOlxuICogYSkgbWFrZSBib3RoIGltYWdlcyB0aGUgc2FtZSBoZWlnaHRcbiAqIGIpIHByb3Blcmx5IHZpc3VhbGl6ZSBkaWZmZXJlbmNlc1xuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgTVVUQVRFUyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHByZXZpb3VzRGF0YVxuICogQHBhcmFtIHtBcnJheX0gY3VycmVudERhdGFcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KSB7XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgocHJldmlvdXNEYXRhLndpZHRoLCBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgY29uc3QgcmVkTGluZSA9IGNvbnN0cnVjdENvbG9yZWRMaW5lKFsyNTUsIDAsIDAsIDI1NV0sIG1heFdpZHRoKTtcbiAgY29uc3QgZ3JlZW5MaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzAsIDI1NSwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuXG4gIGNvbnN0IHByZXZpb3VzSW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgcHJldmlvdXNEYXRhLCBtYXhXaWR0aCAtIHByZXZpb3VzRGF0YS53aWR0aCk7XG5cbiAgY29uc3QgY3VycmVudEltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIGN1cnJlbnREYXRhLCBtYXhXaWR0aCAtIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBhZGlmZlJlc3VsdHMgPSBnZXRBZGlmZlJlc3VsdHMoe1xuICAgIHByZXZpb3VzRGF0YSxcbiAgICBjdXJyZW50RGF0YSxcbiAgICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgICBjdXJyZW50SW1hZ2VEYXRhLFxuICB9KTtcblxuICAvLyBpdGVyYXRlIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHByZXZpb3VzIGRhdGFcbiAgYWRpZmZSZXN1bHRzLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgY29uc3QgYXRJbmRleCA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGRlbGV0ZWRJdGVtcyA9IGluc3RydWN0aW9uWzFdO1xuICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBpbnN0cnVjdGlvbi5sZW5ndGggLSAyO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBNYXRoLm1heChkZWxldGVkSXRlbXMsIGFkZGVkSXRlbXMpOyB5KyspIHtcbiAgICAgIGlmICh5IDwgZGVsZXRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgZ3JlZW4gbGluZSB0byBzaWduYWwgYW4gYWRkaXRpb25cbiAgICAgICAgcHJldmlvdXNJbWFnZURhdGEuc3BsaWNlKGF0SW5kZXggKyB5LCAwLCBncmVlbkxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gaXRlcmF0ZSBiYWNrd2FyZHMgYW5kIGFwcGx5IGNoYW5nZXMgdG8gY3VycmVudCBkYXRhXG4gIGZvciAobGV0IGkgPSBhZGlmZlJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGFkaWZmUmVzdWx0c1tpXTtcbiAgICBjb25zdCBhdEluZGV4ID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb25bMV07XG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IGluc3RydWN0aW9uLmxlbmd0aCAtIDI7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IE1hdGgubWF4KGRlbGV0ZWRJdGVtcywgYWRkZWRJdGVtcyk7IHkrKykge1xuICAgICAgaWYgKHkgPCBhZGRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgcmVkIGxpbmUgdG8gc2lnbmFsIGEgZGVsZXRpb25cbiAgICAgICAgY3VycmVudEltYWdlRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIHJlZExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3VycmVudERhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEoY3VycmVudEltYWdlRGF0YSksXG4gICAgICBoZWlnaHQ6IGN1cnJlbnRJbWFnZURhdGEubGVuZ3RoLFxuICAgICAgd2lkdGg6IG1heFdpZHRoLFxuICAgIH0sXG4gICAgcHJldmlvdXNEYXRhOiB7XG4gICAgICBkYXRhOiBmbGF0dGVuSW1hZ2VEYXRhKHByZXZpb3VzSW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogcHJldmlvdXNJbWFnZURhdGEubGVuZ3RoLFxuICAgICAgd2lkdGg6IG1heFdpZHRoLFxuICAgIH0sXG4gIH07XG59XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGE6IHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9IH0pID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KTtcbiAgc2VsZi5wb3N0TWVzc2FnZShyZXN1bHQpO1xuICBzZWxmLmNsb3NlKCk7XG59KTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL3dvcmtlcnMvQ29tcHV0ZUFuZEluamVjdERpZmZzV29ya2VyLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("function head (a) {\n return a[0]\n}\n\nfunction last (a) {\n return a[a.length - 1]\n}\n\nfunction tail(a) {\n return a.slice(1)\n}\n\nfunction retreat (e) {\n return e.pop()\n}\n\nfunction hasLength (e) {\n return e.length\n}\n\nfunction any(ary, test) {\n for(var i=0;i<ary.length;i++)\n if(test(ary[i]))\n return true\n return false\n}\n\nfunction score (a) {\n return a.reduce(function (s, a) {\n return s + a.length + a[1] + 1\n }, 0)\n}\n\nfunction best (a, b) {\n return score(a) <= score(b) ? a : b\n}\n\n\nvar _rules // set at the bottom \n\n// note, naive implementation. will break on circular objects.\n\nfunction _equal(a, b) {\n if(a && !b) return false\n if(Array.isArray(a))\n if(a.length != b.length) return false\n if(a && 'object' == typeof a) {\n for(var i in a)\n if(!_equal(a[i], b[i])) return false\n for(var i in b)\n if(!_equal(a[i], b[i])) return false\n return true\n }\n return a == b\n}\n\nfunction getArgs(args) {\n return args.length == 1 ? args[0] : [].slice.call(args)\n}\n\n// return the index of the element not like the others, or -1\nfunction oddElement(ary, cmp) {\n var c\n function guess(a) {\n var odd = -1\n c = 0\n for (var i = a; i < ary.length; i ++) {\n if(!cmp(ary[a], ary[i])) {\n odd = i, c++\n }\n }\n return c > 1 ? -1 : odd\n }\n //assume that it is the first element.\n var g = guess(0)\n if(-1 != g) return g\n //0 was the odd one, then all the other elements are equal\n //else there more than one different element\n guess(1)\n return c == 0 ? 0 : -1\n}\nvar exports = module.exports = function (deps, exports) {\n var equal = (deps && deps.equal) || _equal\n exports = exports || {} \n exports.lcs = \n function lcs() {\n var cache = {}\n var args = getArgs(arguments)\n var a = args[0], b = args[1]\n\n function key (a,b){\n return a.length + ':' + b.length\n }\n\n //find length that matches at the head\n\n if(args.length > 2) {\n //if called with multiple sequences\n //recurse, since lcs(a, b, c, d) == lcs(lcs(a,b), lcs(c,d))\n args.push(lcs(args.shift(), args.shift()))\n return lcs(args)\n }\n \n //this would be improved by truncating input first\n //and not returning an lcs as an intermediate step.\n //untill that is a performance problem.\n\n var start = 0, end = 0\n for(var i = 0; i < a.length && i < b.length \n && equal(a[i], b[i])\n ; i ++\n )\n start = i + 1\n\n if(a.length === start)\n return a.slice()\n\n for(var i = 0; i < a.length - start && i < b.length - start\n && equal(a[a.length - 1 - i], b[b.length - 1 - i])\n ; i ++\n )\n end = i\n\n function recurse (a, b) {\n if(!a.length || !b.length) return []\n //avoid exponential time by caching the results\n if(cache[key(a, b)]) return cache[key(a, b)]\n\n if(equal(a[0], b[0]))\n return [head(a)].concat(recurse(tail(a), tail(b)))\n else { \n var _a = recurse(tail(a), b)\n var _b = recurse(a, tail(b))\n return cache[key(a,b)] = _a.length > _b.length ? _a : _b \n }\n }\n \n var middleA = a.slice(start, a.length - end)\n var middleB = b.slice(start, b.length - end)\n\n return (\n a.slice(0, start).concat(\n recurse(middleA, middleB)\n ).concat(a.slice(a.length - end))\n )\n }\n\n // given n sequences, calc the lcs, and then chunk strings into stable and unstable sections.\n // unstable chunks are passed to build\n exports.chunk =\n function (q, build) {\n var q = q.map(function (e) { return e.slice() })\n var lcs = exports.lcs.apply(null, q)\n var all = [lcs].concat(q)\n\n function matchLcs (e) {\n if(e.length && !lcs.length || !e.length && lcs.length)\n return false //incase the last item is null\n return equal(last(e), last(lcs)) || ((e.length + lcs.length) === 0)\n }\n\n while(any(q, hasLength)) {\n //if each element is at the lcs then this chunk is stable.\n while(q.every(matchLcs) && q.every(hasLength))\n all.forEach(retreat)\n //collect the changes in each array upto the next match with the lcs\n var c = false\n var unstable = q.map(function (e) {\n var change = []\n while(!matchLcs(e)) {\n change.unshift(retreat(e))\n c = true\n }\n return change\n })\n if(c) build(q[0].length, unstable)\n }\n }\n\n //calculate a diff this is only updates\n exports.optimisticDiff =\n function (a, b) {\n var M = Math.max(a.length, b.length)\n var m = Math.min(a.length, b.length)\n var patch = []\n for(var i = 0; i < M; i++)\n if(a[i] !== b[i]) {\n var cur = [i,0], deletes = 0\n while(a[i] !== b[i] && i < m) {\n cur[1] = ++deletes\n cur.push(b[i++])\n }\n //the rest are deletes or inserts\n if(i >= m) {\n //the rest are deletes\n if(a.length > b.length)\n cur[1] += a.length - b.length\n //the rest are inserts\n else if(a.length < b.length)\n cur = cur.concat(b.slice(a.length))\n }\n patch.push(cur)\n }\n\n return patch\n }\n\n exports.diff =\n function (a, b) {\n var optimistic = exports.optimisticDiff(a, b)\n var changes = []\n exports.chunk([a, b], function (index, unstable) {\n var del = unstable.shift().length\n var insert = unstable.shift()\n changes.push([index, del].concat(insert))\n })\n return best(optimistic, changes)\n }\n\n exports.patch = function (a, changes, mutate) {\n if(mutate !== true) a = a.slice(a)//copy a\n changes.forEach(function (change) {\n [].splice.apply(a, change)\n })\n return a\n }\n\n // http://en.wikipedia.org/wiki/Concestor\n // me, concestor, you...\n exports.merge = function () {\n var args = getArgs(arguments)\n var patch = exports.diff3(args)\n return exports.patch(args[0], patch)\n }\n\n exports.diff3 = function () {\n var args = getArgs(arguments)\n var r = []\n exports.chunk(args, function (index, unstable) {\n var mine = unstable[0]\n var insert = resolve(unstable)\n if(equal(mine, insert)) return \n r.push([index, mine.length].concat(insert)) \n })\n return r\n }\n exports.oddOneOut =\n function oddOneOut (changes) {\n changes = changes.slice()\n //put the concestor first\n changes.unshift(changes.splice(1,1)[0])\n var i = oddElement(changes, equal)\n if(i == 0) // concestor was different, 'false conflict'\n return changes[1]\n if (~i)\n return changes[i] \n }\n exports.insertMergeOverDelete = \n //i've implemented this as a seperate rule,\n //because I had second thoughts about this.\n function insertMergeOverDelete (changes) {\n changes = changes.slice()\n changes.splice(1,1)// remove concestor\n \n //if there is only one non empty change thats okay.\n //else full confilct\n for (var i = 0, nonempty; i < changes.length; i++)\n if(changes[i].length) \n if(!nonempty) nonempty = changes[i]\n else return // full conflict\n return nonempty\n }\n\n var rules = (deps && deps.rules) || [exports.oddOneOut, exports.insertMergeOverDelete]\n\n function resolve (changes) {\n var l = rules.length\n for (var i in rules) { // first\n \n var c = rules[i] && rules[i](changes)\n if(c) return c\n }\n changes.splice(1,1) // remove concestor\n //returning the conflicts as an object is a really bad idea,\n // because == will not detect they are the same. and conflicts build.\n // better to use\n // '<<<<<<<<<<<<<'\n // of course, i wrote this before i started on snob, so i didn't know that then.\n /*var conflict = ['>>>>>>>>>>>>>>>>']\n while(changes.length)\n conflict = conflict.concat(changes.shift()).concat('============')\n conflict.pop()\n conflict.push ('<<<<<<<<<<<<<<<')\n changes.unshift ('>>>>>>>>>>>>>>>')\n return conflict*/\n //nah, better is just to use an equal can handle objects\n return {'?': changes}\n }\n return exports\n}\nexports(null, exports)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2FkaWZmL2luZGV4LmpzPzA0ZDYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0Isb0JBQW9CO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaGVhZCAoYSkge1xuICByZXR1cm4gYVswXVxufVxuXG5mdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhW2EubGVuZ3RoIC0gMV1cbn1cblxuZnVuY3Rpb24gdGFpbChhKSB7XG4gIHJldHVybiBhLnNsaWNlKDEpXG59XG5cbmZ1bmN0aW9uIHJldHJlYXQgKGUpIHtcbiAgcmV0dXJuIGUucG9wKClcbn1cblxuZnVuY3Rpb24gaGFzTGVuZ3RoIChlKSB7XG4gIHJldHVybiBlLmxlbmd0aFxufVxuXG5mdW5jdGlvbiBhbnkoYXJ5LCB0ZXN0KSB7XG4gIGZvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspXG4gICAgaWYodGVzdChhcnlbaV0pKVxuICAgICAgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHNjb3JlIChhKSB7XG4gIHJldHVybiBhLnJlZHVjZShmdW5jdGlvbiAocywgYSkge1xuICAgICAgcmV0dXJuIHMgKyBhLmxlbmd0aCArIGFbMV0gKyAxXG4gIH0sIDApXG59XG5cbmZ1bmN0aW9uIGJlc3QgKGEsIGIpIHtcbiAgcmV0dXJuIHNjb3JlKGEpIDw9IHNjb3JlKGIpID8gYSA6IGJcbn1cblxuXG52YXIgX3J1bGVzIC8vIHNldCBhdCB0aGUgYm90dG9tICBcblxuLy8gbm90ZSwgbmFpdmUgaW1wbGVtZW50YXRpb24uIHdpbGwgYnJlYWsgb24gY2lyY3VsYXIgb2JqZWN0cy5cblxuZnVuY3Rpb24gX2VxdWFsKGEsIGIpIHtcbiAgaWYoYSAmJiAhYikgcmV0dXJuIGZhbHNlXG4gIGlmKEFycmF5LmlzQXJyYXkoYSkpXG4gICAgaWYoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBpZihhICYmICdvYmplY3QnID09IHR5cGVvZiBhKSB7XG4gICAgZm9yKHZhciBpIGluIGEpXG4gICAgICBpZighX2VxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2VcbiAgICBmb3IodmFyIGkgaW4gYilcbiAgICAgIGlmKCFfZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGEgPT0gYlxufVxuXG5mdW5jdGlvbiBnZXRBcmdzKGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID09IDEgPyBhcmdzWzBdIDogW10uc2xpY2UuY2FsbChhcmdzKVxufVxuXG4vLyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IG5vdCBsaWtlIHRoZSBvdGhlcnMsIG9yIC0xXG5mdW5jdGlvbiBvZGRFbGVtZW50KGFyeSwgY21wKSB7XG4gIHZhciBjXG4gIGZ1bmN0aW9uIGd1ZXNzKGEpIHtcbiAgICB2YXIgb2RkID0gLTFcbiAgICBjID0gMFxuICAgIGZvciAodmFyIGkgPSBhOyBpIDwgYXJ5Lmxlbmd0aDsgaSArKykge1xuICAgICAgaWYoIWNtcChhcnlbYV0sIGFyeVtpXSkpIHtcbiAgICAgICAgb2RkID0gaSwgYysrXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjID4gMSA/IC0xIDogb2RkXG4gIH1cbiAgLy9hc3N1bWUgdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudC5cbiAgdmFyIGcgPSBndWVzcygwKVxuICBpZigtMSAhPSBnKSByZXR1cm4gZ1xuICAvLzAgd2FzIHRoZSBvZGQgb25lLCB0aGVuIGFsbCB0aGUgb3RoZXIgZWxlbWVudHMgYXJlIGVxdWFsXG4gIC8vZWxzZSB0aGVyZSBtb3JlIHRoYW4gb25lIGRpZmZlcmVudCBlbGVtZW50XG4gIGd1ZXNzKDEpXG4gIHJldHVybiBjID09IDAgPyAwIDogLTFcbn1cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVwcywgZXhwb3J0cykge1xuICB2YXIgZXF1YWwgPSAoZGVwcyAmJiBkZXBzLmVxdWFsKSB8fCBfZXF1YWxcbiAgZXhwb3J0cyA9IGV4cG9ydHMgfHwge30gXG4gIGV4cG9ydHMubGNzID0gXG4gIGZ1bmN0aW9uIGxjcygpIHtcbiAgICB2YXIgY2FjaGUgPSB7fVxuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIGEgPSBhcmdzWzBdLCBiID0gYXJnc1sxXVxuXG4gICAgZnVuY3Rpb24ga2V5IChhLGIpe1xuICAgICAgcmV0dXJuIGEubGVuZ3RoICsgJzonICsgYi5sZW5ndGhcbiAgICB9XG5cbiAgICAvL2ZpbmQgbGVuZ3RoIHRoYXQgbWF0Y2hlcyBhdCB0aGUgaGVhZFxuXG4gICAgaWYoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAvL2lmIGNhbGxlZCB3aXRoIG11bHRpcGxlIHNlcXVlbmNlc1xuICAgICAgLy9yZWN1cnNlLCBzaW5jZSBsY3MoYSwgYiwgYywgZCkgPT0gbGNzKGxjcyhhLGIpLCBsY3MoYyxkKSlcbiAgICAgIGFyZ3MucHVzaChsY3MoYXJncy5zaGlmdCgpLCBhcmdzLnNoaWZ0KCkpKVxuICAgICAgcmV0dXJuIGxjcyhhcmdzKVxuICAgIH1cbiAgICBcbiAgICAvL3RoaXMgd291bGQgYmUgaW1wcm92ZWQgYnkgdHJ1bmNhdGluZyBpbnB1dCBmaXJzdFxuICAgIC8vYW5kIG5vdCByZXR1cm5pbmcgYW4gbGNzIGFzIGFuIGludGVybWVkaWF0ZSBzdGVwLlxuICAgIC8vdW50aWxsIHRoYXQgaXMgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLlxuXG4gICAgdmFyIHN0YXJ0ID0gMCwgZW5kID0gMFxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aCAmJiBpIDwgYi5sZW5ndGggXG4gICAgICAmJiBlcXVhbChhW2ldLCBiW2ldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgc3RhcnQgPSBpICsgMVxuXG4gICAgaWYoYS5sZW5ndGggPT09IHN0YXJ0KVxuICAgICAgcmV0dXJuIGEuc2xpY2UoKVxuXG4gICAgZm9yKHZhciBpID0gMDsgIGkgPCBhLmxlbmd0aCAtIHN0YXJ0ICYmIGkgPCBiLmxlbmd0aCAtIHN0YXJ0XG4gICAgICAmJiBlcXVhbChhW2EubGVuZ3RoIC0gMSAtIGldLCBiW2IubGVuZ3RoIC0gMSAtIGldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgZW5kID0gaVxuXG4gICAgZnVuY3Rpb24gcmVjdXJzZSAoYSwgYikge1xuICAgICAgaWYoIWEubGVuZ3RoIHx8ICFiLmxlbmd0aCkgcmV0dXJuIFtdXG4gICAgICAvL2F2b2lkIGV4cG9uZW50aWFsIHRpbWUgYnkgY2FjaGluZyB0aGUgcmVzdWx0c1xuICAgICAgaWYoY2FjaGVba2V5KGEsIGIpXSkgcmV0dXJuIGNhY2hlW2tleShhLCBiKV1cblxuICAgICAgaWYoZXF1YWwoYVswXSwgYlswXSkpXG4gICAgICAgIHJldHVybiBbaGVhZChhKV0uY29uY2F0KHJlY3Vyc2UodGFpbChhKSwgdGFpbChiKSkpXG4gICAgICBlbHNlIHsgXG4gICAgICAgIHZhciBfYSA9IHJlY3Vyc2UodGFpbChhKSwgYilcbiAgICAgICAgdmFyIF9iID0gcmVjdXJzZShhLCB0YWlsKGIpKVxuICAgICAgICByZXR1cm4gY2FjaGVba2V5KGEsYildID0gX2EubGVuZ3RoID4gX2IubGVuZ3RoID8gX2EgOiBfYiAgXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhciBtaWRkbGVBID0gYS5zbGljZShzdGFydCwgYS5sZW5ndGggLSBlbmQpXG4gICAgdmFyIG1pZGRsZUIgPSBiLnNsaWNlKHN0YXJ0LCBiLmxlbmd0aCAtIGVuZClcblxuICAgIHJldHVybiAoXG4gICAgICBhLnNsaWNlKDAsIHN0YXJ0KS5jb25jYXQoXG4gICAgICAgIHJlY3Vyc2UobWlkZGxlQSwgbWlkZGxlQilcbiAgICAgICkuY29uY2F0KGEuc2xpY2UoYS5sZW5ndGggLSBlbmQpKVxuICAgIClcbiAgfVxuXG4gIC8vIGdpdmVuIG4gc2VxdWVuY2VzLCBjYWxjIHRoZSBsY3MsIGFuZCB0aGVuIGNodW5rIHN0cmluZ3MgaW50byBzdGFibGUgYW5kIHVuc3RhYmxlIHNlY3Rpb25zLlxuICAvLyB1bnN0YWJsZSBjaHVua3MgYXJlIHBhc3NlZCB0byBidWlsZFxuICBleHBvcnRzLmNodW5rID1cbiAgZnVuY3Rpb24gKHEsIGJ1aWxkKSB7XG4gICAgdmFyIHEgPSBxLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5zbGljZSgpIH0pXG4gICAgdmFyIGxjcyA9IGV4cG9ydHMubGNzLmFwcGx5KG51bGwsIHEpXG4gICAgdmFyIGFsbCA9IFtsY3NdLmNvbmNhdChxKVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hMY3MgKGUpIHtcbiAgICAgIGlmKGUubGVuZ3RoICYmICFsY3MubGVuZ3RoIHx8ICFlLmxlbmd0aCAmJiBsY3MubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2UgLy9pbmNhc2UgdGhlIGxhc3QgaXRlbSBpcyBudWxsXG4gICAgICByZXR1cm4gZXF1YWwobGFzdChlKSwgbGFzdChsY3MpKSB8fCAoKGUubGVuZ3RoICsgbGNzLmxlbmd0aCkgPT09IDApXG4gICAgfVxuXG4gICAgd2hpbGUoYW55KHEsIGhhc0xlbmd0aCkpIHtcbiAgICAgIC8vaWYgZWFjaCBlbGVtZW50IGlzIGF0IHRoZSBsY3MgdGhlbiB0aGlzIGNodW5rIGlzIHN0YWJsZS5cbiAgICAgIHdoaWxlKHEuZXZlcnkobWF0Y2hMY3MpICYmIHEuZXZlcnkoaGFzTGVuZ3RoKSlcbiAgICAgICAgYWxsLmZvckVhY2gocmV0cmVhdClcbiAgICAgIC8vY29sbGVjdCB0aGUgY2hhbmdlcyBpbiBlYWNoIGFycmF5IHVwdG8gdGhlIG5leHQgbWF0Y2ggd2l0aCB0aGUgbGNzXG4gICAgICB2YXIgYyA9IGZhbHNlXG4gICAgICB2YXIgdW5zdGFibGUgPSBxLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY2hhbmdlID0gW11cbiAgICAgICAgd2hpbGUoIW1hdGNoTGNzKGUpKSB7XG4gICAgICAgICAgY2hhbmdlLnVuc2hpZnQocmV0cmVhdChlKSlcbiAgICAgICAgICBjID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgIH0pXG4gICAgICBpZihjKSBidWlsZChxWzBdLmxlbmd0aCwgdW5zdGFibGUpXG4gICAgfVxuICB9XG5cbiAgLy9jYWxjdWxhdGUgYSBkaWZmIHRoaXMgaXMgb25seSB1cGRhdGVzXG4gIGV4cG9ydHMub3B0aW1pc3RpY0RpZmYgPVxuICBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBNID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBtID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBwYXRjaCA9IFtdXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IE07IGkrKylcbiAgICAgIGlmKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgdmFyIGN1ciA9IFtpLDBdLCBkZWxldGVzID0gMFxuICAgICAgICB3aGlsZShhW2ldICE9PSBiW2ldICYmIGkgPCBtKSB7XG4gICAgICAgICAgY3VyWzFdID0gKytkZWxldGVzXG4gICAgICAgICAgY3VyLnB1c2goYltpKytdKVxuICAgICAgICB9XG4gICAgICAgIC8vdGhlIHJlc3QgYXJlIGRlbGV0ZXMgb3IgaW5zZXJ0c1xuICAgICAgICBpZihpID49IG0pIHtcbiAgICAgICAgICAvL3RoZSByZXN0IGFyZSBkZWxldGVzXG4gICAgICAgICAgaWYoYS5sZW5ndGggPiBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1clsxXSArPSBhLmxlbmd0aCAtIGIubGVuZ3RoXG4gICAgICAgICAgLy90aGUgcmVzdCBhcmUgaW5zZXJ0c1xuICAgICAgICAgIGVsc2UgaWYoYS5sZW5ndGggPCBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1ciA9IGN1ci5jb25jYXQoYi5zbGljZShhLmxlbmd0aCkpXG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2gucHVzaChjdXIpXG4gICAgICB9XG5cbiAgICByZXR1cm4gcGF0Y2hcbiAgfVxuXG4gIGV4cG9ydHMuZGlmZiA9XG4gIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIG9wdGltaXN0aWMgPSBleHBvcnRzLm9wdGltaXN0aWNEaWZmKGEsIGIpXG4gICAgdmFyIGNoYW5nZXMgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoW2EsIGJdLCBmdW5jdGlvbiAoaW5kZXgsIHVuc3RhYmxlKSB7XG4gICAgICB2YXIgZGVsID0gdW5zdGFibGUuc2hpZnQoKS5sZW5ndGhcbiAgICAgIHZhciBpbnNlcnQgPSB1bnN0YWJsZS5zaGlmdCgpXG4gICAgICBjaGFuZ2VzLnB1c2goW2luZGV4LCBkZWxdLmNvbmNhdChpbnNlcnQpKVxuICAgIH0pXG4gICAgcmV0dXJuIGJlc3Qob3B0aW1pc3RpYywgY2hhbmdlcylcbiAgfVxuXG4gIGV4cG9ydHMucGF0Y2ggPSBmdW5jdGlvbiAoYSwgY2hhbmdlcywgbXV0YXRlKSB7XG4gICAgaWYobXV0YXRlICE9PSB0cnVlKSBhID0gYS5zbGljZShhKS8vY29weSBhXG4gICAgY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2UpIHtcbiAgICAgIFtdLnNwbGljZS5hcHBseShhLCBjaGFuZ2UpXG4gICAgfSlcbiAgICByZXR1cm4gYVxuICB9XG5cbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db25jZXN0b3JcbiAgLy8gbWUsIGNvbmNlc3RvciwgeW91Li4uXG4gIGV4cG9ydHMubWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBnZXRBcmdzKGFyZ3VtZW50cylcbiAgICB2YXIgcGF0Y2ggPSBleHBvcnRzLmRpZmYzKGFyZ3MpXG4gICAgcmV0dXJuIGV4cG9ydHMucGF0Y2goYXJnc1swXSwgcGF0Y2gpXG4gIH1cblxuICBleHBvcnRzLmRpZmYzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIHIgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoYXJncywgZnVuY3Rpb24gKGluZGV4LCB1bnN0YWJsZSkge1xuICAgICAgdmFyIG1pbmUgPSB1bnN0YWJsZVswXVxuICAgICAgdmFyIGluc2VydCA9IHJlc29sdmUodW5zdGFibGUpXG4gICAgICBpZihlcXVhbChtaW5lLCBpbnNlcnQpKSByZXR1cm4gXG4gICAgICByLnB1c2goW2luZGV4LCBtaW5lLmxlbmd0aF0uY29uY2F0KGluc2VydCkpIFxuICAgIH0pXG4gICAgcmV0dXJuIHJcbiAgfVxuICBleHBvcnRzLm9kZE9uZU91dCA9XG4gICAgZnVuY3Rpb24gb2RkT25lT3V0IChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICAvL3B1dCB0aGUgY29uY2VzdG9yIGZpcnN0XG4gICAgICBjaGFuZ2VzLnVuc2hpZnQoY2hhbmdlcy5zcGxpY2UoMSwxKVswXSlcbiAgICAgIHZhciBpID0gb2RkRWxlbWVudChjaGFuZ2VzLCBlcXVhbClcbiAgICAgIGlmKGkgPT0gMCkgLy8gY29uY2VzdG9yIHdhcyBkaWZmZXJlbnQsICdmYWxzZSBjb25mbGljdCdcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbMV1cbiAgICAgIGlmICh+aSlcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbaV0gXG4gICAgfVxuICBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZSA9IFxuICAgIC8vaSd2ZSBpbXBsZW1lbnRlZCB0aGlzIGFzIGEgc2VwZXJhdGUgcnVsZSxcbiAgICAvL2JlY2F1c2UgSSBoYWQgc2Vjb25kIHRob3VnaHRzIGFib3V0IHRoaXMuXG4gICAgZnVuY3Rpb24gaW5zZXJ0TWVyZ2VPdmVyRGVsZXRlIChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICBjaGFuZ2VzLnNwbGljZSgxLDEpLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgICAgXG4gICAgICAvL2lmIHRoZXJlIGlzIG9ubHkgb25lIG5vbiBlbXB0eSBjaGFuZ2UgdGhhdHMgb2theS5cbiAgICAgIC8vZWxzZSBmdWxsIGNvbmZpbGN0XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9uZW1wdHk7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZihjaGFuZ2VzW2ldLmxlbmd0aCkgXG4gICAgICAgICAgaWYoIW5vbmVtcHR5KSBub25lbXB0eSA9IGNoYW5nZXNbaV1cbiAgICAgICAgICBlbHNlIHJldHVybiAvLyBmdWxsIGNvbmZsaWN0XG4gICAgICByZXR1cm4gbm9uZW1wdHlcbiAgICB9XG5cbiAgdmFyIHJ1bGVzID0gKGRlcHMgJiYgZGVwcy5ydWxlcykgfHwgW2V4cG9ydHMub2RkT25lT3V0LCBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZV1cblxuICBmdW5jdGlvbiByZXNvbHZlIChjaGFuZ2VzKSB7XG4gICAgdmFyIGwgPSBydWxlcy5sZW5ndGhcbiAgICBmb3IgKHZhciBpIGluIHJ1bGVzKSB7IC8vIGZpcnN0XG4gICAgICBcbiAgICAgIHZhciBjID0gcnVsZXNbaV0gJiYgcnVsZXNbaV0oY2hhbmdlcylcbiAgICAgIGlmKGMpIHJldHVybiBjXG4gICAgfVxuICAgIGNoYW5nZXMuc3BsaWNlKDEsMSkgLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgIC8vcmV0dXJuaW5nIHRoZSBjb25mbGljdHMgYXMgYW4gb2JqZWN0IGlzIGEgcmVhbGx5IGJhZCBpZGVhLFxuICAgIC8vIGJlY2F1c2UgPT0gd2lsbCBub3QgZGV0ZWN0IHRoZXkgYXJlIHRoZSBzYW1lLiBhbmQgY29uZmxpY3RzIGJ1aWxkLlxuICAgIC8vIGJldHRlciB0byB1c2VcbiAgICAvLyAnPDw8PDw8PDw8PDw8PCdcbiAgICAvLyBvZiBjb3Vyc2UsIGkgd3JvdGUgdGhpcyBiZWZvcmUgaSBzdGFydGVkIG9uIHNub2IsIHNvIGkgZGlkbid0IGtub3cgdGhhdCB0aGVuLlxuICAgIC8qdmFyIGNvbmZsaWN0ID0gWyc+Pj4+Pj4+Pj4+Pj4+Pj4+J11cbiAgICB3aGlsZShjaGFuZ2VzLmxlbmd0aClcbiAgICAgIGNvbmZsaWN0ID0gY29uZmxpY3QuY29uY2F0KGNoYW5nZXMuc2hpZnQoKSkuY29uY2F0KCc9PT09PT09PT09PT0nKVxuICAgIGNvbmZsaWN0LnBvcCgpXG4gICAgY29uZmxpY3QucHVzaCAgICAgICAgICAoJzw8PDw8PDw8PDw8PDw8PCcpXG4gICAgY2hhbmdlcy51bnNoaWZ0ICAgICAgICgnPj4+Pj4+Pj4+Pj4+Pj4+JylcbiAgICByZXR1cm4gY29uZmxpY3QqL1xuICAgIC8vbmFoLCBiZXR0ZXIgaXMganVzdCB0byB1c2UgYW4gZXF1YWwgY2FuIGhhbmRsZSBvYmplY3RzXG4gICAgcmV0dXJuIHsnPyc6IGNoYW5nZXN9XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHNcbn1cbmV4cG9ydHMobnVsbCwgZXhwb3J0cylcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FkaWZmL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = flattenImageData;\n/**\n * @param {Array} imageData a 2d array\n * @return {Uint8ClampedArray}\n */\nfunction flattenImageData(imageData) {\n var width = imageData[0].length;\n var result = new Uint8ClampedArray(imageData.length * width * 4);\n imageData.forEach(function (row, y) {\n row.forEach(function (pixel, x) {\n var index = y * width * 4 + x * 4;\n result[index] = pixel[0];\n result[index + 1] = pixel[1];\n result[index + 2] = pixel[2];\n result[index + 3] = pixel[3];\n });\n });\n return result;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qcz8yZGRiIl0sIm5hbWVzIjpbImZsYXR0ZW5JbWFnZURhdGEiLCJpbWFnZURhdGEiLCJ3aWR0aCIsImxlbmd0aCIsInJlc3VsdCIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiZm9yRWFjaCIsInJvdyIsInkiLCJwaXhlbCIsIngiLCJpbmRleCJdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBSXdCQSxnQjtBQUp4Qjs7OztBQUllLFNBQVNBLGdCQUFULENBQTBCQyxTQUExQixFQUFxQztBQUNsRCxNQUFNQyxRQUFRRCxVQUFVLENBQVYsRUFBYUUsTUFBM0I7QUFDQSxNQUFNQyxTQUFTLElBQUlDLGlCQUFKLENBQXNCSixVQUFVRSxNQUFWLEdBQW1CRCxLQUFuQixHQUEyQixDQUFqRCxDQUFmO0FBQ0FELFlBQVVLLE9BQVYsQ0FBa0IsVUFBQ0MsR0FBRCxFQUFNQyxDQUFOLEVBQVk7QUFDNUJELFFBQUlELE9BQUosQ0FBWSxVQUFDRyxLQUFELEVBQVFDLENBQVIsRUFBYztBQUN4QixVQUFNQyxRQUFTSCxJQUFJTixLQUFKLEdBQVksQ0FBYixHQUFtQlEsSUFBSSxDQUFyQztBQUNBTixhQUFPTyxLQUFQLElBQWdCRixNQUFNLENBQU4sQ0FBaEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDRCxLQU5EO0FBT0QsR0FSRDtBQVNBLFNBQU9MLE1BQVA7QUFDRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBpbWFnZURhdGEgYSAyZCBhcnJheVxuICogQHJldHVybiB7VWludDhDbGFtcGVkQXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZsYXR0ZW5JbWFnZURhdGEoaW1hZ2VEYXRhKSB7XG4gIGNvbnN0IHdpZHRoID0gaW1hZ2VEYXRhWzBdLmxlbmd0aDtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGltYWdlRGF0YS5sZW5ndGggKiB3aWR0aCAqIDQpO1xuICBpbWFnZURhdGEuZm9yRWFjaCgocm93LCB5KSA9PiB7XG4gICAgcm93LmZvckVhY2goKHBpeGVsLCB4KSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9ICh5ICogd2lkdGggKiA0KSArICh4ICogNCk7XG4gICAgICByZXN1bHRbaW5kZXhdID0gcGl4ZWxbMF07XG4gICAgICByZXN1bHRbaW5kZXggKyAxXSA9IHBpeGVsWzFdO1xuICAgICAgcmVzdWx0W2luZGV4ICsgMl0gPSBwaXhlbFsyXTtcbiAgICAgIHJlc3VsdFtpbmRleCArIDNdID0gcGl4ZWxbM107XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
60
+
61
+ /***/ }
62
+ /******/ ]);