Skip to content

Instantly share code, notes, and snippets.

@derhuerst
Created February 10, 2021 23:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save derhuerst/01ade8f8e95f229897f7011762ebb50a to your computer and use it in GitHub Desktop.
Save derhuerst/01ade8f8e95f229897f7011762ebb50a to your computer and use it in GitHub Desktop.
source code of "COVID-19 infection risk due to aerosols" TU Berlin webapps
const Qb = {
low_activity_lying: 0.45,
low_activity: 0.54,
singing: 0.65,
mid_activity: 0.9,
sports: 1.2,
test_1: 0.54, // value used in test_data/PIR_Modell.jpg
test_2: 0.65, // value used in test_data/PIR_Modell_akt.jpg as instructed by mail
};
function f_tau(V, Q) {
return V / Q;
}
function R_Zero(virus) {
console.log(virus)
switch (virus) {
case "standard":
return 3.35;
case "mutated":
return 4.0;
}
}
function f_E(activity) {
if (activity == "singing") {
return 3500;
} else if (activity =="test_2") {
return 2500; // value received via mail from kriegel
} else return 100;
}
function f_Q(airing) {
if (airing == "very_bad") {
return 10;
} else if (airing == "bad") {
return 20;
} else if (airing == "ok") {
return 30;
} else if (airing == "good") {
return 40;
} else if (airing == "very_good") {
return 60;
}
}
function f_mask(mask, maskPosition) {
if (mask == "no") {
return 1.0
}
if (mask == "medical") {
if (maskPosition == "tight") {
return 0.4
}
return 0.9
}
if (mask == "one_cotton") {
if (maskPosition == "tight") {
return 0.85
}
return 0.95
}
if (mask == "two_cotton") {
if (maskPosition == "tight") {
return 0.7
}
return 0.95
}
if (mask == "ffp1") {
if (maskPosition == "tight") {
return 0.25
}
return 0.6
}
console.log(`No mask coefficient for ${mask} and ${maskPosition}`)
return 1.0
}
function f_qa(activity, virus, maskCoefficient) {
const R_0 = R_Zero(virus);
const q_0 = 2.7618 * (Math.exp(1.1761 * R_0) - 1);
const E_0 = f_E("low_activity");
const E = f_E(activity);
return maskCoefficient * q_0 * (E / E_0) * (Qb[activity] / Qb.low_activity);
}
function f_qatau(qa, tau) {
return qa * Math.exp(-0.5776 * tau);
}
function f_ACH(V, Q) {
return Q / V;
}
function f_C(qa, ACH, Q, t) {
// numerator
let n = 390625 * ACH + 225625;
// console.log(n);
n = n * Math.exp(ACH * t);
// console.log(n);
n = n - 225625;
// console.log(n);
n = n * Math.exp(-ACH * t - (361 / 625) * t);
// console.log(n);
n = 390625 * ACH - n;
// console.log(n);
n = qa * n;
// console.log(n);
// console.log(qa);
// console.log(ACH);
// console.log(Q);
// console.log("t: " + t);
// console.log(n);
// denominator
let d = Q * (225625 * ACH + 130321);
// console.log(d);
return n / d;
}
function f_Ctau(qatau, ACH, tau, Q, t) {
// numerator
// let n = qatau * Math.exp(-ACH * (t + tau)) * (ACH * (t - tau) * Math.exp(ACH * (t + tau)) - Math.exp(ACH * t) + Math.exp(ACH * tau));
// let n = qatau * Math.exp(-ACH * t - 1) * ((ACH * t - 1) * Math.exp(ACH * t + 1) - Math.exp(ACH * t) + Math.exp(1));
let n = qatau * (ACH * t + Math.exp(-ACH * t) - 1/Math.E - 1) // this is a simplification of the above generated by wolfram alpha
// denominator
let d = Q * ACH;
return n / d;
}
function pira(t, Q, activity, virus, V, maskCoefficient) {
if (Q == 0) Q += 0.01;
// console.log(`Calculating pira for: t=${t}, Q=${Q}, activity=${activity}, V=${V}`);
const tau = f_tau(V, Q);
// console.log("tau: " + tau);
const qa = f_qa(activity, virus, maskCoefficient);
// console.log("qa: " + qa);
const qatau = f_qatau(qa, tau);
// console.log("qatau: " + qatau);
const ACH = f_ACH(V, Q);
// console.log("ACH: " + ACH);
// console.log("Qb: " + Qb[activity]);
if (t > tau) {
const C = f_C(qa, ACH, Q, tau);
// console.log(C);
let Ctau = f_Ctau(qatau, ACH, tau, Q, t);
// if (isNaN(Ctau)) {
// Ctau = 1
// }
// console.log(Ctau);
return 1 - Math.exp(-(C + Ctau) * Qb[activity]);
} else {
const C = f_C(qa, ACH, Q, t);
// console.log(C);
return 1 - Math.exp(-C * Qb[activity]);
}
}
function prepareData(volume, activity, virus, maxQ, mask, maskPosition) {
const V = volume;
const maskCoefficient = f_mask(mask, maskPosition)
let xA = [];
let yA = [];
let rows = [];
const min = 50
const max = maxQ
for (let Q = min; Q <= max; Q += 50) {
xA = [];
let row = [];
for (let t = 0.0; t <= 6.0; t += 0.1) {
// hours,+ increments in hours
p = pira(t, Q, activity, virus, V, maskCoefficient);
//console.log("Pira for t=" + t + ", Q=" + Q + ": " + p);
p = Math.round(p * 10000) / 100;
//if (t == 6 && Q == 500) p = 100;
// if (isNaN(p) || p >= 100) {
// p = 0
// }
row.push(p);
xA.push(t);
}
yA.push(Q);
rows.push(row);
}
// for (let minute = 0; minute <= 360; minute += 30) {
// let t = minute / 60;
// let m = minute % 60;
// let h = (minute - m) / 60;
// let time = h + ":" + m + "h";
// }
return {
test: xA,
x: xA,
y: yA,
z: rows
};
}
function prepareDataSimple(volume, activity, virus, Q, people, mask, maskPosition) {
const V = volume;
const maskCoefficient = f_mask(mask, maskPosition)
console.log(`Total airflow for all people in the room is (Q) is ${Q}`)
let x = [];
let y = []; // pira
let x2 = []; // only timestamps for the full hour
let y2 = []; // infected people
for (let t = 0; t <= 6; t += 1) {
p = pira(t, Q, activity, virus, V, maskCoefficient);
p = Math.round(p * 10000) / 100;
y.push(p);
x.push(t);
x2.push(t)
y2.push(Math.round(p * (people - 1)/ 100)); // the infected person cannot be infected again
// intermediate steps for pira only, not for no. infected people
for (let st = 0.1; st < 1; st += 0.1) {
p = pira(t + st, Q, activity, virus, V, maskCoefficient);
p = Math.round(p * 10000) / 100;
y.push(p);
x.push(t + st);
}
}
return [
{
x: x,
y: y
},
{
x: x2,
y: y2
}
];
}
module.exports = {
prepareData: prepareData,
prepareDataSimple: prepareDataSimple,
pira: pira,
f_qa: f_qa,
f_Q: f_Q
}
!function(e){var t={};function n(a){if(t[a])return t[a].exports;var o=t[a]={i:a,l:!1,exports:{}};return e[a].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(a,o,function(t){return e[t]}.bind(null,o));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=2)}([function(e,t){const n={low_activity_lying:.45,low_activity:.54,singing:.65,mid_activity:.9,sports:1.2,test_1:.54,test_2:.65};function a(e){return"singing"==e?3500:"test_2"==e?2500:100}function o(e,t){return"no"==e?1:"medical"==e?"tight"==t?.4:.9:"one_cotton"==e?"tight"==t?.85:.95:"two_cotton"==e?"tight"==t?.7:.95:"ffp1"==e?"tight"==t?.25:.6:(console.log(`No mask coefficient for ${e} and ${t}`),1)}function i(e,t,o){const i=function(e){switch(console.log(e),e){case"standard":return 3.35;case"mutated":return 4}}(t),l=2.7618*(Math.exp(1.1761*i)-1),u=a("low_activity");return o*l*(a(e)/u)*(n[e]/n.low_activity)}function l(e,t,n,a){let o=390625*t+225625;return o*=Math.exp(t*a),o-=225625,o*=Math.exp(-t*a-.5776*a),o=390625*t-o,o*=e,o/(n*(225625*t+130321))}function u(e,t,a,o,u,d){0==t&&(t+=.01);const r=function(e,t){return e/t}(u,t),c=i(a,o,d),s=function(e,t){return e*Math.exp(-.5776*t)}(c,r),m=function(e,t){return t/e}(u,t);if(e>r){const o=l(c,m,t,r);let i=function(e,t,n,a,o){return e*(t*o+Math.exp(-t*o)-1/Math.E-1)/(a*t)}(s,m,0,t,e);return 1-Math.exp(-(o+i)*n[a])}{const o=l(c,m,t,e);return 1-Math.exp(-o*n[a])}}e.exports={prepareData:function(e,t,n,a,i,l){const d=e,r=o(i,l);let c=[],s=[],m=[];const g=a;for(let e=50;e<=g;e+=50){c=[];let a=[];for(let o=0;o<=6;o+=.1)p=u(o,e,t,n,d,r),p=Math.round(1e4*p)/100,a.push(p),c.push(o);s.push(e),m.push(a)}return{test:c,x:c,y:s,z:m}},prepareDataSimple:function(e,t,n,a,i,l,d){const r=e,c=o(l,d);console.log("Total airflow for all people in the room is (Q) is "+a);let s=[],m=[],g=[],f=[];for(let e=0;e<=6;e+=1){p=u(e,a,t,n,r,c),p=Math.round(1e4*p)/100,m.push(p),s.push(e),g.push(e),f.push(Math.round(p*(i-1)/100));for(let o=.1;o<1;o+=.1)p=u(e+o,a,t,n,r,c),p=Math.round(1e4*p)/100,m.push(p),s.push(e+o)}return[{x:s,y:m},{x:g,y:f}]},pira:u,f_qa:i,f_Q:function(e){return"very_bad"==e?10:"bad"==e?20:"ok"==e?30:"good"==e?40:"very_good"==e?60:void 0}}},function(e,t,n){const a=n(0).prepareData,o=n(0).prepareDataSimple,i=n(0).f_Q;var l=document.getElementById("volume").value,u=document.getElementById("activity").value,d=document.getElementById("virus").value,r=document.getElementById("mask").value,c=document.getElementById("maskPosition").value,s=document.getElementById("mode").value,m=document.getElementById("airing").value,p=document.getElementById("people").value,g=-1,f=0,v=-1;E();var y=-1;x();const h=document.getElementById("chart");function E(){g=i(m)*p,v=g+f,document.getElementById("isQ").value=g,document.getElementById("usedQ").value=v}function x(){y=i("very_good")*p,document.getElementById("maxQ").value=y}function I(){console.log("The graph must be updated!"),console.log(`Volume: ${l}, activity: ${u}, airing: ${m}`),"simple"===s?(data=o(l,u,d,v,p,r,c),function(e){e[0].mode="lines",e[0].name="PIRA (in %)",e[0].yaxis="y",e[1].type="bar",e[1].yaxis="y2",e[1].name="Potentiell Angesteckte",console.log(e);var t={shareX:!0,xaxis:{title:{text:"Zeit in Stunden"}},yaxis:{title:"PIRA (in %)",overlaying:"y2",tickvals:[10,20,30,40,50,60,70,80,90,100],range:[0,100]},yaxis2:{tickmode:"auto",title:"Anzahl sich potentiell angesteckter Personen (gerundet)",side:"right",range:[0,p-1]},legend:{y:1,x:0}};Plotly.newPlot(h,e,t,{responsive:!0})}(data)):"expert"===s&&(data=a(l,u,d,y,r,c),function(e){e.type="contour",e.colorbar={title:"PIRA",ticksuffix:"%"},e.hovertemplate="PIRA: %{z:.2f}%<extra></extra>";console.log(e),Plotly.newPlot(h,[e],{showaxeslabels:!0,xaxis_title:"Zeit in Stunden",xaxis:{title:{text:"Zeit in Stunden"}},yaxis:{title:{text:"Frischluftmenge in m³/h"}}},{responsive:!0})}(data))}e.exports={modeUpdated:function(e){s=e,I()},volumeUpdated:function(e){l=e,I()},activityUpdated:function(e){u=e,I()},virusUpdated:function(e){d=e,I()},maskUpdated:function(e){r=e,I()},maskPositionUpdated:function(e){c=e,I()},airingUpdated:function(e){m=e,E(),I()},vistypeUpdated:function(e){vistype=e,I()},peopleUpdated:function(e){p=e,E(),x(),I()},addQUpdated:function(e){f=e,E(),I()},maxQUpdated:function(e){y=e,I()}}},function(e,t,n){n(3);const a=n(1);document.getElementById("mode").addEventListener("input",(function(e){if("expert"==e.target.value){for(el of(simpleElements=document.getElementsByClassName("simple"),simpleElements))el.style.display="none";for(el of(expertElements=document.getElementsByClassName("expert"),expertElements))el.style.display="block"}else if("simple"==e.target.value){for(el of(expertElements=document.getElementsByClassName("simple"),expertElements))el.style.display="block";for(el of(expertElements=document.getElementsByClassName("expert"),expertElements))el.style.display="none"}a.modeUpdated(e.target.value)})),document.getElementById("activity").addEventListener("input",(function(e){a.activityUpdated(e.target.value)})),document.getElementById("virus").addEventListener("input",(function(e){a.virusUpdated(e.target.value),"mutated"==e.target.value?document.getElementById("mutationdisclaimer").style.display="block":document.getElementById("mutationdisclaimer").style.display="none"})),document.getElementById("mask").addEventListener("input",(function(e){a.maskUpdated(e.target.value)})),document.getElementById("maskPosition").addEventListener("input",(function(e){a.maskPositionUpdated(e.target.value)})),document.getElementById("people").addEventListener("change",(function(e){""!=e.target.value&&(e.target.value<1?e.target.value=1:e.target.value>100&&(e.target.value=100),a.peopleUpdated(e.target.value))})),document.getElementById("airing").addEventListener("change",(function(e){a.airingUpdated(e.target.value)})),document.getElementById("addQ").addEventListener("change",(function(e){e.target.value<0?e.target.value=0:e.target.value>5e3&&(e.target.value=5e3),a.addQUpdated(parseInt(e.target.value))})),document.getElementById("maxQ").addEventListener("change",(function(e){e.target.value<100?e.target.value=100:e.target.value>6e3&&(e.target.value=6e3),a.maxQUpdated(e.target.value)}))},function(e,t,n){const a=n(1);function o(e,t){this.data=t,this.element=e,e.value=t,e.addEventListener("change",this,!1)}function i(){l.data>10&&l.change(10),l.data<1&&l.change(1),u.data>10&&u.change(10),u.data<1&&u.change(1),d.data>5&&d.change(5),d.data<1&&d.change(1);const e=l.data*u.data*d.data;return console.log(e),document.getElementById("volume").value=e,a.volumeUpdated(e),e}o.prototype.handleEvent=function(e){switch(e.type){case"change":this.change(this.element.value),i()}},o.prototype.change=function(e){this.data=e,this.element.value=e};var l=new o(document.getElementById("length"),document.getElementById("length").value),u=new o(document.getElementById("width"),document.getElementById("width").value),d=new o(document.getElementById("height"),document.getElementById("height").value);i(),e.exports={get:i,init:i}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2RhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2dyYXBoLmpzIiwid2VicGFjazovLy8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdm9sdW1lLmpzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiUWIiLCJsb3dfYWN0aXZpdHlfbHlpbmciLCJsb3dfYWN0aXZpdHkiLCJzaW5naW5nIiwibWlkX2FjdGl2aXR5Iiwic3BvcnRzIiwidGVzdF8xIiwidGVzdF8yIiwiZl9FIiwiYWN0aXZpdHkiLCJmX21hc2siLCJtYXNrIiwibWFza1Bvc2l0aW9uIiwiY29uc29sZSIsImxvZyIsImZfcWEiLCJ2aXJ1cyIsIm1hc2tDb2VmZmljaWVudCIsIlJfMCIsIlJfWmVybyIsInFfMCIsIk1hdGgiLCJleHAiLCJFXzAiLCJmX0MiLCJxYSIsIkFDSCIsIlEiLCJwaXJhIiwiViIsInRhdSIsImZfdGF1IiwicWF0YXUiLCJmX3FhdGF1IiwiZl9BQ0giLCJDIiwiQ3RhdSIsIkUiLCJmX0N0YXUiLCJwcmVwYXJlRGF0YSIsInZvbHVtZSIsIm1heFEiLCJ4QSIsInlBIiwicm93cyIsIm1heCIsInJvdyIsInJvdW5kIiwicHVzaCIsInRlc3QiLCJ4IiwieSIsInoiLCJwcmVwYXJlRGF0YVNpbXBsZSIsInBlb3BsZSIsIngyIiwieTIiLCJzdCIsImZfUSIsImFpcmluZyIsImRhdGFGIiwiZGF0YUZTaW1wbGUiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaXNRIiwiYWRkUSIsInVzZWRRIiwiY2FsY3VsYXRlVXNlZFEiLCJjYWxjdWxhdGVNYXhRIiwiY2hhcnREaXYiLCJ1cGRhdGVHcmFwaCIsImRhdGEiLCJ5YXhpcyIsInR5cGUiLCJsYXlvdXQiLCJzaGFyZVgiLCJ4YXhpcyIsInRpdGxlIiwidGV4dCIsIm92ZXJsYXlpbmciLCJ0aWNrdmFscyIsInJhbmdlIiwieWF4aXMyIiwidGlja21vZGUiLCJzaWRlIiwibGVnZW5kIiwiUGxvdGx5IiwibmV3UGxvdCIsInJlc3BvbnNpdmUiLCJkcmF3U2ltcGxlUGxvdCIsImNvbG9yYmFyIiwidGlja3N1ZmZpeCIsImhvdmVydGVtcGxhdGUiLCJzaG93YXhlc2xhYmVscyIsInhheGlzX3RpdGxlIiwiZHJhd0NvbnRvdXJQbG90IiwibW9kZVVwZGF0ZWQiLCJuZXdNb2RlIiwidm9sdW1lVXBkYXRlZCIsIm5ld1ZvbHVtZSIsImFjdGl2aXR5VXBkYXRlZCIsIm5ld0FjdGl2aXR5IiwidmlydXNVcGRhdGVkIiwibmV3VmlydXMiLCJtYXNrVXBkYXRlZCIsIm5ld01hc2siLCJtYXNrUG9zaXRpb25VcGRhdGVkIiwibmV3TWFza1Bvc2l0aW9uIiwiYWlyaW5nVXBkYXRlZCIsIm5ld0FpcmluZyIsInZpc3R5cGVVcGRhdGVkIiwibmV3VmlzVHlwZSIsInZpc3R5cGUiLCJwZW9wbGVVcGRhdGVkIiwibmV3UGVvcGxlIiwiYWRkUVVwZGF0ZWQiLCJuZXdBZGRRIiwibWF4UVVwZGF0ZWQiLCJuZXdNYXhRIiwiZ3JhcGgiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJ0YXJnZXQiLCJlbCIsInNpbXBsZUVsZW1lbnRzIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsInN0eWxlIiwiZGlzcGxheSIsImV4cGVydEVsZW1lbnRzIiwicGFyc2VJbnQiLCJJbnB1dEVsZW1lbnQiLCJlbGVtZW50IiwidGhpcyIsInVwZGF0ZVZvbHVtZSIsImxlbmd0aEVsZW1lbnQiLCJjaGFuZ2UiLCJ3aWR0aEVsZW1lbnQiLCJoZWlnaHRFbGVtZW50IiwiaGFuZGxlRXZlbnQiLCJpbml0Il0sIm1hcHBpbmdzIjoiYUFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUFLZkYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWViLEVBQVNTLEVBQU0sQ0FBRUssWUFBWSxFQUFNQyxJQUFLTCxLQUtoRVosRUFBb0JrQixFQUFJLFNBQVNoQixHQUNYLG9CQUFYaUIsUUFBMEJBLE9BQU9DLGFBQzFDTixPQUFPQyxlQUFlYixFQUFTaUIsT0FBT0MsWUFBYSxDQUFFQyxNQUFPLFdBRTdEUCxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sS0FRdkRyQixFQUFvQnNCLEVBQUksU0FBU0QsRUFBT0UsR0FFdkMsR0FEVSxFQUFQQSxJQUFVRixFQUFRckIsRUFBb0JxQixJQUMvQixFQUFQRSxFQUFVLE9BQU9GLEVBQ3BCLEdBQVcsRUFBUEUsR0FBOEIsaUJBQVZGLEdBQXNCQSxHQUFTQSxFQUFNRyxXQUFZLE9BQU9ILEVBQ2hGLElBQUlJLEVBQUtYLE9BQU9ZLE9BQU8sTUFHdkIsR0FGQTFCLEVBQW9Ca0Is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Y2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyKTtcbiIsImNvbnN0IFFiID0ge1xuICBsb3dfYWN0aXZpdHlfbHlpbmc6IDAuNDUsXG4gIGxvd19hY3Rpdml0eTogMC41NCxcbiAgc2luZ2luZzogMC42NSxcbiAgbWlkX2FjdGl2aXR5OiAwLjksXG4gIHNwb3J0czogMS4yLFxuICB0ZXN0XzE6IDAuNTQsIC8vIHZhbHVlIHVzZWQgaW4gdGVzdF9kYXRhL1BJUl9Nb2RlbGwuanBnXG4gIHRlc3RfMjogMC42NSwgLy8gdmFsdWUgdXNlZCBpbiB0ZXN0X2RhdGEvUElSX01vZGVsbF9ha3QuanBnIGFzIGluc3RydWN0ZWQgYnkgbWFpbFxufTtcblxuZnVuY3Rpb24gZl90YXUoViwgUSkge1xuICByZXR1cm4gViAvIFE7XG59XG5cbmZ1bmN0aW9uIFJfWmVybyh2aXJ1cykge1xuICAgIGNvbnNvbGUubG9nKHZpcnVzKVxuICAgIHN3aXRjaCAodmlydXMpIHtcbiAgICAgICAgY2FzZSBcInN0YW5kYXJkXCI6XG4gICAgICAgICAgICByZXR1cm4gMy4zNTtcbiAgICAgICAgY2FzZSBcIm11dGF0ZWRcIjpcbiAgICAgICAgICAgIHJldHVybiA0LjA7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmX0UoYWN0aXZpdHkpIHtcbiAgaWYgKGFjdGl2aXR5ID09IFwic2luZ2luZ1wiKSB7XG4gICAgcmV0dXJuIDM1MDA7XG4gIH0gZWxzZSBpZiAoYWN0aXZpdHkgPT1cInRlc3RfMlwiKSB7XG4gICAgcmV0dXJuIDI1MDA7IC8vIHZhbHVlIHJlY2VpdmVkIHZpYSBtYWlsIGZyb20ga3JpZWdlbFxuICB9IGVsc2UgcmV0dXJuIDEwMDtcbn1cblxuZnVuY3Rpb24gZl9RKGFpcmluZykge1xuICBpZiAoYWlyaW5nID09IFwidmVyeV9iYWRcIikge1xuICAgIHJldHVybiAxMDtcbiAgfSBlbHNlIGlmIChhaXJpbmcgPT0gXCJiYWRcIikge1xuICAgIHJldHVybiAyMDtcbiAgfSBlbHNlIGlmIChhaXJpbmcgPT0gXCJva1wiKSB7XG4gICAgcmV0dXJuIDMwO1xuICB9IGVsc2UgaWYgKGFpcmluZyA9PSBcImdvb2RcIikge1xuICAgIHJldHVybiA0MDtcbiAgfSBlbHNlIGlmIChhaXJpbmcgPT0gXCJ2ZXJ5X2dvb2RcIikge1xuICAgIHJldHVybiA2MDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmX21hc2sobWFzaywgbWFza1Bvc2l0aW9uKSB7XG4gICAgaWYgKG1hc2sgPT0gXCJub1wiKSB7XG4gICAgICAgIHJldHVybiAxLjBcbiAgICB9XG4gICAgaWYgKG1hc2sgPT0gXCJtZWRpY2FsXCIpIHtcbiAgICAgICAgaWYgKG1hc2tQb3NpdGlvbiA9PSBcInRpZ2h0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMC45XG4gICAgfVxuICAgIGlmIChtYXNrID09IFwib25lX2NvdHRvblwiKSB7XG4gICAgICAgIGlmIChtYXNrUG9zaXRpb24gPT0gXCJ0aWdodFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gMC44NVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwLjk1XG4gICAgfVxuICAgIGlmIChtYXNrID09IFwidHdvX2NvdHRvblwiKSB7XG4gICAgICAgIGlmIChtYXNrUG9zaXRpb24gPT0gXCJ0aWdodFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gMC43XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDAuOTVcbiAgICB9XG4gICAgaWYgKG1hc2sgPT0gXCJmZnAxXCIpIHtcbiAgICAgICAgaWYgKG1hc2tQb3NpdGlvbiA9PSBcInRpZ2h0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjI1XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDAuNlxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgTm8gbWFzayBjb2VmZmljaWVudCBmb3IgJHttYXNrfSBhbmQgJHttYXNrUG9zaXRpb259YClcbiAgICByZXR1cm4gMS4wXG59XG5cbmZ1bmN0aW9uIGZfcWEoYWN0aXZpdHksIHZpcnVzLCBtYXNrQ29lZmZpY2llbnQpIHtcbiAgY29uc3QgUl8wID0gUl9aZXJvKHZpcnVzKTtcbiAgY29uc3QgcV8wID0gMi43NjE4ICogKE1hdGguZXhwKDEuMTc2MSAqIFJfMCkgLSAxKTtcblxuICBjb25zdCBFXzAgPSBmX0UoXCJsb3dfYWN0aXZpdHlcIik7XG4gIGNvbnN0IEUgPSBmX0UoYWN0aXZpdHkpO1xuXG4gIHJldHVybiBtYXNrQ29lZmZpY2llbnQgKiBxXzAgKiAoRSAvIEVfMCkgKiAoUWJbYWN0aXZpdHldIC8gUWIubG93X2FjdGl2aXR5KTtcbn1cblxuZnVuY3Rpb24gZl9xYXRhdShxYSwgdGF1KSB7XG4gIHJldHVybiBxYSAqIE1hdGguZXhwKC0wLjU3NzYgKiB0YXUpO1xufVxuXG5mdW5jdGlvbiBmX0FDSChWLCBRKSB7XG4gIHJldHVybiBRIC8gVjtcbn1cblxuZnVuY3Rpb24gZl9DKHFhLCBBQ0gsIFEsIHQpIHtcbiAgLy8gbnVtZXJhdG9yXG5cbiAgbGV0IG4gPSAzOTA2MjUgKiBBQ0ggKyAyMjU2MjU7XG4gIC8vIGNvbnNvbGUubG9nKG4pO1xuICBuID0gbiAqIE1hdGguZXhwKEFDSCAqIHQpO1xuICAvLyBjb25zb2xlLmxvZyhuKTtcbiAgbiA9IG4gLSAyMjU2MjU7XG4gIC8vIGNvbnNvbGUubG9nKG4pO1xuICBuID0gbiAqIE1hdGguZXhwKC1BQ0ggKiB0IC0gKDM2MSAvIDYyNSkgKiB0KTtcbiAgLy8gY29uc29sZS5sb2cobik7XG4gIG4gPSAzOTA2MjUgKiBBQ0ggLSBuO1xuICAvLyBjb25zb2xlLmxvZyhuKTtcbiAgbiA9IHFhICogbjtcblxuICAvLyBjb25zb2xlLmxvZyhuKTtcbiAgLy8gY29uc29sZS5sb2cocWEpO1xuICAvLyBjb25zb2xlLmxvZyhBQ0gpO1xuICAvLyBjb25zb2xlLmxvZyhRKTtcbiAgLy8gY29uc29sZS5sb2coXCJ0OiBcIiArIHQpO1xuXG4gIC8vIGNvbnNvbGUubG9nKG4pO1xuICAvLyBkZW5vbWluYXRvclxuICBsZXQgZCA9IFEgKiAoMjI1NjI1ICogQUNIICsgMTMwMzIxKTtcbiAgLy8gY29uc29sZS5sb2coZCk7XG5cbiAgcmV0dXJuIG4gLyBkO1xufVxuXG5mdW5jdGlvbiBmX0N0YXUocWF0YXUsIEFDSCwgdGF1LCBRLCB0KSB7XG4gIC8vIG51bWVyYXRvclxuICAvLyBsZXQgbiA9IHFhdGF1ICogTWF0aC5leHAoLUFDSCAqICh0ICsgdGF1KSkgKiAoQUNIICogKHQgLSB0YXUpICogTWF0aC5leHAoQUNIICogKHQgKyB0YXUpKSAtIE1hdGguZXhwKEFDSCAqIHQpICsgTWF0aC5leHAoQUNIICogdGF1KSk7XG4gIC8vIGxldCBuID0gcWF0YXUgKiBNYXRoLmV4cCgtQUNIICogdCAtIDEpICogKChBQ0ggKiB0IC0gMSkgKiBNYXRoLmV4cChBQ0ggKiB0ICsgMSkgLSBNYXRoLmV4cChBQ0ggKiB0KSArIE1hdGguZXhwKDEpKTtcbiAgbGV0IG4gPSBxYXRhdSAqIChBQ0ggKiB0ICsgTWF0aC5leHAoLUFDSCAqIHQpIC0gMS9NYXRoLkUgLSAxKSAvLyB0aGlzIGlzIGEgc2ltcGxpZmljYXRpb24gb2YgdGhlIGFib3ZlIGdlbmVyYXRlZCBieSB3b2xmcmFtIGFscGhhXG5cbiAgLy8gZGVub21pbmF0b3JcbiAgbGV0IGQgPSBRICogQUNIO1xuXG4gIHJldHVybiBuIC8gZDtcbn1cblxuZnVuY3Rpb24gcGlyYSh0LCBRLCBhY3Rpdml0eSwgdmlydXMsIFYsIG1hc2tDb2VmZmljaWVudCkge1xuICBpZiAoUSA9PSAwKSBRICs9IDAuMDE7XG4gIC8vIGNvbnNvbGUubG9nKGBDYWxjdWxhdGluZyBwaXJhIGZvcjogdD0ke3R9LCBRPSR7UX0sIGFjdGl2aXR5PSR7YWN0aXZpdHl9LCBWPSR7Vn1gKTtcbiAgY29uc3QgdGF1ID0gZl90YXUoViwgUSk7XG4gIC8vIGNvbnNvbGUubG9nKFwidGF1OiBcIiArIHRhdSk7XG4gIGNvbnN0IHFhID0gZl9xYShhY3Rpdml0eSwgdmlydXMsIG1hc2tDb2VmZmljaWVudCk7XG4gIC8vIGNvbnNvbGUubG9nKFwicWE6IFwiICsgcWEpO1xuICBjb25zdCBxYXRhdSA9IGZfcWF0YXUocWEsIHRhdSk7XG4gIC8vIGNvbnNvbGUubG9nKFwicWF0YXU6IFwiICsgcWF0YXUpO1xuICBjb25zdCBBQ0ggPSBmX0FDSChWLCBRKTtcbiAgLy8gY29uc29sZS5sb2coXCJBQ0g6IFwiICsgQUNIKTtcbiAgLy8gY29uc29sZS5sb2coXCJRYjogXCIgKyBRYlthY3Rpdml0eV0pO1xuXG4gIGlmICh0ID4gdGF1KSB7XG4gICAgY29uc3QgQyA9IGZfQyhxYSwgQUNILCBRLCB0YXUpO1xuICAgIC8vIGNvbnNvbGUubG9nKEMpO1xuICAgIGxldCBDdGF1ID0gZl9DdGF1KHFhdGF1LCBBQ0gsIHRhdSwgUSwgdCk7XG4gICAgLy8gaWYgKGlzTmFOKEN0YXUpKSB7XG4gICAgLy8gICAgIEN0YXUgPSAxXG4gICAgLy8gfVxuICAgIC8vIGNvbnNvbGUubG9nKEN0YXUpO1xuICAgIHJldHVybiAxIC0gTWF0aC5leHAoLShDICsgQ3RhdSkgKiBRYlthY3Rpdml0eV0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IEMgPSBmX0MocWEsIEFDSCwgUSwgdCk7XG4gICAgLy8gY29uc29sZS5sb2coQyk7XG4gICAgcmV0dXJuIDEgLSBNYXRoLmV4cCgtQyAqIFFiW2FjdGl2aXR5XSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZURhdGEodm9sdW1lLCBhY3Rpdml0eSwgdmlydXMsIG1heFEsIG1hc2ssIG1hc2tQb3NpdGlvbikge1xuICBjb25zdCBWID0gdm9sdW1lO1xuICBjb25zdCBtYXNrQ29lZmZpY2llbnQgPSBmX21hc2sobWFzaywgbWFza1Bvc2l0aW9uKVxuXG4gIGxldCB4QSA9IFtdO1xuICBsZXQgeUEgPSBbXTtcbiAgbGV0IHJvd3MgPSBbXTtcblxuICBjb25zdCBtaW4gPSA1MFxuICBjb25zdCBtYXggPSBtYXhRXG5cbiAgZm9yIChsZXQgUSA9IG1pbjsgUSA8PSBtYXg7IFEgKz0gNTApIHtcbiAgICB4QSA9IFtdO1xuICAgIGxldCByb3cgPSBbXTtcblxuICAgIGZvciAobGV0IHQgPSAwLjA7IHQgPD0gNi4wOyB0ICs9IDAuMSkge1xuICAgICAgLy8gaG91cnMsKyBpbmNyZW1lbnRzIGluIGhvdXJzXG4gICAgICBwID0gcGlyYSh0LCBRLCBhY3Rpdml0eSwgdmlydXMsIFYsIG1hc2tDb2VmZmljaWVudCk7XG4gICAgICAvL2NvbnNvbGUubG9nKFwiUGlyYSBmb3IgdD1cIiArIHQgKyBcIiwgUT1cIiArIFEgKyBcIjogXCIgKyBwKTtcbiAgICAgIHAgPSBNYXRoLnJvdW5kKHAgKiAxMDAwMCkgLyAxMDA7XG4gICAgICAvL2lmICh0ID09IDYgJiYgUSA9PSA1MDApIHAgPSAxMDA7XG4gICAgLy8gICBpZiAoaXNOYU4ocCkgfHwgcCA+PSAxMDApIHtcbiAgICAvLyAgICAgICBwID0gMFxuICAgIC8vICAgfVxuICAgICAgcm93LnB1c2gocCk7XG4gICAgICB4QS5wdXNoKHQpO1xuICAgIH1cbiAgICB5QS5wdXNoKFEpO1xuICAgIHJvd3MucHVzaChyb3cpO1xuICB9XG5cbiAgLy8gZm9yIChsZXQgbWludXRlID0gMDsgbWludXRlIDw9IDM2MDsgbWludXRlICs9IDMwKSB7XG4gIC8vICAgICBsZXQgdCA9IG1pbnV0ZSAvIDYwO1xuICAvLyAgICAgbGV0IG0gPSBtaW51dGUgJSA2MDtcbiAgLy8gICAgIGxldCBoID0gKG1pbnV0ZSAtIG0pIC8gNjA7XG4gIC8vICAgICBsZXQgdGltZSA9IGggKyBcIjpcIiArIG0gKyBcImhcIjtcbiAgLy8gfVxuXG4gIHJldHVybiB7XG4gICAgdGVzdDogeEEsXG4gICAgeDogeEEsXG4gICAgeTogeUEsXG4gICAgejogcm93c1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRGF0YVNpbXBsZSh2b2x1bWUsIGFjdGl2aXR5LCB2aXJ1cywgUSwgcGVvcGxlLCBtYXNrLCBtYXNrUG9zaXRpb24pIHtcbiAgY29uc3QgViA9IHZvbHVtZTtcbiAgY29uc3QgbWFza0NvZWZmaWNpZW50ID0gZl9tYXNrKG1hc2ssIG1hc2tQb3NpdGlvbilcbiBcbiAgY29uc29sZS5sb2coYFRvdGFsIGFpcmZsb3cgZm9yIGFsbCBwZW9wbGUgaW4gdGhlIHJvb20gaXMgKFEpIGlzICR7UX1gKVxuXG4gIGxldCB4ID0gW107XG4gIGxldCB5ID0gW107IC8vIHBpcmFcbiAgbGV0IHgyID0gW107IC8vIG9ubHkgdGltZXN0YW1wcyBmb3IgdGhlIGZ1bGwgaG91clxuICBsZXQgeTIgPSBbXTsgLy8gaW5mZWN0ZWQgcGVvcGxlXG5cbiAgZm9yIChsZXQgdCA9IDA7IHQgPD0gNjsgdCArPSAxKSB7XG4gICAgcCA9IHBpcmEodCwgUSwgYWN0aXZpdHksIHZpcnVzLCBWLCBtYXNrQ29lZmZpY2llbnQpO1xuICAgIHAgPSBNYXRoLnJvdW5kKHAgKiAxMDAwMCkgLyAxMDA7XG4gICAgeS5wdXNoKHApO1xuICAgIHgucHVzaCh0KTtcbiAgICB4Mi5wdXNoKHQpXG4gICAgeTIucHVzaChNYXRoLnJvdW5kKHAgKiAocGVvcGxlIC0gMSkvIDEwMCkpOyAvLyB0aGUgaW5mZWN0ZWQgcGVyc29uIGNhbm5vdCBiZSBpbmZlY3RlZCBhZ2FpblxuICAgIC8vIGludGVybWVkaWF0ZSBzdGVwcyBmb3IgcGlyYSBvbmx5LCBub3QgZm9yIG5vLiBpbmZlY3RlZCBwZW9wbGVcbiAgICBmb3IgKGxldCBzdCA9IDAuMTsgc3QgPCAxOyBzdCArPSAwLjEpIHtcbiAgICAgICAgcCA9IHBpcmEodCArIHN0LCBRLCBhY3Rpdml0eSwgdmlydXMsIFYsIG1hc2tDb2VmZmljaWVudCk7XG4gICAgICAgIHAgPSBNYXRoLnJvdW5kKHAgKiAxMDAwMCkgLyAxMDA7XG4gICAgICAgIHkucHVzaChwKTtcbiAgICAgICAgeC5wdXNoKHQgKyBzdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeVxuICAgIH0sXG4gICAge1xuICAgICAgeDogeDIsXG4gICAgICB5OiB5MlxuICAgIH1cbiAgXTtcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwcmVwYXJlRGF0YTogcHJlcGFyZURhdGEsXG4gICAgcHJlcGFyZURhdGFTaW1wbGU6IHByZXBhcmVEYXRhU2ltcGxlLFxuICAgIHBpcmE6IHBpcmEsXG4gICAgZl9xYTogZl9xYSxcbiAgICBmX1E6IGZfUVxufVxuIiwiY29uc3QgZGF0YUYgPSByZXF1aXJlKFwiLi9kYXRhLmpzXCIpLnByZXBhcmVEYXRhO1xuY29uc3QgZGF0YUZTaW1wbGUgPSByZXF1aXJlKFwiLi9kYXRhLmpzXCIpLnByZXBhcmVEYXRhU2ltcGxlO1xuY29uc3QgZl9RID0gcmVxdWlyZShcIi4vZGF0YS5qc1wiKS5mX1E7XG4vLyBjb25zdCBQbG90bHkgPSByZXF1aXJlKFwicGxvdGx5LmpzLWdsM2QtZGlzdC1taW5cIikgLy8gbm90IGluc3RhbGxlZCB2aWEgbnBtIHRvIHJlZHVjZSBidW5kbGUgc2l6ZVxuXG52YXIgdm9sdW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ2b2x1bWVcIikudmFsdWU7XG52YXIgYWN0aXZpdHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjdGl2aXR5XCIpLnZhbHVlO1xudmFyIHZpcnVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ2aXJ1c1wiKS52YWx1ZTtcbnZhciBtYXNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXNrXCIpLnZhbHVlO1xudmFyIG1hc2tQb3NpdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFza1Bvc2l0aW9uXCIpLnZhbHVlO1xuLy8gdmFyIHZpc3R5cGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInZpc3R5cGVcIikudmFsdWU7XG52YXIgbW9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibW9kZVwiKS52YWx1ZTsgLy8gc2ltcGxlIG9yIGV4cGVydFxudmFyIGFpcmluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWlyaW5nXCIpLnZhbHVlOyAvLyBpbiB0aGUgZm9ybXVsYSwgdGhpcyBpcyBRXG52YXIgcGVvcGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwZW9wbGVcIikudmFsdWU7XG52YXIgaXNRID0gLTFcbnZhciBhZGRRID0gMFxudmFyIHVzZWRRID0gLTFcbmNhbGN1bGF0ZVVzZWRRKCk7XG52YXIgbWF4USA9IC0xO1xuY2FsY3VsYXRlTWF4USgpO1xuXG5jb25zdCBjaGFydERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hhcnRcIik7XG5cbmZ1bmN0aW9uIG1vZGVVcGRhdGVkKG5ld01vZGUpIHtcbiAgbW9kZSA9IG5ld01vZGU7XG4gIHVwZGF0ZUdyYXBoKCk7XG59XG5cbmZ1bmN0aW9uIHZvbHVtZVVwZGF0ZWQobmV3Vm9sdW1lKSB7XG4gIHZvbHVtZSA9IG5ld1ZvbHVtZTtcbiAgdXBkYXRlR3JhcGgoKTtcbn1cblxuZnVuY3Rpb24gYWN0aXZpdHlVcGRhdGVkKG5ld0FjdGl2aXR5KSB7XG4gIGFjdGl2aXR5ID0gbmV3QWN0aXZpdHk7XG4gIHVwZGF0ZUdyYXBoKCk7XG59XG5cbmZ1bmN0aW9uIHZpcnVzVXBkYXRlZChuZXdWaXJ1cykge1xuICAgIHZpcnVzID0gbmV3VmlydXM7XG4gICAgdXBkYXRlR3JhcGgoKTtcbiAgfVxuXG5mdW5jdGlvbiBtYXNrVXBkYXRlZChuZXdNYXNrKSB7XG4gIG1hc2sgPSBuZXdNYXNrO1xuICB1cGRhdGVHcmFwaCgpO1xufVxuXG5mdW5jdGlvbiBtYXNrUG9zaXRpb25VcGRhdGVkKG5ld01hc2tQb3NpdGlvbikge1xuICBtYXNrUG9zaXRpb24gPSBuZXdNYXNrUG9zaXRpb247XG4gIHVwZGF0ZUdyYXBoKCk7XG59XG5cbmZ1bmN0aW9uIGFpcmluZ1VwZGF0ZWQobmV3QWlyaW5nKSB7XG4gIGFpcmluZyA9IG5ld0FpcmluZztcbiAgY2FsY3VsYXRlVXNlZFEoKVxuICB1cGRhdGVHcmFwaCgpO1xufVxuXG5mdW5jdGlvbiBwZW9wbGVVcGRhdGVkKG5ld1Blb3BsZSkge1xuICBwZW9wbGUgPSBuZXdQZW9wbGU7XG4gIGNhbGN1bGF0ZVVzZWRRKClcbiAgY2FsY3VsYXRlTWF4USgpXG4gIHVwZGF0ZUdyYXBoKCk7XG59XG5cbmZ1bmN0aW9uIHZpc3R5cGVVcGRhdGVkKG5ld1Zpc1R5cGUpIHtcbiAgdmlzdHlwZSA9IG5ld1Zpc1R5cGU7XG4gIHVwZGF0ZUdyYXBoKCk7XG59XG5cbmZ1bmN0aW9uIGFkZFFVcGRhdGVkKG5ld0FkZFEpIHtcbiAgYWRkUSA9IG5ld0FkZFE7XG4gIGNhbGN1bGF0ZVVzZWRRKCk7XG4gIHVwZGF0ZUdyYXBoKCk7XG59XG5cbi8vIHJlY2FsY3VsYXRlIHVzZWRRIGJhc2VkIG9uIGFpcmluZyBhbmQgcGVvcGxlXG5mdW5jdGlvbiBjYWxjdWxhdGVVc2VkUSgpIHtcbiAgaXNRID0gZl9RKGFpcmluZykgKiBwZW9wbGU7XG4gIHVzZWRRID0gaXNRICsgYWRkUTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpc1FcIikudmFsdWUgPSBpc1FcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ1c2VkUVwiKS52YWx1ZSA9IHVzZWRRXG59XG5cbi8vIG1heFEgdXBkYXRlZCBieSBtYW51YWwgdXNlciBpbnB1dFxuZnVuY3Rpb24gbWF4UVVwZGF0ZWQobmV3TWF4USkge1xuICBtYXhRID0gbmV3TWF4UVxuICB1cGRhdGVHcmFwaCgpXG59XG5cbi8vIHJlY2FsY3VsYXRlIG1heFEgYmFzZWQgb24gcGVvcGxlIGFuZCB2ZXJ5X2dvb2QgYWlyaW5nXG5mdW5jdGlvbiBjYWxjdWxhdGVNYXhRKCkge1xuICBtYXhRID0gZl9RKFwidmVyeV9nb29kXCIpICogcGVvcGxlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWF4UVwiKS52YWx1ZSA9IG1heFFcbn1cblxuZnVuY3Rpb24gdXBkYXRlR3JhcGgoKSB7XG4gIGNvbnNvbGUubG9nKFwiVGhlIGdyYXBoIG11c3QgYmUgdXBkYXRlZCFcIik7XG4gIGNvbnNvbGUubG9nKGBWb2x1bWU6ICR7dm9sdW1lfSwgYWN0aXZpdHk6ICR7YWN0aXZpdHl9LCBhaXJpbmc6ICR7YWlyaW5nfWApO1xuXG4gIGlmIChtb2RlID09PSBcInNpbXBsZVwiKSB7XG4gICAgZGF0YSA9IGRhdGFGU2ltcGxlKHZvbHVtZSwgYWN0aXZpdHksIHZpcnVzLCB1c2VkUSwgcGVvcGxlLCBtYXNrLCBtYXNrUG9zaXRpb24pXG5cbiAgICBkcmF3U2ltcGxlUGxvdChkYXRhKVxuICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiZXhwZXJ0XCIpIHtcbiAgICBkYXRhID0gZGF0YUYodm9sdW1lLCBhY3Rpdml0eSwgdmlydXMsIG1heFEsIG1hc2ssIG1hc2tQb3NpdGlvbik7XG5cbiAgICAvLyBpZiAodmlzdHlwZSA9PT0gXCJzdXJmYWNlXCIpIHtcbiAgICAvLyAgIGRyYXdTdXJmYWNlUGxvdChkYXRhKTtcbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgZHJhd0NvbnRvdXJQbG90KGRhdGEpO1xuICAgIC8vIH1cblxuICAgIGRyYXdDb250b3VyUGxvdChkYXRhKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkcmF3U2ltcGxlUGxvdChkYXRhKSB7XG4gIGRhdGFbMF0ubW9kZSA9IFwibGluZXNcIjtcbiAgZGF0YVswXS5uYW1lID0gXCJQSVJBIChpbiAlKVwiXG4gIGRhdGFbMF0ueWF4aXMgPSBcInlcIlxuXG4gIGRhdGFbMV0udHlwZSA9IFwiYmFyXCI7XG4gIGRhdGFbMV0ueWF4aXMgPSBcInkyXCI7XG4gIGRhdGFbMV0ubmFtZSA9IFwiUG90ZW50aWVsbCBBbmdlc3RlY2t0ZVwiXG5cbiAgY29uc29sZS5sb2coZGF0YSlcblxuICB2YXIgbGF5b3V0ID0ge1xuICAgIHNoYXJlWDogdHJ1ZSxcbiAgICB4YXhpczoge1xuICAgICAgICB0aXRsZToge1xuICAgICAgICAgIHRleHQ6IFwiWmVpdCBpbiBTdHVuZGVuXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIHlheGlzOiB7XG4gICAgICB0aXRsZTogJ1BJUkEgKGluICUpJyxcbiAgICAgIG92ZXJsYXlpbmc6ICd5MicsXG4gICAgICB0aWNrdmFsczogWzEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwgOTAsIDEwMF0sXG4gICAgICByYW5nZTogWzAsIDEwMF1cbiAgICB9LFxuICAgIHlheGlzMjoge1xuICAgICAgdGlja21vZGU6IFwiYXV0b1wiLFxuICAgICAgdGl0bGU6ICdBbnphaGwgc2ljaCBwb3RlbnRpZWxsIGFuZ2VzdGVja3RlciBQZXJzb25lbiAoZ2VydW5kZXQpJyxcbiAgICAgIHNpZGU6ICdyaWdodCcsXG4gICAgICByYW5nZTogWzAsIHBlb3BsZSAtIDFdIC8vIHRoZSBpbmZlY3RlZCBwZXJzb24gY2FuIG5vdCBiZSBpbmZlY3RlZCBhZ2FpblxuICAgIH0sXG4gICAgbGVnZW5kOiB7XG4gICAgICAgIHk6IDEsXG4gICAgICAgIHg6IDAsXG4gICAgICB9XG4gIH07XG5cbiAgUGxvdGx5Lm5ld1Bsb3QoY2hhcnREaXYsIGRhdGEsIGxheW91dCwgeyByZXNwb25zaXZlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBkcmF3U3VyZmFjZVBsb3QoZGF0YSkge1xuICBkYXRhLnR5cGUgPSBcInN1cmZhY2VcIjtcbiAgZGF0YS5jb250b3VycyA9IHtcbiAgICB6OiB7XG4gICAgICBzaG93OiB0cnVlLFxuICAgICAgdXNlY29sb3JtYXA6IHRydWUsXG4gICAgICBoaWdobGlnaHRjb2xvcjogXCIjNDJmNDYyXCIsXG4gICAgICBwcm9qZWN0OiB7IHo6IHRydWUgfSxcbiAgICB9LFxuICB9O1xuICBjb25zdCBsYXlvdXQgPSB7XG4gICAgeGF4aXM6IHtcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIHRleHQ6IFwiWmVpdCBpbiBTdHVuZGVuXCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgeWF4aXM6IHtcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIHRleHQ6IFwiRnJpc2NobHVmdG1lbmdlIGluIG1eMy9oXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgY29uc29sZS5sb2coZGF0YSk7XG4gIFBsb3RseS5uZXdQbG90KGNoYXJ0RGl2LCBbZGF0YV0sIGxheW91dCwgeyByZXNwb25zaXZlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBkcmF3Q29udG91clBsb3QoZGF0YSkge1xuICBkYXRhLnR5cGUgPSBcImNvbnRvdXJcIjtcblxuICBkYXRhLmNvbG9yYmFyID0ge1xuICAgIHRpdGxlOiBcIlBJUkFcIixcbiAgICB0aWNrc3VmZml4OiBcIiVcIixcbiAgfTtcblxuICBkYXRhLmhvdmVydGVtcGxhdGUgPSBcIlBJUkE6ICV7ejouMmZ9JTxleHRyYT48L2V4dHJhPlwiO1xuXG4gIGNvbnN0IGxheW91dCA9IHtcbiAgICBzaG93YXhlc2xhYmVsczogdHJ1ZSxcbiAgICB4YXhpc190aXRsZTogXCJaZWl0IGluIFN0dW5kZW5cIixcbiAgICB4YXhpczoge1xuICAgICAgdGl0bGU6IHtcbiAgICAgICAgdGV4dDogXCJaZWl0IGluIFN0dW5kZW5cIixcbiAgICAgIH0sXG4gICAgfSxcbiAgICB5YXhpczoge1xuICAgICAgdGl0bGU6IHtcbiAgICAgICAgdGV4dDogXCJGcmlzY2hsdWZ0bWVuZ2UgaW4gbcKzL2hcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgUGxvdGx5Lm5ld1Bsb3QoY2hhcnREaXYsIFtkYXRhXSwgbGF5b3V0LCB7IHJlc3BvbnNpdmU6IHRydWUgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtb2RlVXBkYXRlZDogbW9kZVVwZGF0ZWQsXG4gIHZvbHVtZVVwZGF0ZWQ6IHZvbHVtZVVwZGF0ZWQsXG4gIGFjdGl2aXR5VXBkYXRlZDogYWN0aXZpdHlVcGRhdGVkLFxuICB2aXJ1c1VwZGF0ZWQ6IHZpcnVzVXBkYXRlZCxcbiAgbWFza1VwZGF0ZWQ6IG1hc2tVcGRhdGVkLFxuICBtYXNrUG9zaXRpb25VcGRhdGVkOiBtYXNrUG9zaXRpb25VcGRhdGVkLFxuICBhaXJpbmdVcGRhdGVkOiBhaXJpbmdVcGRhdGVkLFxuICB2aXN0eXBlVXBkYXRlZDogdmlzdHlwZVVwZGF0ZWQsXG4gIHBlb3BsZVVwZGF0ZWQ6IHBlb3BsZVVwZGF0ZWQsXG4gIGFkZFFVcGRhdGVkOiBhZGRRVXBkYXRlZCxcbiAgbWF4UVVwZGF0ZWQ6IG1heFFVcGRhdGVkXG59O1xuIiwiY29uc3Qgdm9sdW1lID0gcmVxdWlyZShcIi4vdm9sdW1lLmpzXCIpO1xuY29uc3QgZ3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaC5qc1wiKTtcblxuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtb2RlXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgLy8gaWYgZXhwZXJ0LCBoaWRlIHNpbXBsZSBodG1sIGVsZW1lbnRzXG4gIGlmIChldmVudC50YXJnZXQudmFsdWUgPT0gXCJleHBlcnRcIikge1xuICAgIHNpbXBsZUVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInNpbXBsZVwiKVxuICAgIGZvciAoZWwgb2Ygc2ltcGxlRWxlbWVudHMpIHtcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXG4gICAgfVxuICAgIGV4cGVydEVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImV4cGVydFwiKVxuICAgIGZvciAoZWwgb2YgZXhwZXJ0RWxlbWVudHMpIHtcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIlxuICAgIH1cbiAgfSBlbHNlIGlmIChldmVudC50YXJnZXQudmFsdWUgPT0gXCJzaW1wbGVcIikge1xuICAgIGV4cGVydEVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInNpbXBsZVwiKVxuICAgIGZvciAoZWwgb2YgZXhwZXJ0RWxlbWVudHMpIHtcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIlxuICAgIH1cbiAgICBleHBlcnRFbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJleHBlcnRcIilcbiAgICBmb3IgKGVsIG9mIGV4cGVydEVsZW1lbnRzKSB7XG4gICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuICAgIH1cbiAgfVxuICBncmFwaC5tb2RlVXBkYXRlZChldmVudC50YXJnZXQudmFsdWUpXG59KTtcblxuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY3Rpdml0eVwiKS5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGdyYXBoLmFjdGl2aXR5VXBkYXRlZChldmVudC50YXJnZXQudmFsdWUpO1xufSk7XG5cbmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidmlydXNcIikuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGdyYXBoLnZpcnVzVXBkYXRlZChldmVudC50YXJnZXQudmFsdWUpO1xuICAgIGlmIChldmVudC50YXJnZXQudmFsdWUgPT0gXCJtdXRhdGVkXCIpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtdXRhdGlvbmRpc2NsYWltZXJcIikuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIlxuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibXV0YXRpb25kaXNjbGFpbWVyXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuICAgIH1cbiAgfSk7XG5cbmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFza1wiKS5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGdyYXBoLm1hc2tVcGRhdGVkKGV2ZW50LnRhcmdldC52YWx1ZSk7XG59KTtcblxuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXNrUG9zaXRpb25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICBncmFwaC5tYXNrUG9zaXRpb25VcGRhdGVkKGV2ZW50LnRhcmdldC52YWx1ZSk7XG59KTtcblxuLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ2aXN0eXBlXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbi8vICAgZ3JhcGgudmlzdHlwZVVwZGF0ZWQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbi8vIH0pO1xuXG5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBlb3BsZVwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQudmFsdWUgIT0gXCJcIikge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSA8IDEpIHtcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gMVxuICAgICAgfSBlbHNlIGlmIChldmVudC50YXJnZXQudmFsdWUgPiAxMDApIHtcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gMTAwXG4gICAgICB9XG4gICAgICBncmFwaC5wZW9wbGVVcGRhdGVkKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfVxufSk7XG5cbmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWlyaW5nXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBncmFwaC5haXJpbmdVcGRhdGVkKGV2ZW50LnRhcmdldC52YWx1ZSlcbn0pO1xuXG5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFkZFFcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQudmFsdWUgPCAwKSB7XG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IDBcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSA+IDUwMDApIHtcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gNTAwMFxuICAgIH1cbiAgICBncmFwaC5hZGRRVXBkYXRlZChwYXJzZUludChldmVudC50YXJnZXQudmFsdWUpKVxufSk7XG5cbmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWF4UVwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSA8IDEwMCkge1xuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSAxMDBcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSA+IDYwMDApIHtcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gNjAwMFxuICAgIH1cbiAgICBncmFwaC5tYXhRVXBkYXRlZChldmVudC50YXJnZXQudmFsdWUpXG59KTsiLCJjb25zdCBncmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBoLmpzXCIpO1xuXG5mdW5jdGlvbiBJbnB1dEVsZW1lbnQoZWxlbWVudCwgZGF0YSkge1xuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICBlbGVtZW50LnZhbHVlID0gZGF0YTtcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIHRoaXMsIGZhbHNlKTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgd2hlbiB0aGUgaW5wdXQgZWxlbWVudCBpcyB1cGRhdGVkLCBlLmcuLCBieSB1c2luZyBhcnJvd3Mgd2hlbiB0eXBlPW51bWJlciBvciBieSBwcmVzc2luZyBlbnRlclxuICovXG5JbnB1dEVsZW1lbnQucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgIGNhc2UgXCJjaGFuZ2VcIjpcbiAgICAgIHRoaXMuY2hhbmdlKHRoaXMuZWxlbWVudC52YWx1ZSk7XG4gICAgICB1cGRhdGVWb2x1bWUoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBVcGRhdGUgdGhlIGVsZW1lbnQ7IHRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIERPTSByZXByZXNlbnRhdGlvbiBhbmQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uXG4gKi9cbklucHV0RWxlbWVudC5wcm90b3R5cGUuY2hhbmdlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHRoaXMuZGF0YSA9IHZhbHVlO1xuICB0aGlzLmVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbn07XG5cbmZ1bmN0aW9uIHVwZGF0ZVZvbHVtZSgpIHtcbiAgaWYgKGxlbmd0aEVsZW1lbnQuZGF0YSA+IDEwKSB7XG4gICAgbGVuZ3RoRWxlbWVudC5jaGFuZ2UoMTApXG4gIH1cbiAgaWYgKGxlbmd0aEVsZW1lbnQuZGF0YSA8IDEpIHtcbiAgICBsZW5ndGhFbGVtZW50LmNoYW5nZSgxKVxuICB9XG5cbiAgaWYgKHdpZHRoRWxlbWVudC5kYXRhID4gMTApIHtcbiAgICB3aWR0aEVsZW1lbnQuY2hhbmdlKDEwKVxuICB9XG4gIGlmICh3aWR0aEVsZW1lbnQuZGF0YSA8IDEpIHtcbiAgICB3aWR0aEVsZW1lbnQuY2hhbmdlKDEpXG4gIH1cblxuICBpZiAoaGVpZ2h0RWxlbWVudC5kYXRhID4gNSkge1xuICAgIGhlaWdodEVsZW1lbnQuY2hhbmdlKDUpXG4gIH1cbiAgaWYgKGhlaWdodEVsZW1lbnQuZGF0YSA8IDEpIHtcbiAgICBoZWlnaHRFbGVtZW50LmNoYW5nZSgxKVxuICB9XG5cbiAgY29uc3Qgdm9sdW1lID0gbGVuZ3RoRWxlbWVudC5kYXRhICogd2lkdGhFbGVtZW50LmRhdGEgKiBoZWlnaHRFbGVtZW50LmRhdGE7XG4gIGNvbnNvbGUubG9nKHZvbHVtZSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidm9sdW1lXCIpLnZhbHVlID0gdm9sdW1lO1xuICBncmFwaC52b2x1bWVVcGRhdGVkKHZvbHVtZSk7XG4gIHJldHVybiB2b2x1bWU7XG59XG5cbi8vIGl0IGlzIHBvc3NpYmxlIHRvIHVwZGF0ZSB0aGVzZSBlbGVtZW50cywgZS5nLiwgd2l0aCBsZW5ndGhFbGVtZW50LmNoYW5nZSgxMClcbnZhciBsZW5ndGhFbGVtZW50ID0gbmV3IElucHV0RWxlbWVudChcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJsZW5ndGhcIiksXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGVuZ3RoXCIpLnZhbHVlXG4pO1xudmFyIHdpZHRoRWxlbWVudCA9IG5ldyBJbnB1dEVsZW1lbnQoXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2lkdGhcIiksXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2lkdGhcIikudmFsdWVcbik7XG52YXIgaGVpZ2h0RWxlbWVudCA9IG5ldyBJbnB1dEVsZW1lbnQoXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVpZ2h0XCIpLFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhlaWdodFwiKS52YWx1ZVxuKTtcbnVwZGF0ZVZvbHVtZSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0OiB1cGRhdGVWb2x1bWUsXG4gIGluaXQ6IHVwZGF0ZVZvbHVtZSxcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment