Software zum Installieren eines Smart-Mirror Frameworks , zum Nutzen von hochschulrelevanten Informationen, auf einem Raspberry-Pi.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

scss-tokenize.js 43KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. "use strict";
  2. var SINGLE_QUOTE = '\''.charCodeAt(0);
  3. var DOUBLE_QUOTE = '"'.charCodeAt(0);
  4. var BACKSLASH = '\\'.charCodeAt(0);
  5. var SLASH = '/'.charCodeAt(0);
  6. var NEWLINE = '\n'.charCodeAt(0);
  7. var SPACE = ' '.charCodeAt(0);
  8. var FEED = '\f'.charCodeAt(0);
  9. var TAB = '\t'.charCodeAt(0);
  10. var CR = '\r'.charCodeAt(0);
  11. var OPEN_SQUARE = '['.charCodeAt(0);
  12. var CLOSE_SQUARE = ']'.charCodeAt(0);
  13. var OPEN_PARENTHESES = '('.charCodeAt(0);
  14. var CLOSE_PARENTHESES = ')'.charCodeAt(0);
  15. var OPEN_CURLY = '{'.charCodeAt(0);
  16. var CLOSE_CURLY = '}'.charCodeAt(0);
  17. var SEMICOLON = ';'.charCodeAt(0);
  18. var ASTERISK = '*'.charCodeAt(0);
  19. var COLON = ':'.charCodeAt(0);
  20. var AT = '@'.charCodeAt(0); // SCSS PATCH {
  21. var COMMA = ','.charCodeAt(0);
  22. var HASH = '#'.charCodeAt(0); // } SCSS PATCH
  23. var RE_AT_END = /[ \n\t\r\f{}()'"\\;/[\]#]/g;
  24. var RE_WORD_END = /[ \n\t\r\f(){}:;@!'"\\\][#]|\/(?=\*)/g;
  25. var RE_BAD_BRACKET = /.[\\/("'\n]/;
  26. var RE_HEX_ESCAPE = /[a-f0-9]/i;
  27. var RE_NEW_LINE = /[\r\f\n]/g; // SCSS PATCH
  28. // SCSS PATCH function name was changed
  29. module.exports = function scssTokenize(input, options) {
  30. if (options === void 0) {
  31. options = {};
  32. }
  33. var css = input.css.valueOf();
  34. var ignore = options.ignoreErrors;
  35. var code, next, quote, lines, last, content, escape, nextLine, nextOffset, escaped, prev, n, currentToken;
  36. var brackets; // SCSS PATCH
  37. var length = css.length;
  38. var offset = -1;
  39. var line = 1;
  40. var pos = 0;
  41. var buffer = [];
  42. var returned = [];
  43. function unclosed(what) {
  44. throw input.error('Unclosed ' + what, line, pos - offset);
  45. }
  46. function endOfFile() {
  47. return returned.length === 0 && pos >= length;
  48. } // SCSS PATCH {
  49. function interpolation() {
  50. var deep = 1;
  51. var stringQuote = false;
  52. var stringEscaped = false;
  53. while (deep > 0) {
  54. next += 1;
  55. if (css.length <= next) unclosed('interpolation');
  56. code = css.charCodeAt(next);
  57. n = css.charCodeAt(next + 1);
  58. if (stringQuote) {
  59. if (!stringEscaped && code === stringQuote) {
  60. stringQuote = false;
  61. stringEscaped = false;
  62. } else if (code === BACKSLASH) {
  63. stringEscaped = !escaped;
  64. } else if (stringEscaped) {
  65. stringEscaped = false;
  66. }
  67. } else if (code === SINGLE_QUOTE || code === DOUBLE_QUOTE) {
  68. stringQuote = code;
  69. } else if (code === CLOSE_CURLY) {
  70. deep -= 1;
  71. } else if (code === HASH && n === OPEN_CURLY) {
  72. deep += 1;
  73. }
  74. }
  75. } // } SCSS PATCH
  76. function nextToken() {
  77. if (returned.length) return returned.pop();
  78. if (pos >= length) return;
  79. code = css.charCodeAt(pos);
  80. if (code === NEWLINE || code === FEED || code === CR && css.charCodeAt(pos + 1) !== NEWLINE) {
  81. offset = pos;
  82. line += 1;
  83. }
  84. switch (code) {
  85. case NEWLINE:
  86. case SPACE:
  87. case TAB:
  88. case CR:
  89. case FEED:
  90. next = pos;
  91. do {
  92. next += 1;
  93. code = css.charCodeAt(next);
  94. if (code === NEWLINE) {
  95. offset = next;
  96. line += 1;
  97. }
  98. } while (code === SPACE || code === NEWLINE || code === TAB || code === CR || code === FEED);
  99. currentToken = ['space', css.slice(pos, next)];
  100. pos = next - 1;
  101. break;
  102. case OPEN_SQUARE:
  103. currentToken = ['[', '[', line, pos - offset];
  104. break;
  105. case CLOSE_SQUARE:
  106. currentToken = [']', ']', line, pos - offset];
  107. break;
  108. case OPEN_CURLY:
  109. currentToken = ['{', '{', line, pos - offset];
  110. break;
  111. case CLOSE_CURLY:
  112. currentToken = ['}', '}', line, pos - offset];
  113. break;
  114. // SCSS PATCH {
  115. case COMMA:
  116. currentToken = ['word', ',', line, pos - offset, line, pos - offset + 1];
  117. break;
  118. // } SCSS PATCH
  119. case COLON:
  120. currentToken = [':', ':', line, pos - offset];
  121. break;
  122. case SEMICOLON:
  123. currentToken = [';', ';', line, pos - offset];
  124. break;
  125. case OPEN_PARENTHESES:
  126. prev = buffer.length ? buffer.pop()[1] : '';
  127. n = css.charCodeAt(pos + 1); // SCSS PATCH {
  128. if (prev === 'url' && n !== SINGLE_QUOTE && n !== DOUBLE_QUOTE) {
  129. brackets = 1;
  130. escaped = false;
  131. next = pos + 1;
  132. while (next <= css.length - 1) {
  133. n = css.charCodeAt(next);
  134. if (n === BACKSLASH) {
  135. escaped = !escaped;
  136. } else if (n === OPEN_PARENTHESES) {
  137. brackets += 1;
  138. } else if (n === CLOSE_PARENTHESES) {
  139. brackets -= 1;
  140. if (brackets === 0) break;
  141. }
  142. next += 1;
  143. }
  144. content = css.slice(pos, next + 1);
  145. lines = content.split('\n');
  146. last = lines.length - 1;
  147. if (last > 0) {
  148. nextLine = line + last;
  149. nextOffset = next - lines[last].length;
  150. } else {
  151. nextLine = line;
  152. nextOffset = offset;
  153. }
  154. currentToken = ['brackets', content, line, pos - offset, nextLine, next - nextOffset];
  155. offset = nextOffset;
  156. line = nextLine;
  157. pos = next; // } SCSS PATCH
  158. } else {
  159. next = css.indexOf(')', pos + 1);
  160. content = css.slice(pos, next + 1);
  161. if (next === -1 || RE_BAD_BRACKET.test(content)) {
  162. currentToken = ['(', '(', line, pos - offset];
  163. } else {
  164. currentToken = ['brackets', content, line, pos - offset, line, next - offset];
  165. pos = next;
  166. }
  167. }
  168. break;
  169. case CLOSE_PARENTHESES:
  170. currentToken = [')', ')', line, pos - offset];
  171. break;
  172. case SINGLE_QUOTE:
  173. case DOUBLE_QUOTE:
  174. // SCSS PATCH {
  175. quote = code;
  176. next = pos;
  177. escaped = false;
  178. while (next < length) {
  179. next++;
  180. if (next === length) unclosed('string');
  181. code = css.charCodeAt(next);
  182. n = css.charCodeAt(next + 1);
  183. if (!escaped && code === quote) {
  184. break;
  185. } else if (code === BACKSLASH) {
  186. escaped = !escaped;
  187. } else if (escaped) {
  188. escaped = false;
  189. } else if (code === HASH && n === OPEN_CURLY) {
  190. interpolation();
  191. }
  192. } // } SCSS PATCH
  193. content = css.slice(pos, next + 1);
  194. lines = content.split('\n');
  195. last = lines.length - 1;
  196. if (last > 0) {
  197. nextLine = line + last;
  198. nextOffset = next - lines[last].length;
  199. } else {
  200. nextLine = line;
  201. nextOffset = offset;
  202. }
  203. currentToken = ['string', css.slice(pos, next + 1), line, pos - offset, nextLine, next - nextOffset];
  204. offset = nextOffset;
  205. line = nextLine;
  206. pos = next;
  207. break;
  208. case AT:
  209. RE_AT_END.lastIndex = pos + 1;
  210. RE_AT_END.test(css);
  211. if (RE_AT_END.lastIndex === 0) {
  212. next = css.length - 1;
  213. } else {
  214. next = RE_AT_END.lastIndex - 2;
  215. }
  216. currentToken = ['at-word', css.slice(pos, next + 1), line, pos - offset, line, next - offset];
  217. pos = next;
  218. break;
  219. case BACKSLASH:
  220. next = pos;
  221. escape = true;
  222. while (css.charCodeAt(next + 1) === BACKSLASH) {
  223. next += 1;
  224. escape = !escape;
  225. }
  226. code = css.charCodeAt(next + 1);
  227. if (escape && code !== SLASH && code !== SPACE && code !== NEWLINE && code !== TAB && code !== CR && code !== FEED) {
  228. next += 1;
  229. if (RE_HEX_ESCAPE.test(css.charAt(next))) {
  230. while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) {
  231. next += 1;
  232. }
  233. if (css.charCodeAt(next + 1) === SPACE) {
  234. next += 1;
  235. }
  236. }
  237. }
  238. currentToken = ['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset];
  239. pos = next;
  240. break;
  241. default:
  242. // SCSS PATCH {
  243. n = css.charCodeAt(pos + 1);
  244. if (code === HASH && n === OPEN_CURLY) {
  245. next = pos;
  246. interpolation();
  247. content = css.slice(pos, next + 1);
  248. lines = content.split('\n');
  249. last = lines.length - 1;
  250. if (last > 0) {
  251. nextLine = line + last;
  252. nextOffset = next - lines[last].length;
  253. } else {
  254. nextLine = line;
  255. nextOffset = offset;
  256. }
  257. currentToken = ['word', content, line, pos - offset, nextLine, next - nextOffset];
  258. offset = nextOffset;
  259. line = nextLine;
  260. pos = next;
  261. } else if (code === SLASH && n === ASTERISK) {
  262. // } SCSS PATCH
  263. next = css.indexOf('*/', pos + 2) + 1;
  264. if (next === 0) {
  265. if (ignore) {
  266. next = css.length;
  267. } else {
  268. unclosed('comment');
  269. }
  270. }
  271. content = css.slice(pos, next + 1);
  272. lines = content.split('\n');
  273. last = lines.length - 1;
  274. if (last > 0) {
  275. nextLine = line + last;
  276. nextOffset = next - lines[last].length;
  277. } else {
  278. nextLine = line;
  279. nextOffset = offset;
  280. }
  281. currentToken = ['comment', content, line, pos - offset, nextLine, next - nextOffset];
  282. offset = nextOffset;
  283. line = nextLine;
  284. pos = next; // SCSS PATCH {
  285. } else if (code === SLASH && n === SLASH) {
  286. RE_NEW_LINE.lastIndex = pos + 1;
  287. RE_NEW_LINE.test(css);
  288. if (RE_NEW_LINE.lastIndex === 0) {
  289. next = css.length - 1;
  290. } else {
  291. next = RE_NEW_LINE.lastIndex - 2;
  292. }
  293. content = css.slice(pos, next + 1);
  294. currentToken = ['comment', content, line, pos - offset, line, next - offset, 'inline'];
  295. pos = next; // } SCSS PATCH
  296. } else {
  297. RE_WORD_END.lastIndex = pos + 1;
  298. RE_WORD_END.test(css);
  299. if (RE_WORD_END.lastIndex === 0) {
  300. next = css.length - 1;
  301. } else {
  302. next = RE_WORD_END.lastIndex - 2;
  303. }
  304. currentToken = ['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset];
  305. buffer.push(currentToken);
  306. pos = next;
  307. }
  308. break;
  309. }
  310. pos++;
  311. return currentToken;
  312. }
  313. function back(token) {
  314. returned.push(token);
  315. }
  316. return {
  317. back: back,
  318. nextToken: nextToken,
  319. endOfFile: endOfFile
  320. };
  321. };
  322. //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjc3MtdG9rZW5pemUuZXM2Il0sIm5hbWVzIjpbIlNJTkdMRV9RVU9URSIsImNoYXJDb2RlQXQiLCJET1VCTEVfUVVPVEUiLCJCQUNLU0xBU0giLCJTTEFTSCIsIk5FV0xJTkUiLCJTUEFDRSIsIkZFRUQiLCJUQUIiLCJDUiIsIk9QRU5fU1FVQVJFIiwiQ0xPU0VfU1FVQVJFIiwiT1BFTl9QQVJFTlRIRVNFUyIsIkNMT1NFX1BBUkVOVEhFU0VTIiwiT1BFTl9DVVJMWSIsIkNMT1NFX0NVUkxZIiwiU0VNSUNPTE9OIiwiQVNURVJJU0siLCJDT0xPTiIsIkFUIiwiQ09NTUEiLCJIQVNIIiwiUkVfQVRfRU5EIiwiUkVfV09SRF9FTkQiLCJSRV9CQURfQlJBQ0tFVCIsIlJFX0hFWF9FU0NBUEUiLCJSRV9ORVdfTElORSIsIm1vZHVsZSIsImV4cG9ydHMiLCJzY3NzVG9rZW5pemUiLCJpbnB1dCIsIm9wdGlvbnMiLCJjc3MiLCJ2YWx1ZU9mIiwiaWdub3JlIiwiaWdub3JlRXJyb3JzIiwiY29kZSIsIm5leHQiLCJxdW90ZSIsImxpbmVzIiwibGFzdCIsImNvbnRlbnQiLCJlc2NhcGUiLCJuZXh0TGluZSIsIm5leHRPZmZzZXQiLCJlc2NhcGVkIiwicHJldiIsIm4iLCJjdXJyZW50VG9rZW4iLCJicmFja2V0cyIsImxlbmd0aCIsIm9mZnNldCIsImxpbmUiLCJwb3MiLCJidWZmZXIiLCJyZXR1cm5lZCIsInVuY2xvc2VkIiwid2hhdCIsImVycm9yIiwiZW5kT2ZGaWxlIiwiaW50ZXJwb2xhdGlvbiIsImRlZXAiLCJzdHJpbmdRdW90ZSIsInN0cmluZ0VzY2FwZWQiLCJuZXh0VG9rZW4iLCJwb3AiLCJzbGljZSIsInNwbGl0IiwiaW5kZXhPZiIsInRlc3QiLCJsYXN0SW5kZXgiLCJjaGFyQXQiLCJwdXNoIiwiYmFjayIsInRva2VuIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLFlBQVksR0FBRyxLQUFLQyxVQUFMLENBQWdCLENBQWhCLENBQXJCO0FBQ0EsSUFB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WyJjb25zdCBTSU5HTEVfUVVPVEUgPSAnXFwnJy5jaGFyQ29kZUF0KDApXG5jb25zdCBET1VCTEVfUVVPVEUgPSAnXCInLmNoYXJDb2RlQXQoMClcbmNvbnN0IEJBQ0tTTEFTSCA9ICdcXFxcJy5jaGFyQ29kZUF0KDApXG5jb25zdCBTTEFTSCA9ICcvJy5jaGFyQ29kZUF0KDApXG5jb25zdCBORVdMSU5FID0gJ1xcbicuY2hhckNvZGVBdCgwKVxuY29uc3QgU1BBQ0UgPSAnICcuY2hhckNvZGVBdCgwKVxuY29uc3QgRkVFRCA9ICdcXGYnLmNoYXJDb2RlQXQoMClcbmNvbnN0IFRBQiA9ICdcXHQnLmNoYXJDb2RlQXQoMClcbmNvbnN0IENSID0gJ1xccicuY2hhckNvZGVBdCgwKVxuY29uc3QgT1BFTl9TUVVBUkUgPSAnWycuY2hhckNvZGVBdCgwKVxuY29uc3QgQ0xPU0VfU1FVQVJFID0gJ10nLmNoYXJDb2RlQXQoMClcbmNvbnN0IE9QRU5fUEFSRU5USEVTRVMgPSAnKCcuY2hhckNvZGVBdCgwKVxuY29uc3QgQ0xPU0VfUEFSRU5USEVTRVMgPSAnKScuY2hhckNvZGVBdCgwKVxuY29uc3QgT1BFTl9DVVJMWSA9ICd7Jy5jaGFyQ29kZUF0KDApXG5jb25zdCBDTE9TRV9DVVJMWSA9ICd9Jy5jaGFyQ29kZUF0KDApXG5jb25zdCBTRU1JQ09MT04gPSAnOycuY2hhckNvZGVBdCgwKVxuY29uc3QgQVNURVJJU0sgPSAnKicuY2hhckNvZGVBdCgwKVxuY29uc3QgQ09MT04gPSAnOicuY2hhckNvZGVBdCgwKVxuY29uc3QgQVQgPSAnQCcuY2hhckNvZGVBdCgwKVxuXG4vLyBTQ1NTIFBBVENIIHtcbmNvbnN0IENPTU1BID0gJywnLmNoYXJDb2RlQXQoMClcbmNvbnN0IEhBU0ggPSAnIycuY2hhckNvZGVBdCgwKVxuLy8gfSBTQ1NTIFBBVENIXG5cbmNvbnN0IFJFX0FUX0VORCA9IC9bIFxcblxcdFxcclxcZnt9KCknXCJcXFxcOy9bXFxdI10vZ1xuY29uc3QgUkVfV09SRF9FTkQgPSAvWyBcXG5cXHRcXHJcXGYoKXt9OjtAISdcIlxcXFxcXF1bI118XFwvKD89XFwqKS9nXG5jb25zdCBSRV9CQURfQlJBQ0tFVCA9IC8uW1xcXFwvKFwiJ1xcbl0vXG5jb25zdCBSRV9IRVhfRVNDQVBFID0gL1thLWYwLTldL2lcblxuY29uc3QgUkVfTkVXX0xJTkUgPSAvW1xcclxcZlxcbl0vZyAvLyBTQ1NTIFBBVENIXG5cbi8vIFNDU1MgUEFUQ0ggZnVuY3Rpb24gbmFtZSB3YXMgY2hhbmdlZFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzY3NzVG9rZW5pemUgKGlucHV0LCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGNzcyA9IGlucHV0LmNzcy52YWx1ZU9mKClcbiAgbGV0IGlnbm9yZSA9IG9wdGlvbnMuaWdub3JlRXJyb3JzXG5cbiAgbGV0IGNvZGUsIG5leHQsIHF1b3RlLCBsaW5lcywgbGFzdCwgY29udGVudCwgZXNjYXBlLFxuICAgIG5leHRMaW5lLCBuZXh0T2Zmc2V0LCBlc2NhcGVkLCBwcmV2LCBuLCBjdXJyZW50VG9rZW5cblxuICBsZXQgYnJhY2tldHMgLy8gU0NTUyBQQVRDSFxuXG4gIGxldCBsZW5ndGggPSBjc3MubGVuZ3RoXG4gIGxldCBvZmZzZXQgPSAtMVxuICBsZXQgbGluZSA9IDFcbiAgbGV0IHBvcyA9IDBcbiAgbGV0IGJ1ZmZlciA9IFtdXG4gIGxldCByZXR1cm5lZCA9IFtdXG5cbiAgZnVuY3Rpb24gdW5jbG9zZWQgKHdoYXQpIHtcbiAgICB0aHJvdyBpbnB1dC5lcnJvcignVW5jbG9zZWQgJyArIHdoYXQsIGxpbmUsIHBvcyAtIG9mZnNldClcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZE9mRmlsZSAoKSB7XG4gICAgcmV0dXJuIHJldHVybmVkLmxlbmd0aCA9PT0gMCAmJiBwb3MgPj0gbGVuZ3RoXG4gIH1cblxuICAvLyBTQ1NTIFBBVENIIHtcbiAgZnVuY3Rpb24gaW50ZXJwb2xhdGlvbiAoKSB7XG4gICAgbGV0IGRlZXAgPSAxXG4gICAgbGV0IHN0cmluZ1F1b3RlID0gZmFsc2VcbiAgICBsZXQgc3RyaW5nRXNjYXBlZCA9IGZhbHNlXG4gICAgd2hpbGUgKGRlZXAgPiAwKSB7XG4gICAgICBuZXh0ICs9IDFcbiAgICAgIGlmIChjc3MubGVuZ3RoIDw9IG5leHQpIHVuY2xvc2VkKCdpbnRlcnBvbGF0aW9uJylcblxuICAgICAgY29kZSA9IGNzcy5jaGFyQ29kZUF0KG5leHQpXG4gICAgICBuID0gY3NzLmNoYXJDb2RlQXQobmV4dCArIDEpXG5cbiAgICAgIGlmIChzdHJpbmdRdW90ZSkge1xuICAgICAgICBpZiAoIXN0cmluZ0VzY2FwZWQgJiYgY29kZSA9PT0gc3RyaW5nUXVvdGUpIHtcbiAgICAgICAgICBzdHJpbmdRdW90ZSA9IGZhbHNlXG4gICAgICAgICAgc3RyaW5nRXNjYXBlZCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gQkFDS1NMQVNIKSB7XG4gICAgICAgICAgc3RyaW5nRXNjYXBlZCA9ICFlc2NhcGVkXG4gICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nRXNjYXBlZCkge1xuICAgICAgICAgIHN0cmluZ0VzY2FwZWQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBjb2RlID09PSBTSU5HTEVfUVVPVEUgfHwgY29kZSA9PT0gRE9VQkxFX1FVT1RFXG4gICAgICApIHtcbiAgICAgICAgc3RyaW5nUXVvdGUgPSBjb2RlXG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IENMT1NFX0NVUkxZKSB7XG4gICAgICAgIGRlZXAgLT0gMVxuICAgICAgfSBlbHNlIGlmIChjb2RlID09PSBIQVNIICYmIG4gPT09IE9QRU5fQ1VSTFkpIHtcbiAgICAgICAgZGVlcCArPSAxXG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIH0gU0NTUyBQQVRDSFxuXG4gIGZ1bmN0aW9uIG5leHRUb2tlbiAoKSB7XG4gICAgaWYgKHJldHVybmVkLmxlbmd0aCkgcmV0dXJuIHJldHVybmVkLnBvcCgpXG4gICAgaWYgKHBvcyA+PSBsZW5ndGgpIHJldHVyblxuXG4gICAgY29kZSA9IGNzcy5jaGFyQ29kZUF0KHBvcylcbiAgICBpZiAoXG4gICAgICBjb2RlID09PSBORVdMSU5FIHx8IGNvZGUgPT09IEZFRUQgfHxcbiAgICAgIChjb2RlID09PSBDUiAmJiBjc3MuY2hhckNvZGVBdChwb3MgKyAxKSAhPT0gTkVXTElORSlcbiAgICApIHtcbiAgICAgIG9mZnNldCA9IHBvc1xuICAgICAgbGluZSArPSAxXG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlIE5FV0xJTkU6XG4gICAgICBjYXNlIFNQQUNFOlxuICAgICAgY2FzZSBUQUI6XG4gICAgICBjYXNlIENSOlxuICAgICAgY2FzZSBGRUVEOlxuICAgICAgICBuZXh0ID0gcG9zXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBuZXh0ICs9IDFcbiAgICAgICAgICBjb2RlID0gY3NzLmNoYXJDb2RlQXQobmV4dClcbiAgICAgICAgICBpZiAoY29kZSA9PT0gTkVXTElORSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dFxuICAgICAgICAgICAgbGluZSArPSAxXG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChjb2RlID09PSBTUEFDRSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPT09IE5FV0xJTkUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb2RlID09PSBUQUIgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb2RlID09PSBDUiB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPT09IEZFRUQpXG5cbiAgICAgICAgY3VycmVudFRva2VuID0gWydzcGFjZScsIGNzcy5zbGljZShwb3MsIG5leHQpXVxuICAgICAgICBwb3MgPSBuZXh0IC0gMVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIE9QRU5fU1FVQVJFOlxuICAgICAgICBjdXJyZW50VG9rZW4gPSBbJ1snLCAnWycsIGxpbmUsIHBvcyAtIG9mZnNldF1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBDTE9TRV9TUVVBUkU6XG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IFsnXScsICddJywgbGluZSwgcG9zIC0gb2Zmc2V0XVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIE9QRU5fQ1VSTFk6XG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IFsneycsICd7JywgbGluZSwgcG9zIC0gb2Zmc2V0XVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIENMT1NFX0NVUkxZOlxuICAgICAgICBjdXJyZW50VG9rZW4gPSBbJ30nLCAnfScsIGxpbmUsIHBvcyAtIG9mZnNldF1cbiAgICAgICAgYnJlYWtcblxuICAgICAgICAvLyBTQ1NTIFBBVENIIHtcbiAgICAgIGNhc2UgQ09NTUE6XG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IFtcbiAgICAgICAgICAnd29yZCcsXG4gICAgICAgICAgJywnLFxuICAgICAgICAgIGxpbmUsIHBvcyAtIG9mZnNldCxcbiAgICAgICAgICBsaW5lLCBwb3MgLSBvZmZzZXQgKyAxXG4gICAgICAgIF1cbiAgICAgICAgYnJlYWtcbiAgICAgICAgLy8gfSBTQ1NTIFBBVENIXG5cbiAgICAgIGNhc2UgQ09MT046XG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IFsnOicsICc6JywgbGluZSwgcG9zIC0gb2Zmc2V0XVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFNFTUlDT0xPTjpcbiAgICAgICAgY3VycmVudFRva2VuID0gWyc7JywgJzsnLCBsaW5lLCBwb3MgLSBvZmZzZXRdXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgT1BFTl9QQVJFTlRIRVNFUzpcbiAgICAgICAgcHJldiA9IGJ1ZmZlci5sZW5ndGggPyBidWZmZXIucG9wKClbMV0gOiAnJ1xuICAgICAgICBuID0gY3NzLmNoYXJDb2RlQXQocG9zICsgMSlcblxuICAgICAgICAvLyBTQ1NTIFBBVENIIHtcbiAgICAgICAgaWYgKHByZXYgPT09ICd1cmwnICYmIG4gIT09IFNJTkdMRV9RVU9URSAmJiBuICE9PSBET1VCTEVfUVVPVEUpIHtcbiAgICAgICAgICBicmFja2V0cyA9IDFcbiAgICAgICAgICBlc2NhcGVkID0gZmFsc2VcbiAgICAgICAgICBuZXh0ID0gcG9zICsgMVxuICAgICAgICAgIHdoaWxlIChuZXh0IDw9IGNzcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBuID0gY3NzLmNoYXJDb2RlQXQobmV4dClcbiAgICAgICAgICAgIGlmIChuID09PSBCQUNLU0xBU0gpIHtcbiAgICAgICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT09IE9QRU5fUEFSRU5USEVTRVMpIHtcbiAgICAgICAgICAgICAgYnJhY2tldHMgKz0gMVxuICAgICAgICAgICAgfSBlbHNlIGlmIChuID09PSBDTE9TRV9QQVJFTlRIRVNFUykge1xuICAgICAgICAgICAgICBicmFja2V0cyAtPSAxXG4gICAgICAgICAgICAgIGlmIChicmFja2V0cyA9PT0gMCkgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHQgKz0gMVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRlbnQgPSBjc3Muc2xpY2UocG9zLCBuZXh0ICsgMSlcbiAgICAgICAgICBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgbGFzdCA9IGxpbmVzLmxlbmd0aCAtIDFcblxuICAgICAgICAgIGlmIChsYXN0ID4gMCkge1xuICAgICAgICAgICAgbmV4dExpbmUgPSBsaW5lICsgbGFzdFxuICAgICAgICAgICAgbmV4dE9mZnNldCA9IG5leHQgLSBsaW5lc1tsYXN0XS5sZW5ndGhcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dExpbmUgPSBsaW5lXG4gICAgICAgICAgICBuZXh0T2Zmc2V0ID0gb2Zmc2V0XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudFRva2VuID0gWydicmFja2V0cycsIGNvbnRlbnQsXG4gICAgICAgICAgICBsaW5lLCBwb3MgLSBvZmZzZXQsXG4gICAgICAgICAgICBuZXh0TGluZSwgbmV4dCAtIG5leHRPZmZzZXRcbiAgICAgICAgICBdXG5cbiAgICAgICAgICBvZmZzZXQgPSBuZXh0T2Zmc2V0XG4gICAgICAgICAgbGluZSA9IG5leHRMaW5lXG4gICAgICAgICAgcG9zID0gbmV4dFxuICAgICAgICAgIC8vIH0gU0NTUyBQQVRDSFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHQgPSBjc3MuaW5kZXhPZignKScsIHBvcyArIDEpXG4gICAgICAgICAgY29udGVudCA9IGNzcy5zbGljZShwb3MsIG5leHQgKyAxKVxuXG4gICAgICAgICAgaWYgKG5leHQgPT09IC0xIHx8IFJFX0JBRF9CUkFDS0VULnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IFsnKCcsICcoJywgbGluZSwgcG9zIC0gb2Zmc2V0XVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50VG9rZW4gPSBbJ2JyYWNrZXRzJywgY29udGVudCxcbiAgICAgICAgICAgICAgbGluZSwgcG9zIC0gb2Zmc2V0LFxuICAgICAgICAgICAgICBsaW5lLCBuZXh0IC0gb2Zmc2V0XG4gICAgICAgICAgICBdXG4gICAgICAgICAgICBwb3MgPSBuZXh0XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBDTE9TRV9QQVJFTlRIRVNFUzpcbiAgICAgICAgY3VycmVudFRva2VuID0gWycpJywgJyknLCBsaW5lLCBwb3MgLSBvZmZzZXRdXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgU0lOR0xFX1FVT1RFOlxuICAgICAgY2FzZSBET1VCTEVfUVVPVEU6XG4gICAgICAgIC8vIFNDU1MgUEFUQ0gge1xuICAgICAgICBxdW90ZSA9IGNvZGVcbiAgICAgICAgbmV4dCA9IHBvc1xuXG4gICAgICAgIGVzY2FwZWQgPSBmYWxzZVxuICAgICAgICB3aGlsZSAobmV4dCA8IGxlbmd0aCkge1xuICAgICAgICAgIG5leHQrK1xuICAgICAgICAgIGlmIChuZXh0ID09PSBsZW5ndGgpIHVuY2xvc2VkKCdzdHJpbmcnKVxuXG4gICAgICAgICAgY29kZSA9IGNzcy5jaGFyQ29kZUF0KG5leHQpXG4gICAgICAgICAgbiA9IGNzcy5jaGFyQ29kZUF0KG5leHQgKyAxKVxuXG4gICAgICAgICAgaWYgKCFlc2NhcGVkICYmIGNvZGUgPT09IHF1b3RlKSB7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gQkFDS1NMQVNIKSB7XG4gICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWRcbiAgICAgICAgICB9IGVsc2UgaWYgKGVzY2FwZWQpIHtcbiAgICAgICAgICAgIGVzY2FwZWQgPSBmYWxzZVxuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gSEFTSCAmJiBuID09PSBPUEVOX0NVUkxZKSB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gfSBTQ1NTIFBBVENIXG5cbiAgICAgICAgY29udGVudCA9IGNzcy5zbGljZShwb3MsIG5leHQgKyAxKVxuICAgICAgICBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpXG4gICAgICAgIGxhc3QgPSBsaW5lcy5sZW5ndGggLSAxXG5cbiAgICAgICAgaWYgKGxhc3QgPiAwKSB7XG4gICAgICAgICAgbmV4dExpbmUgPSBsaW5lICsgbGFzdFxuICAgICAgICAgIG5leHRPZmZzZXQgPSBuZXh0IC0gbGluZXNbbGFzdF0ubGVuZ3RoXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dExpbmUgPSBsaW5lXG4gICAgICAgICAgbmV4dE9mZnNldCA9IG9mZnNldFxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRva2VuID0gWydzdHJpbmcnLCBjc3Muc2xpY2UocG9zLCBuZXh0ICsgMSksXG4gICAgICAgICAgbGluZSwgcG9zIC0gb2Zmc2V0LFxuICAgICAgICAgIG5leHRMaW5lLCBuZXh0IC0gbmV4dE9mZnNldFxuICAgICAgICBdXG5cbiAgICAgICAgb2Zmc2V0ID0gbmV4dE9mZnNldFxuICAgICAgICBsaW5lID0gbmV4dExpbmVcbiAgICAgICAgcG9zID0gbmV4dFxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIEFUOlxuICAgICAgICBSRV9BVF9FTkQubGFzdEluZGV4ID0gcG9zICsgMVxuICAgICAgICBSRV9BVF9FTkQudGVzdChjc3MpXG4gICAgICAgIGlmIChSRV9BVF9FTkQubGFzdEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgbmV4dCA9IGNzcy5sZW5ndGggLSAxXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dCA9IFJFX0FUX0VORC5sYXN0SW5kZXggLSAyXG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VG9rZW4gPSBbJ2F0LXdvcmQnLCBjc3Muc2xpY2UocG9zLCBuZXh0ICsgMSksXG4gICAgICAgICAgbGluZSwgcG9zIC0gb2Zmc2V0LFxuICAgICAgICAgIGxpbmUsIG5leHQgLSBvZmZzZXRcbiAgICAgICAgXVxuXG4gICAgICAgIHBvcyA9IG5leHRcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBCQUNLU0xBU0g6XG4gICAgICAgIG5leHQgPSBwb3NcbiAgICAgICAgZXNjYXBlID0gdHJ1ZVxuICAgICAgICB3aGlsZSAoY3NzLmNoYXJDb2RlQXQobmV4dCArIDEpID09PSBCQUNLU0xBU0gpIHtcbiAgICAgICAgICBuZXh0ICs9IDFcbiAgICAgICAgICBlc2NhcGUgPSAhZXNjYXBlXG4gICAgICAgIH1cbiAgICAgICAgY29kZSA9IGNzcy5jaGFyQ29kZUF0KG5leHQgKyAxKVxuICAgICAgICBpZiAoZXNjYXBlICYmIChjb2RlICE9PSBTTEFTSCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgIT09IFNQQUNFICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAhPT0gTkVXTElORSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgIT09IFRBQiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgIT09IENSICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAhPT0gRkVFRCkpIHtcbiAgICAgICAgICBuZXh0ICs9IDFcbiAgICAgICAgICBpZiAoUkVfSEVYX0VTQ0FQRS50ZXN0KGNzcy5jaGFyQXQobmV4dCkpKSB7XG4gICAgICAgICAgICB3aGlsZSAoUkVfSEVYX0VTQ0FQRS50ZXN0KGNzcy5jaGFyQXQobmV4dCArIDEpKSkge1xuICAgICAgICAgICAgICBuZXh0ICs9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjc3MuY2hhckNvZGVBdChuZXh0ICsgMSkgPT09IFNQQUNFKSB7XG4gICAgICAgICAgICAgIG5leHQgKz0gMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IFsnd29yZCcsIGNzcy5zbGljZShwb3MsIG5leHQgKyAxKSxcbiAgICAgICAgICBsaW5lLCBwb3MgLSBvZmZzZXQsXG4gICAgICAgICAgbGluZSwgbmV4dCAtIG9mZnNldFxuICAgICAgICBdXG5cbiAgICAgICAgcG9zID0gbmV4dFxuICAgICAgICBicmVha1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBTQ1NTIFBBVENIIHtcbiAgICAgICAgbiA9IGNzcy5jaGFyQ29kZUF0KHBvcyArIDEpXG5cbiAgICAgICAgaWYgKGNvZGUgPT09IEhBU0ggJiYgbiA9PT0gT1BFTl9DVVJMWSkge1xuICAgICAgICAgIG5leHQgPSBwb3NcbiAgICAgICAgICBpbnRlcnBvbGF0aW9uKClcblxuICAgICAgICAgIGNvbnRlbnQgPSBjc3Muc2xpY2UocG9zLCBuZXh0ICsgMSlcbiAgICAgICAgICBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgbGFzdCA9IGxpbmVzLmxlbmd0aCAtIDFcblxuICAgICAgICAgIGlmIChsYXN0ID4gMCkge1xuICAgICAgICAgICAgbmV4dExpbmUgPSBsaW5lICsgbGFzdFxuICAgICAgICAgICAgbmV4dE9mZnNldCA9IG5leHQgLSBsaW5lc1tsYXN0XS5sZW5ndGhcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dExpbmUgPSBsaW5lXG4gICAgICAgICAgICBuZXh0T2Zmc2V0ID0gb2Zmc2V0XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudFRva2VuID0gWyd3b3JkJywgY29udGVudCxcbiAgICAgICAgICAgIGxpbmUsIHBvcyAtIG9mZnNldCxcbiAgICAgICAgICAgIG5leHRMaW5lLCBuZXh0IC0gbmV4dE9mZnNldFxuICAgICAgICAgIF1cblxuICAgICAgICAgIG9mZnNldCA9IG5leHRPZmZzZXRcbiAgICAgICAgICBsaW5lID0gbmV4dExpbmVcbiAgICAgICAgICBwb3MgPSBuZXh0XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gU0xBU0ggJiYgbiA9PT0gQVNURVJJU0spIHtcbiAgICAgICAgICAvLyB9IFNDU1MgUEFUQ0hcbiAgICAgICAgICBuZXh0ID0gY3NzLmluZGV4T2YoJyovJywgcG9zICsgMikgKyAxXG4gICAgICAgICAgaWYgKG5leHQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChpZ25vcmUpIHtcbiAgICAgICAgICAgICAgbmV4dCA9IGNzcy5sZW5ndGhcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuY2xvc2VkKCdjb21tZW50JylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZW50ID0gY3NzLnNsaWNlKHBvcywgbmV4dCArIDEpXG4gICAgICAgICAgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKVxuICAgICAgICAgIGxhc3QgPSBsaW5lcy5sZW5ndGggLSAxXG5cbiAgICAgICAgICBpZiAobGFzdCA+IDApIHtcbiAgICAgICAgICAgIG5leHRMaW5lID0gbGluZSArIGxhc3RcbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSBuZXh0IC0gbGluZXNbbGFzdF0ubGVuZ3RoXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHRMaW5lID0gbGluZVxuICAgICAgICAgICAgbmV4dE9mZnNldCA9IG9mZnNldFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IFsnY29tbWVudCcsIGNvbnRlbnQsXG4gICAgICAgICAgICBsaW5lLCBwb3MgLSBvZmZzZXQsXG4gICAgICAgICAgICBuZXh0TGluZSwgbmV4dCAtIG5leHRPZmZzZXRcbiAgICAgICAgICBdXG5cbiAgICAgICAgICBvZmZzZXQgPSBuZXh0T2Zmc2V0XG4gICAgICAgICAgbGluZSA9IG5leHRMaW5lXG4gICAgICAgICAgcG9zID0gbmV4dFxuXG4gICAgICAgICAgLy8gU0NTUyBQQVRDSCB7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gU0xBU0ggJiYgbiA9PT0gU0xBU0gpIHtcbiAgICAgICAgICBSRV9ORVdfTElORS5sYXN0SW5kZXggPSBwb3MgKyAxXG4gICAgICAgICAgUkVfTkVXX0xJTkUudGVzdChjc3MpXG4gICAgICAgICAgaWYgKFJFX05FV19MSU5FLmxhc3RJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgbmV4dCA9IGNzcy5sZW5ndGggLSAxXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHQgPSBSRV9ORVdfTElORS5sYXN0SW5kZXggLSAyXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGVudCA9IGNzcy5zbGljZShwb3MsIG5leHQgKyAxKVxuXG4gICAgICAgICAgY3VycmVudFRva2VuID0gWydjb21tZW50JywgY29udGVudCxcbiAgICAgICAgICAgIGxpbmUsIHBvcyAtIG9mZnNldCxcbiAgICAgICAgICAgIGxpbmUsIG5leHQgLSBvZmZzZXQsXG4gICAgICAgICAgICAnaW5saW5lJ1xuICAgICAgICAgIF1cblxuICAgICAgICAgIHBvcyA9IG5leHRcbiAgICAgICAgICAvLyB9IFNDU1MgUEFUQ0hcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBSRV9XT1JEX0VORC5sYXN0SW5kZXggPSBwb3MgKyAxXG4gICAgICAgICAgUkVfV09SRF9FTkQudGVzdChjc3MpXG4gICAgICAgICAgaWYgKFJFX1dPUkRfRU5ELmxhc3RJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgbmV4dCA9IGNzcy5sZW5ndGggLSAxXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHQgPSBSRV9XT1JEX0VORC5sYXN0SW5kZXggLSAyXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudFRva2VuID0gWyd3b3JkJywgY3NzLnNsaWNlKHBvcywgbmV4dCArIDEpLFxuICAgICAgICAgICAgbGluZSwgcG9zIC0gb2Zmc2V0LFxuICAgICAgICAgICAgbGluZSwgbmV4dCAtIG9mZnNldFxuICAgICAgICAgIF1cblxuICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnJlbnRUb2tlbilcblxuICAgICAgICAgIHBvcyA9IG5leHRcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgcG9zKytcbiAgICByZXR1cm4gY3VycmVudFRva2VuXG4gIH1cblxuICBmdW5jdGlvbiBiYWNrICh0b2tlbikge1xuICAgIHJldHVybmVkLnB1c2godG9rZW4pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhY2ssXG4gICAgbmV4dFRva2VuLFxuICAgIGVuZE9mRmlsZVxuICB9XG59XG4iXSwiZmlsZSI6InNjc3MtdG9rZW5pemUuanMifQ==