Commit a6e13c59 authored by Alexandra Rogova's avatar Alexandra Rogova

major restructure part 2

parent 2e1d402d

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

{
"env": {
"amd" : true,
"node": true,
"es6": true
},
"extends": "eslint:recommended",
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": {
"ecmaVersion": 2018,
"sourceType": "module"
},
"rules": {
"indent": [
"error",
4
],
"linebreak-style": [
"error",
"windows"
],
"quotes": [
"error",
"double"
],
"semi": [
"error",
"always"
]
}
}
\ No newline at end of file
{
"node" : true,
"maxlen" : 80,
"indent" : 2,
"maxerr" : 3,
"terse" : true,
"for" : true
}
\ No newline at end of file
const fs = require('fs');
var ipc=require('node-ipc');
const args = require("yargs")
.usage("Usage : Milestone1/all.js -only test -file only on this file -verbose")
.alias("f", "file")
.alias("o", "only")
.alias("v", "verbose")
.describe("file", "If you want to run the test on only one file (as opposed to all files in the directory), add this option and specify file location")
.describe("only", "If you only want to run one test, add this option and specify the test file name (eg : rss_bench)")
.describe("verbose", "Print results to console, if not specified results will only be copied to result file")
.nargs("file", 1)
.nargs("only", 1)
.nargs("verbose", 0)
.argv;
var current;
var to_run = [];
var options = [];
var only_script = args.only == null ? "" : args.only;
if(args.file !== undefined){
options.push("f");
options.push(args.file);
}
if (args.v !== undefined){
options.push("v");
}
ipc.config.id = 'main';
ipc.config.silent = true;
ipc.serve(
function(){
ipc.server.on('message', function(data,socket){
if (args.v) console.log(data);
if (data == "DONE") run(to_run, function (err) {if (err) throw err;});
});
ipc.server.on('socket.disconnected', function(socket, destroyedSocketID) {
ipc.log('client ' + destroyedSocketID + ' has disconnected!');
});
}
);
ipc.server.start();
function run (to_run_array, callback){
var childProcess = require('child_process');
if (to_run_array.length === 0){
return;
}
var invoked = false,
current = to_run_array.shift();
console.log("Starting" + current);
process = childProcess.fork(current, options);
process.on('message', function (mes){});
process.on('error', function (err) {
if (invoked) return;
invoked = true;
callback(err);
});
process.on('exit', function (code) {
if (invoked) return;
invoked = true;
var err = code === 0 ? null : new Error('exit code ' + code);
callback(err);
});
};
fs.readdir("./bench_files/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
if (!file.includes("run_scripts_sync") && file.includes(only_script)) {
to_run.push("./bench_files/"+file);
}
});
run(to_run, function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/add_csv_attachments.csv", {flags:'a'});
fs.truncateSync("./results/add_csv_attachments.csv");
stream.write("items,ramUsed,memUsed\n");
var to_run = [];
fs.readdir("./files/CSV/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
to_run.push({scriptPath : './unit_tests/add_csv.js', args : ['-f' ,"./files/CSV/"+file, "-s", "attachment"]});
});
to_run.sort(function(file1, file2){
var nb_items_file1 = parseInt(file1.args[1].slice(file1.args[1].indexOf("_")+1, file1.args[1].lastIndexOf(".")));
var nb_items_file2 = parseInt(file2.args[1].slice(file2.args[1].indexOf("_")+1, file2.args[1].lastIndexOf(".")));
return nb_items_file1 - nb_items_file2;
});
run(to_run, "./results/add_csv_attachments.csv", function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("../results/add_csv_metadata.csv", {flags:'a'});
fs.truncateSync("../results/add_csv_metadata.csv");
stream.write("items,ramUsed,memUsed\n");
var to_run = [];
fs.readdir("../files/CSV/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
to_run.push({scriptPath : '../unit_tests/add_csv.js', args : ['-f' ,"../files/CSV/"+file, "-s", "metadata"], amount : parseInt(file.substring(17, file.length-4))});
});
to_run.sort(function(file1, file2){
var nb_items_file1 = parseInt(file1.args[1].slice(file1.args[1].indexOf("_")+1, file1.args[1].lastIndexOf(".")));
var nb_items_file2 = parseInt(file2.args[1].slice(file2.args[1].indexOf("_")+1, file2.args[1].lastIndexOf(".")));
return nb_items_file1 - nb_items_file2;
});
run(to_run, "../results/add_csv_metadata.csv", function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("../results/add_random_csv_attachment.csv", {flags:'a'});
fs.truncateSync("../results/add_random_csv_attachment.csv");
stream.write("items,ramUsed,memUsed\n");
var to_run = [{scriptPath : '../unit_tests/add_random_csv.js', args : ["-p", 1000000, "-s", "attachment"], amount : 1000000}];
run(to_run, "../results/add_random_csv_attachment.csv", function (err) {if (err) throw err;});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("../results/add_random_csv_metadata.csv", {flags:'a'});
fs.truncateSync("../results/add_random_csv_metadata.csv");
stream.write("items,ramUsed,memUsed\n");
var to_run = [{scriptPath : '../unit_tests/add_random_csv.js', args : ["-p", 1000000, "-s", "metadata"], amount : 1000000}];
run(to_run, "../results/add_random_csv_metadata.csv", function (err) {if (err) throw err;});
/*jslint es6 */
"use strict";
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var run = require("./run_scripts_sync").run;
const fs = require("fs");
var gen_random_content = require("../unit_tests/random_gen").gen_random_content;
var args = JSON.parse(process.argv[2]);
var stream = fs.createWriteStream(args.result_file, {flags: 'w+'});
var stream = fs.createWriteStream(args.result_file, {flags: "w+"});
stream.write(args.titles + "\n");
var to_run = [];
......@@ -13,15 +13,15 @@ var to_run = [];
if (args.files_dir) {
fs.readdir(args.files_dir, function (err, items) {
if (err) {
return console.log('Unable to scan directory: ' + err);
return console.log("Unable to scan directory: " + err);
}
items.forEach(function (file) {
if (args.file === undefined || file.includes(args.file)) {
var to_pass = [...args.to_pass];
to_pass.push("-f");
to_pass.push(args.files_dir + file);
to_run.push({scriptPath: './unit_tests/' + args.script,
args: to_pass});
to_run.push({scriptPath: "./unit_tests/" + args.script,
args: to_pass});
}
});
console.log("Starting " + args.script);
......@@ -36,8 +36,8 @@ if (args.files_dir) {
var to_pass = [...args.to_pass];
to_pass.push("-f");
to_pass.push(random_file);
to_run.push({scriptPath: './unit_tests/' + args.script,
args: to_pass});
to_run.push({scriptPath: "./unit_tests/" + args.script,
args: to_pass});
run(to_run, args.result_file, function (err) {
if (err) {
throw err;
......
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/content_csv_size.csv", {flags:'a'});
fs.truncateSync("./results/content_csv_size.csv");
stream.write("items,uncompressed,compressed\n");
var to_run = [];
fs.readdir("./files/CSV/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
to_run.push({scriptPath : './unit_tests/download_content.js', args : ['-f' ,"./files/CSV/"+file], amount : parseInt(file.substring(17, file.length-4))});
});
run(to_run, "./results/content_csv_size.csv", function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
var to_run = [{scriptPath : './unit_tests/download_content_random.js', args : ["-p", 1000000], amount : 1000000}];
run(to_run, "./results/content_random_size.csv", function (err) {if (err) throw err;});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/index_csv_size.csv", {flags:'a'});
fs.truncateSync("./results/index_csv_size.csv");
stream.write("items,uncompressed,compressed\n");
var to_run = [];
fs.readdir("./files/CSV/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
to_run.push({scriptPath : './unit_tests/download_index.js', args : ['-f' ,"./files/CSV/"+file], amount : parseInt(file.substring(17, file.length-4))});
});
run(to_run, "./results/index_csv_size.csv", function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
var to_run = [{scriptPath : './unit_tests/download_index_random.js', args : ["-p", 1000000], amount : 1000000}];
run(to_run, "./results/index_random_size.csv", function (err) {if (err) throw err;});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/export_content.csv", {flags:'a'});
fs.truncateSync("./results/export_content.csv");
stream.write("items,zip,json\n");
var to_run = [];
fs.readdir("./files/CONTENT/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
if (file.includes("zip")) to_run.push({scriptPath : './unit_tests/export_content.js', args : ['-f' ,"./files/CONTENT/"+file], amount : parseInt(file.substring(25, file.length-4))});
});
run(to_run, "./results/export_content.csv", function (err) {if (err) throw err;});
});
const fs = require('fs');
var stream = fs.createWriteStream("./results/export_index.csv", {flags:'a'});
fs.truncateSync("./results/export_index.csv");
stream.write("items,zip,json\n");
var to_run = [];
fs.readdir("./files/INDEX/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
if (file.includes(".json")) to_run.push({scriptPath : './unit_tests/export_index.js', args : ['-f' ,"./files/INDEX/"+file], amount : parseInt(file.substring(21, file.length-5))});
});
run(to_run, "./results/export_index.csv", function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/import_content.csv", {flags:'a'});
fs.truncateSync("./results/import_content.csv");
stream.write("items,time\n");
var to_run = [];
fs.readdir("./files/CONTENT/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
if (file.includes("zip")) to_run.push({scriptPath : './unit_tests/import_content.js', args : ['-f' ,"./files/CONTENT/"+file], amount : parseInt(file.substring(25, file.length-4))});
});
run(to_run, "./results/import_content.csv", function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/import_content_bulk.csv", {flags:'a'});
fs.truncateSync("./results/import_content_bulk.csv");
stream.write("items,time\n");
var to_run = [];
fs.readdir("./files/CONTENT/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
if (file.includes(".zip")) to_run.push({scriptPath : './unit_tests/import_content.js', args : ['-f' ,"./files/CONTENT/"+file, '-b'], amount : parseInt(file.substring(17, file.length-4))});
});
run(to_run, "./results/import_content_bulk.csv", function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/import_content_uncompressed.csv", {flags:'a'});
fs.truncateSync("./results/import_content_uncompressed.csv");
stream.write("items,time\n");
var to_run = [];
fs.readdir("./files/CONTENT/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
if (file.includes(".json")) to_run.push({scriptPath : './unit_tests/import_content.js', args : ['-f' ,"./files/CONTENT/"+file, '-u'], amount : parseInt(file.substring(17, file.length-5))});
});
run(to_run, "./results/import_content_uncompressed.csv", function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/import_index.csv", {flags:'a'});
fs.truncateSync("./results/import_index.csv");
stream.write("items,time\n");
var to_run = [];
fs.readdir("./files/INDEX/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
if (file.includes(".zip")) to_run.push({scriptPath : './unit_tests/import_index.js', args : ['-f' ,"./files/INDEX/"+file], amount : parseInt(file.substring(21, file.length-4))});
});
run(to_run, "./results/import_index.csv", function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/import_index_uncompressed.csv", {flags:'a'});
fs.truncateSync("./results/import_index_uncompressed.csv");
stream.write("items,time\n");
var to_run = [];
fs.readdir("./files/INDEX/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
if (file.includes(".json")) to_run.push({scriptPath : './unit_tests/import_index.js', args : ['-f' ,"./files/INDEX/"+file, "-u"], amount : parseInt(file.substring(21, file.length-5))});
});
run(to_run, "./results/import_index_uncompressed.csv", function (err) {if (err) throw err;});
});
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/rss.csv", {flags:'a'});
fs.truncateSync("./results/rss.csv");
stream.write("items,time \n");
var to_run = [];
fs.readdir("./files/RSS/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
var args = process.argv.includes("v") ? ['-f' ,"./files/RSS/"+file, '-v'] : ['-f' ,"./files/RSS/"+file];
if (! process.argv.includes("f")) to_run.push({scriptPath : './unit_tests/add_rss.js', args : args});
else if (file.includes(process.argv[process.argv.indexOf("f")+1])) to_run.push({scriptPath : './unit_tests/add_rss.js', args : args});
});
run(to_run, "./results/rss.csv", function (err) {if (err) throw err;});
});
/*jslint es6 */
"use strict";
function get_size(file) {
return file.slice(file.indexOf("_") + 1, file.lastIndexOf("."));
}
module.exports = {
run: function (args, filepath, callback) {
var ipc = require('node-ipc');
var ipc = require("node-ipc");
ipc.config.silent = true;
ipc.connectTo("main");
var childProcess = require('child_process');
const fs = require('fs');
var stream = fs.createWriteStream(filepath, {flags: 'a'});
var childProcess = require("child_process");
const fs = require("fs");
var stream = fs.createWriteStream(filepath, {flags: "a"});
function write(message) {
if (filepath === "") {
......@@ -23,7 +18,7 @@ module.exports = {
}
if (args.length === 0) {
ipc.of.main.emit('message', "DONE");
ipc.of.main.emit("message", "DONE");
return;
}
......@@ -32,29 +27,20 @@ module.exports = {
console.log(to_run.args);
var process = childProcess.fork(to_run.scriptPath, to_run.args);
process.on('message', function (mes) {
process.on("message", function (mes) {
mes = mes.toString();
if (mes.includes("DONE")) {
module.exports.run(args, filepath, callback);
} else if (mes.includes("ERROR")) {
ipc.of.main.emit('message', mes);
if (to_run.args.includes("-f")) {
write(get_size(to_run.args[1]) + "," + mes);
} else {
write(mes);
}
module.exports.run(args, filepath, callback);
} else {
ipc.of.main.emit('message', mes);
if (to_run.args.includes("-f")) {
write(get_size(to_run.args[1]) + "," + mes);
} else {
write(mes);
ipc.of.main.emit("message", mes);
write(mes);
if (mes.includes("ERROR")) {
module.exports.run(args, filepath, callback);
}
}
});
process.on('error', function (err) {
process.on("error", function (err) {
if (invoked) {
return;
}
......@@ -62,14 +48,14 @@ module.exports = {
callback(err);
});
process.on('exit', function (code) {
process.on("exit", function (code) {
if (invoked) {
return;
}
invoked = true;
var err = code === 0
? null
: new Error('exit code ' + code);
: new Error("exit code " + code);
callback(err);
});
}
......
var run = require('./run_scripts_sync').run;
const fs = require('fs');
var stream = fs.createWriteStream("./results/sitemap.csv", {flags:'a'});
fs.truncateSync("./results/sitemap.csv");
stream.write("items,time\n");
var to_run = [];
fs.readdir("./files/SITEMAP/", function(err, items){
if (err) {
return console.log('Unable to scan directory: ' + err);
}
items.forEach(function (file) {
to_run.push({scriptPath : './unit_tests/add_sitemap.js', args : ['-f' ,"./files/SITEMAP/"+file], amount : parseInt(file.substring(25, file.length-4))});
});
run(to_run, "./results/sitemap.csv", function (err) {if (err) throw err;});
});
......@@ -35,12 +35,121 @@
"paragraphs" : 1000000,
"to_pass" : ["-s", "metadata"]
},
{
"test_name" : "download content",
"script" : "download_content.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/download_content.html",
"result_file" : "./results/content_csv_size.csv",
"titles" : "items,time\n",
"files_dir" : "./files/CSV/",
"to_pass" : []
},
{
"test_name" : "download random content",
"script" : "download_content.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/download_content.html",
"result_file" : "./results/content_random_size.csv",
"titles" : "items,time\n",
"paragraphs" : 1000000,
"to_pass" : []
},
{
"test_name" : "download index",
"script" : "download_index.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/download_index.html",
"result_file" : "./results/index_csv_size.csv",
"titles" : "items,time\n",
"files_dir" : "./files/CSV/",
"to_pass" : []
},
{
"test_name" : "download random index",
"script" : "download_index.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/download_index.html",
"result_file" : "./results/index_random_size.csv",
"titles" : "items,time\n",
"paragraphs" : 1000000,
"to_pass" : []
},
{
"test_name" : "export content",
"script" : "export_content.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/export_content.html",
"result_file" : "./results/export_content.csv",
"titles" : "items,zip,json\n",
"files_dir" : "./files/CONTENT/",
"to_pass" : []
},
{
"test_name" : "export index",
"script" : "export_index.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/export_index.html",
"result_file" : "./results/export_index.csv",
"titles" : "items,zip,json\n",
"files_dir" : "./files/INDEX/",
"to_pass" : []
},
{
"test_name" : "import content",
"script" : "import_content.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/import_content.html",
"result_file" : "./results/import_content.csv",
"titles" : "items,time\n",
"files_dir" : "./files/CONTENT/",
"to_pass" : []
},
{
"test_name" : "import uncompressed content",
"script" : "import_content.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/import_content_uncompressed.html",
"result_file" : "./results/import_content_uncompressed.csv",
"titles" : "items,time\n",
"files_dir" : "./files/CONTENT/",
"to_pass" : ["-u"]
},
{
"test_name" : "import content in bulk",
"script" : "import_content.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/import_content_bulk.html",
"result_file" : "./results/import_content_bulk.csv",
"titles" : "items,time\n",
"files_dir" : "./files/CONTENT/",
"to_pass" : ["-b"]
},
{
"test_name" : "import index",
"script" : "import_index.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/import_index.html",
"result_file" : "./results/import_index.csv",
"titles" : "items,time\n",
"files_dir" : "./files/INDEX/",
"to_pass" : []
},
{
"test_name" : "import uncompressed index",
"script" : "import_index.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/import_index_uncompressed.html",
"result_file" : "./results/import_index_uncompressed.csv",
"titles" : "items,time\n",
"files_dir" : "./files/INDEX/",
"to_pass" : ["-u"]
},
{
"test_name" : "add rss",
"script" : "add_rss.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/add_rss.html",
"result_file" : "./results/rss.csv",
"titles" : "items,time",
"files_dir" : "./files/RSS/",
"to_pass" : []
},
{
"test_name" : "add sitemap",
"script" : "add_sitemap.js",
"link" : "https://softinst115787.host.vifib.net/public/unit_tests/add_sitemap.html",
"result_file" : "./results/sitemap.csv",
"titles" : "items,time",
"files_dir" : "./files/SITEMAP/",
"to_pass" : []
}
]
\ No newline at end of file
items,ramUsed,diskUsed
1000,-0.556598572009277,3.10546875
2000,-0.46393734146813537,5.2265625
3000,-0.5450302605122971,4.890625
/*jslint es6 */
"use strict";
const fs = require('fs');
var ipc = require('node-ipc');
const fs = require("fs");
var ipc = require("node-ipc");
const args = require("yargs")
.usage("Usage : Milestone1/all.js -only test -file only on this file -v")
.alias("f", "file")
......@@ -30,11 +30,11 @@ if (args.file !== undefined) {
options.file = args.file;
}
ipc.config.id = 'main';
ipc.config.id = "main";
ipc.config.silent = true;
ipc.serve(
function () {
ipc.server.on('message', function (data) {
ipc.server.on("message", function (data) {
if (args.v) {
console.log(data);
}
......@@ -51,7 +51,7 @@ ipc.serve(
ipc.server.start();
run = function (callback) {
var childProcess = require('child_process');
var childProcess = require("child_process");
if (to_run.length === 0) {
return;
......@@ -59,9 +59,9 @@ run = function (callback) {
var invoked = false;
var process = childProcess.fork("./bench_files/bench.js",
[JSON.stringify(to_run.shift())]);
[JSON.stringify(to_run.shift())]);
process.on('error', function (err) {
process.on("error", function (err) {
if (invoked) {
return;
}
......@@ -69,21 +69,21 @@ run = function (callback) {
callback(err);
});
process.on('exit', function (code) {
process.on("exit", function (code) {
if (invoked) {
return;
}
invoked = true;
var err = code === 0
? null
: new Error('exit code ' + code);
: new Error("exit code " + code);
callback(err);
});
};
fs.readFile("./config.json", 'utf8', function (err, data) {
fs.readFile("./config.json", "utf8", function (err, data) {
if (err) {
return console.log('Error while reading config file : ' + err);
return console.log("Error while reading config file : " + err);
}
var test_args = JSON.parse(data);
test_args.forEach(function (test) {
......
/*jslint es6 */
"use strict";
var cut_file = require("./random_gen").cut_file;
var diskspace = require('diskspace');
var os_utils = require('os-utils');
const fs = require('fs');
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
var diskspace = require("diskspace");
var os_utils = require("os-utils");
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : load_content.js -saveAs metadata/attachment -file file_path")
.demandOption(['file'])
.demandOption(['saveAs'])
.alias("f", "file")
.alias("s", "saveAs")
.alias("l", "link")
.describe("file", "file containing content, data must follow the CSV standard")
.describe("saveAs", "choose whether to save the content as " +
.usage("Usage : load_content.js -saveAs metadata/attachment -file file_path")
.demandOption(["file"])
.demandOption(["saveAs"])
.alias("f", "file")
.alias("s", "saveAs")
.alias("l", "link")
.describe("file", "file containing content, data must follow the CSV standard")
.describe("saveAs", "choose whether to save the content as " +
"metadata or attachments in the indexeddb")
.describe("link", "link to website treating the data, defaults to Mynij")
.nargs("file", 1)
.nargs("saveAs", 1)
.nargs("link", 1)
.argv;
.describe("link", "link to website treating the data, defaults to Mynij")
.nargs("file", 1)
.nargs("saveAs", 1)
.nargs("link", 1)
.argv;
if (!(args.saveAs === "metadata" ||args.saveAs === "attachment")){
throw 'Unrecognized save as argument';
throw "Unrecognized save as argument";
}
var link = args.link
? args.link
: "https://softinst115787.host.vifib.net/public/unit_tests/" +
? args.link
: "https://softinst115787.host.vifib.net/public/unit_tests/" +
"content_load.html?saveAs=";
var saveAs = args.saveAs;
var files;
var stream;
var browser;
var page;
var n = 0;
......@@ -43,10 +40,9 @@ var memBefore;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
console.log(msg);
diskspace.check('C', function (err, result){
ws.on("connection", function(w){
w.on("message", function(){
diskspace.check("C", function (err, result){
var memUsed = (result.used/1024/1024) - memBefore;
os_utils.cpuUsage(function(v){
var ramUsed = v - ramBefore;
......@@ -55,7 +51,7 @@ function init_server (){
});
});
});
w.on('close', function() {
w.on("close", function() {
ws.close();
});
});
......@@ -66,7 +62,7 @@ function timeout (){
setTimeout(function () {
if (Date.now() - time > 7200000){ //2 hours
process.send(n + ",Timeout error \n");
result = [];
files = [];
query();
} else {
timeout();
......@@ -76,34 +72,34 @@ function timeout (){
async function query (){
if (files.length === 0){
var ipc=require('node-ipc');
var ipc=require("node-ipc");
ipc.config.silent = true;
ipc.connectTo("main");
ipc.of.main.emit('message', "DONE");
ipc.of.main.emit("message", "DONE");
return;
} else {
n += 1000;
time = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
page.click("input#load")
]);
await fileChooser.accept([files.shift()]);
}
}
(async () => {
files = cut_file(args.file);
files = cut_file(args.file, 1000);
init_server();
browser = await puppeteer.launch();
page = await browser.newPage();
await page.goto(link+saveAs);
os_utils.cpuUsage(function(v){
ramBefore = v;
});
diskspace.check('C', function (err, result){
diskspace.check("C", function (err, result){
memBefore = result.used/1024/1024;
});
browser = await puppeteer.launch();
page = await browser.newPage();
await page.goto(link+saveAs);
timeout();
query();
})();
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : add_rss.js -file file_path")
.demandOption(['file'])
.alias("f", "file")
.describe("file", "path to the RSS File")
.nargs("file", 1)
.argv;
.usage("Usage : add_rss.js -file file_path")
.demandOption(["file"])
.alias("f", "file")
.describe("file", "path to the RSS File")
.nargs("file", 1)
.alias("l", "link")
.describe("link", "link to website treating the data, defaults to Mynij")
.nargs("link", 1)
.argv;
var browser,
index_start,
index_total,
db_start,
db_total;
var link = args.link
? args.link
: "https://softinst115787.host.vifib.net/public/unit_tests/add_rss.html";
var browser;
var index_start;
var index_total;
var db_start;
var db_total;
function init_server (){
var ws = new Server({port: 9030});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg === "Index"){
index_start = Date.now();
} else if (msg === "Database"){
index_total = Date.now() - index_start;
db_start = Date.now();
} else if (msg.includes("Done")){
db_total = Date.now() - db_start;
process.send((db_total+index_total)/1000);
process.send("DONE");
ws.close();
browser.close();
} else {
process.send(msg);
ws.close();
browser.close();
}
});
w.on('close', function() {
ws.close();
var ws = new Server({port: 9030});
ws.on("connection", function(w){
w.on("message", function(msg){
if (msg === "Index"){
index_start = Date.now();
} else if (msg === "Database"){
index_total = Date.now() - index_start;
db_start = Date.now();
} else if (msg.includes("Done")){
db_total = Date.now() - db_start;
process.send((db_total+index_total)/1000);
process.send("DONE");
ws.close();
browser.close();
} else {
process.send(msg);
ws.close();
browser.close();
}
});
w.on("close", function() {
ws.close();
});
});
});
}
(async () => {
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/add_rss.html');
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto(link);
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click("input#load")
]);
await fileChooser.accept([args.file]);
})();
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : add_sitemap.js -file file_path")
.demandOption(['file'])
.alias("f", "file")
.describe("file", "path to the Sitemap XML File")
.nargs("file", 1)
.argv;
.usage("Usage : add_sitemap.js -file file_path")
.demandOption(["file"])
.alias("f", "file")
.describe("file", "path to the Sitemap XML File")
.nargs("file", 1)
.alias("l", "link")
.describe("link", "link to website treating the data, defaults to Mynij")
.nargs("link", 1)
.argv;
var link = args.link
? args.link
: "https://softinst115787.host.vifib.net/public/unit_tests/add_sitemap.html";
var browser,
start;
start;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg.includes("Done")){
var now = Date.now();
process.send((now-start)/1000);
process.send("DONE");
ws.close();
browser.close();
} else {
console.log(msg);
ws.close();
browser.close();
}
});
w.on('close', function() {
ws.close();
var port = 9030;
var ws = new Server({port: port});
ws.on("connection", function(w){
w.on("message", function(msg){
if (msg.includes("Done")){
var now = Date.now();
process.send((now-start)/1000);
process.send("DONE");
ws.close();
browser.close();
} else {
console.log(msg);
ws.close();
browser.close();
}
});
w.on("close", function() {
ws.close();
});
});
});
}
(async () => {
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/add_sitemap.html');
start = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto(link);
start = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click("input#load")
]);
await fileChooser.accept([args.file]);
})();
const puppeteer = require('puppeteer');
"use strict";
var cut_file = require("./random_gen").cut_file;
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : download_content.js -file file_path")
.demandOption(['file'])
.alias("f", "file")
.describe("file", "file containing content, data must follow the CSV standard")
.nargs("file", 1)
.argv;
.usage("Usage : download_content.js -file file_path")
.demandOption(["file"])
.alias("f", "file")
.alias("l", "link")
.describe("file", "file containing content, data must follow the CSV standard")
.describe("link", "link to website treating the data, defaults to Mynij")
.nargs("file", 1)
.nargs("link", 1)
.argv;
var link = args.link
? args.link
: "https://softinst115787.host.vifib.net/public/unit_tests/" +
"download_content.html";
var start;
var files;
var browser;
var n = 0;
var time;
var page;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg === "Start"){
start = Date.now();
} else if (msg === "Done"){
var total = Date.now() - start;
//console.log("Time spent : " + total/1000 + "s");
process.send(total/1000);
process.send("DONE");
// NEED TO SEND SIZE
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on('close', function() {
ws.close();
var port = 9030;
var ws = new Server({port: port});
ws.on("connection", function(w){
w.on("message", function(msg){
if (msg === "Start"){
start = Date.now();
} else if (msg === "Done"){
var total = Date.now() - start;
process.send(n + "," + total/1000 + "\n");
query();
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on("close", function() {
ws.close();
});
});
});
}
function timeout (){
setTimeout(function () {
if (Date.now() - time > 7200000){ //2 hours
process.send(n + ",Timeout error \n");
files = [];
query();
} else {
timeout();
}
}, 1800000); //30 minutes
}
async function query (){
if (files.length === 0){
var ipc=require("node-ipc");
ipc.config.silent = true;
ipc.connectTo("main");
ipc.of.main.emit("message", "DONE");
return;
} else {
n += 1000;
time = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click("input#load")
]);
await fileChooser.accept([files.shift()]);
}
}
(async () => {
init_server();
var browser = await puppeteer.launch({headless: false});
var page = await browser.newPage();
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/download_content.html');
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
files = cut_file(args.file, 1000);
init_server();
browser = await puppeteer.launch({headless: false});
page = await browser.newPage();
await page.goto(link);
timeout();
query();
})();
var gen_random_content = require('./random_gen').gen_random_content;
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const tmp = require('tmp');
const fs = require('fs');
var stream = fs.createWriteStream("../results/content_random_size.csv", {flags:'a'});
fs.truncateSync("../results/content_random_size.csv");
const args = require("yargs")
.usage("Usage : download_content_random.js -p number of random paragraphs to add to the index")
.demandOption(['paragraphs'])
.alias("p", "paragraphs")
.describe("paragraphs", "Number of random paragraphs to generate")
.nargs("p", 1)
.argv;
var start,
browser,
page,
result,
n=0,
time;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg.includes("Start")){
start = Date.now();
} else if (msg.includes("Done")){
var time_spent = Date.now() - start;
query();
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on('close', function() {
ws.close();
});
});
}
function timeout (){ //Every 30 minutes, check if more than 2 hours have passed since last response
setTimeout(function () {
if (Date.now() - time > 7200000){ //2 hours
stream.write(n + ",Timeout error \n");
process.exit();
} else {
timeout();
}
}, 1800000); //30 minutes
}
async function query (){
if (result.length === 0){
var ipc=require('node-ipc');
ipc.config.silent = true;
ipc.connectTo("main");
ipc.of.main.emit('message', "DONE");
} else {
n += 1000;
time = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([result.shift()]);
}
}
(async () => {
stream.write("items,uncompressed,compressed\n");
init_server();
result = gen_random_content(args.p);
browser = await puppeteer.launch({headless: false});
page = await browser.newPage();
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/download_content.html');
timeout();
query();
})();
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
"use strict";
var cut_file = require("./random_gen").cut_file;
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : download_index.js -file file_path")
.demandOption(['file'])
.alias("f", "file")
.describe("file", "file containing content, data must follow the CSV standard")
.nargs("file", 1)
.argv;
.usage("Usage : download_index.js -file file_path")
.demandOption(["file"])
.alias("f", "file")
.alias("l", "link")
.describe("link", "link to website treating the data, defaults to Mynij")
.describe("file", "file containing content, data must follow the CSV standard")
.nargs("file", 1)
.nargs("link", 1)
.argv;
var link = args.link
? args.link
: "https://softinst115787.host.vifib.net/public/unit_tests/" +
"download_index.html";
var browser,
start;
var browser;
var start;
var n = 0;
var time;
var page;
var files;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg === "Start"){
start = Date.now();
} else if (msg === "Done"){
var total = Date.now() - start;
//console.log("Time spent : " + total/1000 + "s");
process.send(total/1000);
process.send("DONE");
// NEED TO SEND SIZE
} else {
console.log("Error : " + msg);
browser.close();
}
var port = 9030;
var ws = new Server({port: port});
ws.on("connection", function(w){
w.on("message", function(msg){
if (msg === "Start"){
start = Date.now();
} else if (msg === "Done"){
var total = Date.now() - start;
process.send(total/1000);
process.send("DONE");
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on("close", function() {
ws.close();
});
});
w.on('close', function() {
ws.close();
});
});
}
function timeout (){
setTimeout(function () {
if (Date.now() - time > 7200000){ //2 hours
process.send(n + ",Timeout error \n");
files = [];
query();
} else {
timeout();
}
}, 1800000); //30 minutes
}
async function query (){
if (files.length === 0){
var ipc=require("node-ipc");
ipc.config.silent = true;
ipc.connectTo("main");
ipc.of.main.emit("message", "DONE");
return;
} else {
n += 1000;
time = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click("input#load")
]);
await fileChooser.accept([files.shift()]);
}
}
(async () => {
init_server();
browser = await puppeteer.launch({headless: false});
var page = await browser.newPage();
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/download_index.html');
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
files = cut_file(args.file, 1000);
init_server();
browser = await puppeteer.launch({headless: false});
page = await browser.newPage();
await page.goto(link);
timeout();
query();
})();
var gen_random_content = require('./random_gen').gen_random_content;
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const fs = require('fs');
var stream = fs.createWriteStream("./results/index_random_size.csv", {flags:'a'});
fs.truncateSync("./results/index_random_size.csv");
const args = require("yargs")
.usage("Usage : download_index_random.js -p number of random paragraphs to add to the index")
.demandOption(['paragraphs'])
.alias("p", "paragraphs")
.describe("paragraphs", "Number of random paragraphs to generate")
.nargs("p", 1)
.argv;
var start,
browser,
page,
result,
n=0,
time;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg === "Start"){
start = Date.now();
} else if (msg === "Done"){
var total = Date.now() - start;
query();
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on('close', function() {
ws.close();
});
});
}
function timeout (){ //Every 30 minutes, check if more than 2 hours have passed since last response
setTimeout(function () {
if (Date.now() - time > 7200000){ //2 hours
stream.write(n + ",Timeout error \n");
process.exit();
} else {
timeout();
}
}, 1800000); //30 minutes
}
async function query (){
if (result.length === 0){
var ipc=require('node-ipc');
ipc.config.silent = true;
ipc.connectTo("main");
ipc.of.main.emit('message', "DONE");
} else {
n += 1000;
time = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([result.shift()]);
}
}
(async () => {
stream.write("items,uncompressed,compressed\n");
init_server();
result = gen_random_content(args.p);
browser = await puppeteer.launch({headless: false});
var page = await browser.newPage();
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/download_index.html');
timeout();
query();
})();
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : export_content.js -file file_path")
.demandOption(['file'])
.alias("f", "file")
.describe("file", "file containing content, data must be ZIP")
.nargs("file", 1)
.argv;
.usage("Usage : export_content.js -file file_path")
.demandOption(["file"])
.alias("f", "file")
.describe("file", "file containing content, data must be ZIP")
.nargs("file", 1)
.alias("l", "link")
.describe("link", "link to website treating the data, defaults to Mynij")
.nargs("link", 1)
.argv;
var browser,
start,
zip,
plain_start,
plain;
var link = args.link
? args.link
: "https://softinst115787.host.vifib.net/public/unit_tests/" +
"export_content.html";
var browser;
var start;
var zip;
var plain_start;
var plain;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg === "Start"){
start = Date.now();
} else if (msg === "Zip"){
zip = Date.now() - start;
plain_start = Date.now();
} else if (msg === "JSON"){
plain = Date.now() - plain_start;
process.send(zip/1000 + "," +plain/1000);
process.send("DONE");
ws.close();
browser.close();
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on('close', function() {
ws.close();
var port = 9030;
var ws = new Server({port: port});
ws.on("connection", function(w){
w.on("message", function(msg){
if (msg === "Start"){
start = Date.now();
} else if (msg === "Zip"){
zip = Date.now() - start;
plain_start = Date.now();
} else if (msg === "JSON"){
plain = Date.now() - plain_start;
process.send(zip/1000 + "," +plain/1000);
process.send("DONE");
ws.close();
browser.close();
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on("close", function() {
ws.close();
});
});
});
}
(async () => {
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/export_content.html');
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto(link);
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click("input#load")
]);
await fileChooser.accept([args.file]);
})();
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : export_index.js -file file_path")
.demandOption(['file'])
.alias("f", "file")
.describe("file", "file containing content, data must follow JSON standard")
.nargs("file", 1)
.argv;
.usage("Usage : export_index.js -file file_path")
.demandOption(["file"])
.alias("f", "file")
.describe("file", "file containing content, data must follow JSON standard")
.nargs("file", 1)
.alias("l", "link")
.describe("link", "link to website treating the data, defaults to Mynij")
.nargs("link", 1)
.argv;
var browser,
start,
zip,
plain_start,
plain;
var link = args.link
? args.link
: "https://softinst115787.host.vifib.net/public/unit_tests/" +
"export_index.html";
var browser;
var start;
var zip;
var plain_start;
var plain;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg === "Start"){
start = Date.now();
} else if (msg === "Zip"){
zip = Date.now() - start;
plain_start = Date.now();
} else if (msg === "JSON"){
plain = Date.now() - plain_start;
process.send(zip/1000 + "," +plain/1000);
process.send("DONE");
ws.close();
browser.close();
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on('close', function() {
ws.close();
var port = 9030;
var ws = new Server({port: port});
ws.on("connection", function(w){
w.on("message", function(msg){
if (msg === "Start"){
start = Date.now();
} else if (msg === "Zip"){
zip = Date.now() - start;
plain_start = Date.now();
} else if (msg === "JSON"){
plain = Date.now() - plain_start;
process.send(zip/1000 + "," +plain/1000);
process.send("DONE");
ws.close();
browser.close();
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on("close", function() {
ws.close();
});
});
});
}
(async () => {
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/export_index.html');
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto(link);
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click("input#load")
]);
await fileChooser.accept([args.file]);
})();
const randomstring = require("randomstring");
const fs = require('fs');
const fs = require("fs");
const args = require("yargs")
.usage("Usage : gen_random_rss.js -n number of items to generate")
.demandOption(['number'])
.alias("n", "number")
.describe("number", "Number of random items to generate")
.nargs("number", 1)
.argv;
.usage("Usage : gen_random_rss.js -n number of items to generate")
.demandOption(["number"])
.alias("n", "number")
.describe("number", "Number of random items to generate")
.nargs("number", 1)
.argv;
function gen_rdm_string (length){
return randomstring.generate({
length: length,
charset: 'alphabetic'
});
return randomstring.generate({
length: length,
charset: "alphabetic"
});
}
function gen_rdm_sentence (word_count, word_length){
var tmp_word_array = [];
for (var i = 0; i<word_count; i+=1){
tmp_word_array[i] = gen_rdm_string(word_length);
}
return tmp_word_array.join(" ");
var tmp_word_array = [];
for (var i = 0; i<word_count; i+=1){
tmp_word_array[i] = gen_rdm_string(word_length);
}
return tmp_word_array.join(" ");
}
function gen_rdm_paragraph (sentence_count, words_per_sentence, word_length){
var tmp_sentence_array = [];
for (var i=0; i<sentence_count; i+=1){
tmp_sentence_array[i] = gen_rdm_sentence(words_per_sentence, word_length);
}
return tmp_sentence_array.join(". ");
var tmp_sentence_array = [];
for (var i=0; i<sentence_count; i+=1){
tmp_sentence_array[i] = gen_rdm_sentence(words_per_sentence, word_length);
}
return tmp_sentence_array.join(". ");
}
function gen_random_content (){
var to_write = "<rss version=\"0.91\"><channel><title>RSS TEST FILE</title><link>http://example.com/</link><description>A randomly generated RSS File</description>\n";
for (var i = 0; i<args.n; i+=1){
to_write += "<item>\n<title>\n";
to_write += gen_rdm_sentence(5, 10);
to_write += "\n</title>\n<link>\n";
to_write += "https://"+gen_rdm_string(5)+".com";
to_write += "\n</link>\n<description>\n";
to_write += gen_rdm_paragraph(15, 10, 6);
to_write += "\n</description>\n</item> \n";
}
to_write += "</channel> </rss>";
return to_write;
var to_write = "<rss version=\"0.91\"><channel><title>RSS TEST FILE</title><link>http://example.com/</link><description>A randomly generated RSS File</description>\n";
for (var i = 0; i<args.n; i+=1){
to_write += "<item>\n<title>\n";
to_write += gen_rdm_sentence(5, 10);
to_write += "\n</title>\n<link>\n";
to_write += "https://"+gen_rdm_string(5)+".com";
to_write += "\n</link>\n<description>\n";
to_write += gen_rdm_paragraph(15, 10, 6);
to_write += "\n</description>\n</item> \n";
}
to_write += "</channel> </rss>";
return to_write;
}
var to_write = gen_random_content();
fs.writeFile("./test_files/RSS/rss_"+args.n+".xml", to_write, function(err){
if(err) return console.log(err);
console.log("The file was saved!");
if(err) return console.log(err);
console.log("The file was saved!");
});
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : import_content.js -file file_path -u if uncompressed file -b for bulk")
.demandOption(['file'])
.alias("f", "file")
.alias("u", "uncompressed")
.alias("b", "bulk")
.describe("file", "file containing the index")
.describe("uncompressed", "to add if file is uncompressed ! For testing only !")
.describe("bulk", "adds items to db in bulk. Much faster but still in testing")
.nargs("file", 1)
.nargs("u", 0)
.nargs("b", 0)
.argv;
.usage("Usage : import_content.js -file file_path " +
"-u if uncompressed file -b for bulk")
.demandOption(["file"])
.alias("f", "file")
.alias("u", "uncompressed")
.alias("b", "bulk")
.describe("file", "file containing the index")
.describe("uncompressed", "to add if file is uncompressed ! For testing only !")
.describe("bulk", "adds items to db in bulk. Much faster but still in testing")
.nargs("file", 1)
.nargs("u", 0)
.nargs("b", 0)
.alias("l", "link")
.describe("link", "link to website treating the data, defaults to Mynij")
.nargs("link", 1)
.argv;
var browser,
start;
var link;
if (args.link == null) {
link ="https://softinst115787.host.vifib.net/public/unit_tests/";
if (args.uncompressed) {
link += "import_content_uncompressed.html";
} else if (args.bulk) {
link += "import_content_bulk.html";
} else {
link += "import_content.html";
}
} else {
link = args.link;
}
var browser;
var start;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg.includes("Done")){
var time_spent = Date.now() - start;
process.send(time_spent/1000);
process.send("DONE");
// console.log(msg + " in " + time_spent/1000 + "s");
browser.close();
ws.close();
} else {
console.log("Error : " + msg);
browser.close();
ws.close();
}
});
w.on('close', function() {
ws.close();
var port = 9030;
var ws = new Server({port: port});
ws.on("connection", function(w){
w.on("message", function(msg){
if (msg.includes("Done")){
var time_spent = Date.now() - start;
process.send(time_spent/1000);
process.send("DONE");
browser.close();
ws.close();
} else {
console.log("Error : " + msg);
browser.close();
ws.close();
}
});
w.on("close", function() {
ws.close();
});
});
});
}
(async () => {
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
if (args.uncompressed) await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/import_content_uncompressed.html');
else if (args.bulk) await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/import_content_bulk.html');
else await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/import_content.html');
start = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto(link);
start = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click("input#load")
]);
await fileChooser.accept([args.file]);
})();
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : import_index.js -file file_path -u if uncompressed file")
.demandOption(['file'])
.alias("f", "file")
.alias("u", "uncompressed")
.describe("file", "file containing the index")
.describe("uncompressed", "to add if file is uncompressed ! For testing only !")
.nargs("file", 1)
.nargs("u", 0)
.argv;
.usage("Usage : import_index.js -file file_path -u if uncompressed file")
.demandOption(["file"])
.alias("f", "file")
.alias("u", "uncompressed")
.describe("file", "file containing the index")
.describe("uncompressed", "to add if file is uncompressed ! For testing only !")
.nargs("file", 1)
.nargs("u", 0)
.alias("l", "link")
.describe("link", "link to website treating the data, defaults to Mynij")
.nargs("link", 1)
.argv;
var link;
if (args.link == null) {
link ="https://softinst115787.host.vifib.net/public/unit_tests/";
if (args.uncompressed) {
link += "import_index_uncompressed.html";
} else {
link += "import_index.html";
}
} else {
link = args.link;
}
var browser,
start;
start;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg.includes("Done : ")){
var time_spent = Date.now() - start;
process.send(time_spent/1000);
process.send("DONE");
browser.close();
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on('close', function() {
ws.close();
var port = 9030;
var ws = new Server({port: port});
ws.on("connection", function(w){
w.on("message", function(msg){
if (msg.includes("Done : ")){
var time_spent = Date.now() - start;
process.send(time_spent/1000);
process.send("DONE");
browser.close();
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on("close", function() {
ws.close();
});
});
});
}
(async () => {
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
if (args.uncompressed) await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/import_index_uncompressed.html');
else await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/import_index.html');
start = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto(link);
start = Date.now();
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click("input#load")
]);
await fileChooser.accept([args.file]);
})();
var diskspace = require('diskspace');
var os_utils = require('os-utils');
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const args = require("yargs")
.usage("Usage : load_index.js -saveAs metadata/attachment -file file_path")
.demandOption(['file'])
.demandOption(['saveAs'])
.alias("f", "file")
.alias("s", "saveAs")
.describe("file", "file containing content to put in the index, data must follow the CSV standard")
.describe("saveAs", "choose whether to save the index as metadata or attachments in the indexeddb")
.nargs("file", 1)
.nargs("saveAs", 1)
.argv;
if (!(args.saveAs === "metadata" ||args.saveAs === "attachment")){
throw 'Unrecognized save as argument';
}
var saveAs = args.saveAs,
browser,
page,
ramBefore,
memBefore
adding_start,
adding_total,
saving_start,
saving_total;
function init_server (){
var port = 9030;
var ws = new Server({port: port});
ws.on('connection', function(w){
w.on('message', function(msg){
if (msg === "started adding"){
adding_start = Date.now();
} else if (msg === "started saving"){
adding_total = Date.now() - adding_start;
saving_start = Date.now();
} else if (msg === "finished saving"){
saving_total = Date.now() - saving_start;
} else if (msg.includes("done !")) {
diskspace.check('C', function (err, result){
var memUsed = (result.used/1024/1024) - memBefore;
os_utils.cpuUsage(function(v){
var ramUsed = v - ramBefore;
process.send(ramUsed + "," + memUsed+ "," + adding_total + "," + saving_total);
process.send("DONE");
});
});
browser.close();
} else {
console.log("Error : " + msg);
browser.close();
}
});
w.on('close', function() {
ws.close();
});
});
}
(async () => {
init_server();
browser = await puppeteer.launch();
page = await browser.newPage();
os_utils.cpuUsage(function(v){
ramBefore = v;
});
diskspace.check('C', function (err, result){
memBefore = result.used/1024/1024;
});
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/index_load.html?saveAs='+saveAs);
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
})();
// var gen_random_content = require('./random_gen').gen_random_content;
// var diskspace = require('diskspace');
// var os_utils = require('os-utils');
// const fs = require('fs');
// const puppeteer = require('puppeteer');
// const Server = require('ws').Server;
// const args = require("yargs")
// .usage("Usage : load_index.js -saveAs metadata/attachment -p Number of random paragraphs to generate")
// .demandOption(['saveAs'])
// .demandOption(['paragraphs'])
// .alias("p", "paragraphs")
// .alias("s", "saveAs")
// .describe("paragraphs", "Number of random paragraphs to generate")
// .describe("saveAs", "choose whether to save the index as metadata or attachments in the indexeddb")
// .nargs("saveAs", 1)
// .nargs("paragraphs", 1)
// .argv;
//
// if (!(args.saveAs === "metadata" ||args.saveAs === "attachment")){
// throw 'Unrecognized save as argument';
// }
// var saveAs = args.saveAs,
// browser,
// page,
// ramBefore,
// memBefore,
// adding_start,
// adding_total,
// saving_start,
// saving_total;
//
// function init_server (){
// var port = 9030;
// var ws = new Server({port: port});
// ws.on('connection', function(w){
// w.on('message', function(msg){
// if (msg === "started adding"){
// adding_start = Date.now();
// } else if (msg === "started saving"){
// adding_total = Date.now() - adding_start;
// saving_start = Date.now();
// } else if (msg === "finished saving"){
// saving_total = Date.now() - saving_start;
// } else if (msg.includes("done !")) {
// diskspace.check('C', function (err, result){
// var memUsed = (result.used/1024/1024) - memBefore;
// os_utils.cpuUsage(function(v){
// var ramUsed = v - ramBefore;
// process.send(ramUsed + "," + memUsed+ "," + adding_total + "," + saving_total);
// });
// });
// browser.close();
// } else {
// console.log("Error : " + msg);
// browser.close();
// }
// });
// w.on('close', function() {
// ws.close();
// });
// });
// }
//
// (async () => {
// init_server();
// var file_path = gen_random_content();
// browser = await puppeteer.launch();
// page = await browser.newPage();
// os_utils.cpuUsage(function(v){
// ramBefore = v;
// });
// diskspace.check('C', function (err, result){
// memBefore = result.used/1024/1024;
// });
// await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/index_load.html?saveAs='+saveAs);
// const [fileChooser] = await Promise.all([
// page.waitForFileChooser(),
// page.click('input#load')
// ]);
// await fileChooser.accept([file_path]);
// })();
/*jslint es6 */
"use strict";
const randomstring = require("randomstring");
const tmp = require('tmp');
const fs = require('fs');
const tmp = require("tmp");
const fs = require("fs");
function gen_rdm_string (length){
return randomstring.generate({
length: length,
charset: 'alphabetic'
charset: "alphabetic"
});
}
......@@ -19,40 +19,30 @@ function gen_rdm_sentence (word_count, word_length){
function gen_rdm_paragraph (sentence_count, words_per_sentence, word_length){
return Array(sentence_count).
fill(gen_rdm_sentence(words_per_sentence, word_length)).
join(". ");
fill(gen_rdm_sentence(words_per_sentence, word_length)).
join(". ");
}
var gen_random_content = function(p){
//return file containing p paragraphs
var tmp_para_array = Array(p).fill(gen_rdm_paragraph(6, 15, 5));
var i;
var tmp_file = tmp.fileSync();
fs.writeFileSync(tmp_file.name, tmp_para_array.join("\n"));
return tmp_file.name;
};
var cut_file = function(file_name) {
var cut_file = function(file_name, size) {
var result = [];
var tmp_file;
var i;
var data = fs.readFileSync(file_name, 'utf8');
var data = fs.readFileSync(file_name, "utf8");
var split = data.split("\n");
for (i=0; i<split.length; i+=1000){
for (i=0; i<split.length; i+=size){
tmp_file = tmp.fileSync();
fs.writeFileSync(tmp_file.name, split.slice(i, i+1000).join("\n"));
fs.writeFileSync(tmp_file.name, split.slice(i, i+size).join("\n"));
result.push(tmp_file.name);
}
return result;
// fs.readFile(file_name, 'utf8', function(err, data) {
// split = data.split("\n");
// for (i=0; i<split.length; i+=1000){
// tmp_file = tmp.fileSync();
// fs.writeFileSync(tmp_file.name, split.slice(i, i+1000).join("\n"));
// result.push(tmp_file.name);
// }
// return result;
// });
};
exports.gen_random_content = gen_random_content;
......
const fs = require('fs');
const util = require('util');
const fs = require("fs");
const util = require("util");
const readdir = util.promisify(fs.readdir);
const Rss_parser = require('rss-parser');
const Rss_parser = require("rss-parser");
var rss_parser = new Rss_parser();
var xml_parser = require('xml2js').parseString;
var xml_parser = require("xml2js").parseString;
var to_run_sitemap,
sitemap_stream;
var to_run_sitemap;
var sitemap_stream;
function run(script, files, stream, callback){
var childProcess = require('child_process');
if (files.length === 0) return;
var childProcess = require("child_process");
if (files.length === 0) return;
var invoked = false,
to_run = files.shift();
process = childProcess.fork(script, ['-f', to_run]);
var invoked = false,
to_run = files.shift();
var new_process = childProcess.fork(script, ["-f", to_run]);
process.on('message', function (mes){
mes = mes.toString();
fs.readFile(to_run, (err, data) => {
if (to_run.includes("rss")){
rss_parser.parseString(data, (err, result) => {
stream.write(to_run +","+ result.items.length +","+ mes + "\n");
new_process.on("message", function (mes){
mes = mes.toString();
fs.readFile(to_run, (err, data) => {
if (to_run.includes("rss")){
rss_parser.parseString(data, (err, result) => {
stream.write(to_run +","+ result.items.length +","+ mes + "\n");
});
} else {
xml_parser(data, (err, result) => {
stream.write(to_run +","+ result.urlset.url.length.toString() +","+ mes + "\n");
});
}
});
} else {
xml_parser(data, (err, result) => {
stream.write(to_run +","+ result.urlset.url.length.toString() +","+ mes + "\n");
});
}
run(script, files, stream, callback);
});
run(script, files, stream, callback);
});
process.on('error', function (err) {
if (invoked) return;
invoked = true;
callback(err);
});
new_process.on("error", function (err) {
if (invoked) return;
invoked = true;
callback(err);
});
process.on('exit', function (code) {
callback();
});
new_process.on("exit", function () {
callback();
});
}
function run_sitemap(){
run("./unit_tests/test_sitemap.js", to_run_sitemap, sitemap_stream, function (){return;});
run("./unit_tests/test_sitemap.js", to_run_sitemap, sitemap_stream, function (){return;});
}
(async () => {
fs.truncateSync("./results/rss.csv");
fs.truncateSync("./results/sitemap.csv");
fs.truncateSync("./results/rss.csv");
fs.truncateSync("./results/sitemap.csv");
var rss_stream = fs.createWriteStream("./results/rss.csv", {flags:'a'});
sitemap_stream = fs.createWriteStream("./results/sitemap.csv", {flags:'a'});
var rss_stream = fs.createWriteStream("./results/rss.csv", {flags:"a"});
sitemap_stream = fs.createWriteStream("./results/sitemap.csv", {flags:"a"});
rss_stream.write("file name,items,items in index,title found,content complete\n");
sitemap_stream.write("file name,items,items in index,title found,content complete\n");
rss_stream.write("file name,items,items in index,title found,content complete\n");
sitemap_stream.write("file name,items,items in index,title found,content complete\n");
var rss_files = await readdir("./files/RSS");
to_run_rss = rss_files.map(file => "./files/RSS/" + file);
var sitemap_files = await readdir("./files/SITEMAP");
to_run_sitemap = sitemap_files.map(file => "./files/SITEMAP/" + file);
var rss_files = await readdir("./files/RSS");
var to_run_rss = rss_files.map(file => "./files/RSS/" + file);
var sitemap_files = await readdir("./files/SITEMAP");
to_run_sitemap = sitemap_files.map(file => "./files/SITEMAP/" + file);
run("./unit_tests/test_rss.js", to_run_rss, rss_stream, run_sitemap);
run("./unit_tests/test_rss.js", to_run_rss, rss_stream, run_sitemap);
})();
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : test_rss.js -file file_path")
.demandOption(['file'])
.alias("f", "file")
.describe("file", "path to the RSS File")
.nargs("file", 1)
.argv;
.usage("Usage : test_rss.js -file file_path")
.demandOption(["file"])
.alias("f", "file")
.describe("file", "path to the RSS File")
.nargs("file", 1)
.argv;
var browser;
function init_server (){
var ws = new Server({port: 9030});
ws.on('connection', function(w){
w.on('message', function(msg){
ws.close();
process.send(msg);
browser.close();
var ws = new Server({port: 9030});
ws.on("connection", function(w){
w.on("message", function(msg){
ws.close();
process.send(msg);
browser.close();
});
w.on("close", function() {
ws.close();
});
});
w.on('close', function() {
ws.close();
});
});
}
(async () => {
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/test_rss.html');
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto("https://softinst115787.host.vifib.net/public/unit_tests/test_rss.html");
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click("input#load")
]);
await fileChooser.accept([args.file]);
})();
const puppeteer = require('puppeteer');
const Server = require('ws').Server;
const puppeteer = require("puppeteer");
const Server = require("ws").Server;
const args = require("yargs")
.usage("Usage : test_sitemap.js -file file_path")
.demandOption(['file'])
.alias("f", "file")
.describe("file", "path to the Sitemap File")
.nargs("file", 1)
.argv;
.usage("Usage : test_sitemap.js -file file_path")
.demandOption(["file"])
.alias("f", "file")
.describe("file", "path to the Sitemap File")
.nargs("file", 1)
.argv;
var browser;
function init_server (){
var ws = new Server({port: 9030});
ws.on('connection', function(w){
w.on('message', function(msg){
ws.close();
process.send(msg);
browser.close();
var ws = new Server({port: 9030});
ws.on("connection", function(w){
w.on("message", function(msg){
ws.close();
process.send(msg);
browser.close();
});
w.on("close", function() {
ws.close();
});
});
w.on('close', function() {
ws.close();
});
});
}
(async () => {
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto('https://softinst115787.host.vifib.net/public/unit_tests/test_sitemap.html');
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click('input#load')
]);
await fileChooser.accept([args.file]);
})();
init_server();
browser = await puppeteer.launch();
var page = await browser.newPage();
await page.goto("https://softinst115787.host.vifib.net/public/unit_tests/test_sitemap.html");
const [fileChooser] = await Promise.all([
page.waitForFileChooser(),
page.click("input#load")
]);
await fileChooser.accept([args.file]);
})();
\ No newline at end of file
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../acorn/bin/acorn" "$@"
ret=$?
else
node "$basedir/../acorn/bin/acorn" "$@"
ret=$?
fi
exit $ret
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\acorn\bin\acorn" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\acorn\bin\acorn" %*
)
\ No newline at end of file
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../eslint/bin/eslint.js" "$@"
ret=$?
else
node "$basedir/../eslint/bin/eslint.js" "$@"
ret=$?
fi
exit $ret
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\eslint\bin\eslint.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\eslint\bin\eslint.js" %*
)
\ No newline at end of file
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../esprima/bin/esparse.js" "$@"
ret=$?
else
node "$basedir/../esprima/bin/esparse.js" "$@"
ret=$?
fi
exit $ret
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\esprima\bin\esparse.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\esprima\bin\esparse.js" %*
)
\ No newline at end of file
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../esprima/bin/esvalidate.js" "$@"
ret=$?
else
node "$basedir/../esprima/bin/esvalidate.js" "$@"
ret=$?
fi
exit $ret
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\esprima\bin\esvalidate.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\esprima\bin\esvalidate.js" %*
)
\ No newline at end of file
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../js-yaml/bin/js-yaml.js" "$@"
ret=$?
else
node "$basedir/../js-yaml/bin/js-yaml.js" "$@"
ret=$?
fi
exit $ret
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\js-yaml\bin\js-yaml.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\js-yaml\bin\js-yaml.js" %*
)
\ No newline at end of file
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../semver/bin/semver.js" "$@"
ret=$?
else
node "$basedir/../semver/bin/semver.js" "$@"
ret=$?
fi
exit $ret
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\semver\bin\semver.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\semver\bin\semver.js" %*
)
\ No newline at end of file
MIT License
Copyright (c) 2014-present Sebastian McKenzie and other contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# @babel/code-frame
> Generate errors that contain a code frame that point to source locations.
See our website [@babel/code-frame](https://babeljs.io/docs/en/next/babel-code-frame.html) for more information.
## Install
Using npm:
```sh
npm install --save-dev @babel/code-frame
```
or using yarn:
```sh
yarn add @babel/code-frame --dev
```
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.codeFrameColumns = codeFrameColumns;
exports.default = _default;
var _highlight = _interopRequireWildcard(require("@babel/highlight"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
let deprecationWarningShown = false;
function getDefs(chalk) {
return {
gutter: chalk.grey,
marker: chalk.red.bold,
message: chalk.red.bold
};
}
const NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
function getMarkerLines(loc, source, opts) {
const startLoc = Object.assign({
column: 0,
line: -1
}, loc.start);
const endLoc = Object.assign({}, startLoc, {}, loc.end);
const {
linesAbove = 2,
linesBelow = 3
} = opts || {};
const startLine = startLoc.line;
const startColumn = startLoc.column;
const endLine = endLoc.line;
const endColumn = endLoc.column;
let start = Math.max(startLine - (linesAbove + 1), 0);
let end = Math.min(source.length, endLine + linesBelow);
if (startLine === -1) {
start = 0;
}
if (endLine === -1) {
end = source.length;
}
const lineDiff = endLine - startLine;
const markerLines = {};
if (lineDiff) {
for (let i = 0; i <= lineDiff; i++) {
const lineNumber = i + startLine;
if (!startColumn) {
markerLines[lineNumber] = true;
} else if (i === 0) {
const sourceLength = source[lineNumber - 1].length;
markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1];
} else if (i === lineDiff) {
markerLines[lineNumber] = [0, endColumn];
} else {
const sourceLength = source[lineNumber - i].length;
markerLines[lineNumber] = [0, sourceLength];
}
}
} else {
if (startColumn === endColumn) {
if (startColumn) {
markerLines[startLine] = [startColumn, 0];
} else {
markerLines[startLine] = true;
}
} else {
markerLines[startLine] = [startColumn, endColumn - startColumn];
}
}
return {
start,
end,
markerLines
};
}
function codeFrameColumns(rawLines, loc, opts = {}) {
const highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight.shouldHighlight)(opts);
const chalk = (0, _highlight.getChalk)(opts);
const defs = getDefs(chalk);
const maybeHighlight = (chalkFn, string) => {
return highlighted ? chalkFn(string) : string;
};
const lines = rawLines.split(NEWLINE);
const {
start,
end,
markerLines
} = getMarkerLines(loc, lines, opts);
const hasColumns = loc.start && typeof loc.start.column === "number";
const numberMaxWidth = String(end).length;
const highlightedLines = highlighted ? (0, _highlight.default)(rawLines, opts) : rawLines;
let frame = highlightedLines.split(NEWLINE).slice(start, end).map((line, index) => {
const number = start + 1 + index;
const paddedNumber = ` ${number}`.slice(-numberMaxWidth);
const gutter = ` ${paddedNumber} | `;
const hasMarker = markerLines[number];
const lastMarkerLine = !markerLines[number + 1];
if (hasMarker) {
let markerLine = "";
if (Array.isArray(hasMarker)) {
const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " ");
const numberOfMarkers = hasMarker[1] || 1;
markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join("");
if (lastMarkerLine && opts.message) {
markerLine += " " + maybeHighlight(defs.message, opts.message);
}
}
return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line, markerLine].join("");
} else {
return ` ${maybeHighlight(defs.gutter, gutter)}${line}`;
}
}).join("\n");
if (opts.message && !hasColumns) {
frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`;
}
if (highlighted) {
return chalk.reset(frame);
} else {
return frame;
}
}
function _default(rawLines, lineNumber, colNumber, opts = {}) {
if (!deprecationWarningShown) {
deprecationWarningShown = true;
const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`.";
if (process.emitWarning) {
process.emitWarning(message, "DeprecationWarning");
} else {
const deprecationError = new Error(message);
deprecationError.name = "DeprecationWarning";
console.warn(new Error(message));
}
}
colNumber = Math.max(colNumber, 0);
const location = {
start: {
column: colNumber,
line: lineNumber
}
};
return codeFrameColumns(rawLines, location, opts);
}
\ No newline at end of file
{
"_from": "@babel/code-frame@^7.0.0",
"_id": "@babel/code-frame@7.8.3",
"_inBundle": false,
"_integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
"_location": "/@babel/code-frame",
"_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
"raw": "@babel/code-frame@^7.0.0",
"name": "@babel/code-frame",
"escapedName": "@babel%2fcode-frame",
"scope": "@babel",
"rawSpec": "^7.0.0",
"saveSpec": null,
"fetchSpec": "^7.0.0"
},
"_requiredBy": [
"/eslint"
],
"_resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
"_shasum": "33e25903d7481181534e12ec0a25f16b6fcf419e",
"_spec": "@babel/code-frame@^7.0.0",
"_where": "C:\\Users\\thequ\\Documents\\Mynij\\Mynij-unit-tests\\node_modules\\eslint",
"author": {
"name": "Sebastian McKenzie",
"email": "sebmck@gmail.com"
},
"bundleDependencies": false,
"dependencies": {
"@babel/highlight": "^7.8.3"
},
"deprecated": false,
"description": "Generate errors that contain a code frame that point to source locations.",
"devDependencies": {
"chalk": "^2.0.0",
"strip-ansi": "^4.0.0"
},
"gitHead": "a7620bd266ae1345975767bbc7abf09034437017",
"homepage": "https://babeljs.io/",
"license": "MIT",
"main": "lib/index.js",
"name": "@babel/code-frame",
"publishConfig": {
"access": "public"
},
"repository": {
"type": "git",
"url": "https://github.com/babel/babel/tree/master/packages/babel-code-frame"
},
"version": "7.8.3"
}
MIT License
Copyright (c) 2014-present Sebastian McKenzie and other contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# @babel/highlight
> Syntax highlight JavaScript strings for output in terminals.
See our website [@babel/highlight](https://babeljs.io/docs/en/next/babel-highlight.html) for more information.
## Install
Using npm:
```sh
npm install --save-dev @babel/highlight
```
or using yarn:
```sh
yarn add @babel/highlight --dev
```
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.shouldHighlight = shouldHighlight;
exports.getChalk = getChalk;
exports.default = highlight;
var _jsTokens = _interopRequireWildcard(require("js-tokens"));
var _esutils = _interopRequireDefault(require("esutils"));
var _chalk = _interopRequireDefault(require("chalk"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function getDefs(chalk) {
return {
keyword: chalk.cyan,
capitalized: chalk.yellow,
jsx_tag: chalk.yellow,
punctuator: chalk.yellow,
number: chalk.magenta,
string: chalk.green,
regex: chalk.magenta,
comment: chalk.grey,
invalid: chalk.white.bgRed.bold
};
}
const NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
const JSX_TAG = /^[a-z][\w-]*$/i;
const BRACKET = /^[()[\]{}]$/;
function getTokenType(match) {
const [offset, text] = match.slice(-2);
const token = (0, _jsTokens.matchToToken)(match);
if (token.type === "name") {
if (_esutils.default.keyword.isReservedWordES6(token.value)) {
return "keyword";
}
if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.substr(offset - 2, 2) == "</")) {
return "jsx_tag";
}
if (token.value[0] !== token.value[0].toLowerCase()) {
return "capitalized";
}
}
if (token.type === "punctuator" && BRACKET.test(token.value)) {
return "bracket";
}
if (token.type === "invalid" && (token.value === "@" || token.value === "#")) {
return "punctuator";
}
return token.type;
}
function highlightTokens(defs, text) {
return text.replace(_jsTokens.default, function (...args) {
const type = getTokenType(args);
const colorize = defs[type];
if (colorize) {
return args[0].split(NEWLINE).map(str => colorize(str)).join("\n");
} else {
return args[0];
}
});
}
function shouldHighlight(options) {
return _chalk.default.supportsColor || options.forceColor;
}
function getChalk(options) {
let chalk = _chalk.default;
if (options.forceColor) {
chalk = new _chalk.default.constructor({
enabled: true,
level: 1
});
}
return chalk;
}
function highlight(code, options = {}) {
if (shouldHighlight(options)) {
const chalk = getChalk(options);
const defs = getDefs(chalk);
return highlightTokens(defs, code);
} else {
return code;
}
}
\ No newline at end of file
{
"_from": "@babel/highlight@^7.8.3",
"_id": "@babel/highlight@7.8.3",
"_inBundle": false,
"_integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
"_location": "/@babel/highlight",
"_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
"raw": "@babel/highlight@^7.8.3",
"name": "@babel/highlight",
"escapedName": "@babel%2fhighlight",
"scope": "@babel",
"rawSpec": "^7.8.3",
"saveSpec": null,
"fetchSpec": "^7.8.3"
},
"_requiredBy": [
"/@babel/code-frame"
],
"_resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
"_shasum": "28f173d04223eaaa59bc1d439a3836e6d1265797",
"_spec": "@babel/highlight@^7.8.3",
"_where": "C:\\Users\\thequ\\Documents\\Mynij\\Mynij-unit-tests\\node_modules\\@babel\\code-frame",
"author": {
"name": "suchipi",
"email": "me@suchipi.com"
},
"bundleDependencies": false,
"dependencies": {
"chalk": "^2.0.0",
"esutils": "^2.0.2",
"js-tokens": "^4.0.0"
},
"deprecated": false,
"description": "Syntax highlight JavaScript strings for output in terminals.",
"devDependencies": {
"strip-ansi": "^4.0.0"
},
"gitHead": "a7620bd266ae1345975767bbc7abf09034437017",
"homepage": "https://babeljs.io/",
"license": "MIT",
"main": "lib/index.js",
"name": "@babel/highlight",
"publishConfig": {
"access": "public"
},
"repository": {
"type": "git",
"url": "https://github.com/babel/babel/tree/master/packages/babel-highlight"
},
"version": "7.8.3"
}
Copyright (C) 2012-2017 by Ingvar Stepanyan
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
# Acorn-JSX
[![Build Status](https://travis-ci.org/acornjs/acorn-jsx.svg?branch=master)](https://travis-ci.org/acornjs/acorn-jsx)
[![NPM version](https://img.shields.io/npm/v/acorn-jsx.svg)](https://www.npmjs.org/package/acorn-jsx)
This is plugin for [Acorn](http://marijnhaverbeke.nl/acorn/) - a tiny, fast JavaScript parser, written completely in JavaScript.
It was created as an experimental alternative, faster [React.js JSX](http://facebook.github.io/react/docs/jsx-in-depth.html) parser. Later, it replaced the [official parser](https://github.com/facebookarchive/esprima) and these days is used by many prominent development tools.
## Transpiler
Please note that this tool only parses source code to JSX AST, which is useful for various language tools and services. If you want to transpile your code to regular ES5-compliant JavaScript with source map, check out [Babel](https://babeljs.io/) and [Buble](https://buble.surge.sh/) transpilers which use `acorn-jsx` under the hood.
## Usage
Requiring this module provides you with an Acorn plugin that you can use like this:
```javascript
var acorn = require("acorn");
var jsx = require("acorn-jsx");
acorn.Parser.extend(jsx()).parse("my(<jsx/>, 'code');");
```
Note that official spec doesn't support mix of XML namespaces and object-style access in tag names (#27) like in `<namespace:Object.Property />`, so it was deprecated in `acorn-jsx@3.0`. If you still want to opt-in to support of such constructions, you can pass the following option:
```javascript
acorn.Parser.extend(jsx({ allowNamespacedObjects: true }))
```
Also, since most apps use pure React transformer, a new option was introduced that allows to prohibit namespaces completely:
```javascript
acorn.Parser.extend(jsx({ allowNamespaces: false }))
```
Note that by default `allowNamespaces` is enabled for spec compliancy.
## License
This plugin is issued under the [MIT license](./LICENSE).
This diff is collapsed.
{
"_from": "acorn-jsx@^5.1.0",
"_id": "acorn-jsx@5.1.0",
"_inBundle": false,
"_integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==",
"_location": "/acorn-jsx",
"_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
"raw": "acorn-jsx@^5.1.0",
"name": "acorn-jsx",
"escapedName": "acorn-jsx",
"rawSpec": "^5.1.0",
"saveSpec": null,
"fetchSpec": "^5.1.0"
},
"_requiredBy": [
"/espree"
],
"_resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz",
"_shasum": "294adb71b57398b0680015f0a38c563ee1db5384",
"_spec": "acorn-jsx@^5.1.0",
"_where": "C:\\Users\\thequ\\Documents\\Mynij\\Mynij-unit-tests\\node_modules\\espree",
"bugs": {
"url": "https://github.com/acornjs/acorn-jsx/issues"
},
"bundleDependencies": false,
"deprecated": false,
"description": "Modern, fast React.js JSX parser",
"devDependencies": {
"acorn": "^7.0.0"
},
"homepage": "https://github.com/acornjs/acorn-jsx",
"license": "MIT",
"maintainers": [
{
"name": "Ingvar Stepanyan",
"email": "me@rreverser.com",
"url": "http://rreverser.com/"
}
],
"name": "acorn-jsx",
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0"
},
"repository": {
"type": "git",
"url": "git+https://github.com/acornjs/acorn-jsx.git"
},
"scripts": {
"test": "node test/run.js"
},
"version": "5.1.0"
}
module.exports = {
quot: '\u0022',
amp: '&',
apos: '\u0027',
lt: '<',
gt: '>',
nbsp: '\u00A0',
iexcl: '\u00A1',
cent: '\u00A2',
pound: '\u00A3',
curren: '\u00A4',
yen: '\u00A5',
brvbar: '\u00A6',
sect: '\u00A7',
uml: '\u00A8',
copy: '\u00A9',
ordf: '\u00AA',
laquo: '\u00AB',
not: '\u00AC',
shy: '\u00AD',
reg: '\u00AE',
macr: '\u00AF',
deg: '\u00B0',
plusmn: '\u00B1',
sup2: '\u00B2',
sup3: '\u00B3',
acute: '\u00B4',
micro: '\u00B5',
para: '\u00B6',
middot: '\u00B7',
cedil: '\u00B8',
sup1: '\u00B9',
ordm: '\u00BA',
raquo: '\u00BB',
frac14: '\u00BC',
frac12: '\u00BD',
frac34: '\u00BE',
iquest: '\u00BF',
Agrave: '\u00C0',
Aacute: '\u00C1',
Acirc: '\u00C2',
Atilde: '\u00C3',
Auml: '\u00C4',
Aring: '\u00C5',
AElig: '\u00C6',
Ccedil: '\u00C7',
Egrave: '\u00C8',
Eacute: '\u00C9',
Ecirc: '\u00CA',
Euml: '\u00CB',
Igrave: '\u00CC',
Iacute: '\u00CD',
Icirc: '\u00CE',
Iuml: '\u00CF',
ETH: '\u00D0',
Ntilde: '\u00D1',
Ograve: '\u00D2',
Oacute: '\u00D3',
Ocirc: '\u00D4',
Otilde: '\u00D5',
Ouml: '\u00D6',
times: '\u00D7',
Oslash: '\u00D8',
Ugrave: '\u00D9',
Uacute: '\u00DA',
Ucirc: '\u00DB',
Uuml: '\u00DC',
Yacute: '\u00DD',
THORN: '\u00DE',
szlig: '\u00DF',
agrave: '\u00E0',
aacute: '\u00E1',
acirc: '\u00E2',
atilde: '\u00E3',
auml: '\u00E4',
aring: '\u00E5',
aelig: '\u00E6',
ccedil: '\u00E7',
egrave: '\u00E8',
eacute: '\u00E9',
ecirc: '\u00EA',
euml: '\u00EB',
igrave: '\u00EC',
iacute: '\u00ED',
icirc: '\u00EE',
iuml: '\u00EF',
eth: '\u00F0',
ntilde: '\u00F1',
ograve: '\u00F2',
oacute: '\u00F3',
ocirc: '\u00F4',
otilde: '\u00F5',
ouml: '\u00F6',
divide: '\u00F7',
oslash: '\u00F8',
ugrave: '\u00F9',
uacute: '\u00FA',
ucirc: '\u00FB',
uuml: '\u00FC',
yacute: '\u00FD',
thorn: '\u00FE',
yuml: '\u00FF',
OElig: '\u0152',
oelig: '\u0153',
Scaron: '\u0160',
scaron: '\u0161',
Yuml: '\u0178',
fnof: '\u0192',
circ: '\u02C6',
tilde: '\u02DC',
Alpha: '\u0391',
Beta: '\u0392',
Gamma: '\u0393',
Delta: '\u0394',
Epsilon: '\u0395',
Zeta: '\u0396',
Eta: '\u0397',
Theta: '\u0398',
Iota: '\u0399',
Kappa: '\u039A',
Lambda: '\u039B',
Mu: '\u039C',
Nu: '\u039D',
Xi: '\u039E',
Omicron: '\u039F',
Pi: '\u03A0',
Rho: '\u03A1',
Sigma: '\u03A3',
Tau: '\u03A4',
Upsilon: '\u03A5',
Phi: '\u03A6',
Chi: '\u03A7',
Psi: '\u03A8',
Omega: '\u03A9',
alpha: '\u03B1',
beta: '\u03B2',
gamma: '\u03B3',
delta: '\u03B4',
epsilon: '\u03B5',
zeta: '\u03B6',
eta: '\u03B7',
theta: '\u03B8',
iota: '\u03B9',
kappa: '\u03BA',
lambda: '\u03BB',
mu: '\u03BC',
nu: '\u03BD',
xi: '\u03BE',
omicron: '\u03BF',
pi: '\u03C0',
rho: '\u03C1',
sigmaf: '\u03C2',
sigma: '\u03C3',
tau: '\u03C4',
upsilon: '\u03C5',
phi: '\u03C6',
chi: '\u03C7',
psi: '\u03C8',
omega: '\u03C9',
thetasym: '\u03D1',
upsih: '\u03D2',
piv: '\u03D6',
ensp: '\u2002',
emsp: '\u2003',
thinsp: '\u2009',
zwnj: '\u200C',
zwj: '\u200D',
lrm: '\u200E',
rlm: '\u200F',
ndash: '\u2013',
mdash: '\u2014',
lsquo: '\u2018',
rsquo: '\u2019',
sbquo: '\u201A',
ldquo: '\u201C',
rdquo: '\u201D',
bdquo: '\u201E',
dagger: '\u2020',
Dagger: '\u2021',
bull: '\u2022',
hellip: '\u2026',
permil: '\u2030',
prime: '\u2032',
Prime: '\u2033',
lsaquo: '\u2039',
rsaquo: '\u203A',
oline: '\u203E',
frasl: '\u2044',
euro: '\u20AC',
image: '\u2111',
weierp: '\u2118',
real: '\u211C',
trade: '\u2122',
alefsym: '\u2135',
larr: '\u2190',
uarr: '\u2191',
rarr: '\u2192',
darr: '\u2193',
harr: '\u2194',
crarr: '\u21B5',
lArr: '\u21D0',
uArr: '\u21D1',
rArr: '\u21D2',
dArr: '\u21D3',
hArr: '\u21D4',
forall: '\u2200',
part: '\u2202',
exist: '\u2203',
empty: '\u2205',
nabla: '\u2207',
isin: '\u2208',
notin: '\u2209',
ni: '\u220B',
prod: '\u220F',
sum: '\u2211',
minus: '\u2212',
lowast: '\u2217',
radic: '\u221A',
prop: '\u221D',
infin: '\u221E',
ang: '\u2220',
and: '\u2227',
or: '\u2228',
cap: '\u2229',
cup: '\u222A',
'int': '\u222B',
there4: '\u2234',
sim: '\u223C',
cong: '\u2245',
asymp: '\u2248',
ne: '\u2260',
equiv: '\u2261',
le: '\u2264',
ge: '\u2265',
sub: '\u2282',
sup: '\u2283',
nsub: '\u2284',
sube: '\u2286',
supe: '\u2287',
oplus: '\u2295',
otimes: '\u2297',
perp: '\u22A5',
sdot: '\u22C5',
lceil: '\u2308',
rceil: '\u2309',
lfloor: '\u230A',
rfloor: '\u230B',
lang: '\u2329',
rang: '\u232A',
loz: '\u25CA',
spades: '\u2660',
clubs: '\u2663',
hearts: '\u2665',
diams: '\u2666'
};
This diff is collapsed.
Copyright (C) 2012-2018 by various contributors (see AUTHORS)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment