Skip to content

Commit

Permalink
Merge pull request #164 from tcarver/master
Browse files Browse the repository at this point in the history
updates
  • Loading branch information
tcarver authored May 8, 2024
2 parents fa0d5d9 + c54ceca commit 07ff772
Show file tree
Hide file tree
Showing 32 changed files with 214 additions and 240 deletions.
1 change: 0 additions & 1 deletion build/pedigreejs.v3.0.0-rc3.css

This file was deleted.

1 change: 0 additions & 1 deletion build/pedigreejs.v3.0.0-rc3.min.css

This file was deleted.

2 changes: 0 additions & 2 deletions build/pedigreejs.v3.0.0-rc3.min.js

This file was deleted.

1 change: 0 additions & 1 deletion build/pedigreejs.v3.0.0-rc3.min.js.map

This file was deleted.

1 change: 1 addition & 0 deletions build/pedigreejs.v3.0.0-rc5.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

107 changes: 73 additions & 34 deletions build/pedigreejs.v3.0.0-rc3.js → build/pedigreejs.v3.0.0-rc5.js
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ var pedigreejs = (function (exports) {
});
}
} catch (err) {
showDialog(title, msg, onConfirm, opts);
showDialog(title, msg, onConfirm, opts, dataset);
}
}

Expand Down Expand Up @@ -1069,37 +1069,40 @@ var pedigreejs = (function (exports) {
btn_target: 'pedigree_history'
}, options);
let btns = [{
"fa": "fa-undo pull-left",
"fa": "fa-file-image",
"title": "download PNG image"
}, {
"fa": "fa-undo",
"title": "undo"
}, {
"fa": "fa-redo pull-left",
"fa": "fa-redo",
"title": "redo"
}, {
"fa": "fa-refresh pull-left",
"fa": "fa-refresh",
"title": "reset"
}];
btns.push({
"fa": "fa-crosshairs pull-right",
"fa": "fa-crosshairs",
"title": "scale-to-fit"
});
if (opts.zoomSrc && opts.zoomSrc.indexOf('button') > -1) {
if (opts.zoomOut !== 1) btns.push({
"fa": "fa-minus-circle pull-right",
"fa": "fa-minus-circle",
"title": "zoom-out"
});
if (opts.zoomIn !== 1) btns.push({
"fa": "fa-plus-circle pull-right",
"fa": "fa-plus-circle",
"title": "zoom-in"
});
}
btns.push({
"fa": "fa-arrows-alt pull-right",
"fa": "fa-arrows-alt",
"title": "fullscreen"
});
let lis = "";
for (let i = 0; i < btns.length; i++) {
lis += '<span>';
lis += '&nbsp;<i class="fa fa-lg ' + btns[i].fa + '" ' + (btns[i].fa === "fa-arrows-alt pull-right" ? 'id="fullscreen" ' : '') + ' aria-hidden="true" title="' + btns[i].title + '"></i>';
lis += '<i class="fa fa-lg ' + btns[i].fa + ' pe-2" aria-hidden="true" title="' + btns[i].title + '"' + (btns[i].fa === "fa-arrows-alt" ? 'id="fullscreen" ' : '') + '></i>';
lis += '</span>';
}
$("#" + opts.btn_target).append(lis);
Expand Down Expand Up @@ -1173,7 +1176,10 @@ var pedigreejs = (function (exports) {
messages("Pedigree Reset", "This may result in loss of some data. Reset now?", reset, opts);
} else if ($(e.target).hasClass('fa-crosshairs')) {
scale_to_fit(opts);
} else if ($(e.target).hasClass('fa-file-image')) {
return;
}

// trigger fhChange event
$(document).trigger('fhChange', [opts]);
});
Expand Down Expand Up @@ -1406,6 +1412,7 @@ var pedigreejs = (function (exports) {
};
let genetic_test1 = ['brca1', 'brca2', 'palb2', 'atm', 'chek2', 'rad51d', 'rad51c', 'brip1'];
let genetic_test2 = ['brca1', 'brca2', 'palb2', 'atm', 'chek2', 'bard1', 'rad51d', 'rad51c', 'brip1'];
let genetic_test4 = ['brca1', 'brca2', 'palb2', 'atm', 'chek2', 'bard1', 'rad51d', 'rad51c', 'brip1', 'hoxb13'];
let pathology_tests = ['er', 'pr', 'her2', 'ck14', 'ck56'];

// risk factor to storage
Expand All @@ -1423,6 +1430,9 @@ var pedigreejs = (function (exports) {
if (prs.ovarian_cancer_prs && prs.ovarian_cancer_prs.alpha !== 0 && prs.ovarian_cancer_prs.zscore !== 0) {
meta += "\n##PRS_OC=alpha=" + prs.ovarian_cancer_prs.alpha + ",zscore=" + prs.ovarian_cancer_prs.zscore;
}
if (prs.prostate_cancer_prs && prs.prostate_cancer_prs.alpha !== 0 && prs.prostate_cancer_prs.zscore !== 0) {
meta += "\n##PRS_PC=alpha=" + prs.prostate_cancer_prs.alpha + ",zscore=" + prs.prostate_cancer_prs.zscore;
}
} catch (err) {
console.warn("PRS", prs);
}
Expand Down Expand Up @@ -1468,6 +1478,13 @@ var pedigreejs = (function (exports) {
'percent': parseFloat($('#ovarian_prs_percent').val())
};
}
if (hasInput("prostate_prs_a") && hasInput("prostate_prs_z")) {
prs['prostate_cancer_prs'] = {
'alpha': parseFloat($('#prostate_prs_a').val()),
'zscore': parseFloat($('#prostate_prs_z').val()),
'percent': parseFloat($('#prostate_prs_percent').val())
};
}
console.log(prs);
return isEmpty(prs) ? 0 : prs;
}
Expand All @@ -1481,22 +1498,31 @@ var pedigreejs = (function (exports) {
}
return meta;
}

/**
* Get genetic test genes based on CanRisk version
*/
function getGeneticTest(version) {
version = parseInt(version);
if (version === 1) return genetic_test1;else if (version === 2) return genetic_test2;else if (version === 3) return genetic_test2;
return genetic_test4;
}
function readCanRisk(boadicea_lines) {
let lines = boadicea_lines.trim().split('\n');
let ped = [];
let hdr = []; // collect risk factor header lines
const regexp = /([0-9])/;
let version = 2;
let gt = version === 1 ? genetic_test1 : genetic_test2;
let ncol = [26, 27, 27]; // number of columns - v1, v2, v3
let version = 3;
let gt = getGeneticTest(version);
let ncol = [26, 27, 27, 28]; // number of columns - v1, v2, v3, v4
// assumes two line header
for (let i = 0; i < lines.length; i++) {
let ln = lines[i].trim();
if (ln.indexOf("##") === 0) {
if (ln.indexOf("##CanRisk") === 0) {
const match = ln.match(regexp);
version = parseInt(match[1]);
gt = version === 1 ? genetic_test1 : genetic_test2;
gt = getGeneticTest(version);
console.log("CanRisk File Format version " + version);
if (ln.indexOf(";") > -1) {
// contains surgical op data
Expand Down Expand Up @@ -1601,7 +1627,7 @@ var pedigreejs = (function (exports) {
* Get CanRisk formated pedigree.
*/
function get_pedigree(dataset, famid, meta, isanon) {
let version = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 2;
let version = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 3;
let ethnicity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined;
let v = Number.isInteger(version) ? version + ".0" : version.toString();
let msg = "##CanRisk " + v;
Expand Down Expand Up @@ -1655,7 +1681,7 @@ var pedigreejs = (function (exports) {
msg += "\n##ethnicity=" + ethnicity;
}
msg += "\n##FamID\tName\tTarget\tIndivID\tFathID\tMothID\tSex\tMZtwin\tDead\tAge\tYob\tBC1\tBC2\tOC\tPRO\tPAN\tAshkn";
let gt = version === 1 ? genetic_test1 : genetic_test2;
let gt = getGeneticTest(version);
for (let i = 0; i < gt.length; i++) {
msg += "\t" + gt[i].toUpperCase();
}
Expand Down Expand Up @@ -1745,6 +1771,7 @@ var pedigreejs = (function (exports) {
cancers: cancers,
genetic_test1: genetic_test1,
genetic_test2: genetic_test2,
genetic_test4: genetic_test4,
get_mdensity: get_mdensity,
get_meta: get_meta,
get_non_anon_pedigree: get_non_anon_pedigree,
Expand Down Expand Up @@ -1779,24 +1806,9 @@ var pedigreejs = (function (exports) {
$('#svg_download').click(function (_e) {
svg_download(get_printable_svg(opts));
});
$('#png_download').click(function (_e) {
let deferred = svg2img($('svg'), "pedigree");
$.when.apply($, [deferred]).done(function () {
let obj = getByName(arguments, "pedigree");
if (isEdge() || isIE()) {
let html = "<img src='" + obj.img + "' alt='canvas image'/>";
let newTab = window.open(); // pop-ups need to be enabled
newTab.document.write(html);
} else {
let a = document.createElement('a');
a.href = obj.img;
a.download = 'plot.png';
a.target = '_blank';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
});
$('#png_download, .fa-file-image').click(function (_e) {
let resolution = 1;
img_download(opts, resolution, "image/png");
});
}

Expand Down Expand Up @@ -1832,6 +1844,32 @@ var pedigreejs = (function (exports) {
}
}

/**
* Export pedigree as image, e.g. PNG
*/
function img_download(opts, resolution, img_type) {
let deferred = svg2img($('#' + opts.targetDiv).find('svg'), "pedigree", {
resolution: resolution,
img_type: img_type
});
$.when.apply($, [deferred]).done(function () {
let obj = getByName(arguments, "pedigree");
if (isEdge() || isIE()) {
let html = "<img src='" + obj.img + "' alt='canvas image'/>";
let newTab = window.open(); // pop-ups need to be enabled
newTab.document.write(html);
} else {
let a = document.createElement('a');
a.href = obj.img;
a.download = 'plot.png';
a.target = '_blank';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
});
}

/**
* Given a SVG document element convert to image (e.g. jpeg, png - default png).
*/
Expand Down Expand Up @@ -2431,6 +2469,7 @@ var pedigreejs = (function (exports) {
__proto__: null,
addIO: addIO,
copy_svg: copy_svg,
img_download: img_download,
load_data: load_data,
print: print,
readBoadiceaV4: readBoadiceaV4,
Expand Down Expand Up @@ -3586,7 +3625,7 @@ var pedigreejs = (function (exports) {
'type': 'prostate_cancer',
'colour': '#D5494A'
}],
labels: ['stillbirth', ['age', 'yob'], 'alleles', ['brca1_gene_test', 'brca2_gene_test', 'palb2_gene_test', 'chek2_gene_test', 'atm_gene_test'], ['rad51d_gene_test', 'rad51c_gene_test', 'brip1_gene_test'], ['er_bc_pathology', 'pr_bc_pathology', 'her2_bc_pathology', 'ck14_bc_pathology', 'ck56_bc_pathology']],
labels: ['stillbirth', ['age', 'yob'], 'alleles', ['brca1_gene_test', 'brca2_gene_test', 'palb2_gene_test', 'chek2_gene_test', 'atm_gene_test'], ['rad51d_gene_test', 'rad51c_gene_test', 'brip1_gene_test', 'hoxb13_gene_test'], ['er_bc_pathology', 'pr_bc_pathology', 'her2_bc_pathology', 'ck14_bc_pathology', 'ck56_bc_pathology']],
keep_proband_on_reset: false,
font_size: '.75em',
font_family: 'Helvetica',
Expand Down
1 change: 1 addition & 0 deletions build/pedigreejs.v3.0.0-rc5.min.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions build/pedigreejs.v3.0.0-rc5.min.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions build/pedigreejs.v3.0.0-rc5.min.js.map

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions css/pedigreejs.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,5 @@
.addsibling, .addchild {
cursor: default;
}
.pull-right { float: right; margin-left:.3em; line-height: 1; }
.pull-left { float: left; margin-right:.3em; line-height: 1; }
.pe-2 { padding-right: 0.75em; }
svg {overflow:hidden}
4 changes: 2 additions & 2 deletions docs/demo.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css" media="all" />
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css" rel="stylesheet" type="text/css" media="all" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc3.css" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc5.css" />

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/d3.min.js" integrity="sha256-yUdn/lyl/rHBn4bD4HkKmnR7S6Fj+tXIO0ozSay1Bik=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>

<script src="../build/pedigreejs.v3.0.0-rc3.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc5.js"></script>


<script type="text/javascript">
Expand Down
4 changes: 2 additions & 2 deletions docs/example1.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

<link href="https://code.jquery.com/ui/1.12.1/themes/cupertino/jquery-ui.min.css" rel="stylesheet" type="text/css" media="all" />
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css" rel="stylesheet" type="text/css" media="all" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc3.min.css" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc5.min.css" />

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/d3.min.js" integrity="sha256-yUdn/lyl/rHBn4bD4HkKmnR7S6Fj+tXIO0ozSay1Bik=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc3.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc5.min.js"></script>

<style>
body {
Expand Down
4 changes: 2 additions & 2 deletions docs/example2.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

<link href="https://code.jquery.com/ui/1.12.1/themes/cupertino/jquery-ui.min.css" rel="stylesheet" type="text/css" media="all" />
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css" rel="stylesheet" type="text/css" media="all" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc3.min.css" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc5.min.css" />

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/d3.min.js" integrity="sha256-yUdn/lyl/rHBn4bD4HkKmnR7S6Fj+tXIO0ozSay1Bik=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc3.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc5.min.js"></script>

<style>
body {
Expand Down
4 changes: 2 additions & 2 deletions docs/example3.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

<link href="https://code.jquery.com/ui/1.12.1/themes/cupertino/jquery-ui.min.css" rel="stylesheet" type="text/css" media="all" />
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css" rel="stylesheet" type="text/css" media="all" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc3.min.css" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc5.min.css" />

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/d3.min.js" integrity="sha256-yUdn/lyl/rHBn4bD4HkKmnR7S6Fj+tXIO0ozSay1Bik=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc3.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc5.min.js"></script>

<style>
body {
Expand Down
4 changes: 2 additions & 2 deletions docs/example4.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

<link href="https://code.jquery.com/ui/1.12.1/themes/cupertino/jquery-ui.min.css" rel="stylesheet" type="text/css" media="all" />
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css" rel="stylesheet" type="text/css" media="all" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc3.min.css" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc5.min.css" />

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/d3.min.js" integrity="sha256-yUdn/lyl/rHBn4bD4HkKmnR7S6Fj+tXIO0ozSay1Bik=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc3.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc5.min.js"></script>

<style>
body {
Expand Down
4 changes: 2 additions & 2 deletions docs/example5.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

<link href="https://code.jquery.com/ui/1.12.1/themes/cupertino/jquery-ui.min.css" rel="stylesheet" type="text/css" media="all" />
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css" rel="stylesheet" type="text/css" media="all" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc3.min.css" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc5.min.css" />

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/d3.min.js" integrity="sha256-yUdn/lyl/rHBn4bD4HkKmnR7S6Fj+tXIO0ozSay1Bik=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc3.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc5.min.js"></script>

<style>
body {
Expand Down
4 changes: 2 additions & 2 deletions docs/example6.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

<link href="https://code.jquery.com/ui/1.12.1/themes/cupertino/jquery-ui.min.css" rel="stylesheet" type="text/css" media="all" />
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css" rel="stylesheet" type="text/css" media="all" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc3.min.css" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc5.min.css" />

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/d3.min.js" integrity="sha256-yUdn/lyl/rHBn4bD4HkKmnR7S6Fj+tXIO0ozSay1Bik=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc3.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc5.min.js"></script>

<style>
body {
Expand Down
4 changes: 2 additions & 2 deletions docs/example7.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

<link href="https://code.jquery.com/ui/1.12.1/themes/cupertino/jquery-ui.min.css" rel="stylesheet" type="text/css" media="all" />
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css" rel="stylesheet" type="text/css" media="all" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc3.min.css" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc5.min.css" />

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/d3.min.js" integrity="sha256-yUdn/lyl/rHBn4bD4HkKmnR7S6Fj+tXIO0ozSay1Bik=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc3.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc5.min.js"></script>

<style>
body {
Expand Down
4 changes: 2 additions & 2 deletions docs/example8.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

<link href="https://code.jquery.com/ui/1.12.1/themes/cupertino/jquery-ui.min.css" rel="stylesheet" type="text/css" media="all" />
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css" rel="stylesheet" type="text/css" media="all" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc3.min.css" />
<link rel="stylesheet" href="../build/pedigreejs.v3.0.0-rc5.min.css" />

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/d3.min.js" integrity="sha256-yUdn/lyl/rHBn4bD4HkKmnR7S6Fj+tXIO0ozSay1Bik=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc3.min.js"></script>
<script src="../build/pedigreejs.v3.0.0-rc5.min.js"></script>

<style>
body {
Expand Down
Loading

0 comments on commit 07ff772

Please sign in to comment.