├── extension ├── index.js ├── background.js ├── src │ ├── README.md │ └── beautify.js ├── coverage_panel.html ├── package.json ├── coverage.html ├── manifest.json └── coverage.js ├── .gitignore ├── reporter ├── package.json └── gen_report.js ├── README.md └── test_data └── ycombinator.js /extension/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extension/background.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_STORE 2 | node_modules 3 | html-report 4 | test_data 5 | -------------------------------------------------------------------------------- /extension/src/README.md: -------------------------------------------------------------------------------- 1 | `../node_modules/.bin/browserify beautify.js > ../beautify.js` 2 | -------------------------------------------------------------------------------- /reporter/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coverage-reporter", 3 | "dependencies": { 4 | "istanbul": "^0.4.5" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /extension/coverage_panel.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /extension/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "browserify": "^13.1.0", 4 | "js-beautify": "^1.6.3" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /extension/src/beautify.js: -------------------------------------------------------------------------------- 1 | window.beautify = function(src) { 2 | var b = require('js-beautify').js_beautify; 3 | 4 | return b(src, {indent_size: 2}); 5 | } 6 | -------------------------------------------------------------------------------- /extension/coverage.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coverage", 3 | "manifest_version": 2, 4 | "version": "1", 5 | "minimum_chrome_version": "10.0", 6 | "devtools_page": "coverage.html", 7 | "background" : { 8 | "scripts": ["background.js"] 9 | }, 10 | "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'" 11 | } 12 | -------------------------------------------------------------------------------- /reporter/gen_report.js: -------------------------------------------------------------------------------- 1 | var ISTANBUL_PATH = 'node_modules/istanbul'; 2 | 3 | var path = require('path'); 4 | var fs = require('fs'); 5 | 6 | var MemoryStore = require('./' + path.join( 7 | ISTANBUL_PATH, '/lib/store/memory')); 8 | 9 | var HtmlReporter = require('./' + path.join( 10 | ISTANBUL_PATH, '/lib/report/html')); 11 | 12 | var Collector = require('./' + path.join( 13 | ISTANBUL_PATH, '/lib/collector')); 14 | 15 | var dump = JSON.parse( 16 | fs.readFileSync( 17 | path.resolve(process.cwd(), process.argv[2]), 'utf8')); 18 | 19 | var truncateFileNames = function (data) { 20 | return Object.keys(data).reduce(function (n, path) { 21 | n[path.slice(0, 200)] = data[path]; 22 | n[path.slice(0, 200)].path = path.slice(0, 200) 23 | 24 | return n; 25 | }, {}); 26 | } 27 | 28 | var originals = truncateFileNames(JSON.parse(dump.originals)); 29 | var sourceStore = new MemoryStore(); 30 | var collector = new Collector(); 31 | var data = truncateFileNames(JSON.parse(dump.coverage)); 32 | 33 | collector.add(data); 34 | 35 | function atob(str) { 36 | return new Buffer(str, 'base64').toString('binary'); 37 | } 38 | 39 | Object.keys(originals).forEach(key => { 40 | sourceStore.set(key, 41 | decodeURIComponent( 42 | escape(atob(originals[key])))); 43 | }); 44 | 45 | 46 | var reporter = new HtmlReporter({ 47 | verbose: true, 48 | sourceStore, 49 | collector, 50 | }); 51 | 52 | reporter.writeReport(collector, true); 53 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## What is this? 2 | 3 | This is an extension to an old version of chrome + a custom istanbul reporter. 4 | This combo gives you the power to view what JS gets evaluated on any website. 5 | 6 | ![image](https://cloud.githubusercontent.com/assets/883126/18592140/6535c56a-7bea-11e6-88e5-dff9d8f0789c.png) 7 | 8 | ## Installation 9 | 10 | 1. Download an **old version of chrome** [Mac](https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Mac/314206/) / [Win](https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win/314199/) 11 | - The reason why we have to use an old version is because we are utilizing a cool API chrome used to have to preprocess any JS file before it gets evaluated by v8. This feature was reverted [here](https://codereview.chromium.org/761143003). 12 | 2. [Download this repo](https://github.com/samccone/coverage-ext/archive/master.zip) and extract it somewhere 13 | 3. Open a prompt in the `reporter` directory 14 | 4. `npm i` 15 | 5. Run the old chrome version 16 | 6. Navigate to `chrome://extensions` and enable developer mode 17 | 7. Click "Load unpacked extension..." and select the `extension` folder from the repo 18 | 19 | ## Example Usage 20 | 21 | 1. Visit `http://news.ycombinator.com/`. 22 | 2. Open up dev tools. 23 | 3. Click on the get coveragez button. 24 | 4. The page will reload, wait for it to complete. 25 | 5. Click on the copy button. 26 | 6. Run `pbpaste > ycombinator-data`. 27 | 7. `cd reporter`. 28 | 8. `node gen_report.js ../ycombinator-data` 29 | 9. open `./reporter/html-report/index.html` to view the report 30 | -------------------------------------------------------------------------------- /extension/coverage.js: -------------------------------------------------------------------------------- 1 | chrome.devtools.panels.create("Coverage", 2 | null, 3 | "coverage_panel.html", 4 | function(panel) { 5 | panel.onShown.addListener(function(panelWindow) { 6 | panelWindow.document.body.querySelector('#gather').addEventListener( 7 | 'click', 8 | onGatherClick); 9 | 10 | panelWindow.document.body.querySelector('#copy').addEventListener( 11 | 'click', 12 | onCopyClick); 13 | }); 14 | } 15 | ); 16 | 17 | function onCopyClick() { 18 | var coveragePromise = new Promise(function(res, rej) { 19 | chrome.devtools.inspectedWindow.eval('JSON.stringify(__coverage__)', function(v, err) { 20 | res(v); 21 | }); 22 | }); 23 | 24 | var originalSrcPromise = new Promise(function(res, rej) { 25 | chrome.devtools.inspectedWindow.eval('JSON.stringify(__originals)', function(v, err) { 26 | res(v); 27 | }); 28 | }); 29 | 30 | Promise.all([coveragePromise, originalSrcPromise]).then(function(vals) { 31 | chrome.devtools.inspectedWindow.eval('copy({"coverage": \''+ vals[0] +'\', "originals": \''+ vals[1] +'\'})', function(v, err) { 32 | if (err) { 33 | console.log(err); 34 | } 35 | }); 36 | }); 37 | } 38 | 39 | function preprocessor(src, url, fName) { 40 | function instrumentSrc(src) { 41 | // Make sure that we store the original src code in a map. 42 | var saniUrl = (url.replace(/\/|\:|\.|\?/g, '-') + '---' + (Math.random().toFixed(4))); 43 | var prefix = '(window.__originals = window.__originals || {});' + 44 | 'window.__originals["' + saniUrl + '"] = "' + btoa(unescape(encodeURIComponent(src))) + '";'; 45 | 46 | return prefix + window.instrument(src, saniUrl); 47 | } 48 | 49 | if (url) { 50 | return instrumentSrc(window.beautify(src)); 51 | } else { 52 | return src; 53 | } 54 | } 55 | 56 | var request = new XMLHttpRequest(); 57 | request.open('GET', 'instrumenter.js', false); 58 | request.send(null); 59 | var instrumenterSrc = request.responseText 60 | 61 | request.open('GET', 'beautify.js', false); 62 | request.send(null); 63 | var beautifySrc = request.responseText 64 | 65 | function onGatherClick() { 66 | chrome.devtools.inspectedWindow.reload({ 67 | preprocessingScript: instrumenterSrc + beautifySrc + 68 | '(' + preprocessor + ')', 69 | }); 70 | } 71 | -------------------------------------------------------------------------------- /test_data/ycombinator.js: -------------------------------------------------------------------------------- 1 | { 2 | "coverage": "{\"https://news.ycombinator.com/hn.js?lsGjatK5zCRhuuVxccgq\":{\"path\":\"https://news.ycombinator.com/hn.js?lsGjatK5zCRhuuVxccgq\",\"s\":{\"1\":1,\"2\":1,\"3\":1,\"4\":3,\"5\":1,\"6\":0,\"7\":1,\"8\":3,\"9\":1,\"10\":0,\"11\":0,\"12\":1,\"13\":0,\"14\":0,\"15\":0,\"16\":0,\"17\":0,\"18\":1,\"19\":1,\"20\":0,\"21\":0,\"22\":0,\"23\":1,\"24\":1,\"25\":1,\"26\":0,\"27\":1,\"28\":1,\"29\":1,\"30\":1,\"31\":0,\"32\":1,\"33\":0,\"34\":0,\"35\":0,\"36\":0,\"37\":1,\"38\":0,\"39\":1,\"40\":0,\"41\":0,\"42\":1,\"43\":0,\"44\":1,\"45\":0,\"46\":1,\"47\":2,\"48\":1,\"49\":0,\"50\":1,\"51\":0,\"52\":0,\"53\":0,\"54\":0,\"55\":1,\"56\":0,\"57\":1,\"58\":0,\"59\":0,\"60\":1,\"61\":0,\"62\":1,\"63\":1,\"64\":1,\"65\":0,\"66\":1,\"67\":0,\"68\":0,\"69\":0,\"70\":0,\"71\":0,\"72\":0,\"73\":0,\"74\":0,\"75\":0,\"76\":0,\"77\":1,\"78\":1,\"79\":1,\"80\":1,\"81\":1,\"82\":0,\"83\":0,\"84\":0,\"85\":0,\"86\":0,\"87\":0,\"88\":0,\"89\":0,\"90\":0,\"91\":0,\"92\":0,\"93\":1,\"94\":0,\"95\":0,\"96\":0,\"97\":0,\"98\":0,\"99\":1,\"100\":0,\"101\":0,\"102\":0,\"103\":0,\"104\":1,\"105\":0,\"106\":0,\"107\":0,\"108\":0,\"109\":0,\"110\":0,\"111\":0,\"112\":1,\"113\":1,\"114\":1,\"115\":1,\"116\":1,\"117\":1,\"118\":1,\"119\":1,\"120\":1,\"121\":0,\"122\":0,\"123\":0,\"124\":0,\"125\":0,\"126\":0,\"127\":1,\"128\":0,\"129\":1,\"130\":1,\"131\":1,\"132\":1,\"133\":1,\"134\":0,\"135\":0,\"136\":0,\"137\":0,\"138\":0,\"139\":0,\"140\":0,\"141\":0,\"142\":1,\"143\":0,\"144\":0,\"145\":0,\"146\":1,\"147\":0,\"148\":1,\"149\":0,\"150\":1,\"151\":0,\"152\":0,\"153\":0,\"154\":0,\"155\":0,\"156\":0,\"157\":0,\"158\":0,\"159\":1,\"160\":0,\"161\":0},\"b\":{\"1\":[3,0],\"2\":[0,0],\"3\":[0,0],\"4\":[0,0],\"5\":[0,1],\"6\":[1,0],\"7\":[0,1],\"8\":[0,0],\"9\":[0,0],\"10\":[0,0],\"11\":[0,0],\"12\":[0,0],\"13\":[0,0],\"14\":[0,0],\"15\":[0,0],\"16\":[0,0],\"17\":[0,0],\"18\":[0,0],\"19\":[0,0],\"20\":[0,0],\"21\":[0,0],\"22\":[1,0],\"23\":[0,0],\"24\":[0,0],\"25\":[1,0],\"26\":[0,0],\"27\":[0,0],\"28\":[0,0],\"29\":[0,0]},\"f\":{\"1\":1,\"2\":3,\"3\":0,\"4\":3,\"5\":0,\"6\":0,\"7\":1,\"8\":1,\"9\":0,\"10\":1,\"11\":0,\"12\":0,\"13\":0,\"14\":0,\"15\":0,\"16\":0,\"17\":2,\"18\":0,\"19\":0,\"20\":0,\"21\":0,\"22\":0,\"23\":1,\"24\":0,\"25\":0,\"26\":1,\"27\":1,\"28\":0,\"29\":0,\"30\":0,\"31\":0,\"32\":0,\"33\":1,\"34\":1,\"35\":0,\"36\":0,\"37\":0,\"38\":1,\"39\":0,\"40\":0,\"41\":0,\"42\":0,\"43\":0,\"44\":0,\"45\":0},\"fnMap\":{\"1\":{\"name\":\"$\",\"line\":1,\"loc\":{\"start\":{\"line\":1,\"column\":0},\"end\":{\"line\":1,\"column\":15}}},\"2\":{\"name\":\"byClass\",\"line\":2,\"loc\":{\"start\":{\"line\":2,\"column\":0},\"end\":{\"line\":2,\"column\":26}}},\"3\":{\"name\":\"byTag\",\"line\":3,\"loc\":{\"start\":{\"line\":3,\"column\":0},\"end\":{\"line\":3,\"column\":24}}},\"4\":{\"name\":\"allof\",\"line\":4,\"loc\":{\"start\":{\"line\":4,\"column\":0},\"end\":{\"line\":4,\"column\":20}}},\"5\":{\"name\":\"hasClass\",\"line\":5,\"loc\":{\"start\":{\"line\":5,\"column\":0},\"end\":{\"line\":5,\"column\":27}}},\"6\":{\"name\":\"addClass\",\"line\":6,\"loc\":{\"start\":{\"line\":6,\"column\":0},\"end\":{\"line\":6,\"column\":27}}},\"7\":{\"name\":\"remClass\",\"line\":7,\"loc\":{\"start\":{\"line\":7,\"column\":0},\"end\":{\"line\":7,\"column\":27}}},\"8\":{\"name\":\"html\",\"line\":8,\"loc\":{\"start\":{\"line\":8,\"column\":0},\"end\":{\"line\":8,\"column\":19}}},\"9\":{\"name\":\"attr\",\"line\":9,\"loc\":{\"start\":{\"line\":9,\"column\":0},\"end\":{\"line\":9,\"column\":25}}},\"10\":{\"name\":\"tonum\",\"line\":10,\"loc\":{\"start\":{\"line\":10,\"column\":0},\"end\":{\"line\":10,\"column\":19}}},\"11\":{\"name\":\"kill\",\"line\":11,\"loc\":{\"start\":{\"line\":11,\"column\":0},\"end\":{\"line\":11,\"column\":19}}},\"12\":{\"name\":\"posf\",\"line\":12,\"loc\":{\"start\":{\"line\":12,\"column\":0},\"end\":{\"line\":12,\"column\":21}}},\"13\":{\"name\":\"pos\",\"line\":13,\"loc\":{\"start\":{\"line\":13,\"column\":0},\"end\":{\"line\":13,\"column\":20}}},\"14\":{\"name\":\"find\",\"line\":14,\"loc\":{\"start\":{\"line\":14,\"column\":0},\"end\":{\"line\":14,\"column\":21}}},\"15\":{\"name\":\"keep\",\"line\":15,\"loc\":{\"start\":{\"line\":15,\"column\":0},\"end\":{\"line\":15,\"column\":22}}},\"16\":{\"name\":\"cut\",\"line\":16,\"loc\":{\"start\":{\"line\":16,\"column\":0},\"end\":{\"line\":16,\"column\":23}}},\"17\":{\"name\":\"each\",\"line\":17,\"loc\":{\"start\":{\"line\":17,\"column\":0},\"end\":{\"line\":17,\"column\":22}}},\"18\":{\"name\":\"map\",\"line\":18,\"loc\":{\"start\":{\"line\":18,\"column\":0},\"end\":{\"line\":18,\"column\":21}}},\"19\":{\"name\":\"rem\",\"line\":19,\"loc\":{\"start\":{\"line\":19,\"column\":0},\"end\":{\"line\":19,\"column\":20}}},\"20\":{\"name\":\"last\",\"line\":20,\"loc\":{\"start\":{\"line\":20,\"column\":0},\"end\":{\"line\":20,\"column\":18}}},\"21\":{\"name\":\"vis\",\"line\":21,\"loc\":{\"start\":{\"line\":21,\"column\":0},\"end\":{\"line\":21,\"column\":21}}},\"22\":{\"name\":\"noshow\",\"line\":22,\"loc\":{\"start\":{\"line\":22,\"column\":0},\"end\":{\"line\":22,\"column\":21}}},\"23\":{\"name\":\"show\",\"line\":23,\"loc\":{\"start\":{\"line\":23,\"column\":0},\"end\":{\"line\":23,\"column\":19}}},\"24\":{\"name\":\"ind\",\"line\":24,\"loc\":{\"start\":{\"line\":24,\"column\":0},\"end\":{\"line\":24,\"column\":18}}},\"25\":{\"name\":\"vote\",\"line\":26,\"loc\":{\"start\":{\"line\":26,\"column\":0},\"end\":{\"line\":26,\"column\":23}}},\"26\":{\"name\":\"comments\",\"line\":43,\"loc\":{\"start\":{\"line\":43,\"column\":0},\"end\":{\"line\":43,\"column\":21}}},\"27\":{\"name\":\"collapsed\",\"line\":44,\"loc\":{\"start\":{\"line\":44,\"column\":0},\"end\":{\"line\":44,\"column\":22}}},\"28\":{\"name\":\"kids\",\"line\":46,\"loc\":{\"start\":{\"line\":46,\"column\":0},\"end\":{\"line\":46,\"column\":19}}},\"29\":{\"name\":\"(anonymous_29)\",\"line\":53,\"loc\":{\"start\":{\"line\":53,\"column\":16},\"end\":{\"line\":53,\"column\":29}}},\"30\":{\"name\":\"toggle\",\"line\":59,\"loc\":{\"start\":{\"line\":59,\"column\":0},\"end\":{\"line\":59,\"column\":24}}},\"31\":{\"name\":\"expand\",\"line\":67,\"loc\":{\"start\":{\"line\":67,\"column\":0},\"end\":{\"line\":67,\"column\":21}}},\"32\":{\"name\":\"squish\",\"line\":74,\"loc\":{\"start\":{\"line\":74,\"column\":0},\"end\":{\"line\":74,\"column\":21}}},\"33\":{\"name\":\"recoll\",\"line\":83,\"loc\":{\"start\":{\"line\":83,\"column\":0},\"end\":{\"line\":83,\"column\":18}}},\"34\":{\"name\":\"onready\",\"line\":88,\"loc\":{\"start\":{\"line\":88,\"column\":0},\"end\":{\"line\":88,\"column\":20}}},\"35\":{\"name\":\"ajax\",\"line\":97,\"loc\":{\"start\":{\"line\":97,\"column\":0},\"end\":{\"line\":97,\"column\":24}}},\"36\":{\"name\":\"(anonymous_36)\",\"line\":100,\"loc\":{\"start\":{\"line\":100,\"column\":27},\"end\":{\"line\":100,\"column\":39}}},\"37\":{\"name\":\"onop\",\"line\":108,\"loc\":{\"start\":{\"line\":108,\"column\":0},\"end\":{\"line\":108,\"column\":17}}},\"38\":{\"name\":\"ranknum\",\"line\":109,\"loc\":{\"start\":{\"line\":109,\"column\":0},\"end\":{\"line\":109,\"column\":22}}},\"39\":{\"name\":\"newstory\",\"line\":112,\"loc\":{\"start\":{\"line\":112,\"column\":0},\"end\":{\"line\":112,\"column\":25}}},\"40\":{\"name\":\"fixranks\",\"line\":125,\"loc\":{\"start\":{\"line\":125,\"column\":0},\"end\":{\"line\":125,\"column\":21}}},\"41\":{\"name\":\"(anonymous_41)\",\"line\":127,\"loc\":{\"start\":{\"line\":127,\"column\":8},\"end\":{\"line\":127,\"column\":22}}},\"42\":{\"name\":\"moreurl\",\"line\":130,\"loc\":{\"start\":{\"line\":130,\"column\":0},\"end\":{\"line\":130,\"column\":19}}},\"43\":{\"name\":\"morenext\",\"line\":131,\"loc\":{\"start\":{\"line\":131,\"column\":0},\"end\":{\"line\":131,\"column\":21}}},\"44\":{\"name\":\"hidestory\",\"line\":133,\"loc\":{\"start\":{\"line\":133,\"column\":0},\"end\":{\"line\":133,\"column\":28}}},\"45\":{\"name\":\"closefeat\",\"line\":143,\"loc\":{\"start\":{\"line\":143,\"column\":0},\"end\":{\"line\":143,\"column\":22}}}},\"statementMap\":{\"1\":{\"start\":{\"line\":1,\"column\":0},\"end\":{\"line\":1,\"column\":54}},\"2\":{\"start\":{\"line\":1,\"column\":17},\"end\":{\"line\":1,\"column\":52}},\"3\":{\"start\":{\"line\":2,\"column\":0},\"end\":{\"line\":2,\"column\":76}},\"4\":{\"start\":{\"line\":2,\"column\":28},\"end\":{\"line\":2,\"column\":75}},\"5\":{\"start\":{\"line\":3,\"column\":0},\"end\":{\"line\":3,\"column\":72}},\"6\":{\"start\":{\"line\":3,\"column\":26},\"end\":{\"line\":3,\"column\":71}},\"7\":{\"start\":{\"line\":4,\"column\":0},\"end\":{\"line\":4,\"column\":52}},\"8\":{\"start\":{\"line\":4,\"column\":22},\"end\":{\"line\":4,\"column\":51}},\"9\":{\"start\":{\"line\":5,\"column\":0},\"end\":{\"line\":5,\"column\":82}},\"10\":{\"start\":{\"line\":5,\"column\":29},\"end\":{\"line\":5,\"column\":61}},\"11\":{\"start\":{\"line\":5,\"column\":62},\"end\":{\"line\":5,\"column\":81}},\"12\":{\"start\":{\"line\":6,\"column\":0},\"end\":{\"line\":6,\"column\":137}},\"13\":{\"start\":{\"line\":6,\"column\":29},\"end\":{\"line\":6,\"column\":135}},\"14\":{\"start\":{\"line\":6,\"column\":39},\"end\":{\"line\":6,\"column\":71}},\"15\":{\"start\":{\"line\":6,\"column\":72},\"end\":{\"line\":6,\"column\":134}},\"16\":{\"start\":{\"line\":6,\"column\":92},\"end\":{\"line\":6,\"column\":106}},\"17\":{\"start\":{\"line\":6,\"column\":107},\"end\":{\"line\":6,\"column\":133}},\"18\":{\"start\":{\"line\":7,\"column\":0},\"end\":{\"line\":7,\"column\":114}},\"19\":{\"start\":{\"line\":7,\"column\":29},\"end\":{\"line\":7,\"column\":112}},\"20\":{\"start\":{\"line\":7,\"column\":39},\"end\":{\"line\":7,\"column\":71}},\"21\":{\"start\":{\"line\":7,\"column\":72},\"end\":{\"line\":7,\"column\":83}},\"22\":{\"start\":{\"line\":7,\"column\":84},\"end\":{\"line\":7,\"column\":111}},\"23\":{\"start\":{\"line\":8,\"column\":0},\"end\":{\"line\":8,\"column\":55}},\"24\":{\"start\":{\"line\":8,\"column\":21},\"end\":{\"line\":8,\"column\":53}},\"25\":{\"start\":{\"line\":9,\"column\":0},\"end\":{\"line\":9,\"column\":57}},\"26\":{\"start\":{\"line\":9,\"column\":27},\"end\":{\"line\":9,\"column\":56}},\"27\":{\"start\":{\"line\":10,\"column\":0},\"end\":{\"line\":10,\"column\":72}},\"28\":{\"start\":{\"line\":10,\"column\":21},\"end\":{\"line\":10,\"column\":43}},\"29\":{\"start\":{\"line\":10,\"column\":44},\"end\":{\"line\":10,\"column\":71}},\"30\":{\"start\":{\"line\":11,\"column\":0},\"end\":{\"line\":11,\"column\":52}},\"31\":{\"start\":{\"line\":11,\"column\":21},\"end\":{\"line\":11,\"column\":51}},\"32\":{\"start\":{\"line\":12,\"column\":0},\"end\":{\"line\":12,\"column\":95}},\"33\":{\"start\":{\"line\":12,\"column\":23},\"end\":{\"line\":12,\"column\":82}},\"34\":{\"start\":{\"line\":12,\"column\":58},\"end\":{\"line\":12,\"column\":80}},\"35\":{\"start\":{\"line\":12,\"column\":71},\"end\":{\"line\":12,\"column\":80}},\"36\":{\"start\":{\"line\":12,\"column\":83},\"end\":{\"line\":12,\"column\":93}},\"37\":{\"start\":{\"line\":13,\"column\":0},\"end\":{\"line\":13,\"column\":103}},\"38\":{\"start\":{\"line\":13,\"column\":22},\"end\":{\"line\":13,\"column\":102}},\"39\":{\"start\":{\"line\":14,\"column\":0},\"end\":{\"line\":14,\"column\":74}},\"40\":{\"start\":{\"line\":14,\"column\":23},\"end\":{\"line\":14,\"column\":41}},\"41\":{\"start\":{\"line\":14,\"column\":42},\"end\":{\"line\":14,\"column\":72}},\"42\":{\"start\":{\"line\":15,\"column\":0},\"end\":{\"line\":15,\"column\":67}},\"43\":{\"start\":{\"line\":15,\"column\":24},\"end\":{\"line\":15,\"column\":66}},\"44\":{\"start\":{\"line\":16,\"column\":0},\"end\":{\"line\":16,\"column\":69}},\"45\":{\"start\":{\"line\":16,\"column\":25},\"end\":{\"line\":16,\"column\":68}},\"46\":{\"start\":{\"line\":17,\"column\":0},\"end\":{\"line\":17,\"column\":68}},\"47\":{\"start\":{\"line\":17,\"column\":24},\"end\":{\"line\":17,\"column\":67}},\"48\":{\"start\":{\"line\":18,\"column\":0},\"end\":{\"line\":18,\"column\":63}},\"49\":{\"start\":{\"line\":18,\"column\":23},\"end\":{\"line\":18,\"column\":62}},\"50\":{\"start\":{\"line\":19,\"column\":0},\"end\":{\"line\":19,\"column\":84}},\"51\":{\"start\":{\"line\":19,\"column\":22},\"end\":{\"line\":19,\"column\":40}},\"52\":{\"start\":{\"line\":19,\"column\":41},\"end\":{\"line\":19,\"column\":72}},\"53\":{\"start\":{\"line\":19,\"column\":55},\"end\":{\"line\":19,\"column\":70}},\"54\":{\"start\":{\"line\":19,\"column\":73},\"end\":{\"line\":19,\"column\":82}},\"55\":{\"start\":{\"line\":20,\"column\":0},\"end\":{\"line\":20,\"column\":44}},\"56\":{\"start\":{\"line\":20,\"column\":20},\"end\":{\"line\":20,\"column\":43}},\"57\":{\"start\":{\"line\":21,\"column\":0},\"end\":{\"line\":21,\"column\":87}},\"58\":{\"start\":{\"line\":21,\"column\":23},\"end\":{\"line\":21,\"column\":85}},\"59\":{\"start\":{\"line\":21,\"column\":33},\"end\":{\"line\":21,\"column\":84}},\"60\":{\"start\":{\"line\":22,\"column\":0},\"end\":{\"line\":22,\"column\":47}},\"61\":{\"start\":{\"line\":22,\"column\":23},\"end\":{\"line\":22,\"column\":46}},\"62\":{\"start\":{\"line\":23,\"column\":0},\"end\":{\"line\":23,\"column\":45}},\"63\":{\"start\":{\"line\":23,\"column\":21},\"end\":{\"line\":23,\"column\":44}},\"64\":{\"start\":{\"line\":24,\"column\":0},\"end\":{\"line\":24,\"column\":62}},\"65\":{\"start\":{\"line\":24,\"column\":20},\"end\":{\"line\":24,\"column\":61}},\"66\":{\"start\":{\"line\":26,\"column\":0},\"end\":{\"line\":41,\"column\":1}},\"67\":{\"start\":{\"line\":27,\"column\":2},\"end\":{\"line\":27,\"column\":31}},\"68\":{\"start\":{\"line\":28,\"column\":2},\"end\":{\"line\":28,\"column\":25}},\"69\":{\"start\":{\"line\":29,\"column\":2},\"end\":{\"line\":29,\"column\":23}},\"70\":{\"start\":{\"line\":30,\"column\":2},\"end\":{\"line\":30,\"column\":36}},\"71\":{\"start\":{\"line\":31,\"column\":2},\"end\":{\"line\":31,\"column\":15}},\"72\":{\"start\":{\"line\":32,\"column\":2},\"end\":{\"line\":37,\"column\":3}},\"73\":{\"start\":{\"line\":33,\"column\":4},\"end\":{\"line\":36,\"column\":59}},\"74\":{\"start\":{\"line\":38,\"column\":2},\"end\":{\"line\":38,\"column\":33}},\"75\":{\"start\":{\"line\":39,\"column\":2},\"end\":{\"line\":39,\"column\":28}},\"76\":{\"start\":{\"line\":40,\"column\":2},\"end\":{\"line\":40,\"column\":15}},\"77\":{\"start\":{\"line\":43,\"column\":0},\"end\":{\"line\":43,\"column\":46}},\"78\":{\"start\":{\"line\":43,\"column\":23},\"end\":{\"line\":43,\"column\":45}},\"79\":{\"start\":{\"line\":44,\"column\":0},\"end\":{\"line\":44,\"column\":46}},\"80\":{\"start\":{\"line\":44,\"column\":24},\"end\":{\"line\":44,\"column\":45}},\"81\":{\"start\":{\"line\":46,\"column\":0},\"end\":{\"line\":57,\"column\":1}},\"82\":{\"start\":{\"line\":47,\"column\":2},\"end\":{\"line\":47,\"column\":14}},\"83\":{\"start\":{\"line\":48,\"column\":2},\"end\":{\"line\":48,\"column\":23}},\"84\":{\"start\":{\"line\":49,\"column\":2},\"end\":{\"line\":49,\"column\":26}},\"85\":{\"start\":{\"line\":50,\"column\":2},\"end\":{\"line\":55,\"column\":3}},\"86\":{\"start\":{\"line\":51,\"column\":4},\"end\":{\"line\":51,\"column\":25}},\"87\":{\"start\":{\"line\":52,\"column\":4},\"end\":{\"line\":52,\"column\":23}},\"88\":{\"start\":{\"line\":53,\"column\":4},\"end\":{\"line\":53,\"column\":56}},\"89\":{\"start\":{\"line\":53,\"column\":30},\"end\":{\"line\":53,\"column\":49}},\"90\":{\"start\":{\"line\":54,\"column\":4},\"end\":{\"line\":54,\"column\":38}},\"91\":{\"start\":{\"line\":54,\"column\":18},\"end\":{\"line\":54,\"column\":37}},\"92\":{\"start\":{\"line\":56,\"column\":2},\"end\":{\"line\":56,\"column\":12}},\"93\":{\"start\":{\"line\":59,\"column\":0},\"end\":{\"line\":65,\"column\":1}},\"94\":{\"start\":{\"line\":60,\"column\":2},\"end\":{\"line\":60,\"column\":37}},\"95\":{\"start\":{\"line\":61,\"column\":2},\"end\":{\"line\":61,\"column\":44}},\"96\":{\"start\":{\"line\":62,\"column\":2},\"end\":{\"line\":62,\"column\":11}},\"97\":{\"start\":{\"line\":63,\"column\":2},\"end\":{\"line\":63,\"column\":65}},\"98\":{\"start\":{\"line\":64,\"column\":2},\"end\":{\"line\":64,\"column\":15}},\"99\":{\"start\":{\"line\":67,\"column\":0},\"end\":{\"line\":72,\"column\":1}},\"100\":{\"start\":{\"line\":68,\"column\":2},\"end\":{\"line\":68,\"column\":11}},\"101\":{\"start\":{\"line\":69,\"column\":2},\"end\":{\"line\":69,\"column\":34}},\"102\":{\"start\":{\"line\":70,\"column\":2},\"end\":{\"line\":70,\"column\":41}},\"103\":{\"start\":{\"line\":71,\"column\":2},\"end\":{\"line\":71,\"column\":43}},\"104\":{\"start\":{\"line\":74,\"column\":0},\"end\":{\"line\":81,\"column\":1}},\"105\":{\"start\":{\"line\":75,\"column\":2},\"end\":{\"line\":75,\"column\":37}},\"106\":{\"start\":{\"line\":75,\"column\":30},\"end\":{\"line\":75,\"column\":37}},\"107\":{\"start\":{\"line\":76,\"column\":2},\"end\":{\"line\":76,\"column\":28}},\"108\":{\"start\":{\"line\":77,\"column\":2},\"end\":{\"line\":77,\"column\":34}},\"109\":{\"start\":{\"line\":78,\"column\":2},\"end\":{\"line\":78,\"column\":51}},\"110\":{\"start\":{\"line\":79,\"column\":2},\"end\":{\"line\":79,\"column\":36}},\"111\":{\"start\":{\"line\":80,\"column\":2},\"end\":{\"line\":80,\"column\":42}},\"112\":{\"start\":{\"line\":83,\"column\":0},\"end\":{\"line\":86,\"column\":1}},\"113\":{\"start\":{\"line\":84,\"column\":2},\"end\":{\"line\":84,\"column\":27}},\"114\":{\"start\":{\"line\":85,\"column\":2},\"end\":{\"line\":85,\"column\":28}},\"115\":{\"start\":{\"line\":88,\"column\":0},\"end\":{\"line\":93,\"column\":1}},\"116\":{\"start\":{\"line\":89,\"column\":2},\"end\":{\"line\":91,\"column\":3}},\"117\":{\"start\":{\"line\":90,\"column\":4},\"end\":{\"line\":90,\"column\":27}},\"118\":{\"start\":{\"line\":92,\"column\":2},\"end\":{\"line\":92,\"column\":11}},\"119\":{\"start\":{\"line\":95,\"column\":0},\"end\":{\"line\":95,\"column\":55}},\"120\":{\"start\":{\"line\":97,\"column\":0},\"end\":{\"line\":106,\"column\":1}},\"121\":{\"start\":{\"line\":98,\"column\":2},\"end\":{\"line\":98,\"column\":33}},\"122\":{\"start\":{\"line\":99,\"column\":2},\"end\":{\"line\":99,\"column\":29}},\"123\":{\"start\":{\"line\":100,\"column\":2},\"end\":{\"line\":104,\"column\":3}},\"124\":{\"start\":{\"line\":101,\"column\":4},\"end\":{\"line\":103,\"column\":5}},\"125\":{\"start\":{\"line\":102,\"column\":6},\"end\":{\"line\":102,\"column\":26}},\"126\":{\"start\":{\"line\":105,\"column\":2},\"end\":{\"line\":105,\"column\":20}},\"127\":{\"start\":{\"line\":108,\"column\":0},\"end\":{\"line\":108,\"column\":64}},\"128\":{\"start\":{\"line\":108,\"column\":19},\"end\":{\"line\":108,\"column\":63}},\"129\":{\"start\":{\"line\":109,\"column\":0},\"end\":{\"line\":109,\"column\":89}},\"130\":{\"start\":{\"line\":109,\"column\":24},\"end\":{\"line\":109,\"column\":41}},\"131\":{\"start\":{\"line\":109,\"column\":42},\"end\":{\"line\":109,\"column\":88}},\"132\":{\"start\":{\"line\":110,\"column\":0},\"end\":{\"line\":110,\"column\":35}},\"133\":{\"start\":{\"line\":112,\"column\":0},\"end\":{\"line\":123,\"column\":1}},\"134\":{\"start\":{\"line\":113,\"column\":2},\"end\":{\"line\":122,\"column\":3}},\"135\":{\"start\":{\"line\":114,\"column\":4},\"end\":{\"line\":114,\"column\":32}},\"136\":{\"start\":{\"line\":115,\"column\":4},\"end\":{\"line\":115,\"column\":35}},\"137\":{\"start\":{\"line\":116,\"column\":4},\"end\":{\"line\":116,\"column\":62}},\"138\":{\"start\":{\"line\":117,\"column\":4},\"end\":{\"line\":117,\"column\":15}},\"139\":{\"start\":{\"line\":118,\"column\":4},\"end\":{\"line\":121,\"column\":5}},\"140\":{\"start\":{\"line\":119,\"column\":6},\"end\":{\"line\":119,\"column\":43}},\"141\":{\"start\":{\"line\":120,\"column\":6},\"end\":{\"line\":120,\"column\":77}},\"142\":{\"start\":{\"line\":125,\"column\":0},\"end\":{\"line\":128,\"column\":1}},\"143\":{\"start\":{\"line\":126,\"column\":2},\"end\":{\"line\":126,\"column\":26}},\"144\":{\"start\":{\"line\":127,\"column\":2},\"end\":{\"line\":127,\"column\":72}},\"145\":{\"start\":{\"line\":127,\"column\":24},\"end\":{\"line\":127,\"column\":64}},\"146\":{\"start\":{\"line\":130,\"column\":0},\"end\":{\"line\":130,\"column\":55}},\"147\":{\"start\":{\"line\":130,\"column\":21},\"end\":{\"line\":130,\"column\":54}},\"148\":{\"start\":{\"line\":131,\"column\":0},\"end\":{\"line\":131,\"column\":66}},\"149\":{\"start\":{\"line\":131,\"column\":23},\"end\":{\"line\":131,\"column\":65}},\"150\":{\"start\":{\"line\":133,\"column\":0},\"end\":{\"line\":141,\"column\":1}},\"151\":{\"start\":{\"line\":134,\"column\":2},\"end\":{\"line\":134,\"column\":55}},\"152\":{\"start\":{\"line\":134,\"column\":30},\"end\":{\"line\":134,\"column\":54}},\"153\":{\"start\":{\"line\":135,\"column\":2},\"end\":{\"line\":135,\"column\":14}},\"154\":{\"start\":{\"line\":136,\"column\":2},\"end\":{\"line\":136,\"column\":13}},\"155\":{\"start\":{\"line\":137,\"column\":2},\"end\":{\"line\":137,\"column\":78}},\"156\":{\"start\":{\"line\":138,\"column\":2},\"end\":{\"line\":138,\"column\":73}},\"157\":{\"start\":{\"line\":139,\"column\":2},\"end\":{\"line\":139,\"column\":29}},\"158\":{\"start\":{\"line\":140,\"column\":2},\"end\":{\"line\":140,\"column\":15}},\"159\":{\"start\":{\"line\":143,\"column\":0},\"end\":{\"line\":146,\"column\":1}},\"160\":{\"start\":{\"line\":144,\"column\":2},\"end\":{\"line\":144,\"column\":27}},\"161\":{\"start\":{\"line\":145,\"column\":2},\"end\":{\"line\":145,\"column\":56}}},\"branchMap\":{\"1\":{\"line\":2,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":2,\"column\":40},\"end\":{\"line\":2,\"column\":69}},{\"start\":{\"line\":2,\"column\":72},\"end\":{\"line\":2,\"column\":74}}]},\"2\":{\"line\":3,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":3,\"column\":38},\"end\":{\"line\":3,\"column\":65}},{\"start\":{\"line\":3,\"column\":68},\"end\":{\"line\":3,\"column\":70}}]},\"3\":{\"line\":6,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":6,\"column\":29},\"end\":{\"line\":6,\"column\":29}},{\"start\":{\"line\":6,\"column\":29},\"end\":{\"line\":6,\"column\":29}}]},\"4\":{\"line\":6,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":6,\"column\":72},\"end\":{\"line\":6,\"column\":72}},{\"start\":{\"line\":6,\"column\":72},\"end\":{\"line\":6,\"column\":72}}]},\"5\":{\"line\":7,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":7,\"column\":29},\"end\":{\"line\":7,\"column\":29}},{\"start\":{\"line\":7,\"column\":29},\"end\":{\"line\":7,\"column\":29}}]},\"6\":{\"line\":8,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":8,\"column\":33},\"end\":{\"line\":8,\"column\":45}},{\"start\":{\"line\":8,\"column\":48},\"end\":{\"line\":8,\"column\":52}}]},\"7\":{\"line\":10,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":10,\"column\":62},\"end\":{\"line\":10,\"column\":66}},{\"start\":{\"line\":10,\"column\":69},\"end\":{\"line\":10,\"column\":70}}]},\"8\":{\"line\":12,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":12,\"column\":58},\"end\":{\"line\":12,\"column\":58}},{\"start\":{\"line\":12,\"column\":58},\"end\":{\"line\":12,\"column\":58}}]},\"9\":{\"line\":13,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":13,\"column\":56},\"end\":{\"line\":13,\"column\":65}},{\"start\":{\"line\":13,\"column\":68},\"end\":{\"line\":13,\"column\":101}}]},\"10\":{\"line\":14,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":14,\"column\":60},\"end\":{\"line\":14,\"column\":64}},{\"start\":{\"line\":14,\"column\":67},\"end\":{\"line\":14,\"column\":71}}]},\"11\":{\"line\":19,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":19,\"column\":41},\"end\":{\"line\":19,\"column\":41}},{\"start\":{\"line\":19,\"column\":41},\"end\":{\"line\":19,\"column\":41}}]},\"12\":{\"line\":21,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":21,\"column\":23},\"end\":{\"line\":21,\"column\":23}},{\"start\":{\"line\":21,\"column\":23},\"end\":{\"line\":21,\"column\":23}}]},\"13\":{\"line\":21,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":21,\"column\":38},\"end\":{\"line\":21,\"column\":59}},{\"start\":{\"line\":21,\"column\":62},\"end\":{\"line\":21,\"column\":83}}]},\"14\":{\"line\":24,\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":24,\"column\":28},\"end\":{\"line\":24,\"column\":47}},{\"start\":{\"line\":24,\"column\":51},\"end\":{\"line\":24,\"column\":53}}]},\"15\":{\"line\":32,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":32,\"column\":2},\"end\":{\"line\":32,\"column\":2}},{\"start\":{\"line\":32,\"column\":2},\"end\":{\"line\":32,\"column\":2}}]},\"16\":{\"line\":36,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":36,\"column\":30},\"end\":{\"line\":36,\"column\":38}},{\"start\":{\"line\":36,\"column\":41},\"end\":{\"line\":36,\"column\":49}}]},\"17\":{\"line\":50,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":50,\"column\":2},\"end\":{\"line\":50,\"column\":2}},{\"start\":{\"line\":50,\"column\":2},\"end\":{\"line\":50,\"column\":2}}]},\"18\":{\"line\":54,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":54,\"column\":4},\"end\":{\"line\":54,\"column\":4}},{\"start\":{\"line\":54,\"column\":4},\"end\":{\"line\":54,\"column\":4}}]},\"19\":{\"line\":61,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":61,\"column\":8},\"end\":{\"line\":61,\"column\":16}},{\"start\":{\"line\":61,\"column\":19},\"end\":{\"line\":61,\"column\":27}}]},\"20\":{\"line\":63,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":63,\"column\":48},\"end\":{\"line\":63,\"column\":50}},{\"start\":{\"line\":63,\"column\":53},\"end\":{\"line\":63,\"column\":63}}]},\"21\":{\"line\":75,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":75,\"column\":2},\"end\":{\"line\":75,\"column\":2}},{\"start\":{\"line\":75,\"column\":2},\"end\":{\"line\":75,\"column\":2}}]},\"22\":{\"line\":89,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":89,\"column\":2},\"end\":{\"line\":89,\"column\":2}},{\"start\":{\"line\":89,\"column\":2},\"end\":{\"line\":89,\"column\":2}}]},\"23\":{\"line\":101,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":101,\"column\":4},\"end\":{\"line\":101,\"column\":4}},{\"start\":{\"line\":101,\"column\":4},\"end\":{\"line\":101,\"column\":4}}]},\"24\":{\"line\":101,\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":101,\"column\":8},\"end\":{\"line\":101,\"column\":28}},{\"start\":{\"line\":101,\"column\":32},\"end\":{\"line\":101,\"column\":50}}]},\"25\":{\"line\":109,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":109,\"column\":53},\"end\":{\"line\":109,\"column\":80}},{\"start\":{\"line\":109,\"column\":83},\"end\":{\"line\":109,\"column\":87}}]},\"26\":{\"line\":113,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":113,\"column\":2},\"end\":{\"line\":113,\"column\":2}},{\"start\":{\"line\":113,\"column\":2},\"end\":{\"line\":113,\"column\":2}}]},\"27\":{\"line\":118,\"type\":\"if\",\"locations\":[{\"start\":{\"line\":118,\"column\":4},\"end\":{\"line\":118,\"column\":4}},{\"start\":{\"line\":118,\"column\":4},\"end\":{\"line\":118,\"column\":4}}]},\"28\":{\"line\":137,\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":137,\"column\":51},\"end\":{\"line\":137,\"column\":72}},{\"start\":{\"line\":137,\"column\":76},\"end\":{\"line\":137,\"column\":78}}]},\"29\":{\"line\":137,\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":137,\"column\":14},\"end\":{\"line\":137,\"column\":32}},{\"start\":{\"line\":137,\"column\":36},\"end\":{\"line\":137,\"column\":46}}]}}}}", 3 | "originals": "{\"https://news.ycombinator.com/hn.js?lsGjatK5zCRhuuVxccgq\":\"ZnVuY3Rpb24gJChpZCkgeyByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyB9CmZ1bmN0aW9uIGJ5Q2xhc3MgKGVsLCBjbCkgeyByZXR1cm4gZWwgPyBlbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsKSA6IFtdIH0KZnVuY3Rpb24gYnlUYWcgKGVsLCB0ZykgeyByZXR1cm4gZWwgPyBlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0ZykgOiBbXSB9CmZ1bmN0aW9uIGFsbG9mIChjbCkgeyByZXR1cm4gYnlDbGFzcyhkb2N1bWVudCwgY2wpIH0KZnVuY3Rpb24gaGFzQ2xhc3MgKGVsLCBjbCkgeyB2YXIgYSA9IGVsLmNsYXNzTmFtZS5zcGxpdCgnICcpOyByZXR1cm4gZmluZChjbCwgYSkgfQpmdW5jdGlvbiBhZGRDbGFzcyAoZWwsIGNsKSB7IGlmIChlbCkgeyB2YXIgYSA9IGVsLmNsYXNzTmFtZS5zcGxpdCgnICcpOyBpZiAoIWZpbmQoY2wsIGEpKSB7IGEudW5zaGlmdChjbCk7IGVsLmNsYXNzTmFtZSA9IGEuam9pbignICcpfX0gfQpmdW5jdGlvbiByZW1DbGFzcyAoZWwsIGNsKSB7IGlmIChlbCkgeyB2YXIgYSA9IGVsLmNsYXNzTmFtZS5zcGxpdCgnICcpOyByZW0oYSwgY2wpOyBlbC5jbGFzc05hbWUgPSBhLmpvaW4oJyAnKSB9IH0KZnVuY3Rpb24gaHRtbCAoZWwpIHsgcmV0dXJuIGVsID8gZWwuaW5uZXJIVE1MIDogbnVsbDsgfQpmdW5jdGlvbiBhdHRyIChlbCwgbmFtZSkgeyByZXR1cm4gZWwuZ2V0QXR0cmlidXRlKG5hbWUpIH0KZnVuY3Rpb24gdG9udW0gKHgpIHsgdmFyIG4gPSBwYXJzZUZsb2F0KHgpOyByZXR1cm4gaXNOYU4obikgPyBudWxsIDogbiB9CmZ1bmN0aW9uIGtpbGwgKGVsKSB7IGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpIH0KZnVuY3Rpb24gcG9zZiAoZiwgYSkgeyBmb3IgKHZhciBpPTA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7IGlmIChmKGFbaV0pKSByZXR1cm4gaTsgfSByZXR1cm4gLTE7IH0KZnVuY3Rpb24gcG9zICh4LCBhKSB7IHJldHVybiAodHlwZW9mIHggPT0gJ2Z1bmN0aW9uJykgPyBwb3NmKHgsYSkgOiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEseCkgfQpmdW5jdGlvbiBmaW5kICh4LCBhKSB7IHZhciBpID0gcG9zKHgsIGEpOyByZXR1cm4gKGkgPj0gMCkgPyBhW2ldIDogbnVsbDsgfQpmdW5jdGlvbiBrZWVwIChmbiwgYSkgeyByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGEsIGZuKSB9CmZ1bmN0aW9uIGN1dCAoYSwgbSwgbikgeyByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwgbSwgbikgfQpmdW5jdGlvbiBlYWNoIChmbiwgYSkgeyByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLCBmbikgfQpmdW5jdGlvbiBtYXAgKGZuLCBhKSB7IHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoYSwgZm4pIH0KZnVuY3Rpb24gcmVtIChhLCB4KSB7IHZhciBpID0gcG9zKHgsIGEpOyBpZiAoaSA+PSAwKSB7IGEuc3BsaWNlKGksIDEpOyB9IHJldHVybiBhOyB9CmZ1bmN0aW9uIGxhc3QgKGEpIHsgcmV0dXJuIGFbYS5sZW5ndGggLSAxXSB9CmZ1bmN0aW9uIHZpcyhlbCwgb24pIHsgaWYgKGVsKSB7IG9uID8gcmVtQ2xhc3MoZWwsICdub3NlZScpIDogYWRkQ2xhc3MoZWwsICdub3NlZScpIH0gfQpmdW5jdGlvbiBub3Nob3cgKGVsKSB7IGFkZENsYXNzKGVsLCAnbm9zaG93JykgfQpmdW5jdGlvbiBzaG93IChlbCkgeyByZW1DbGFzcyhlbCwgJ25vc2hvdycpIH0KZnVuY3Rpb24gaW5kIChlbCkgeyByZXR1cm4gKGJ5VGFnKGVsLCAnaW1nJylbMF0gfHwge30pLndpZHRoIH0KCmZ1bmN0aW9uIHZvdGUoZWwsIGhvdykgewogIHZhciBpZCA9IGVsLmlkLnNwbGl0KC9fLylbMV07CiAgdmFyIHVwID0gJCgndXBfJyArIGlkKTsKICB2aXModXAsIGhvdyA9PSAndW4nKTsKICB2aXMoJCgnZG93bl8nICsgaWQpLCBob3cgPT0gJ3VuJyk7CiAgdmFyIHVudiA9ICcnOwogIGlmIChob3cgIT0gJ3VuJykgewogICAgdW52ID0gIiB8IDxhIGlkPSd1bl8iICsgaWQKICAgICAgKyAiJyBvbmNsaWNrPSdyZXR1cm4gdm90ZSh0aGlzLFwidW5cIiknIGhyZWY9JyIKICAgICAgKyB1cC5ocmVmLnJlcGxhY2UoJ2hvdz11cCcsJ2hvdz11bicpCiAgICAgICsgIic+IiArIChob3cgPT0gJ3VwJyA/ICd1bnZvdGUnIDogJ3VuZG93bicpICsgIjwvYT4iCiAgfQogICQoJ3Vudl8nICsgaWQpLmlubmVySFRNTCA9IHVudjsKICBuZXcgSW1hZ2UoKS5zcmMgPSBlbC5ocmVmOwogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gY29tbWVudHMgKCkgeyByZXR1cm4gYWxsb2YoJ2NvbXRyJykgfQpmdW5jdGlvbiBjb2xsYXBzZWQgKCkgeyByZXR1cm4gYWxsb2YoJ2NvbGwnKSB9CgpmdW5jdGlvbiBraWRzIChpZCkgewogIHZhciBrcyA9IFtdOwogIHZhciB0cnMgPSBjb21tZW50cygpOwogIHZhciBpID0gcG9zKCQoaWQpLCB0cnMpOwogIGlmIChpID49IDApIHsKICAgIGtzID0gY3V0KHRycywgaSArIDEpOwogICAgdmFyIG4gPSBpbmQoJChpZCkpOwogICAgdmFyIGogPSBwb3MoZnVuY3Rpb24odHIpIHtyZXR1cm4gaW5kKHRyKSA8PSBufSwga3MpOwogICAgaWYgKGogPj0gMCkgeyBrcyA9IGN1dChrcywgMCwgaikgfQogIH0KICByZXR1cm4ga3M7Cn0KCmZ1bmN0aW9uIHRvZ2dsZSAoaWQsIG4pIHsKICB2YXIgb24gPSAhZmluZCgkKGlkKSwgY29sbGFwc2VkKCkpOwogIChvbiA/IGFkZENsYXNzIDogcmVtQ2xhc3MpKCQoaWQpLCAnY29sbCcpOwogIHJlY29sbCgpOwogIG5ldyBJbWFnZSgpLnNyYyA9ICdjb2xsYXBzZT9pZD0nICsgaWQgKyAob24gPyAnJyA6ICcmdW49dHJ1ZScpOwogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gZXhwYW5kICh0cikgewogIHNob3codHIpOwogIHNob3coYnlDbGFzcyh0ciwgJ2NvbW1lbnQnKVswXSk7CiAgdmlzKGJ5Q2xhc3ModHIsICd2b3RlbGlua3MnKVswXSwgdHJ1ZSk7CiAgYnlDbGFzcyh0ciwgJ3RvZ2cnKVswXS5pbm5lckhUTUwgPSAnWy1dJzsKfQoKZnVuY3Rpb24gc3F1aXNoICh0cikgewogIGlmIChoYXNDbGFzcyh0ciwgJ25vc2hvdycpKSByZXR1cm47CiAgZWFjaChub3Nob3csIGtpZHModHIuaWQpKTsKICB2YXIgZWwgPSBieUNsYXNzKHRyLCAndG9nZycpWzBdOwogIGVsLmlubmVySFRNTCA9ICdbKycgKyBlbC5nZXRBdHRyaWJ1dGUoJ24nKSArICddJzsKICBub3Nob3coYnlDbGFzcyh0ciwgJ2NvbW1lbnQnKVswXSk7CiAgdmlzKGJ5Q2xhc3ModHIsICd2b3RlbGlua3MnKVswXSwgZmFsc2UpOwp9CgpmdW5jdGlvbiByZWNvbGwoKSB7CiAgZWFjaChleHBhbmQsIGNvbW1lbnRzKCkpOwogIGVhY2goc3F1aXNoLCBjb2xsYXBzZWQoKSk7Cn0KCmZ1bmN0aW9uIG9ucmVhZHkgKCkgewogIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NvbGxhcHNpbmduZXdmZWF0dXJlcycpKSB7CiAgICBzaG93KCQoJ25ld2ZlYXR1cmVzJykpOwogIH0KICByZWNvbGwoKTsKfQoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIG9ucmVhZHkpOwoKZnVuY3Rpb24gYWpheCAoZm4sIHVybCkgewogIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICByZXEub3BlbignR0VUJywgdXJsLCB0cnVlKTsKICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHJlcS5yZWFkeVN0YXRlID09PSA0ICYmIHJlcS5zdGF0dXMgPT09IDIwMCkgewogICAgICBmbihyZXEucmVzcG9uc2VUZXh0KQogICAgfQogIH0KICByZXR1cm4gcmVxLnNlbmQoKTsKfQoKZnVuY3Rpb24gb25vcCAoKSB7IHJldHVybiBhdHRyKGJ5VGFnKGRvY3VtZW50LCdodG1sJylbMF0sJ29wJykgfQpmdW5jdGlvbiByYW5rbnVtIChlbCkgeyB2YXIgcyA9IGh0bWwoZWwpOyByZXR1cm4gcyA/IHRvbnVtKHMubWF0Y2goL1swLTldKy8pWzBdKSA6IG51bGwgfQp2YXIgbjEgPSByYW5rbnVtKGFsbG9mKCdyYW5rJylbMF0pOwoKZnVuY3Rpb24gbmV3c3RvcnkgKGpzb24pIHsKICBpZiAoanNvbikgewogICAgdmFyIHBhaXIgPSBKU09OLnBhcnNlKGpzb24pOwogICAgdmFyIHNwID0gbGFzdChhbGxvZignc3BhY2VyJykpOwogICAgc3AuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmVuZCcsIHBhaXJbMF0gKyBzcC5vdXRlckhUTUwpOwogICAgZml4cmFua3MoKTsKICAgIGlmIChvbm9wKCkgPT0gJ25ld2VzdCcpIHsKICAgICAgdmFyIG4gPSByYW5rbnVtKGxhc3QoYWxsb2YoJ3JhbmsnKSkpOwogICAgICBhbGxvZignbW9yZWxpbmsnKVswXS5ocmVmID0gJ25ld2VzdD9uZXh0PScgKyBwYWlyWzFdICsgJyZuPScgKyAobiArIDEpOwogICAgfQogIH0KfQoKZnVuY3Rpb24gZml4cmFua3MgKCkgewogIHZhciBya3MgPSBhbGxvZigncmFuaycpOwogIGVhY2ggKGZ1bmN0aW9uIChyaykgeyByay5pbm5lckhUTUwgPSAocG9zKHJrLHJrcykgKyBuMSkgKyAnLicgfSwgcmtzKTsKfQoKZnVuY3Rpb24gbW9yZXVybCgpIHsgcmV0dXJuIGFsbG9mKCdtb3JlbGluaycpWzBdLmhyZWYgfQpmdW5jdGlvbiBtb3JlbmV4dCAoKSB7IHJldHVybiB0b251bShtb3JldXJsKCkuc3BsaXQoJ25leHQ9JylbMV0pIH0KCmZ1bmN0aW9uIGhpZGVzdG9yeSAoZWwsIGlkKSB7CiAgZm9yICh2YXIgaT0wOyBpIDwgMzsgaSsrKSB7IGtpbGwoJChpZCkubmV4dFNpYmxpbmcpIH0KICBraWxsKCQoaWQpKTsKICBmaXhyYW5rcygpOwogIHZhciBuZXh0ID0gKG9ub3AoKSA9PSAnbmV3ZXN0JyAmJiBtb3JlbmV4dCgpKSA/ICgnJm5leHQ9JyArIG1vcmVuZXh0KCkpIDogJycKICB2YXIgdXJsID0gZWwuaHJlZi5yZXBsYWNlKCdoaWRlJywgJ3NuaXAtc3RvcnknKS5yZXBsYWNlKCdnb3RvJywgJ29ub3AnKQogIGFqYXgobmV3c3RvcnksIHVybCArIG5leHQpOwogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gY2xvc2VmZWF0ICgpIHsKICBub3Nob3coJCgnbmV3ZmVhdHVyZXMnKSk7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NvbGxhcHNpbmduZXdmZWF0dXJlcycsICdzZWVuJyk7Cn0K\"}" 4 | } --------------------------------------------------------------------------------