map-generator.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _jsBase = require('js-base64');
  4. var _sourceMap = require('source-map');
  5. var _sourceMap2 = _interopRequireDefault(_sourceMap);
  6. var _path = require('path');
  7. var _path2 = _interopRequireDefault(_path);
  8. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  9. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  10. var MapGenerator = function () {
  11. function MapGenerator(stringify, root, opts) {
  12. _classCallCheck(this, MapGenerator);
  13. this.stringify = stringify;
  14. this.mapOpts = opts.map || {};
  15. this.root = root;
  16. this.opts = opts;
  17. }
  18. MapGenerator.prototype.isMap = function isMap() {
  19. if (typeof this.opts.map !== 'undefined') {
  20. return !!this.opts.map;
  21. } else {
  22. return this.previous().length > 0;
  23. }
  24. };
  25. MapGenerator.prototype.previous = function previous() {
  26. var _this = this;
  27. if (!this.previousMaps) {
  28. this.previousMaps = [];
  29. this.root.walk(function (node) {
  30. if (node.source && node.source.input.map) {
  31. var map = node.source.input.map;
  32. if (_this.previousMaps.indexOf(map) === -1) {
  33. _this.previousMaps.push(map);
  34. }
  35. }
  36. });
  37. }
  38. return this.previousMaps;
  39. };
  40. MapGenerator.prototype.isInline = function isInline() {
  41. if (typeof this.mapOpts.inline !== 'undefined') {
  42. return this.mapOpts.inline;
  43. }
  44. var annotation = this.mapOpts.annotation;
  45. if (typeof annotation !== 'undefined' && annotation !== true) {
  46. return false;
  47. }
  48. if (this.previous().length) {
  49. return this.previous().some(function (i) {
  50. return i.inline;
  51. });
  52. } else {
  53. return true;
  54. }
  55. };
  56. MapGenerator.prototype.isSourcesContent = function isSourcesContent() {
  57. if (typeof this.mapOpts.sourcesContent !== 'undefined') {
  58. return this.mapOpts.sourcesContent;
  59. }
  60. if (this.previous().length) {
  61. return this.previous().some(function (i) {
  62. return i.withContent();
  63. });
  64. } else {
  65. return true;
  66. }
  67. };
  68. MapGenerator.prototype.clearAnnotation = function clearAnnotation() {
  69. if (this.mapOpts.annotation === false) return;
  70. var node = void 0;
  71. for (var i = this.root.nodes.length - 1; i >= 0; i--) {
  72. node = this.root.nodes[i];
  73. if (node.type !== 'comment') continue;
  74. if (node.text.indexOf('# sourceMappingURL=') === 0) {
  75. this.root.removeChild(i);
  76. }
  77. }
  78. };
  79. MapGenerator.prototype.setSourcesContent = function setSourcesContent() {
  80. var _this2 = this;
  81. var already = {};
  82. this.root.walk(function (node) {
  83. if (node.source) {
  84. var from = node.source.input.from;
  85. if (from && !already[from]) {
  86. already[from] = true;
  87. var relative = _this2.relative(from);
  88. _this2.map.setSourceContent(relative, node.source.input.css);
  89. }
  90. }
  91. });
  92. };
  93. MapGenerator.prototype.applyPrevMaps = function applyPrevMaps() {
  94. for (var _iterator = this.previous(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
  95. var _ref;
  96. if (_isArray) {
  97. if (_i >= _iterator.length) break;
  98. _ref = _iterator[_i++];
  99. } else {
  100. _i = _iterator.next();
  101. if (_i.done) break;
  102. _ref = _i.value;
  103. }
  104. var prev = _ref;
  105. var from = this.relative(prev.file);
  106. var root = prev.root || _path2.default.dirname(prev.file);
  107. var map = void 0;
  108. if (this.mapOpts.sourcesContent === false) {
  109. map = new _sourceMap2.default.SourceMapConsumer(prev.text);
  110. if (map.sourcesContent) {
  111. map.sourcesContent = map.sourcesContent.map(function () {
  112. return null;
  113. });
  114. }
  115. } else {
  116. map = prev.consumer();
  117. }
  118. this.map.applySourceMap(map, from, this.relative(root));
  119. }
  120. };
  121. MapGenerator.prototype.isAnnotation = function isAnnotation() {
  122. if (this.isInline()) {
  123. return true;
  124. } else if (typeof this.mapOpts.annotation !== 'undefined') {
  125. return this.mapOpts.annotation;
  126. } else if (this.previous().length) {
  127. return this.previous().some(function (i) {
  128. return i.annotation;
  129. });
  130. } else {
  131. return true;
  132. }
  133. };
  134. MapGenerator.prototype.addAnnotation = function addAnnotation() {
  135. var content = void 0;
  136. if (this.isInline()) {
  137. content = 'data:application/json;base64,' + _jsBase.Base64.encode(this.map.toString());
  138. } else if (typeof this.mapOpts.annotation === 'string') {
  139. content = this.mapOpts.annotation;
  140. } else {
  141. content = this.outputFile() + '.map';
  142. }
  143. var eol = '\n';
  144. if (this.css.indexOf('\r\n') !== -1) eol = '\r\n';
  145. this.css += eol + '/*# sourceMappingURL=' + content + ' */';
  146. };
  147. MapGenerator.prototype.outputFile = function outputFile() {
  148. if (this.opts.to) {
  149. return this.relative(this.opts.to);
  150. } else if (this.opts.from) {
  151. return this.relative(this.opts.from);
  152. } else {
  153. return 'to.css';
  154. }
  155. };
  156. MapGenerator.prototype.generateMap = function generateMap() {
  157. this.generateString();
  158. if (this.isSourcesContent()) this.setSourcesContent();
  159. if (this.previous().length > 0) this.applyPrevMaps();
  160. if (this.isAnnotation()) this.addAnnotation();
  161. if (this.isInline()) {
  162. return [this.css];
  163. } else {
  164. return [this.css, this.map];
  165. }
  166. };
  167. MapGenerator.prototype.relative = function relative(file) {
  168. if (file.indexOf('<') === 0) return file;
  169. if (/^\w+:\/\//.test(file)) return file;
  170. var from = this.opts.to ? _path2.default.dirname(this.opts.to) : '.';
  171. if (typeof this.mapOpts.annotation === 'string') {
  172. from = _path2.default.dirname(_path2.default.resolve(from, this.mapOpts.annotation));
  173. }
  174. file = _path2.default.relative(from, file);
  175. if (_path2.default.sep === '\\') {
  176. return file.replace(/\\/g, '/');
  177. } else {
  178. return file;
  179. }
  180. };
  181. MapGenerator.prototype.sourcePath = function sourcePath(node) {
  182. if (this.mapOpts.from) {
  183. return this.mapOpts.from;
  184. } else {
  185. return this.relative(node.source.input.from);
  186. }
  187. };
  188. MapGenerator.prototype.generateString = function generateString() {
  189. var _this3 = this;
  190. this.css = '';
  191. this.map = new _sourceMap2.default.SourceMapGenerator({ file: this.outputFile() });
  192. var line = 1;
  193. var column = 1;
  194. var lines = void 0,
  195. last = void 0;
  196. this.stringify(this.root, function (str, node, type) {
  197. _this3.css += str;
  198. if (node && type !== 'end') {
  199. if (node.source && node.source.start) {
  200. _this3.map.addMapping({
  201. source: _this3.sourcePath(node),
  202. generated: { line: line, column: column - 1 },
  203. original: {
  204. line: node.source.start.line,
  205. column: node.source.start.column - 1
  206. }
  207. });
  208. } else {
  209. _this3.map.addMapping({
  210. source: '<no source>',
  211. original: { line: 1, column: 0 },
  212. generated: { line: line, column: column - 1 }
  213. });
  214. }
  215. }
  216. lines = str.match(/\n/g);
  217. if (lines) {
  218. line += lines.length;
  219. last = str.lastIndexOf('\n');
  220. column = str.length - last;
  221. } else {
  222. column += str.length;
  223. }
  224. if (node && type !== 'start') {
  225. if (node.source && node.source.end) {
  226. _this3.map.addMapping({
  227. source: _this3.sourcePath(node),
  228. generated: { line: line, column: column - 1 },
  229. original: {
  230. line: node.source.end.line,
  231. column: node.source.end.column
  232. }
  233. });
  234. } else {
  235. _this3.map.addMapping({
  236. source: '<no source>',
  237. original: { line: 1, column: 0 },
  238. generated: { line: line, column: column - 1 }
  239. });
  240. }
  241. }
  242. });
  243. };
  244. MapGenerator.prototype.generate = function generate() {
  245. this.clearAnnotation();
  246. if (this.isMap()) {
  247. return this.generateMap();
  248. } else {
  249. var result = '';
  250. this.stringify(this.root, function (i) {
  251. result += i;
  252. });
  253. return [result];
  254. }
  255. };
  256. return MapGenerator;
  257. }();
  258. exports.default = MapGenerator;
  259. module.exports = exports['default'];
  260. //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvbWFwLWdlbmVyYXRvci5lczYiXSwibmFtZXMiOlsiTWFwR2VuZXJhdG9yIiwic3RyaW5naWZ5Iiwicm9vdCIsIm9wdHMiLCJtYXBPcHRzIiwibWFwIiwiaXNNYXAiLCJwcmV2aW91cyIsImxlbmd0aCIsInByZXZpb3VzTWFwcyIsIndhbGsiLCJub2RlIiwic291cmNlIiwiaW5wdXQiLCJpbmRleE9mIiwicHVzaCIsImlzSW5saW5lIiwiaW5saW5lIiwiYW5ub3RhdGlvbiIsInNvbWUiLCJpIiwiaXNTb3VyY2VzQ29udGVudCIsInNvdXJjZXNDb250ZW50Iiwid2l0aENvbnRlbnQiLCJjbGVhckFubm90YXRpb24iLCJub2RlcyIsInR5cGUiLCJ0ZXh0IiwicmVtb3ZlQ2hpbGQiLCJzZXRTb3VyY2VzQ29udGVudCIsImFscmVhZHkiLCJmcm9tIiwicmVsYXRpdmUiLCJzZXRTb3VyY2VDb250ZW50IiwiY3NzIiwiYXBwbHlQcmV2TWFwcyIsInByZXYiLCJmaWxlIiwiZGlybmFtZSIsIlNvdXJjZU1hcENvbnN1bWVyIiwiY29uc3VtZXIiLCJhcHBseVNvdXJjZU1hcCIsImlzQW5ub3RhdGlvbiIsImFkZEFubm90YXRpb24iLCJjb250ZW50IiwiZW5jb2RlIiwidG9TdHJpbmciLCJvdXRwdXRGaWxlIiwiZW9sIiwidG8iLCJnZW5lcmF0ZU1hcCIsImdlbmVyYXRlU3RyaW5nIiwidGVzdCIsInJlc29sdmUiLCJzZXAiLCJyZXBsYWNlIiwic291cmNlUGF0aCIsIlNvdXJjZU1hcEdlbmVyYXRvciIsImxpbmUiLCJjb2x1bW4iLCJsaW5lcyIsImxhc3QiLCJzdHIiLCJzdGFydCIsImFkZE1hcHBpbmciLCJnZW5lcmF0ZWQiLCJvcmlnaW5hbCIsIm1hdGNoIiwibGFzdEluZGV4T2YiLCJlbmQiLCJnZW5lcmF0ZSIsInJlc3VsdCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0lBRXFCQSxZO0FBRWpCLDBCQUFZQyxTQUFaLEVB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S2YsS0FBS0MsTUFBTCxJQUFlRCxLQUFLQyxNQUFMLENBQVl5RCxHQUFoQyxFQUFzQztBQUNsQywyQkFBS2hFLEdBQUwsQ0FBUzJELFVBQVQsQ0FBb0I7QUFDaEJwRCxnQ0FBVyxPQUFLNEMsVUFBTCxDQUFnQjdDLElBQWhCLENBREs7QUFFaEJzRCxtQ0FBVyxFQUFFUCxVQUFGLEVBQVFDLFFBQVFBLFNBQVMsQ0FBekIsRUFGSztBQUdoQk8sa0NBQVc7QUFDUFIsa0NBQVEvQyxLQUFLQyxNQUFMLENBQVl5RCxHQUFaLENBQWdCWCxJQURqQjtBQUVQQyxvQ0FBUWhELEtBQUtDLE1BQUwsQ0FBWXlELEdBQVosQ0FBZ0JWO0FBRmpCO0FBSEsscUJBQXBCO0FBUUgsaUJBVEQsTUFTTztBQUNILDJCQUFLdEQsR0FBTCxDQUFTMkQsVUFBVCxDQUFvQjtBQUNoQnBELGdDQUFXLGFBREs7QUFFaEJzRCxrQ0FBVyxFQUFFUixNQUFNLENBQVIsRUFBV0MsUUFBUSxDQUFuQixFQUZLO0FBR2hCTSxtQ0FBVyxFQUFFUCxVQUFGLEVBQVFDLFFBQVFBLFNBQVMsQ0FBekI7QUFISyxxQkFBcEI7QUFLSDtBQUNKO0FBQ0osU0FqREQ7QUFrREgsSzs7MkJBRURXLFEsdUJBQVc7QUFDUCxhQUFLOUMsZUFBTDs7QUFFQSxZQUFLLEtBQUtsQixLQUFMLEVBQUwsRUFBb0I7QUFDaEIsbUJBQU8sS0FBSzRDLFdBQUwsRUFBUDtBQUNILFNBRkQsTUFFTztBQUNILGdCQUFJcUIsU0FBUyxFQUFiO0FBQ0EsaUJBQUt0RSxTQUFMLENBQWUsS0FBS0MsSUFBcEIsRUFBMEIsYUFBSztBQUMzQnFFLDBCQUFVbkQsQ0FBVjtBQUNILGFBRkQ7QUFHQSxtQkFBTyxDQUFDbUQsTUFBRCxDQUFQO0FBQ0g7QUFDSixLOzs7OztrQkFwUWdCdkUsWSIsImZpbGUiOiJtYXAtZ2VuZXJhdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZTY0IH0gZnJvbSAnanMtYmFzZTY0JztcbmltcG9ydCAgIG1vemlsbGEgIGZyb20gJ3NvdXJjZS1tYXAnO1xuaW1wb3J0ICAgcGF0aCAgICAgZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcEdlbmVyYXRvciB7XG5cbiAgICBjb25zdHJ1Y3RvcihzdHJpbmdpZnksIHJvb3QsIG9wdHMpIHtcbiAgICAgICAgdGhpcy5zdHJpbmdpZnkgPSBzdHJpbmdpZnk7XG4gICAgICAgIHRoaXMubWFwT3B0cyAgID0gb3B0cy5tYXAgfHwgeyB9O1xuICAgICAgICB0aGlzLnJvb3QgICAgICA9IHJvb3Q7XG4gICAgICAgIHRoaXMub3B0cyAgICAgID0gb3B0cztcbiAgICB9XG5cbiAgICBpc01hcCgpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgdGhpcy5vcHRzLm1hcCAhPT0gJ3VuZGVmaW5lZCcgKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLm9wdHMubWFwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXMoKS5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJldmlvdXMoKSB7XG4gICAgICAgIGlmICggIXRoaXMucHJldmlvdXNNYXBzICkge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c01hcHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucm9vdC53YWxrKCBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIG5vZGUuc291cmNlICYmIG5vZGUuc291cmNlLmlucHV0Lm1hcCApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcCA9IG5vZGUuc291cmNlLmlucHV0Lm1hcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzLnByZXZpb3VzTWFwcy5pbmRleE9mKG1hcCkgPT09IC0xICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c01hcHMucHVzaChtYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91c01hcHM7XG4gICAgfVxuXG4gICAgaXNJbmxpbmUoKSB7XG4gICAgICAgIGlmICggdHlwZW9mIHRoaXMubWFwT3B0cy5pbmxpbmUgIT09ICd1bmRlZmluZWQnICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwT3B0cy5pbmxpbmU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYW5ub3RhdGlvbiA9IHRoaXMubWFwT3B0cy5hbm5vdGF0aW9uO1xuICAgICAgICBpZiAoIHR5cGVvZiBhbm5vdGF0aW9uICE9PSAndW5kZWZpbmVkJyAmJiBhbm5vdGF0aW9uICE9PSB0cnVlICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCB0aGlzLnByZXZpb3VzKCkubGVuZ3RoICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXMoKS5zb21lKCBpID0+IGkuaW5saW5lICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzU291cmNlc0NvbnRlbnQoKSB7XG4gICAgICAgIGlmICggdHlwZW9mIHRoaXMubWFwT3B0cy5zb3VyY2VzQ29udGVudCAhPT0gJ3VuZGVmaW5lZCcgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBPcHRzLnNvdXJjZXNDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICggdGhpcy5wcmV2aW91cygpLmxlbmd0aCApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzKCkuc29tZSggaSA9PiBpLndpdGhDb250ZW50KCkgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXJBbm5vdGF0aW9uKCkge1xuICAgICAgICBpZiAoIHRoaXMubWFwT3B0cy5hbm5vdGF0aW9uID09PSBmYWxzZSApIHJldHVybjtcblxuICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgZm9yICggbGV0IGkgPSB0aGlzLnJvb3Qubm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XG4gICAgICAgICAgICBub2RlID0gdGhpcy5yb290Lm5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKCBub2RlLnR5cGUgIT09ICdjb21tZW50JyApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCBub2RlLnRleHQuaW5kZXhPZignIyBzb3VyY2VNYXBwaW5nVVJMPScpID09PSAwICkge1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdC5yZW1vdmVDaGlsZChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFNvdXJjZXNDb250ZW50KCkge1xuICAgICAgICBsZXQgYWxyZWFkeSA9IHsgfTtcbiAgICAgICAgdGhpcy5yb290LndhbGsoIG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKCBub2RlLnNvdXJjZSApIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IG5vZGUuc291cmNlLmlucHV0LmZyb207XG4gICAgICAgICAgICAgICAgaWYgKCBmcm9tICYmICFhbHJlYWR5W2Zyb21dICkge1xuICAgICAgICAgICAgICAgICAgICBhbHJlYWR5W2Zyb21dID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGF0aXZlID0gdGhpcy5yZWxhdGl2ZShmcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAuc2V0U291cmNlQ29udGVudChyZWxhdGl2ZSwgbm9kZS5zb3VyY2UuaW5wdXQuY3NzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFwcGx5UHJldk1hcHMoKSB7XG4gICAgICAgIGZvciAoIGxldCBwcmV2IG9mIHRoaXMucHJldmlvdXMoKSApIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gdGhpcy5yZWxhdGl2ZShwcmV2LmZpbGUpO1xuICAgICAgICAgICAgbGV0IHJvb3QgPSBwcmV2LnJvb3QgfHwgcGF0aC5kaXJuYW1lKHByZXYuZmlsZSk7XG4gICAgICAgICAgICBsZXQgbWFwO1xuXG4gICAgICAgICAgICBpZiAoIHRoaXMubWFwT3B0cy5zb3VyY2VzQ29udGVudCA9PT0gZmFsc2UgKSB7XG4gICAgICAgICAgICAgICAgbWFwID0gbmV3IG1vemlsbGEuU291cmNlTWFwQ29uc3VtZXIocHJldi50ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoIG1hcC5zb3VyY2VzQ29udGVudCApIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnNvdXJjZXNDb250ZW50ID0gbWFwLnNvdXJjZXNDb250ZW50Lm1hcCggKCkgPT4gbnVsbCApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFwID0gcHJldi5jb25zdW1lcigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1hcC5hcHBseVNvdXJjZU1hcChtYXAsIGZyb20sIHRoaXMucmVsYXRpdmUocm9vdCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNBbm5vdGF0aW9uKCkge1xuICAgICAgICBpZiAoIHRoaXMuaXNJbmxpbmUoKSApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdGhpcy5tYXBPcHRzLmFubm90YXRpb24gIT09ICd1bmRlZmluZWQnICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwT3B0cy5hbm5vdGF0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKCB0aGlzLnByZXZpb3VzKCkubGVuZ3RoICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXMoKS5zb21lKCBpID0+IGkuYW5ub3RhdGlvbiApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRBbm5vdGF0aW9uKCkge1xuICAgICAgICBsZXQgY29udGVudDtcblxuICAgICAgICBpZiAoIHRoaXMuaXNJbmxpbmUoKSApIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCwnICtcbiAgICAgICAgICAgICAgICAgICAgICAgQmFzZTY0LmVuY29kZSggdGhpcy5tYXAudG9TdHJpbmcoKSApO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB0aGlzLm1hcE9wdHMuYW5ub3RhdGlvbiA9PT0gJ3N0cmluZycgKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gdGhpcy5tYXBPcHRzLmFubm90YXRpb247XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLm91dHB1dEZpbGUoKSArICcubWFwJztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlb2wgICA9ICdcXG4nO1xuICAgICAgICBpZiAoIHRoaXMuY3NzLmluZGV4T2YoJ1xcclxcbicpICE9PSAtMSApIGVvbCA9ICdcXHJcXG4nO1xuXG4gICAgICAgIHRoaXMuY3NzICs9IGVvbCArICcvKiMgc291cmNlTWFwcGluZ1VSTD0nICsgY29udGVudCArICcgKi8nO1xuICAgIH1cblxuICAgIG91dHB1dEZpbGUoKSB7XG4gICAgICAgIGlmICggdGhpcy5vcHRzLnRvICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpdmUodGhpcy5vcHRzLnRvKTtcbiAgICAgICAgfSBlbHNlIGlmICggdGhpcy5vcHRzLmZyb20gKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZSh0aGlzLm9wdHMuZnJvbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ3RvLmNzcyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZU1hcCgpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVN0cmluZygpO1xuICAgICAgICBpZiAoIHRoaXMuaXNTb3VyY2VzQ29udGVudCgpICkgICAgdGhpcy5zZXRTb3VyY2VzQ29udGVudCgpO1xuICAgICAgICBpZiAoIHRoaXMucHJldmlvdXMoKS5sZW5ndGggPiAwICkgdGhpcy5hcHBseVByZXZNYXBzKCk7XG4gICAgICAgIGlmICggdGhpcy5pc0Fubm90YXRpb24oKSApICAgICAgICB0aGlzLmFkZEFubm90YXRpb24oKTtcblxuICAgICAgICBpZiAoIHRoaXMuaXNJbmxpbmUoKSApIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5jc3NdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmNzcywgdGhpcy5tYXBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVsYXRpdmUoZmlsZSkge1xuICAgICAgICBpZiAoIGZpbGUuaW5kZXhPZignPCcpID09PSAwICkgcmV0dXJuIGZpbGU7XG4gICAgICAgIGlmICggL15cXHcrOlxcL1xcLy8udGVzdChmaWxlKSApIHJldHVybiBmaWxlO1xuXG4gICAgICAgIGxldCBmcm9tID0gdGhpcy5vcHRzLnRvID8gcGF0aC5kaXJuYW1lKHRoaXMub3B0cy50bykgOiAnLic7XG5cbiAgICAgICAgaWYgKCB0eXBlb2YgdGhpcy5tYXBPcHRzLmFubm90YXRpb24gPT09ICdzdHJpbmcnICkge1xuICAgICAgICAgICAgZnJvbSA9IHBhdGguZGlybmFtZSggcGF0aC5yZXNvbHZlKGZyb20sIHRoaXMubWFwT3B0cy5hbm5vdGF0aW9uKSApO1xuICAgICAgICB9XG5cbiAgICAgICAgZmlsZSA9IHBhdGgucmVsYXRpdmUoZnJvbSwgZmlsZSk7XG4gICAgICAgIGlmICggcGF0aC5zZXAgPT09ICdcXFxcJyApIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc291cmNlUGF0aChub2RlKSB7XG4gICAgICAgIGlmICggdGhpcy5tYXBPcHRzLmZyb20gKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBPcHRzLmZyb207XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZShub2RlLnNvdXJjZS5pbnB1dC5mcm9tKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlU3RyaW5nKCkge1xuICAgICAgICB0aGlzLmNzcyA9ICcnO1xuICAgICAgICB0aGlzLm1hcCA9IG5ldyBtb3ppbGxhLlNvdXJjZU1hcEdlbmVyYXRvcih7IGZpbGU6IHRoaXMub3V0cHV0RmlsZSgpIH0pO1xuXG4gICAgICAgIGxldCBsaW5lICAgPSAxO1xuICAgICAgICBsZXQgY29sdW1uID0gMTtcblxuICAgICAgICBsZXQgbGluZXMsIGxhc3Q7XG4gICAgICAgIHRoaXMuc3RyaW5naWZ5KHRoaXMucm9vdCwgKHN0ciwgbm9kZSwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jc3MgKz0gc3RyO1xuXG4gICAgICAgICAgICBpZiAoIG5vZGUgJiYgdHlwZSAhPT0gJ2VuZCcgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCBub2RlLnNvdXJjZSAmJiBub2RlLnNvdXJjZS5zdGFydCApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICAgIHRoaXMuc291cmNlUGF0aChub2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZDogeyBsaW5lLCBjb2x1bW46IGNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsOiAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbm9kZS5zb3VyY2Uuc3RhcnQubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG5vZGUuc291cmNlLnN0YXJ0LmNvbHVtbiAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICAgICc8bm8gc291cmNlPicsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbDogIHsgbGluZTogMSwgY29sdW1uOiAwIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHsgbGluZSwgY29sdW1uOiBjb2x1bW4gLSAxIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lcyA9IHN0ci5tYXRjaCgvXFxuL2cpO1xuICAgICAgICAgICAgaWYgKCBsaW5lcyApIHtcbiAgICAgICAgICAgICAgICBsaW5lICArPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGFzdCAgID0gc3RyLmxhc3RJbmRleE9mKCdcXG4nKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBzdHIubGVuZ3RoIC0gbGFzdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sdW1uICs9IHN0ci5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICggbm9kZSAmJiB0eXBlICE9PSAnc3RhcnQnICkge1xuICAgICAgICAgICAgICAgIGlmICggbm9kZS5zb3VyY2UgJiYgbm9kZS5zb3VyY2UuZW5kICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogICAgdGhpcy5zb3VyY2VQYXRoKG5vZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkOiB7IGxpbmUsIGNvbHVtbjogY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICBub2RlLnNvdXJjZS5lbmQubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG5vZGUuc291cmNlLmVuZC5jb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICAgICc8bm8gc291cmNlPicsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbDogIHsgbGluZTogMSwgY29sdW1uOiAwIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHsgbGluZSwgY29sdW1uOiBjb2x1bW4gLSAxIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZW5lcmF0ZSgpIHtcbiAgICAgICAgdGhpcy5jbGVhckFubm90YXRpb24oKTtcblxuICAgICAgICBpZiAoIHRoaXMuaXNNYXAoKSApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlTWFwKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLnN0cmluZ2lmeSh0aGlzLnJvb3QsIGkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3Jlc3VsdF07XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiJdfQ==