").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("
").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})});
\ No newline at end of file
diff --git a/web/javascript/jquery/jquery.min.js b/web/javascript/jquery/jquery.min.js
deleted file mode 100644
index e6a051d0d..000000000
--- a/web/javascript/jquery/jquery.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v1.11.2 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.2",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="
",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++d
b;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML=" ","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML=" ",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
-return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" a ",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML=" ",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h ]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""," "],legend:[1,""," "],area:[1,""," "],param:[1,""," "],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:k.htmlSerialize?[0,"",""]:[1,"X","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" a ",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)
-}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();ca ",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/web/javascript/jquery/jquery.transmenu.js b/web/javascript/jquery/jquery.transmenu.js
deleted file mode 100644
index 764c847ff..000000000
--- a/web/javascript/jquery/jquery.transmenu.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * This file Copyright (C) 2015 Mnemosyne LLC
- *
- * It may be used under the GNU GPL versions 2 or 3
- * or any future license endorsed by Mnemosyne LLC.
- */
-
-$.widget('tr.transMenu', $.ui.menu, {
- options: {
- open: null,
- close: null
- },
-
- _create: function() {
- this.selectImpl = this.options.select;
- this.options.select = $.proxy(this._select, this);
- this.element.hide();
- this._superApply(arguments);
- },
-
- _select: function(event, ui) {
- if (ui.item.is("[aria-haspopup='true']"))
- return;
- ui.id = ui.item.attr("id");
- ui.group = ui.item.attr("radio-group");
- ui.target = $(event.currentTarget);
- if (this.selectImpl(event, ui) !== false)
- this.close();
- },
-
- open: function(event) {
- this.element.show();
- this.element.css({ position: "absolute", left: 4, top: -this.element.height() - 4 });
-
- $(document).bind("keydown" + this.eventNamespace, $.proxy(function(event) {
- if (event.which === $.ui.keyCode.ESCAPE)
- this.close();
- }, this));
- $(document).bind("mousedown" + this.eventNamespace + " touchstart" + this.eventNamespace, $.proxy(function(event) {
- if (!$(event.target).closest(".ui-menu-item").length)
- this.close();
- }, this));
-
- this._trigger("open", event);
- },
-
- close: function(event) {
- $(document).unbind("keydown" + this.eventNamespace);
- $(document).unbind("mousedown" + this.eventNamespace);
- $(document).unbind("touchstart" + this.eventNamespace);
-
- this._close(this.element);
- this.element.hide();
-
- this._trigger("close", event);
- }
-});
-
-(function($)
-{
- function indicatorClass(type)
- {
- return ['ui-icon', 'ui-icon-' + type];
- }
-
- function findIndicator(item, type)
- {
- return $(item).find('span.' + indicatorClass(type).join('.'));
- }
-
- function createIndicator(item, type)
- {
- $(item).prepend($("
"));
- }
-
- function indicatorType(item)
- {
- var group = item.attr('radio-group');
- return { type: group !== undefined ? 'bullet' : 'check', group: group };
- }
-
- $.fn.selectMenuItem = function() {
- var t = indicatorType(this);
- if (t.type == 'bullet')
- this.parent().find('li[radio-group=' + t.group + '] span.' + indicatorClass(t.type).join('.')).remove();
- if (findIndicator(this, t.type).length == 0)
- createIndicator(this, t.type);
- return this;
- };
-
- $.fn.deselectMenuItem = function() {
- var t = indicatorType(this);
- return findIndicator(this, t.type).remove();
- };
-
- $.fn.menuItemIsSelected = function() {
- return findIndicator(this, 'bullet').length > 0 || findIndicator(this, 'check').length > 0;
- };
-})(jQuery);
diff --git a/web/javascript/jquery/jquery.transmenu.min.js b/web/javascript/jquery/jquery.transmenu.min.js
deleted file mode 100644
index 6398f9133..000000000
--- a/web/javascript/jquery/jquery.transmenu.min.js
+++ /dev/null
@@ -1 +0,0 @@
-$.widget("tr.transMenu",$.ui.menu,{options:{open:null,close:null},_create:function(){this.selectImpl=this.options.select,this.options.select=$.proxy(this._select,this),this.element.hide(),this._superApply(arguments)},_select:function(e,t){t.item.is("[aria-haspopup='true']")||(t.id=t.item.attr("id"),t.group=t.item.attr("radio-group"),t.target=$(e.currentTarget),this.selectImpl(e,t)!==!1&&this.close())},open:function(e){this.element.show(),this.element.css({position:"absolute",left:4,top:-this.element.height()-4}),$(document).bind("keydown"+this.eventNamespace,$.proxy(function(e){e.which===$.ui.keyCode.ESCAPE&&this.close()},this)),$(document).bind("mousedown"+this.eventNamespace+" touchstart"+this.eventNamespace,$.proxy(function(e){$(e.target).closest(".ui-menu-item").length||this.close()},this)),this._trigger("open",e)},close:function(e){$(document).unbind("keydown"+this.eventNamespace),$(document).unbind("mousedown"+this.eventNamespace),$(document).unbind("touchstart"+this.eventNamespace),this._close(this.element),this.element.hide(),this._trigger("close",e)}}),function($){function e(e){return["ui-icon","ui-icon-"+e]}function t(t,n){return $(t).find("span."+e(n).join("."))}function n(t,n){$(t).prepend($("
"))}function i(e){var t=e.attr("radio-group");return{type:void 0!==t?"bullet":"check",group:t}}$.fn.selectMenuItem=function(){var s=i(this);return"bullet"==s.type&&this.parent().find("li[radio-group="+s.group+"] span."+e(s.type).join(".")).remove(),0==t(this,s.type).length&&n(this,s.type),this},$.fn.deselectMenuItem=function(){var e=i(this);return t(this,e.type).remove()},$.fn.menuItemIsSelected=function(){return t(this,"bullet").length>0||t(this,"check").length>0}}(jQuery);
\ No newline at end of file
diff --git a/web/javascript/jquery/jquery.ui-contextmenu.js b/web/javascript/jquery/jquery.ui-contextmenu.js
deleted file mode 100644
index f8245420d..000000000
--- a/web/javascript/jquery/jquery.ui-contextmenu.js
+++ /dev/null
@@ -1,469 +0,0 @@
-/*******************************************************************************
- * jquery.ui-contextmenu.js plugin.
- *
- * jQuery plugin that provides a context menu (based on the jQueryUI menu widget).
- *
- * @see https://github.com/mar10/jquery-ui-contextmenu
- *
- * Copyright (c) 2013-2015, Martin Wendt (http://wwWendt.de). Licensed MIT.
- */
-
-(function( factory ) {
- "use strict";
- if ( typeof define === "function" && define.amd ) {
- // AMD. Register as an anonymous module.
- define([ "jquery", "jquery-ui/menu" ], factory );
- } else {
- // Browser globals
- factory( jQuery );
- }
-}(function( $ ) {
-
-"use strict";
-
-var supportSelectstart = "onselectstart" in document.createElement("div"),
- match = $.ui.menu.version.match(/^(\d)\.(\d+)/),
- uiVersion = {
- major: parseInt(match[1], 10),
- minor: parseInt(match[2], 10)
- },
- isLTE110 = ( uiVersion.major < 2 && uiVersion.minor < 11 );
-
-$.widget("moogle.contextmenu", {
- version: "@VERSION",
- options: {
- addClass: "ui-contextmenu", // Add this class to the outer
- autoFocus: false, // Set keyboard focus to first entry on open
- autoTrigger: true, // open menu on browser's `contextmenu` event
- delegate: null, // selector
- hide: { effect: "fadeOut", duration: "fast" },
- ignoreParentSelect: true, // Don't trigger 'select' for sub-menu parents
- menu: null, // selector or jQuery pointing to , or a definition hash
- position: null, // popup positon
- preventContextMenuForPopup: false, // prevent opening the browser's system
- // context menu on menu entries
- preventSelect: false, // disable text selection of target
- show: { effect: "slideDown", duration: "fast" },
- taphold: false, // open menu on taphold events (requires external plugins)
- uiMenuOptions: {}, // Additional options, used when UI Menu is created
- // Events:
- beforeOpen: $.noop, // menu about to open; return `false` to prevent opening
- blur: $.noop, // menu option lost focus
- close: $.noop, // menu was closed
- create: $.noop, // menu was initialized
- createMenu: $.noop, // menu was initialized (original UI Menu)
- focus: $.noop, // menu option got focus
- open: $.noop, // menu was opened
- select: $.noop // menu option was selected; return `false` to prevent closing
- },
- /** Constructor */
- _create: function() {
- var cssText, eventNames, targetId,
- opts = this.options;
-
- this.$headStyle = null;
- this.$menu = null;
- this.menuIsTemp = false;
- this.currentTarget = null;
- this.previousFocus = null;
-
- if (opts.preventSelect) {
- // Create a global style for all potential menu targets
- // If the contextmenu was bound to `document`, we apply the
- // selector relative to the tag instead
- targetId = ($(this.element).is(document) ? $("body")
- : this.element).uniqueId().attr("id");
- cssText = "#" + targetId + " " + opts.delegate + " { " +
- "-webkit-user-select: none; " +
- "-khtml-user-select: none; " +
- "-moz-user-select: none; " +
- "-ms-user-select: none; " +
- "user-select: none; " +
- "}";
- this.$headStyle = $("")
- .prop("type", "text/css")
- .appendTo("head");
-
- try {
- this.$headStyle.html(cssText);
- } catch ( e ) {
- // issue #47: fix for IE 6-8
- this.$headStyle[0].styleSheet.cssText = cssText;
- }
- // TODO: the selectstart is not supported by FF?
- if (supportSelectstart) {
- this.element.delegate(opts.delegate, "selectstart" + this.eventNamespace,
- function(event) {
- event.preventDefault();
- });
- }
- }
- this._createUiMenu(opts.menu);
-
- eventNames = "contextmenu" + this.eventNamespace;
- if (opts.taphold) {
- eventNames += " taphold" + this.eventNamespace;
- }
- this.element.delegate(opts.delegate, eventNames, $.proxy(this._openMenu, this));
- },
- /** Destructor, called on $().contextmenu("destroy"). */
- _destroy: function() {
- this.element.undelegate(this.eventNamespace);
-
- this._createUiMenu(null);
-
- if (this.$headStyle) {
- this.$headStyle.remove();
- this.$headStyle = null;
- }
- },
- /** (Re)Create jQuery UI Menu. */
- _createUiMenu: function(menuDef) {
- var ct,
- opts = this.options;
-
- // Remove temporary if any
- if (this.isOpen()) {
- // #58: 'replaceMenu' in beforeOpen causing select: to lose ui.target
- ct = this.currentTarget;
- // close without animation, to force async mode
- this._closeMenu(true);
- this.currentTarget = ct;
- }
- if (this.menuIsTemp) {
- this.$menu.remove(); // this will also destroy ui.menu
- } else if (this.$menu) {
- this.$menu
- .menu("destroy")
- .removeClass(this.options.addClass)
- .hide();
- }
- this.$menu = null;
- this.menuIsTemp = false;
- // If a menu definition array was passed, create a hidden
- // and generate the structure now
- if ( !menuDef ) {
- return;
- } else if ($.isArray(menuDef)) {
- this.$menu = $.moogle.contextmenu.createMenuMarkup(menuDef);
- this.menuIsTemp = true;
- }else if ( typeof menuDef === "string" ) {
- this.$menu = $(menuDef);
- } else {
- this.$menu = menuDef;
- }
- // Create - but hide - the jQuery UI Menu widget
- this.$menu
- .hide()
- .addClass(opts.addClass)
- // Create a menu instance that delegates events to our widget
- .menu($.extend(true, {}, opts.uiMenuOptions, {
- blur: $.proxy(opts.blur, this),
- create: $.proxy(opts.createMenu, this),
- focus: $.proxy(opts.focus, this),
- select: $.proxy(function(event, ui) {
- // User selected a menu entry
- var retval,
- isParent = $.moogle.contextmenu.isMenu(ui.item),
- actionHandler = ui.item.data("actionHandler");
-
- ui.cmd = ui.item.attr("data-command");
- ui.target = $(this.currentTarget);
- // ignore clicks, if they only open a sub-menu
- if ( !isParent || !opts.ignoreParentSelect) {
- retval = this._trigger.call(this, "select", event, ui);
- if ( actionHandler ) {
- retval = actionHandler.call(this, event, ui);
- }
- if ( retval !== false ) {
- this._closeMenu.call(this);
- }
- event.preventDefault();
- }
- }, this)
- }));
- },
- /** Open popup (called on 'contextmenu' event). */
- _openMenu: function(event, recursive) {
- var res, promise,
- opts = this.options,
- posOption = opts.position,
- self = this,
- manualTrigger = !!event.isTrigger,
- ui = { menu: this.$menu, target: $(event.target),
- extraData: event.extraData, originalEvent: event,
- result: null };
-
- if ( !opts.autoTrigger && !manualTrigger ) {
- // ignore browser's `contextmenu` events
- return;
- }
-
- // Prevent browser from opening the system context menu
- event.preventDefault();
-
- this.currentTarget = event.target;
-
- if ( !recursive ) {
- res = this._trigger("beforeOpen", event, ui);
- promise = (ui.result && $.isFunction(ui.result.promise)) ? ui.result : null;
- ui.result = null;
- if ( res === false ) {
- this.currentTarget = null;
- return false;
- } else if ( promise ) {
- // Handler returned a Deferred or Promise. Delay menu open until
- // the promise is resolved
- promise.done(function() {
- self._openMenu(event, true);
- });
- this.currentTarget = null;
- return false;
- }
- ui.menu = this.$menu; // Might have changed in beforeOpen
- }
-
- // Register global event handlers that close the dropdown-menu
- $(document).bind("keydown" + this.eventNamespace, function(event) {
- if ( event.which === $.ui.keyCode.ESCAPE ) {
- self._closeMenu();
- }
- }).bind("mousedown" + this.eventNamespace + " touchstart" + this.eventNamespace,
- function(event) {
- // Close menu when clicked outside menu
- if ( !$(event.target).closest(".ui-menu-item").length ) {
- self._closeMenu();
- }
- });
-
- // required for custom positioning (issue #18 and #13).
- if ($.isFunction(posOption)) {
- posOption = posOption(event, ui);
- }
- posOption = $.extend({
- my: "left top",
- at: "left bottom",
- // if called by 'open' method, event does not have pageX/Y
- of: (event.pageX === undefined) ? event.target : event,
- collision: "fit"
- }, posOption);
-
- // Finally display the popup
- this.$menu
- .show() // required to fix positioning error
- .css({
- position: "absolute",
- left: 0,
- top: 0
- }).position(posOption)
- .hide(); // hide again, so we can apply nice effects
-
- if ( opts.preventContextMenuForPopup ) {
- this.$menu.bind("contextmenu" + this.eventNamespace, function(event) {
- event.preventDefault();
- });
- }
- this._show(this.$menu, opts.show, function() {
- // Set focus to first active menu entry
- if ( opts.autoFocus ) {
- // var $first = self.$menu.children(".ui-menu-item:enabled:first");
- // self.$menu.menu("focus", event, $first).focus();
- self.$menu.focus();
- self.previousFocus = $(event.target);
- }
- self._trigger.call(self, "open", event, ui);
- });
- },
- /** Close popup. */
- _closeMenu: function(immediately) {
- var self = this,
- hideOpts = immediately ? false : this.options.hide;
-
- // Note: we don't want to unbind the 'contextmenu' event
- $(document)
- .unbind("mousedown" + this.eventNamespace)
- .unbind("touchstart" + this.eventNamespace)
- .unbind("keydown" + this.eventNamespace);
-
- self.currentTarget = null; // issue #44 after hide animation is too late
- if ( this.$menu ) { // #88: widget might have been destroyed already
- this.$menu
- .unbind("contextmenu" + this.eventNamespace);
- this._hide(this.$menu, hideOpts, function() {
- if ( self.previousFocus ) {
- self.previousFocus.focus();
- self.previousFocus = null;
- }
- self._trigger("close");
- });
- } else {
- self._trigger("close");
- }
- },
- /** Handle $().contextmenu("option", key, value) calls. */
- _setOption: function(key, value) {
- switch (key) {
- case "menu":
- this.replaceMenu(value);
- break;
- }
- $.Widget.prototype._setOption.apply(this, arguments);
- },
- /** Return ui-menu entry ( tag). */
- _getMenuEntry: function(cmd) {
- return this.$menu.find("li[data-command=" + cmd + "]");
- },
- /** Close context menu. */
- close: function() {
- if (this.isOpen()) {
- this._closeMenu();
- }
- },
- /** Enable or disable the menu command. */
- enableEntry: function(cmd, flag) {
- this._getMenuEntry(cmd).toggleClass("ui-state-disabled", (flag === false));
- },
- /** Return Menu element (UL). */
- getMenu: function() {
- return this.$menu;
- },
- /** Return true if menu is open. */
- isOpen: function() {
-// return this.$menu && this.$menu.is(":visible");
- return !!this.$menu && !!this.currentTarget;
- },
- /** Open context menu on a specific target (must match options.delegate)
- * Optional `extraData` is passed to event handlers as `ui.extraData`.
- */
- open: function(target, extraData) {
- // Fake a 'contextmenu' event
- extraData = extraData || {};
- var e = jQuery.Event("contextmenu", { target: target.get(0), extraData: extraData });
- return this.element.trigger(e);
- },
- /** Replace the menu altogether. */
- replaceMenu: function(data) {
- this._createUiMenu(data);
- },
- /** Redefine menu entry (title or all of it). */
- setEntry: function(cmd, entry) {
- var $ul,
- $entryLi = this._getMenuEntry(cmd);
-
- if (typeof entry === "string") {
- $.moogle.contextmenu.updateTitle($entryLi, entry);
- } else {
- $entryLi.empty();
- entry.cmd = entry.cmd || cmd;
- $.moogle.contextmenu.createEntryMarkup(entry, $entryLi);
- if ($.isArray(entry.children)) {
- $ul = $("").appendTo($entryLi);
- $.moogle.contextmenu.createMenuMarkup(entry.children, $ul);
- }
- this.getMenu().menu("refresh");
- }
- },
- /** Show or hide the menu command. */
- showEntry: function(cmd, flag) {
- this._getMenuEntry(cmd).toggle(flag !== false);
- }
-});
-
-/*
- * Global functions
- */
-$.extend($.moogle.contextmenu, {
- /** Convert a menu description into a into a content. */
- createEntryMarkup: function(entry, $parentLi) {
- var $a = null;
-
- if ( !/[^\-\u2014\u2013\s]/.test( entry.title ) ) {
- // hyphen, em dash, en dash: separator as defined by UI Menu 1.10
- $parentLi.text(entry.title);
- } else {
- if ( isLTE110 ) {
- // jQuery UI Menu 1.10 or before required an `` tag
- $parentLi.attr("data-command", entry.cmd);
- $a = $(" ", {
- html: "" + entry.title,
- href: "#"
- }).appendTo($parentLi);
-
- if ( entry.uiIcon ) {
- $a.append($(" ").addClass(entry.uiIcon));
- }
-
- } else {
- // jQuery UI Menu 1.11+ preferes to avoid `` tags
- $parentLi
- .attr("data-command", entry.cmd)
- .html("" + entry.title);
- if ( $.isFunction(entry.action) ) {
- $parentLi.data("actionHandler", entry.action);
- }
- if ( entry.uiIcon ) {
- $parentLi
- .append($(" ")
- .addClass(entry.uiIcon));
- }
- }
- if ( $.isFunction(entry.action) ) {
- $parentLi.data("actionHandler", entry.action);
- }
- if ( entry.disabled ) {
- $parentLi.addClass("ui-state-disabled");
- }
- if ( entry.addClass ) {
- $parentLi.addClass(entry.addClass);
- }
- if ( $.isPlainObject(entry.data) ) {
- $parentLi.data(entry.data);
- }
- }
- },
- /** Convert a nested array of command objects into a structure. */
- createMenuMarkup: function(options, $parentUl) {
- var i, menu, $ul, $li;
- if ( $parentUl == null ) {
- $parentUl = $("").appendTo("body");
- }
- for (i = 0; i < options.length; i++) {
- menu = options[i];
- $li = $(" ").appendTo($parentUl);
-
- $.moogle.contextmenu.createEntryMarkup(menu, $li);
-
- if ( $.isArray(menu.children) ) {
- $ul = $("").appendTo($li);
- $.moogle.contextmenu.createMenuMarkup(menu.children, $ul);
- }
- }
- return $parentUl;
- },
- /** Returns true if the menu item has child menu items */
- isMenu: function(item) {
- if ( isLTE110 ) {
- return item.has(">a[aria-haspopup='true']").length > 0;
- } else {
- return item.is("[aria-haspopup='true']");
- }
- },
- /** Replaces the value of elem's first text node child */
- replaceFirstTextNodeChild: function(elem, text) {
- elem
- .contents()
- .filter(function() { return this.nodeType === 3; })
- .first()
- .replaceWith(text);
- },
- /** Updates the menu item's title */
- updateTitle: function(item, title) {
- if ( isLTE110 ) {
- $.moogle.contextmenu.replaceFirstTextNodeChild($("a", item), title);
- } else {
- $.moogle.contextmenu.replaceFirstTextNodeChild(item, title);
- }
- }
-});
-
-}));
diff --git a/web/javascript/jquery/jquery.ui-contextmenu.min.js b/web/javascript/jquery/jquery.ui-contextmenu.min.js
deleted file mode 100644
index 2a987780f..000000000
--- a/web/javascript/jquery/jquery.ui-contextmenu.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery UI context menu plugin - v1.9.0 - 2015-04-20 | https://github.com/mar10/jquery-ui-contextmenu | Copyright (c) 2015 Martin Wendt; Licensed MIT */
-
-!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery","jquery-ui/menu"],a):a(jQuery)}(function(a){"use strict";var b="onselectstart"in document.createElement("div"),c=a.ui.menu.version.match(/^(\d)\.(\d+)/),d={major:parseInt(c[1],10),minor:parseInt(c[2],10)},e=d.major<2&&d.minor<11;a.widget("moogle.contextmenu",{version:"@VERSION",options:{addClass:"ui-contextmenu",autoFocus:!1,autoTrigger:!0,delegate:null,hide:{effect:"fadeOut",duration:"fast"},ignoreParentSelect:!0,menu:null,position:null,preventContextMenuForPopup:!1,preventSelect:!1,show:{effect:"slideDown",duration:"fast"},taphold:!1,uiMenuOptions:{},beforeOpen:a.noop,blur:a.noop,close:a.noop,create:a.noop,createMenu:a.noop,focus:a.noop,open:a.noop,select:a.noop},_create:function(){var c,d,e,f=this.options;if(this.$headStyle=null,this.$menu=null,this.menuIsTemp=!1,this.currentTarget=null,this.previousFocus=null,f.preventSelect){e=(a(this.element).is(document)?a("body"):this.element).uniqueId().attr("id"),c="#"+e+" "+f.delegate+" { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }",this.$headStyle=a("").prop("type","text/css").appendTo("head");try{this.$headStyle.html(c)}catch(g){this.$headStyle[0].styleSheet.cssText=c}b&&this.element.delegate(f.delegate,"selectstart"+this.eventNamespace,function(a){a.preventDefault()})}this._createUiMenu(f.menu),d="contextmenu"+this.eventNamespace,f.taphold&&(d+=" taphold"+this.eventNamespace),this.element.delegate(f.delegate,d,a.proxy(this._openMenu,this))},_destroy:function(){this.element.undelegate(this.eventNamespace),this._createUiMenu(null),this.$headStyle&&(this.$headStyle.remove(),this.$headStyle=null)},_createUiMenu:function(b){var c,d=this.options;this.isOpen()&&(c=this.currentTarget,this._closeMenu(!0),this.currentTarget=c),this.menuIsTemp?this.$menu.remove():this.$menu&&this.$menu.menu("destroy").removeClass(this.options.addClass).hide(),this.$menu=null,this.menuIsTemp=!1,b&&(a.isArray(b)?(this.$menu=a.moogle.contextmenu.createMenuMarkup(b),this.menuIsTemp=!0):this.$menu="string"==typeof b?a(b):b,this.$menu.hide().addClass(d.addClass).menu(a.extend(!0,{},d.uiMenuOptions,{blur:a.proxy(d.blur,this),create:a.proxy(d.createMenu,this),focus:a.proxy(d.focus,this),select:a.proxy(function(b,c){var e,f=a.moogle.contextmenu.isMenu(c.item),g=c.item.data("actionHandler");c.cmd=c.item.attr("data-command"),c.target=a(this.currentTarget),f&&d.ignoreParentSelect||(e=this._trigger.call(this,"select",b,c),g&&(e=g.call(this,b,c)),e!==!1&&this._closeMenu.call(this),b.preventDefault())},this)})))},_openMenu:function(b,c){var d,e,f=this.options,g=f.position,h=this,i=!!b.isTrigger,j={menu:this.$menu,target:a(b.target),extraData:b.extraData,originalEvent:b,result:null};if(f.autoTrigger||i){if(b.preventDefault(),this.currentTarget=b.target,!c){if(d=this._trigger("beforeOpen",b,j),e=j.result&&a.isFunction(j.result.promise)?j.result:null,j.result=null,d===!1)return this.currentTarget=null,!1;if(e)return e.done(function(){h._openMenu(b,!0)}),this.currentTarget=null,!1;j.menu=this.$menu}a(document).bind("keydown"+this.eventNamespace,function(b){b.which===a.ui.keyCode.ESCAPE&&h._closeMenu()}).bind("mousedown"+this.eventNamespace+" touchstart"+this.eventNamespace,function(b){a(b.target).closest(".ui-menu-item").length||h._closeMenu()}),a.isFunction(g)&&(g=g(b,j)),g=a.extend({my:"left top",at:"left bottom",of:void 0===b.pageX?b.target:b,collision:"fit"},g),this.$menu.show().css({position:"absolute",left:0,top:0}).position(g).hide(),f.preventContextMenuForPopup&&this.$menu.bind("contextmenu"+this.eventNamespace,function(a){a.preventDefault()}),this._show(this.$menu,f.show,function(){f.autoFocus&&(h.$menu.focus(),h.previousFocus=a(b.target)),h._trigger.call(h,"open",b,j)})}},_closeMenu:function(b){var c=this,d=b?!1:this.options.hide;a(document).unbind("mousedown"+this.eventNamespace).unbind("touchstart"+this.eventNamespace).unbind("keydown"+this.eventNamespace),c.currentTarget=null,this.$menu?(this.$menu.unbind("contextmenu"+this.eventNamespace),this._hide(this.$menu,d,function(){c.previousFocus&&(c.previousFocus.focus(),c.previousFocus=null),c._trigger("close")})):c._trigger("close")},_setOption:function(b,c){switch(b){case"menu":this.replaceMenu(c)}a.Widget.prototype._setOption.apply(this,arguments)},_getMenuEntry:function(a){return this.$menu.find("li[data-command="+a+"]")},close:function(){this.isOpen()&&this._closeMenu()},enableEntry:function(a,b){this._getMenuEntry(a).toggleClass("ui-state-disabled",b===!1)},getMenu:function(){return this.$menu},isOpen:function(){return!!this.$menu&&!!this.currentTarget},open:function(a,b){b=b||{};var c=jQuery.Event("contextmenu",{target:a.get(0),extraData:b});return this.element.trigger(c)},replaceMenu:function(a){this._createUiMenu(a)},setEntry:function(b,c){var d,e=this._getMenuEntry(b);"string"==typeof c?a.moogle.contextmenu.updateTitle(e,c):(e.empty(),c.cmd=c.cmd||b,a.moogle.contextmenu.createEntryMarkup(c,e),a.isArray(c.children)&&(d=a("").appendTo(e),a.moogle.contextmenu.createMenuMarkup(c.children,d)),this.getMenu().menu("refresh"))},showEntry:function(a,b){this._getMenuEntry(a).toggle(b!==!1)}}),a.extend(a.moogle.contextmenu,{createEntryMarkup:function(b,c){var d=null;/[^\-\u2014\u2013\s]/.test(b.title)?(e?(c.attr("data-command",b.cmd),d=a(" ",{html:""+b.title,href:"#"}).appendTo(c),b.uiIcon&&d.append(a(" ").addClass(b.uiIcon))):(c.attr("data-command",b.cmd).html(""+b.title),a.isFunction(b.action)&&c.data("actionHandler",b.action),b.uiIcon&&c.append(a(" ").addClass(b.uiIcon))),a.isFunction(b.action)&&c.data("actionHandler",b.action),b.disabled&&c.addClass("ui-state-disabled"),b.addClass&&c.addClass(b.addClass),a.isPlainObject(b.data)&&c.data(b.data)):c.text(b.title)},createMenuMarkup:function(b,c){var d,e,f,g;for(null==c&&(c=a("").appendTo("body")),d=0;d ").appendTo(c),a.moogle.contextmenu.createEntryMarkup(e,g),a.isArray(e.children)&&(f=a("").appendTo(g),a.moogle.contextmenu.createMenuMarkup(e.children,f));return c},isMenu:function(a){return e?a.has(">a[aria-haspopup='true']").length>0:a.is("[aria-haspopup='true']")},replaceFirstTextNodeChild:function(a,b){a.contents().filter(function(){return 3===this.nodeType}).first().replaceWith(b)},updateTitle:function(b,c){e?a.moogle.contextmenu.replaceFirstTextNodeChild(a("a",b),c):a.moogle.contextmenu.replaceFirstTextNodeChild(b,c)}})});
-//# sourceMappingURL=jquery.ui-contextmenu.min.js.map
\ No newline at end of file
diff --git a/web/javascript/main.js b/web/javascript/main.js
deleted file mode 100644
index 1c3af9610..000000000
--- a/web/javascript/main.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Copyright © Dave Perrett, Malcolm Jarvis and Artem Vorotnikov
- *
- * This file is licensed under the GPLv2.
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- */
-
-function main() {
- // IE specific fixes here
- if (jQuery.browser.msie) {
- try {
- document.execCommand('BackgroundImageCache', false, true);
- } catch (err) {
- // no-op
- }
- }
-
- if (jQuery.browser.safari) {
- // Move search field's margin down for the styled input
- document.getElementById('torrent_search').style['margin-top'] = 3;
- }
-
- if (isMobileDevice) {
- window.onload = function () {
- setTimeout(function () {
- window.scrollTo(0, 1);
- }, 500);
- };
- window.onorientationchange = function () {
- setTimeout(function () {
- window.scrollTo(0, 1);
- }, 100);
- };
- if (window.navigator.standalone) {
- // Fix min height for isMobileDevice when run in full screen mode from home screen
- // so the footer appears in the right place
- document.getElementById('torrent_container').style['min-height'] = '338px';
- }
- } else {
- // Fix for non-Safari-3 browsers: dark borders to replace shadows.
- Array.from(document.getElementsByClassName('dialog_window')).forEach(function (e) {
- e.style['border'] = '1px solid #777';
- });
- }
-
- // Initialise the dialog controller
- dialog = new Dialog();
-
- // Initialise the main Transmission controller
- transmission = new Transmission();
-}
-
-document.addEventListener('DOMContentLoaded', main);
diff --git a/web/javascript/notifications.js b/web/javascript/notifications.js
deleted file mode 100644
index d096c6b2f..000000000
--- a/web/javascript/notifications.js
+++ /dev/null
@@ -1,46 +0,0 @@
-const Notifications = {};
-
-$(document).ready(function () {
- if (!window.webkitNotifications) {
- return;
- }
-
- let notificationsEnabled = window.webkitNotifications.checkPermission() === 0;
- const toggle = $('#toggle_notifications');
-
- toggle.show();
- updateMenuTitle();
- $(transmission).bind('downloadComplete seedingComplete', function (event, torrent) {
- if (notificationsEnabled) {
- let title = (event.type == 'downloadComplete' ? 'Download' : 'Seeding') + ' complete',
- content = torrent.getName(),
- notification;
-
- notification = window.webkitNotifications.createNotification(
- 'style/transmission/images/logo.png',
- title,
- content
- );
- notification.show();
- setTimeout(function () {
- notification.cancel();
- }, 5000);
- }
- });
-
- function updateMenuTitle() {
- toggle.html((notificationsEnabled ? 'Disable' : 'Enable') + ' Notifications');
- }
-
- Notifications.toggle = function () {
- if (window.webkitNotifications.checkPermission() !== 0) {
- window.webkitNotifications.requestPermission(function () {
- notificationsEnabled = window.webkitNotifications.checkPermission() === 0;
- updateMenuTitle();
- });
- } else {
- notificationsEnabled = !notificationsEnabled;
- updateMenuTitle();
- }
- };
-});
diff --git a/web/javascript/polyfill.js b/web/javascript/polyfill.js
deleted file mode 100644
index 1297c2ada..000000000
--- a/web/javascript/polyfill.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * Copyright © Dave Perrett, Malcolm Jarvis and Artem Vorotnikov
- *
- * This file is licensed under the GPLv2.
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- */
-
-if (!Array.from) {
- Array.from = (function () {
- const toStr = Object.prototype.toString;
- const isCallable = function (fn) {
- return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
- };
- const toInteger = function (value) {
- const number = Number(value);
- if (isNaN(number)) {
- return 0;
- }
- if (number === 0 || !isFinite(number)) {
- return number;
- }
- return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
- };
- const maxSafeInteger = Math.pow(2, 53) - 1;
- const toLength = function (value) {
- const len = toInteger(value);
- return Math.min(Math.max(len, 0), maxSafeInteger);
- };
-
- // The length property of the from method is 1.
- return function from(arrayLike /*, mapFn, thisArg */) {
- // 1. Let C be the this value.
- const C = this;
-
- // 2. Let items be ToObject(arrayLike).
- const items = Object(arrayLike);
-
- // 3. ReturnIfAbrupt(items).
- if (arrayLike == null) {
- throw new TypeError('Array.from requires an array-like object - not null or undefined');
- }
-
- // 4. If mapfn is undefined, then let mapping be false.
- const mapFn = arguments.length > 1 ? arguments[1] : void undefined;
- let T;
- if (typeof mapFn !== 'undefined') {
- // 5. else
- // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
- if (!isCallable(mapFn)) {
- throw new TypeError('Array.from: when provided, the second argument must be a function');
- }
-
- // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
- if (arguments.length > 2) {
- T = arguments[2];
- }
- }
-
- // 10. Let lenValue be Get(items, "length").
- // 11. Let len be ToLength(lenValue).
- const len = toLength(items.length);
-
- // 13. If IsConstructor(C) is true, then
- // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len.
- // 14. a. Else, Let A be ArrayCreate(len).
- const A = isCallable(C) ? Object(new C(len)) : new Array(len);
-
- // 16. Let k be 0.
- let k = 0;
- // 17. Repeat, while k < len… (also steps a - h)
- let kValue;
- while (k < len) {
- kValue = items[k];
- if (mapFn) {
- A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
- } else {
- A[k] = kValue;
- }
- k += 1;
- }
- // 18. Let putStatus be Put(A, "length", len, true).
- A.length = len;
- // 20. Return A.
- return A;
- };
- })();
-}
diff --git a/web/javascript/prefs-dialog.js b/web/javascript/prefs-dialog.js
deleted file mode 100644
index 59b419a72..000000000
--- a/web/javascript/prefs-dialog.js
+++ /dev/null
@@ -1,308 +0,0 @@
-/**
- * Copyright © Charles Kerr, Dave Perrett, Malcolm Jarvis and Bruno Bierbaumer
- *
- * This file is licensed under the GPLv2.
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- */
-
-function PrefsDialog(remote) {
- const data = {
- dialog: null,
- remote: null,
- elements: {},
-
- // all the RPC session keys that we have gui controls for
- keys: [
- 'alt-speed-down',
- 'alt-speed-time-begin',
- 'alt-speed-time-day',
- 'alt-speed-time-enabled',
- 'alt-speed-time-end',
- 'alt-speed-up',
- 'blocklist-enabled',
- 'blocklist-size',
- 'blocklist-url',
- 'dht-enabled',
- 'download-dir',
- 'encryption',
- 'idle-seeding-limit',
- 'idle-seeding-limit-enabled',
- 'lpd-enabled',
- 'peer-limit-global',
- 'peer-limit-per-torrent',
- 'peer-port',
- 'peer-port-random-on-start',
- 'pex-enabled',
- 'port-forwarding-enabled',
- 'rename-partial-files',
- 'seedRatioLimit',
- 'seedRatioLimited',
- 'speed-limit-down',
- 'speed-limit-down-enabled',
- 'speed-limit-up',
- 'speed-limit-up-enabled',
- 'start-added-torrents',
- 'utp-enabled',
- ],
-
- // map of keys that are enabled only if a 'parent' key is enabled
- groups: {
- 'alt-speed-time-enabled': [
- 'alt-speed-time-begin',
- 'alt-speed-time-day',
- 'alt-speed-time-end',
- ],
- 'blocklist-enabled': ['blocklist-url', 'blocklist-update-button'],
- 'idle-seeding-limit-enabled': ['idle-seeding-limit'],
- seedRatioLimited: ['seedRatioLimit'],
- 'speed-limit-down-enabled': ['speed-limit-down'],
- 'speed-limit-up-enabled': ['speed-limit-up'],
- },
- };
-
- const initTimeDropDown = function (e) {
- let i, hour, mins, value, content;
-
- for (i = 0; i < 24 * 4; ++i) {
- hour = parseInt(i / 4, 10);
- mins = (i % 4) * 15;
- value = i * 15;
- content = hour + ':' + (mins || '00');
- e.options[i] = new Option(content, value);
- }
- };
-
- const onPortChecked = function (response) {
- const is_open = response['arguments']['port-is-open'];
- const text = 'Port is ' + (is_open ? 'Open' : 'Closed') + ' ';
- const e = data.elements.root.find('#port-label');
- setInnerHTML(e[0], text);
- };
-
- const setGroupEnabled = function (parent_key, enabled) {
- let i, key, keys, root;
-
- if (parent_key in data.groups) {
- root = data.elements.root;
- keys = data.groups[parent_key];
-
- for (i = 0; (key = keys[i]); ++i) {
- root.find('#' + key).attr('disabled', !enabled);
- }
- }
- };
-
- const onBlocklistUpdateClicked = function () {
- data.remote.updateBlocklist();
- setBlocklistButtonEnabled(false);
- };
-
- var setBlocklistButtonEnabled = function (b) {
- const e = data.elements.blocklist_button;
- e.attr('disabled', !b);
- e.val(b ? 'Update' : 'Updating...');
- };
-
- const getValue = function (e) {
- let str;
-
- switch (e[0].type) {
- case 'checkbox':
- case 'radio':
- return e.prop('checked');
-
- case 'text':
- case 'url':
- case 'email':
- case 'number':
- case 'search':
- case 'select-one':
- str = e.val();
- if (parseInt(str, 10).toString() === str) {
- return parseInt(str, 10);
- }
- if (parseFloat(str).toString() === str) {
- return parseFloat(str);
- }
- return str;
-
- default:
- return null;
- }
- };
-
- /* this callback is for controls whose changes can be applied
- immediately, like checkboxs, radioboxes, and selects */
- const onControlChanged = function (ev) {
- const o = {};
- o[ev.target.id] = getValue($(ev.target));
- data.remote.savePrefs(o);
- };
-
- /* these two callbacks are for controls whose changes can't be applied
- immediately -- like a text entry field -- because it takes many
- change events for the user to get to the desired result */
- const onControlFocused = function (ev) {
- data.oldValue = getValue($(ev.target));
- };
-
- const onControlBlurred = function (ev) {
- const newValue = getValue($(ev.target));
- if (newValue !== data.oldValue) {
- const o = {};
- o[ev.target.id] = newValue;
- data.remote.savePrefs(o);
- delete data.oldValue;
- }
- };
-
- const getDefaultMobileOptions = function () {
- return {
- width: $(window).width(),
- height: $(window).height(),
- position: ['left', 'top'],
- };
- };
-
- const initialize = function (remote) {
- let i, key, e, o;
-
- data.remote = remote;
-
- e = $('#prefs-dialog');
- data.elements.root = e;
-
- initTimeDropDown(e.find('#alt-speed-time-begin')[0]);
- initTimeDropDown(e.find('#alt-speed-time-end')[0]);
-
- o = isMobileDevice
- ? getDefaultMobileOptions()
- : {
- width: 350,
- height: 400,
- };
- o.autoOpen = false;
- o.show = o.hide = 'fade';
- o.close = onDialogClosed;
- e.tabbedDialog(o);
-
- e = e.find('#blocklist-update-button');
- data.elements.blocklist_button = e;
- e.click(onBlocklistUpdateClicked);
-
- // listen for user input
- for (i = 0; (key = data.keys[i]); ++i) {
- e = data.elements.root.find('#' + key);
- switch (e[0].type) {
- case 'checkbox':
- case 'radio':
- case 'select-one':
- e.change(onControlChanged);
- break;
-
- case 'text':
- case 'url':
- case 'email':
- case 'number':
- case 'search':
- e.focus(onControlFocused);
- e.blur(onControlBlurred);
- break;
-
- default:
- break;
- }
- }
- };
-
- const getValues = function () {
- let i,
- key,
- val,
- o = {},
- keys = data.keys,
- root = data.elements.root;
-
- for (i = 0; (key = keys[i]); ++i) {
- val = getValue(root.find('#' + key));
- if (val !== null) {
- o[key] = val;
- }
- }
-
- return o;
- };
-
- var onDialogClosed = function () {
- transmission.hideMobileAddressbar();
-
- $(data.dialog).trigger('closed', getValues());
- };
-
- /****
- ***** PUBLIC FUNCTIONS
- ****/
-
- // update the dialog's controls
- this.set = function (o) {
- let e, i, key, val;
- const keys = data.keys;
- const root = data.elements.root;
-
- setBlocklistButtonEnabled(true);
-
- for (i = 0; (key = keys[i]); ++i) {
- val = o[key];
- e = root.find('#' + key);
-
- if (key === 'blocklist-size') {
- // special case -- regular text area
- e.text('' + val.toStringWithCommas());
- } else {
- switch (e[0].type) {
- case 'checkbox':
- case 'radio':
- e.prop('checked', val);
- setGroupEnabled(key, val);
- break;
- case 'text':
- case 'url':
- case 'email':
- case 'number':
- case 'search':
- // don't change the text if the user's editing it.
- // it's very annoying when that happens!
- if (e[0] !== document.activeElement) {
- e.val(val);
- }
- break;
- case 'select-one':
- e.val(val);
- break;
- default:
- break;
- }
- }
- }
- };
-
- this.show = function () {
- transmission.hideMobileAddressbar();
-
- setBlocklistButtonEnabled(true);
- data.remote.checkPort(onPortChecked, this);
- data.elements.root.dialog('open');
- };
-
- this.close = function () {
- transmission.hideMobileAddressbar();
- data.elements.root.dialog('close');
- };
-
- this.shouldAddedTorrentsStart = function () {
- return data.elements.root.find('#start-added-torrents')[0].checked;
- };
-
- data.dialog = this;
- initialize(remote);
-}
diff --git a/web/javascript/remote.js b/web/javascript/remote.js
deleted file mode 100644
index 153309a09..000000000
--- a/web/javascript/remote.js
+++ /dev/null
@@ -1,302 +0,0 @@
-/**
- * Copyright © Charles Kerr, Dave Perrett, Malcolm Jarvis and Bruno Bierbaumer
- *
- * This file is licensed under the GPLv2.
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- */
-
-const RPC = {
- _DaemonVersion: 'version',
- _DownSpeedLimit: 'speed-limit-down',
- _DownSpeedLimited: 'speed-limit-down-enabled',
- _QueueMoveTop: 'queue-move-top',
- _QueueMoveBottom: 'queue-move-bottom',
- _QueueMoveUp: 'queue-move-up',
- _QueueMoveDown: 'queue-move-down',
- _Root: '../rpc',
- _TurtleDownSpeedLimit: 'alt-speed-down',
- _TurtleState: 'alt-speed-enabled',
- _TurtleUpSpeedLimit: 'alt-speed-up',
- _UpSpeedLimit: 'speed-limit-up',
- _UpSpeedLimited: 'speed-limit-up-enabled',
-};
-
-function TransmissionRemote(controller) {
- this.initialize(controller);
- return this;
-}
-
-TransmissionRemote.prototype = {
- /*
- * Constructor
- */
- initialize: function (controller) {
- this._controller = controller;
- this._error = '';
- this._token = '';
- },
-
- /*
- * Display an error if an ajax request fails, and stop sending requests
- * or on a 409, globally set the X-Transmission-Session-Id and resend
- */
- ajaxError: function (request, error_string, exception, ajaxObject) {
- let token;
- const remote = this;
-
- // set the Transmission-Session-Id on a 409
- if (
- request.status === 409 &&
- (token = request.getResponseHeader('X-Transmission-Session-Id'))
- ) {
- remote._token = token;
- $.ajax(ajaxObject);
- return;
- }
-
- remote._error = request.responseText
- ? request.responseText.trim().replace(/(<([^>]+)>)/gi, '')
- : '';
- if (!remote._error.length) {
- remote._error = 'Server not responding';
- }
-
- dialog.confirm(
- 'Connection Failed',
- 'Could not connect to the server. You may need to reload the page to reconnect.',
- 'Details',
- function () {
- alert(remote._error);
- },
- 'Dismiss'
- );
- remote._controller.togglePeriodicSessionRefresh(false);
- },
-
- appendSessionId: function (XHR) {
- if (this._token) {
- XHR.setRequestHeader('X-Transmission-Session-Id', this._token);
- }
- },
-
- sendRequest: function (data, callback, context, async) {
- const remote = this;
- if (typeof async != 'boolean') {
- async = true;
- }
-
- var ajaxSettings = {
- url: RPC._Root,
- type: 'POST',
- contentType: 'json',
- dataType: 'json',
- cache: false,
- data: JSON.stringify(data),
- beforeSend: function (XHR) {
- remote.appendSessionId(XHR);
- },
- error: function (request, error_string, exception) {
- remote.ajaxError(request, error_string, exception, ajaxSettings);
- },
- success: callback,
- context: context,
- async: async,
- };
-
- $.ajax(ajaxSettings);
- },
-
- loadDaemonPrefs: function (callback, context, async) {
- const o = {
- method: 'session-get',
- };
- this.sendRequest(o, callback, context, async);
- },
-
- checkPort: function (callback, context, async) {
- const o = {
- method: 'port-test',
- };
- this.sendRequest(o, callback, context, async);
- },
-
- renameTorrent: function (torrentIds, oldpath, newname, callback, context) {
- const o = {
- method: 'torrent-rename-path',
- arguments: {
- ids: torrentIds,
- path: oldpath,
- name: newname,
- },
- };
- this.sendRequest(o, callback, context);
- },
-
- loadDaemonStats: function (callback, context, async) {
- const o = {
- method: 'session-stats',
- };
- this.sendRequest(o, callback, context, async);
- },
-
- updateTorrents: function (torrentIds, fields, callback, context) {
- const o = {
- method: 'torrent-get',
- arguments: {
- fields: fields,
- },
- };
- if (torrentIds) {
- o['arguments'].ids = torrentIds;
- }
- this.sendRequest(o, function (response) {
- const args = response['arguments'];
- callback.call(context, args.torrents, args.removed);
- });
- },
-
- getFreeSpace: function (dir, callback, context) {
- const o = {
- method: 'free-space',
- arguments: {
- path: dir,
- },
- };
- this.sendRequest(o, function (response) {
- const args = response['arguments'];
- callback.call(context, args.path, args['size-bytes']);
- });
- },
-
- changeFileCommand: function (torrentId, fileIndices, command) {
- const remote = this,
- args = {
- ids: [torrentId],
- };
- args[command] = fileIndices;
- this.sendRequest(
- {
- arguments: args,
- method: 'torrent-set',
- },
- function () {
- remote._controller.refreshTorrents([torrentId]);
- }
- );
- },
-
- sendTorrentSetRequests: function (method, torrent_ids, args, callback, context) {
- if (!args) {
- args = {};
- }
- args['ids'] = torrent_ids;
- const o = {
- method: method,
- arguments: args,
- };
- this.sendRequest(o, callback, context);
- },
-
- sendTorrentActionRequests: function (method, torrent_ids, callback, context) {
- this.sendTorrentSetRequests(method, torrent_ids, null, callback, context);
- },
-
- startTorrents: function (torrent_ids, noqueue, callback, context) {
- const name = noqueue ? 'torrent-start-now' : 'torrent-start';
- this.sendTorrentActionRequests(name, torrent_ids, callback, context);
- },
- stopTorrents: function (torrent_ids, callback, context) {
- this.sendTorrentActionRequests('torrent-stop', torrent_ids, callback, context);
- },
-
- moveTorrents: function (torrent_ids, new_location, callback, context) {
- this.sendTorrentSetRequests(
- 'torrent-set-location',
- torrent_ids,
- {
- move: true,
- location: new_location,
- },
- callback,
- context
- );
- },
-
- removeTorrents: function (torrent_ids, callback, context) {
- this.sendTorrentActionRequests('torrent-remove', torrent_ids, callback, context);
- },
- removeTorrentsAndData: function (torrents) {
- const remote = this;
- const o = {
- method: 'torrent-remove',
- arguments: {
- 'delete-local-data': true,
- ids: [],
- },
- };
-
- if (torrents) {
- for (let i = 0, len = torrents.length; i < len; ++i) {
- o.arguments.ids.push(torrents[i].getId());
- }
- }
- this.sendRequest(o, function () {
- remote._controller.refreshTorrents();
- });
- },
- verifyTorrents: function (torrent_ids, callback, context) {
- this.sendTorrentActionRequests('torrent-verify', torrent_ids, callback, context);
- },
- reannounceTorrents: function (torrent_ids, callback, context) {
- this.sendTorrentActionRequests('torrent-reannounce', torrent_ids, callback, context);
- },
- addTorrentByUrl: function (url, options) {
- const remote = this;
- if (url.match(/^[0-9a-f]{40}$/i)) {
- url = 'magnet:?xt=urn:btih:' + url;
- }
- const o = {
- method: 'torrent-add',
- arguments: {
- paused: options.paused,
- filename: url,
- },
- };
- this.sendRequest(o, function () {
- remote._controller.refreshTorrents();
- });
- },
- savePrefs: function (args) {
- const remote = this;
- const o = {
- method: 'session-set',
- arguments: args,
- };
- this.sendRequest(o, function () {
- remote._controller.loadDaemonPrefs();
- });
- },
- updateBlocklist: function () {
- const remote = this;
- const o = {
- method: 'blocklist-update',
- };
- this.sendRequest(o, function () {
- remote._controller.loadDaemonPrefs();
- });
- },
-
- // Added queue calls
- moveTorrentsToTop: function (torrent_ids, callback, context) {
- this.sendTorrentActionRequests(RPC._QueueMoveTop, torrent_ids, callback, context);
- },
- moveTorrentsToBottom: function (torrent_ids, callback, context) {
- this.sendTorrentActionRequests(RPC._QueueMoveBottom, torrent_ids, callback, context);
- },
- moveTorrentsUp: function (torrent_ids, callback, context) {
- this.sendTorrentActionRequests(RPC._QueueMoveUp, torrent_ids, callback, context);
- },
- moveTorrentsDown: function (torrent_ids, callback, context) {
- this.sendTorrentActionRequests(RPC._QueueMoveDown, torrent_ids, callback, context);
- },
-};
diff --git a/web/javascript/torrent-row.js b/web/javascript/torrent-row.js
deleted file mode 100644
index 655149920..000000000
--- a/web/javascript/torrent-row.js
+++ /dev/null
@@ -1,451 +0,0 @@
-/**
- * Copyright © Mnemosyne LLC
- *
- * This file is licensed under the GPLv2.
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- */
-
-function TorrentRendererHelper() {}
-
-TorrentRendererHelper.getProgressInfo = function (controller, t) {
- let pct, extra;
- const s = t.getStatus();
- const seed_ratio_limit = t.seedRatioLimit(controller);
-
- if (t.needsMetaData()) {
- pct = t.getMetadataPercentComplete() * 100;
- } else if (!t.isDone()) {
- pct = Math.round(t.getPercentDone() * 100);
- } else if (seed_ratio_limit > 0 && t.isSeeding()) {
- // don't split up the bar if paused or queued
- pct = Math.round((t.getUploadRatio() * 100) / seed_ratio_limit);
- } else {
- pct = 100;
- }
-
- if (s === Torrent._StatusStopped) {
- extra = 'paused';
- } else if (s === Torrent._StatusDownloadWait) {
- extra = 'leeching queued';
- } else if (t.needsMetaData()) {
- extra = 'magnet';
- } else if (s === Torrent._StatusDownload) {
- extra = 'leeching';
- } else if (s === Torrent._StatusSeedWait) {
- extra = 'seeding queued';
- } else if (s === Torrent._StatusSeed) {
- extra = 'seeding';
- } else {
- extra = '';
- }
-
- return {
- percent: pct,
- complete: ['torrent_progress_bar', 'complete', extra].join(' '),
- incomplete: ['torrent_progress_bar', 'incomplete', extra].join(' '),
- };
-};
-
-TorrentRendererHelper.createProgressbar = function (classes) {
- let complete, incomplete, progressbar;
-
- complete = document.createElement('div');
- complete.className = 'torrent_progress_bar complete';
-
- incomplete = document.createElement('div');
- incomplete.className = 'torrent_progress_bar incomplete';
-
- progressbar = document.createElement('div');
- progressbar.className = 'torrent_progress_bar_container ' + classes;
- progressbar.appendChild(complete);
- progressbar.appendChild(incomplete);
-
- return {
- element: progressbar,
- complete: complete,
- incomplete: incomplete,
- };
-};
-
-TorrentRendererHelper.renderProgressbar = function (controller, t, progressbar) {
- let e, style, width, display;
- const info = TorrentRendererHelper.getProgressInfo(controller, t);
-
- // update the complete progressbar
- e = progressbar.complete;
- style = e.style;
- width = '' + info.percent + '%';
- display = info.percent > 0 ? 'block' : 'none';
- if (style.width !== width || style.display !== display) {
- $(e).css({
- width: '' + info.percent + '%',
- display: display,
- });
- }
-
- if (e.className !== info.complete) {
- e.className = info.complete;
- }
-
- // update the incomplete progressbar
- e = progressbar.incomplete;
- display = info.percent < 100 ? 'block' : 'none';
-
- if (e.style.display !== display) {
- e.style.display = display;
- }
-
- if (e.className !== info.incomplete) {
- e.className = info.incomplete;
- }
-};
-
-TorrentRendererHelper.formatUL = function (t) {
- return '▲' + Transmission.fmt.speedBps(t.getUploadSpeed());
-};
-
-TorrentRendererHelper.formatDL = function (t) {
- return '▼' + Transmission.fmt.speedBps(t.getDownloadSpeed());
-};
-
-TorrentRendererHelper.formatETA = function (t) {
- const eta = t.getETA();
- if (eta < 0 || eta >= 999 * 60 * 60) {
- return '';
- }
- return 'ETA: ' + Transmission.fmt.timeInterval(eta);
-};
-
-/****
- *****
- *****
- ****/
-
-function TorrentRendererFull() {}
-TorrentRendererFull.prototype = {
- createRow: function () {
- let root, name, peers, progressbar, details, image, button;
-
- root = document.createElement('li');
- root.className = 'torrent';
-
- name = document.createElement('div');
- name.className = 'torrent_name';
-
- peers = document.createElement('div');
- peers.className = 'torrent_peer_details';
-
- progressbar = TorrentRendererHelper.createProgressbar('full');
-
- details = document.createElement('div');
- details.className = 'torrent_progress_details';
-
- image = document.createElement('div');
- button = document.createElement('a');
- button.appendChild(image);
-
- root.appendChild(name);
- root.appendChild(peers);
- root.appendChild(button);
- root.appendChild(progressbar.element);
- root.appendChild(details);
-
- root._name_container = name;
- root._peer_details_container = peers;
- root._progress_details_container = details;
- root._progressbar = progressbar;
- root._pause_resume_button_image = image;
- root._toggle_running_button = button;
-
- return root;
- },
-
- getPeerDetails: function (t) {
- let err,
- peer_count,
- webseed_count,
- fmt = Transmission.fmt;
-
- if ((err = t.getErrorMessage())) {
- return err;
- }
-
- if (t.isDownloading()) {
- peer_count = t.getPeersConnected();
- webseed_count = t.getWebseedsSendingToUs();
-
- if (webseed_count && peer_count) {
- // Downloading from 2 of 3 peer(s) and 2 webseed(s)
- return [
- 'Downloading from',
- t.getPeersSendingToUs(),
- 'of',
- fmt.countString('peer', 'peers', peer_count),
- 'and',
- fmt.countString('web seed', 'web seeds', webseed_count),
- '–',
- TorrentRendererHelper.formatDL(t),
- TorrentRendererHelper.formatUL(t),
- ].join(' ');
- } else if (webseed_count) {
- // Downloading from 2 webseed(s)
- return [
- 'Downloading from',
- fmt.countString('web seed', 'web seeds', webseed_count),
- '–',
- TorrentRendererHelper.formatDL(t),
- TorrentRendererHelper.formatUL(t),
- ].join(' ');
- } else {
- // Downloading from 2 of 3 peer(s)
- return [
- 'Downloading from',
- t.getPeersSendingToUs(),
- 'of',
- fmt.countString('peer', 'peers', peer_count),
- '–',
- TorrentRendererHelper.formatDL(t),
- TorrentRendererHelper.formatUL(t),
- ].join(' ');
- }
- }
-
- if (t.isSeeding()) {
- return [
- 'Seeding to',
- t.getPeersGettingFromUs(),
- 'of',
- fmt.countString('peer', 'peers', t.getPeersConnected()),
- '-',
- TorrentRendererHelper.formatUL(t),
- ].join(' ');
- }
-
- if (t.isChecking()) {
- return [
- 'Verifying local data (',
- Transmission.fmt.percentString(100.0 * t.getRecheckProgress()),
- '% tested)',
- ].join('');
- }
-
- return t.getStateString();
- },
-
- getProgressDetails: function (controller, t) {
- if (t.needsMetaData()) {
- let MetaDataStatus = 'retrieving';
- if (t.isStopped()) {
- MetaDataStatus = 'needs';
- }
- const percent = 100 * t.getMetadataPercentComplete();
- return [
- 'Magnetized transfer - ' + MetaDataStatus + ' metadata (',
- Transmission.fmt.percentString(percent),
- '%)',
- ].join('');
- }
-
- let c;
- const sizeWhenDone = t.getSizeWhenDone();
- const totalSize = t.getTotalSize();
- const is_done = t.isDone() || t.isSeeding();
-
- if (is_done) {
- if (totalSize === sizeWhenDone) {
- // seed: '698.05 MiB'
- c = [Transmission.fmt.size(totalSize)];
- } else {
- // partial seed: '127.21 MiB of 698.05 MiB (18.2%)'
- c = [
- Transmission.fmt.size(sizeWhenDone),
- ' of ',
- Transmission.fmt.size(t.getTotalSize()),
- ' (',
- t.getPercentDoneStr(),
- '%)',
- ];
- }
- // append UL stats: ', uploaded 8.59 GiB (Ratio: 12.3)'
- c.push(
- ', uploaded ',
- Transmission.fmt.size(t.getUploadedEver()),
- ' (Ratio ',
- Transmission.fmt.ratioString(t.getUploadRatio()),
- ')'
- );
- } else {
- // not done yet
- c = [
- Transmission.fmt.size(sizeWhenDone - t.getLeftUntilDone()),
- ' of ',
- Transmission.fmt.size(sizeWhenDone),
- ' (',
- t.getPercentDoneStr(),
- '%)',
- ];
- }
-
- // maybe append eta
- if (!t.isStopped() && (!is_done || t.seedRatioLimit(controller) > 0)) {
- c.push(' - ');
- const eta = t.getETA();
- if (eta < 0 || eta >= 999 * 60 * 60 /* arbitrary */) {
- c.push('remaining time unknown');
- } else {
- c.push(Transmission.fmt.timeInterval(t.getETA()), ' remaining');
- }
- }
-
- return c.join('');
- },
-
- render: function (controller, t, root) {
- // name
- setTextContent(root._name_container, t.getName());
-
- // progressbar
- TorrentRendererHelper.renderProgressbar(controller, t, root._progressbar);
-
- // peer details
- const has_error = t.getError() !== Torrent._ErrNone;
- let e = root._peer_details_container;
- $(e).toggleClass('error', has_error);
- setTextContent(e, this.getPeerDetails(t));
-
- // progress details
- e = root._progress_details_container;
- setTextContent(e, this.getProgressDetails(controller, t));
-
- // pause/resume button
- const is_stopped = t.isStopped();
- e = root._pause_resume_button_image;
- e.alt = is_stopped ? 'Resume' : 'Pause';
- e.className = is_stopped ? 'torrent_resume' : 'torrent_pause';
- },
-};
-
-/****
- *****
- *****
- ****/
-
-function TorrentRendererCompact() {}
-TorrentRendererCompact.prototype = {
- createRow: function () {
- let progressbar, details, name, root;
-
- progressbar = TorrentRendererHelper.createProgressbar('compact');
-
- details = document.createElement('div');
- details.className = 'torrent_peer_details compact';
-
- name = document.createElement('div');
- name.className = 'torrent_name compact';
-
- root = document.createElement('li');
- root.appendChild(progressbar.element);
- root.appendChild(details);
- root.appendChild(name);
- root.className = 'torrent compact';
- root._progressbar = progressbar;
- root._details_container = details;
- root._name_container = name;
- return root;
- },
-
- getPeerDetails: function (t) {
- let c;
- if ((c = t.getErrorMessage())) {
- return c;
- }
- if (t.isDownloading()) {
- const have_dn = t.getDownloadSpeed() > 0;
- const have_up = t.getUploadSpeed() > 0;
-
- if (!have_up && !have_dn) {
- return 'Idle';
- }
- let s = '';
- if (!isMobileDevice) {
- s = TorrentRendererHelper.formatETA(t) + ' ';
- }
- if (have_dn) {
- s += TorrentRendererHelper.formatDL(t);
- }
- if (have_dn && have_up) {
- s += ' ';
- }
- if (have_up) {
- s += TorrentRendererHelper.formatUL(t);
- }
- return s;
- }
- if (t.isSeeding()) {
- return [
- 'Ratio: ',
- Transmission.fmt.ratioString(t.getUploadRatio()),
- ', ',
- TorrentRendererHelper.formatUL(t),
- ].join('');
- }
- return t.getStateString();
- },
-
- render: function (controller, t, root) {
- // name
- const is_stopped = t.isStopped();
- let e = root._name_container;
- $(e).toggleClass('paused', is_stopped);
- setTextContent(e, t.getName());
-
- // peer details
- const has_error = t.getError() !== Torrent._ErrNone;
- e = root._details_container;
- $(e).toggleClass('error', has_error);
- setTextContent(e, this.getPeerDetails(t));
-
- // progressbar
- TorrentRendererHelper.renderProgressbar(controller, t, root._progressbar);
- },
-};
-
-/****
- *****
- *****
- ****/
-
-function TorrentRow(view, controller, torrent) {
- this.initialize(view, controller, torrent);
-}
-TorrentRow.prototype = {
- initialize: function (view, controller, torrent) {
- const row = this;
- this._view = view;
- this._torrent = torrent;
- this._element = view.createRow();
- this.render(controller);
- $(this._torrent).bind('dataChanged.torrentRowListener', function () {
- row.render(controller);
- });
- },
- getElement: function () {
- return this._element;
- },
- render: function (controller) {
- const tor = this.getTorrent();
- if (tor) {
- this._view.render(controller, tor, this.getElement());
- }
- },
- isSelected: function () {
- return this.getElement().className.indexOf('selected') !== -1;
- },
-
- getTorrent: function () {
- return this._torrent;
- },
- getTorrentId: function () {
- return this.getTorrent().getId();
- },
-};
diff --git a/web/javascript/torrent.js b/web/javascript/torrent.js
deleted file mode 100644
index 6abc9f076..000000000
--- a/web/javascript/torrent.js
+++ /dev/null
@@ -1,614 +0,0 @@
-/**
- * Copyright © Mnemosyne LLC
- *
- * This file is licensed under the GPLv2.
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- */
-
-function Torrent(data) {
- this.initialize(data);
-}
-
-/***
- ****
- **** Constants
- ****
- ***/
-
-// Torrent.fields.status
-Torrent._StatusStopped = 0;
-Torrent._StatusCheckWait = 1;
-Torrent._StatusCheck = 2;
-Torrent._StatusDownloadWait = 3;
-Torrent._StatusDownload = 4;
-Torrent._StatusSeedWait = 5;
-Torrent._StatusSeed = 6;
-
-// Torrent.fields.seedRatioMode
-Torrent._RatioUseGlobal = 0;
-Torrent._RatioUseLocal = 1;
-Torrent._RatioUnlimited = 2;
-
-// Torrent.fields.error
-Torrent._ErrNone = 0;
-Torrent._ErrTrackerWarning = 1;
-Torrent._ErrTrackerError = 2;
-Torrent._ErrLocalError = 3;
-
-// TrackerStats' announceState
-Torrent._TrackerInactive = 0;
-Torrent._TrackerWaiting = 1;
-Torrent._TrackerQueued = 2;
-Torrent._TrackerActive = 3;
-
-Torrent.Fields = {};
-
-// commonly used fields which only need to be loaded once,
-// either on startup or when a magnet finishes downloading its metadata
-// finishes downloading its metadata
-Torrent.Fields.Metadata = ['addedDate', 'name', 'totalSize'];
-
-// commonly used fields which need to be periodically refreshed
-Torrent.Fields.Stats = [
- 'error',
- 'errorString',
- 'eta',
- 'isFinished',
- 'isStalled',
- 'leftUntilDone',
- 'metadataPercentComplete',
- 'peersConnected',
- 'peersGettingFromUs',
- 'peersSendingToUs',
- 'percentDone',
- 'queuePosition',
- 'rateDownload',
- 'rateUpload',
- 'recheckProgress',
- 'seedRatioMode',
- 'seedRatioLimit',
- 'sizeWhenDone',
- 'status',
- 'trackers',
- 'downloadDir',
- 'uploadedEver',
- 'uploadRatio',
- 'webseedsSendingToUs',
-];
-
-// fields used by the inspector which only need to be loaded once
-Torrent.Fields.InfoExtra = [
- 'comment',
- 'creator',
- 'dateCreated',
- 'files',
- 'hashString',
- 'isPrivate',
- 'pieceCount',
- 'pieceSize',
-];
-
-// fields used in the inspector which need to be periodically refreshed
-Torrent.Fields.StatsExtra = [
- 'activityDate',
- 'corruptEver',
- 'desiredAvailable',
- 'downloadedEver',
- 'fileStats',
- 'haveUnchecked',
- 'haveValid',
- 'peers',
- 'startDate',
- 'trackerStats',
-];
-
-/***
- ****
- **** Methods
- ****
- ***/
-
-Torrent.prototype = {
- initialize: function (data) {
- this.fields = {};
- this.fieldObservers = {};
- this.refresh(data);
- },
-
- notifyOnFieldChange: function (field, callback) {
- this.fieldObservers[field] = this.fieldObservers[field] || [];
- this.fieldObservers[field].push(callback);
- },
-
- setField: function (o, name, value) {
- let i, observer;
-
- if (o[name] === value) {
- return false;
- }
- if (o == this.fields && this.fieldObservers[name] && this.fieldObservers[name].length) {
- for (i = 0; (observer = this.fieldObservers[name][i]); ++i) {
- observer.call(this, value, o[name], name);
- }
- }
- o[name] = value;
- return true;
- },
-
- // fields.files is an array of unions of RPC's "files" and "fileStats" objects.
- updateFiles: function (files) {
- let changed = false;
- const myfiles = this.fields.files || [];
- const keys = ['length', 'name', 'bytesCompleted', 'wanted', 'priority'];
- let i, f, j, key, myfile;
-
- for (i = 0; (f = files[i]); ++i) {
- myfile = myfiles[i] || {};
- for (j = 0; (key = keys[j]); ++j) {
- if (key in f) {
- changed |= this.setField(myfile, key, f[key]);
- }
- }
- myfiles[i] = myfile;
- }
- this.fields.files = myfiles;
- return changed;
- },
-
- collateTrackers: function (trackers) {
- return trackers.map((t) => t.announce.toLowerCase()).join('\t');
- },
-
- refreshFields: function (data) {
- let key;
- let changed = false;
-
- for (key in data) {
- switch (key) {
- case 'files':
- case 'fileStats': // merge files and fileStats together
- changed |= this.updateFiles(data[key]);
- break;
- case 'trackerStats': // 'trackerStats' is a superset of 'trackers'...
- changed |= this.setField(this.fields, 'trackers', data[key]);
- break;
- case 'trackers': // ...so only save 'trackers' if we don't have it already
- if (!(key in this.fields)) {
- changed |= this.setField(this.fields, key, data[key]);
- }
- break;
- default:
- changed |= this.setField(this.fields, key, data[key]);
- }
- }
-
- return changed;
- },
-
- refresh: function (data) {
- if (this.refreshFields(data)) {
- $(this).trigger('dataChanged', this);
- }
- },
-
- /****
- *****
- ****/
-
- // simple accessors
- getComment: function () {
- return this.fields.comment;
- },
- getCreator: function () {
- return this.fields.creator;
- },
- getDateAdded: function () {
- return this.fields.addedDate;
- },
- getDateCreated: function () {
- return this.fields.dateCreated;
- },
- getDesiredAvailable: function () {
- return this.fields.desiredAvailable;
- },
- getDownloadDir: function () {
- return this.fields.downloadDir;
- },
- getDownloadSpeed: function () {
- return this.fields.rateDownload;
- },
- getDownloadedEver: function () {
- return this.fields.downloadedEver;
- },
- getError: function () {
- return this.fields.error;
- },
- getErrorString: function () {
- return this.fields.errorString;
- },
- getETA: function () {
- return this.fields.eta;
- },
- getFailedEver: function (i) {
- return this.fields.corruptEver;
- },
- getFile: function (i) {
- return this.fields.files[i];
- },
- getFileCount: function () {
- return this.fields.files ? this.fields.files.length : 0;
- },
- getHashString: function () {
- return this.fields.hashString;
- },
- getHave: function () {
- return this.getHaveValid() + this.getHaveUnchecked();
- },
- getHaveUnchecked: function () {
- return this.fields.haveUnchecked;
- },
- getHaveValid: function () {
- return this.fields.haveValid;
- },
- getId: function () {
- return this.fields.id;
- },
- getLastActivity: function () {
- return this.fields.activityDate;
- },
- getLeftUntilDone: function () {
- return this.fields.leftUntilDone;
- },
- getMetadataPercentComplete: function () {
- return this.fields.metadataPercentComplete;
- },
- getName: function () {
- return this.fields.name || 'Unknown';
- },
- getPeers: function () {
- return this.fields.peers;
- },
- getPeersConnected: function () {
- return this.fields.peersConnected;
- },
- getPeersGettingFromUs: function () {
- return this.fields.peersGettingFromUs;
- },
- getPeersSendingToUs: function () {
- return this.fields.peersSendingToUs;
- },
- getPieceCount: function () {
- return this.fields.pieceCount;
- },
- getPieceSize: function () {
- return this.fields.pieceSize;
- },
- getPrivateFlag: function () {
- return this.fields.isPrivate;
- },
- getQueuePosition: function () {
- return this.fields.queuePosition;
- },
- getRecheckProgress: function () {
- return this.fields.recheckProgress;
- },
- getSeedRatioLimit: function () {
- return this.fields.seedRatioLimit;
- },
- getSeedRatioMode: function () {
- return this.fields.seedRatioMode;
- },
- getSizeWhenDone: function () {
- return this.fields.sizeWhenDone;
- },
- getStartDate: function () {
- return this.fields.startDate;
- },
- getStatus: function () {
- return this.fields.status;
- },
- getTotalSize: function () {
- return this.fields.totalSize;
- },
- getTrackers: function () {
- return this.fields.trackers;
- },
- getUploadSpeed: function () {
- return this.fields.rateUpload;
- },
- getUploadRatio: function () {
- return this.fields.uploadRatio;
- },
- getUploadedEver: function () {
- return this.fields.uploadedEver;
- },
- getWebseedsSendingToUs: function () {
- return this.fields.webseedsSendingToUs;
- },
- isFinished: function () {
- return this.fields.isFinished;
- },
-
- // derived accessors
- hasExtraInfo: function () {
- return 'hashString' in this.fields;
- },
- isSeeding: function () {
- return this.getStatus() === Torrent._StatusSeed;
- },
- isStopped: function () {
- return this.getStatus() === Torrent._StatusStopped;
- },
- isChecking: function () {
- return this.getStatus() === Torrent._StatusCheck;
- },
- isDownloading: function () {
- return this.getStatus() === Torrent._StatusDownload;
- },
- isQueued: function () {
- return (
- this.getStatus() === Torrent._StatusDownloadWait ||
- this.getStatus() === Torrent._StatusSeedWait
- );
- },
- isDone: function () {
- return this.getLeftUntilDone() < 1;
- },
- needsMetaData: function () {
- return this.getMetadataPercentComplete() < 1;
- },
- getActivity: function () {
- return this.getDownloadSpeed() + this.getUploadSpeed();
- },
- getPercentDoneStr: function () {
- return Transmission.fmt.percentString(100 * this.getPercentDone());
- },
- getPercentDone: function () {
- return this.fields.percentDone;
- },
- getStateString: function () {
- switch (this.getStatus()) {
- case Torrent._StatusStopped:
- return this.isFinished() ? 'Seeding complete' : 'Paused';
- case Torrent._StatusCheckWait:
- return 'Queued for verification';
- case Torrent._StatusCheck:
- return 'Verifying local data';
- case Torrent._StatusDownloadWait:
- return 'Queued for download';
- case Torrent._StatusDownload:
- return 'Downloading';
- case Torrent._StatusSeedWait:
- return 'Queued for seeding';
- case Torrent._StatusSeed:
- return 'Seeding';
- case null:
- case undefined:
- return 'Unknown';
- default:
- return 'Error';
- }
- },
- seedRatioLimit: function (controller) {
- switch (this.getSeedRatioMode()) {
- case Torrent._RatioUseGlobal:
- return controller.seedRatioLimit();
- case Torrent._RatioUseLocal:
- return this.getSeedRatioLimit();
- default:
- return -1;
- }
- },
- getErrorMessage: function () {
- const str = this.getErrorString();
- switch (this.getError()) {
- case Torrent._ErrTrackerWarning:
- return 'Tracker returned a warning: ' + str;
- case Torrent._ErrTrackerError:
- return 'Tracker returned an error: ' + str;
- case Torrent._ErrLocalError:
- return 'Error: ' + str;
- default:
- return null;
- }
- },
- getCollatedName: function () {
- const f = this.fields;
- if (!f.collatedName && f.name) {
- f.collatedName = f.name.toLowerCase();
- }
- return f.collatedName || '';
- },
- getCollatedTrackers: function () {
- const f = this.fields;
- if (!f.collatedTrackers && f.trackers) {
- f.collatedTrackers = this.collateTrackers(f.trackers);
- }
- return f.collatedTrackers || '';
- },
-
- /****
- *****
- ****/
-
- testState: function (state) {
- const s = this.getStatus();
-
- switch (state) {
- case Prefs._FilterActive:
- return (
- this.getPeersGettingFromUs() > 0 ||
- this.getPeersSendingToUs() > 0 ||
- this.getWebseedsSendingToUs() > 0 ||
- this.isChecking()
- );
- case Prefs._FilterSeeding:
- return s === Torrent._StatusSeed || s === Torrent._StatusSeedWait;
- case Prefs._FilterDownloading:
- return s === Torrent._StatusDownload || s === Torrent._StatusDownloadWait;
- case Prefs._FilterPaused:
- return this.isStopped();
- case Prefs._FilterFinished:
- return this.isFinished();
- default:
- return true;
- }
- },
-
- /**
- * @param filter one of Prefs._Filter*
- * @param search substring to look for, or null
- * @return true if it passes the test, false if it fails
- */
- test: function (state, search, tracker) {
- // flter by state...
- let pass = this.testState(state);
-
- // maybe filter by text...
- if (pass && search && search.length) {
- pass = this.getCollatedName().indexOf(search.toLowerCase()) !== -1;
- }
-
- // maybe filter by tracker...
- if (pass && tracker && tracker.length) {
- pass = this.getCollatedTrackers().indexOf(tracker) !== -1;
- }
-
- return pass;
- },
-};
-
-/***
- ****
- **** SORTING
- ****
- ***/
-
-Torrent.compareById = function (ta, tb) {
- return ta.getId() - tb.getId();
-};
-Torrent.compareByName = function (ta, tb) {
- return ta.getCollatedName().localeCompare(tb.getCollatedName()) || Torrent.compareById(ta, tb);
-};
-Torrent.compareByQueue = function (ta, tb) {
- return ta.getQueuePosition() - tb.getQueuePosition();
-};
-Torrent.compareByAge = function (ta, tb) {
- const a = ta.getDateAdded();
- const b = tb.getDateAdded();
-
- return b - a || Torrent.compareByQueue(ta, tb);
-};
-Torrent.compareByState = function (ta, tb) {
- const a = ta.getStatus();
- const b = tb.getStatus();
-
- return b - a || Torrent.compareByQueue(ta, tb);
-};
-Torrent.compareByActivity = function (ta, tb) {
- const a = ta.getActivity();
- const b = tb.getActivity();
-
- return b - a || Torrent.compareByState(ta, tb);
-};
-Torrent.compareByRatio = function (ta, tb) {
- const a = ta.getUploadRatio();
- const b = tb.getUploadRatio();
-
- if (a < b) {
- return 1;
- }
- if (a > b) {
- return -1;
- }
- return Torrent.compareByState(ta, tb);
-};
-Torrent.compareByProgress = function (ta, tb) {
- const a = ta.getPercentDone();
- const b = tb.getPercentDone();
-
- return a - b || Torrent.compareByRatio(ta, tb);
-};
-Torrent.compareBySize = function (ta, tb) {
- const a = ta.getTotalSize();
- const b = tb.getTotalSize();
-
- return a - b || Torrent.compareByName(ta, tb);
-};
-
-Torrent.compareTorrents = function (a, b, sortMethod, sortDirection) {
- let i;
-
- switch (sortMethod) {
- case Prefs._SortByActivity:
- i = Torrent.compareByActivity(a, b);
- break;
- case Prefs._SortByAge:
- i = Torrent.compareByAge(a, b);
- break;
- case Prefs._SortByQueue:
- i = Torrent.compareByQueue(a, b);
- break;
- case Prefs._SortByProgress:
- i = Torrent.compareByProgress(a, b);
- break;
- case Prefs._SortBySize:
- i = Torrent.compareBySize(a, b);
- break;
- case Prefs._SortByState:
- i = Torrent.compareByState(a, b);
- break;
- case Prefs._SortByRatio:
- i = Torrent.compareByRatio(a, b);
- break;
- default:
- i = Torrent.compareByName(a, b);
- break;
- }
-
- if (sortDirection === Prefs._SortDescending) {
- i = -i;
- }
-
- return i;
-};
-
-/**
- * @param torrents an array of Torrent objects
- * @param sortMethod one of Prefs._SortBy*
- * @param sortDirection Prefs._SortAscending or Prefs._SortDescending
- */
-Torrent.sortTorrents = function (torrents, sortMethod, sortDirection) {
- switch (sortMethod) {
- case Prefs._SortByActivity:
- torrents.sort(this.compareByActivity);
- break;
- case Prefs._SortByAge:
- torrents.sort(this.compareByAge);
- break;
- case Prefs._SortByQueue:
- torrents.sort(this.compareByQueue);
- break;
- case Prefs._SortByProgress:
- torrents.sort(this.compareByProgress);
- break;
- case Prefs._SortBySize:
- torrents.sort(this.compareBySize);
- break;
- case Prefs._SortByState:
- torrents.sort(this.compareByState);
- break;
- case Prefs._SortByRatio:
- torrents.sort(this.compareByRatio);
- break;
- default:
- torrents.sort(this.compareByName);
- break;
- }
-
- if (sortDirection === Prefs._SortDescending) {
- torrents.reverse();
- }
-
- return torrents;
-};
diff --git a/web/javascript/transmission.js b/web/javascript/transmission.js
deleted file mode 100644
index f1647585c..000000000
--- a/web/javascript/transmission.js
+++ /dev/null
@@ -1,1963 +0,0 @@
-/**
- * Copyright © Charles Kerr, Dave Perrett, Malcolm Jarvis and Bruno Bierbaumer
- *
- * This file is licensed under the GPLv2.
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- */
-
-function Transmission() {
- this.initialize();
-}
-
-Transmission.prototype = {
- /****
- *****
- ***** STARTUP
- *****
- ****/
-
- initialize: function () {
- let e;
-
- // Initialize the helper classes
- this.remote = new TransmissionRemote(this);
- this.inspector = new Inspector(this);
- this.prefsDialog = new PrefsDialog(this.remote);
- $(this.prefsDialog).bind('closed', $.proxy(this.onPrefsDialogClosed, this));
-
- this.isMenuEnabled = !isMobileDevice;
-
- // Initialize the implementation fields
- this.filterText = '';
- this._torrents = {};
- this._rows = [];
- this.dirtyTorrents = {};
- this.uriCache = {};
-
- // Initialize the clutch preferences
- Prefs.getClutchPrefs(this);
-
- // Set up user events
- $('#toolbar-pause').click($.proxy(this.stopSelectedClicked, this));
- $('#toolbar-start').click($.proxy(this.startSelectedClicked, this));
- $('#toolbar-pause-all').click($.proxy(this.stopAllClicked, this));
- $('#toolbar-start-all').click($.proxy(this.startAllClicked, this));
- $('#toolbar-remove').click($.proxy(this.removeClicked, this));
- $('#toolbar-open').click($.proxy(this.openTorrentClicked, this));
-
- $('#prefs-button').click($.proxy(this.togglePrefsDialogClicked, this));
-
- $('#upload_confirm_button').click($.proxy(this.confirmUploadClicked, this));
- $('#upload_cancel_button').click($.proxy(this.hideUploadDialog, this));
-
- $('#rename_confirm_button').click($.proxy(this.confirmRenameClicked, this));
- $('#rename_cancel_button').click($.proxy(this.hideRenameDialog, this));
-
- $('#move_confirm_button').click($.proxy(this.confirmMoveClicked, this));
- $('#move_cancel_button').click($.proxy(this.hideMoveDialog, this));
-
- $('#turtle-button').click($.proxy(this.toggleTurtleClicked, this));
- $('#compact-button').click($.proxy(this.toggleCompactClicked, this));
-
- // tell jQuery to copy the dataTransfer property from events over if it exists
- jQuery.event.props.push('dataTransfer');
-
- $('#torrent_upload_form').submit(function () {
- $('#upload_confirm_button').click();
- return false;
- });
-
- $('#toolbar-inspector').click($.proxy(this.toggleInspector, this));
-
- e = $('#filter-mode');
- e.val(this[Prefs._FilterMode]);
- e.change($.proxy(this.onFilterModeClicked, this));
- $('#filter-tracker').change($.proxy(this.onFilterTrackerClicked, this));
-
- if (!isMobileDevice) {
- $(document).bind('keydown', $.proxy(this.keyDown, this));
- $(document).bind('keyup', $.proxy(this.keyUp, this));
- $('#torrent_container').click($.proxy(this.deselectAll, this));
- $('#torrent_container').bind('dragover', $.proxy(this.dragenter, this));
- $('#torrent_container').bind('dragenter', $.proxy(this.dragenter, this));
- $('#torrent_container').bind('drop', $.proxy(this.drop, this));
- $('#inspector_link').click($.proxy(this.toggleInspector, this));
-
- this.setupSearchBox();
- this.createContextMenu();
- }
-
- if (this.isMenuEnabled) {
- this.createSettingsMenu();
- }
-
- e = {};
- e.torrent_list = $('#torrent_list')[0];
- e.toolbar_buttons = $('#toolbar ul li');
- e.toolbar_pause_button = $('#toolbar-pause')[0];
- e.toolbar_start_button = $('#toolbar-start')[0];
- e.toolbar_remove_button = $('#toolbar-remove')[0];
- this.elements = e;
-
- // Apply the prefs settings to the gui
- this.initializeSettings();
-
- // Get preferences & torrents from the daemon
- const async = false;
- this.loadDaemonPrefs(async);
- this.loadDaemonStats(async);
- this.initializeTorrents();
- this.refreshTorrents();
- this.togglePeriodicSessionRefresh(true);
-
- this.updateButtonsSoon();
- },
-
- loadDaemonPrefs: function (async, callback) {
- this.remote.loadDaemonPrefs(
- function (data) {
- const o = data['arguments'];
- Prefs.getClutchPrefs(o);
- this.updateGuiFromSession(o);
- this.sessionProperties = o;
-
- if (callback) {
- callback();
- }
- },
- this,
- async
- );
- },
-
- loadImages: function () {
- for (var i = 0, row; (row = arguments[i]); ++i) {
- jQuery(' ').attr('src', row);
- }
- },
-
- /*
- * Load the clutch prefs and init the GUI according to those prefs
- */
- initializeSettings: function () {
- Prefs.getClutchPrefs(this);
-
- if (this.isMenuEnabled) {
- $('#sort_by_' + this[Prefs._SortMethod]).selectMenuItem();
-
- if (this[Prefs._SortDirection] === Prefs._SortDescending) {
- $('#reverse_sort_order').selectMenuItem();
- }
- }
-
- this.initCompactMode();
- },
-
- /*
- * Set up the search box
- */
- setupSearchBox: function () {
- const tr = this;
- const search_box = $('#torrent_search');
- search_box.bind('keyup click', function () {
- tr.setFilterText(this.value);
- });
- if (!$.browser.safari) {
- search_box.addClass('blur');
- search_box[0].value = 'Filter';
- search_box
- .bind('blur', function () {
- if (this.value === '') {
- $(this).addClass('blur');
- this.value = 'Filter';
- tr.setFilterText(null);
- }
- })
- .bind('focus', function () {
- if ($(this).is('.blur')) {
- this.value = '';
- $(this).removeClass('blur');
- }
- });
- }
- },
-
- /**
- * Create the torrent right-click menu
- */
- createContextMenu: function () {
- const tr = this;
- const bindings = {
- pause_selected: function () {
- tr.stopSelectedTorrents();
- },
- resume_selected: function () {
- tr.startSelectedTorrents(false);
- },
- resume_now_selected: function () {
- tr.startSelectedTorrents(true);
- },
- move: function () {
- tr.moveSelectedTorrents(false);
- },
- remove: function () {
- tr.removeSelectedTorrents();
- },
- remove_data: function () {
- tr.removeSelectedTorrentsAndData();
- },
- verify: function () {
- tr.verifySelectedTorrents();
- },
- rename: function () {
- tr.renameSelectedTorrents();
- },
- reannounce: function () {
- tr.reannounceSelectedTorrents();
- },
- move_top: function () {
- tr.moveTop();
- },
- move_up: function () {
- tr.moveUp();
- },
- move_down: function () {
- tr.moveDown();
- },
- move_bottom: function () {
- tr.moveBottom();
- },
- select_all: function () {
- tr.selectAll();
- },
- deselect_all: function () {
- tr.deselectAll();
- },
- };
-
- // Set up the context menu
- $('ul#torrent_list').contextmenu({
- delegate: '.torrent',
- menu: '#torrent_context_menu',
- preventSelect: true,
- taphold: true,
- show: {
- effect: 'none',
- },
- hide: {
- effect: 'none',
- },
- select: function (event, ui) {
- bindings[ui.cmd]();
- },
- beforeOpen: $.proxy(function (event, ui) {
- const element = $(event.currentTarget);
- const i = $('#torrent_list > li').index(element);
- if (i !== -1 && !this._rows[i].isSelected()) {
- this.setSelectedRow(this._rows[i]);
- }
-
- this.calculateTorrentStates(function (s) {
- const tl = $(event.target);
- tl.contextmenu('enableEntry', 'pause_selected', s.activeSel > 0);
- tl.contextmenu('enableEntry', 'resume_selected', s.pausedSel > 0);
- tl.contextmenu('enableEntry', 'resume_now_selected', s.pausedSel > 0 || s.queuedSel > 0);
- tl.contextmenu('enableEntry', 'rename', s.sel == 1);
- });
- }, this),
- });
- },
-
- createSettingsMenu: function () {
- $('#footer_super_menu').transMenu({
- open: function () {
- $('#settings_menu').addClass('selected');
- },
- close: function () {
- $('#settings_menu').removeClass('selected');
- },
- select: $.proxy(this.onMenuClicked, this),
- });
- $('#settings_menu').click(function (event) {
- $('#footer_super_menu').transMenu('open');
- });
- },
-
- /****
- *****
- ****/
-
- updateFreeSpaceInAddDialog: function () {
- const formdir = $('input#add-dialog-folder-input').val();
- this.remote.getFreeSpace(formdir, this.onFreeSpaceResponse, this);
- },
-
- onFreeSpaceResponse: function (dir, bytes) {
- let e, str, formdir;
-
- formdir = $('input#add-dialog-folder-input').val();
- if (formdir == dir) {
- e = $('label#add-dialog-folder-label');
- if (bytes > 0) {
- str = ' (' + Transmission.fmt.size(bytes) + ' Free) ';
- } else {
- str = '';
- }
- e.html('Destination folder' + str + ':');
- }
- },
-
- /****
- *****
- ***** UTILITIES
- *****
- ****/
-
- getAllTorrents: function () {
- const torrents = [];
- for (const key in this._torrents) {
- torrents.push(this._torrents[key]);
- }
- return torrents;
- },
-
- getTorrentIds: function (torrents) {
- return $.map(torrents.slice(0), function (t) {
- return t.getId();
- });
- },
-
- scrollToRow: function (row) {
- if (isMobileDevice) {
- // FIXME: why? return
- const list = $('#torrent_container');
- const scrollTop = list.scrollTop();
- const innerHeight = list.innerHeight();
- const offsetTop = row.getElement().offsetTop;
- const offsetHeight = $(row.getElement()).outerHeight();
-
- if (offsetTop < scrollTop) {
- list.scrollTop(offsetTop);
- } else if (innerHeight + scrollTop < offsetTop + offsetHeight) {
- list.scrollTop(offsetTop + offsetHeight - innerHeight);
- }
- }
- },
-
- seedRatioLimit: function () {
- const p = this.sessionProperties;
- if (p && p.seedRatioLimited) {
- return p.seedRatioLimit;
- }
- return -1;
- },
-
- setPref: function (key, val) {
- this[key] = val;
- Prefs.setValue(key, val);
- },
-
- /****
- *****
- ***** SELECTION
- *****
- ****/
-
- getSelectedRows: function () {
- return $.grep(this._rows, function (r) {
- return r.isSelected();
- });
- },
-
- getSelectedTorrents: function () {
- return $.map(this.getSelectedRows(), function (r) {
- return r.getTorrent();
- });
- },
-
- getSelectedTorrentIds: function () {
- return this.getTorrentIds(this.getSelectedTorrents());
- },
-
- setSelectedRow: function (row) {
- $(this.elements.torrent_list).children('.selected').removeClass('selected');
- this.selectRow(row);
- },
-
- selectRow: function (row) {
- $(row.getElement()).addClass('selected');
- this.callSelectionChangedSoon();
- },
-
- deselectRow: function (row) {
- $(row.getElement()).removeClass('selected');
- this.callSelectionChangedSoon();
- },
-
- selectAll: function () {
- $(this.elements.torrent_list).children().addClass('selected');
- this.callSelectionChangedSoon();
- },
- deselectAll: function () {
- $(this.elements.torrent_list).children('.selected').removeClass('selected');
- this.callSelectionChangedSoon();
- delete this._last_torrent_clicked;
- },
-
- indexOfLastTorrent: function () {
- for (var i = 0, r; (r = this._rows[i]); ++i) {
- if (r.getTorrentId() === this._last_torrent_clicked) {
- return i;
- }
- }
- return -1;
- },
-
- // Select a range from this row to the last clicked torrent
- selectRange: function (row) {
- const last = this.indexOfLastTorrent();
-
- if (last === -1) {
- this.selectRow(row);
- } else {
- // select the range between the prevous & current
- const next = this._rows.indexOf(row);
- const min = Math.min(last, next);
- const max = Math.max(last, next);
- for (let i = min; i <= max; ++i) {
- this.selectRow(this._rows[i]);
- }
- }
-
- this.callSelectionChangedSoon();
- },
-
- selectionChanged: function () {
- this.updateButtonStates();
-
- this.inspector.setTorrents(this.inspectorIsVisible() ? this.getSelectedTorrents() : []);
-
- clearTimeout(this.selectionChangedTimer);
- delete this.selectionChangedTimer;
- },
-
- callSelectionChangedSoon: function () {
- if (!this.selectionChangedTimer) {
- const callback = $.proxy(this.selectionChanged, this),
- msec = 200;
- this.selectionChangedTimer = setTimeout(callback, msec);
- }
- },
-
- /*--------------------------------------------
- *
- * E V E N T F U N C T I O N S
- *
- *--------------------------------------------*/
-
- /*
- * Process key event
- */
- keyDown: function (ev) {
- let handled = false;
- const rows = this._rows;
- const isInputFocused = $(ev.target).is('input');
- const isDialogVisible =
- $('.dialog_heading:visible').length > 0 || $('.ui-dialog:visible').length > 0;
-
- // hotkeys
- const up_key = ev.keyCode === 38; // up key pressed
- const dn_key = ev.keyCode === 40; // down key pressed
- const a_key = ev.keyCode === 65; // a key pressed
- const c_key = ev.keyCode === 67; // c key pressed
- const d_key = ev.keyCode === 68; // d key pressed
- const i_key = ev.keyCode === 73; // i key pressed
- const l_key = ev.keyCode === 76; // l key pressed
- const m_key = ev.keyCode === 77; // m key pressed
- const o_key = ev.keyCode === 79; // o key pressed
- const p_key = ev.keyCode === 80; // p key pressed
- const r_key = ev.keyCode === 82; // r key pressed
- const t_key = ev.keyCode === 84; // t key pressed
- const u_key = ev.keyCode === 85; // u key pressed
- const shift_key = ev.keyCode === 16; // shift key pressed
- const slash_key = ev.keyCode === 191; // slash (/) key pressed
- const backspace_key = ev.keyCode === 8; // backspace key pressed
- const del_key = ev.keyCode === 46; // delete key pressed
- const enter_key = ev.keyCode === 13; // enter key pressed
- const esc_key = ev.keyCode === 27; // esc key pressed
- const comma_key = ev.keyCode === 188; // comma key pressed
-
- if (enter_key) {
- // handle other dialogs
- if (dialog && dialog.isVisible()) {
- dialog.executeCallback();
- handled = true;
- }
-
- // handle upload dialog
- if ($('#upload_container').is(':visible')) {
- this.confirmUploadClicked();
- handled = true;
- }
-
- // handle move dialog
- if ($('#move_container').is(':visible')) {
- this.confirmMoveClicked();
- handled = true;
- }
-
- // handle rename dialog
- if ($('#rename_container').is(':visible')) {
- this.confirmRenameClicked();
- handled = true;
- }
- }
-
- if (esc_key) {
- // handle other dialogs
- if (dialog && dialog.isVisible()) {
- dialog.hideDialog();
- handled = true;
- }
-
- // handle upload dialog
- if ($('#upload_container').is(':visible')) {
- this.hideUploadDialog();
- handled = true;
- }
-
- // handle move dialog
- if ($('#move_container').is(':visible')) {
- this.hideMoveDialog();
- handled = true;
- }
-
- // handle rename dialog
- if ($('#rename_container').is(':visible')) {
- this.hideRenameDialog();
- handled = true;
- }
- }
-
- // Some hotkeys can only be used if the following conditions are met:
- // 1. when no input fields are focused
- // 2. when no other dialogs are visible
- // 3. when the meta or ctrl key isn't pressed (i.e. opening dev tools shouldn't trigger the info panel)
- if (!isInputFocused && !isDialogVisible && !ev.metaKey && !ev.ctrlKey) {
- if (comma_key) {
- this.togglePrefsDialogClicked();
- handled = true;
- }
-
- if (slash_key) {
- this.showHotkeysDialog();
- handled = true;
- }
-
- if (a_key) {
- if (ev.shiftKey) {
- this.deselectAll();
- } else {
- this.selectAll();
- }
- handled = true;
- }
-
- if (c_key) {
- this.toggleCompactClicked();
- handled = true;
- }
-
- if ((backspace_key || del_key || d_key) && rows.length) {
- this.removeSelectedTorrents();
- handled = true;
- }
-
- if (i_key) {
- this.toggleInspector();
- handled = true;
- }
-
- if (m_key || l_key) {
- this.moveSelectedTorrents();
- handled = true;
- }
-
- if (o_key || u_key) {
- this.openTorrentClicked(ev);
- handled = true;
- }
-
- if (p_key) {
- this.stopSelectedTorrents();
- handled = true;
- }
-
- if (r_key) {
- this.startSelectedTorrents();
- handled = true;
- }
-
- if (t_key) {
- this.toggleTurtleClicked();
- handled = true;
- }
-
- if ((up_key || dn_key) && rows.length) {
- var last = this.indexOfLastTorrent(),
- i = last,
- anchor = this._shift_index,
- min = 0,
- max = rows.length - 1;
-
- if (dn_key && i + 1 <= max) {
- ++i;
- } else if (up_key && i - 1 >= min) {
- --i;
- }
-
- const r = rows[i];
-
- if (anchor >= 0) {
- // user is extending the selection
- // with the shift + arrow keys...
- if ((anchor <= last && last < i) || (anchor >= last && last > i)) {
- this.selectRow(r);
- } else if ((anchor >= last && i > last) || (anchor <= last && last > i)) {
- this.deselectRow(rows[last]);
- }
- } else {
- if (ev.shiftKey) {
- this.selectRange(r);
- } else {
- this.setSelectedRow(r);
- }
- }
- this._last_torrent_clicked = r.getTorrentId();
- this.scrollToRow(r);
- handled = true;
- } else if (shift_key) {
- this._shift_index = this.indexOfLastTorrent();
- }
- }
-
- return !handled;
- },
-
- keyUp: function (ev) {
- if (ev.keyCode === 16) {
- // shift key pressed
- delete this._shift_index;
- }
- },
-
- isButtonEnabled: function (ev) {
- const p = (ev.target || ev.srcElement).parentNode;
- return p.className !== 'disabled' && p.parentNode.className !== 'disabled';
- },
-
- stopSelectedClicked: function (ev) {
- if (this.isButtonEnabled(ev)) {
- this.stopSelectedTorrents();
- this.hideMobileAddressbar();
- }
- },
-
- startSelectedClicked: function (ev) {
- if (this.isButtonEnabled(ev)) {
- this.startSelectedTorrents(false);
- this.hideMobileAddressbar();
- }
- },
-
- stopAllClicked: function (ev) {
- if (this.isButtonEnabled(ev)) {
- this.stopAllTorrents();
- this.hideMobileAddressbar();
- }
- },
-
- startAllClicked: function (ev) {
- if (this.isButtonEnabled(ev)) {
- this.startAllTorrents(false);
- this.hideMobileAddressbar();
- }
- },
-
- openTorrentClicked: function (ev) {
- if (this.isButtonEnabled(ev)) {
- $('body').addClass('open_showing');
- this.uploadTorrentFile();
- this.updateButtonStates();
- }
- },
-
- dragenter: function (ev) {
- if (ev.dataTransfer && ev.dataTransfer.types) {
- const types = ['text/uri-list', 'text/plain'];
- for (let i = 0; i < types.length; ++i) {
- // it would be better to look at the links here;
- // sadly, with Firefox, trying would throw.
- if (ev.dataTransfer.types.contains(types[i])) {
- ev.stopPropagation();
- ev.preventDefault();
- ev.dropEffect = 'copy';
- return false;
- }
- }
- } else if (ev.dataTransfer) {
- ev.dataTransfer.dropEffect = 'none';
- }
- return true;
- },
-
- drop: function (ev) {
- let i, uri;
- let uris = null;
- const types = ['text/uri-list', 'text/plain'];
- const paused = this.shouldAddedTorrentsStart();
-
- if (!ev.dataTransfer || !ev.dataTransfer.types) {
- return true;
- }
-
- for (i = 0; !uris && i < types.length; ++i) {
- if (ev.dataTransfer.types.contains(types[i])) {
- uris = ev.dataTransfer.getData(types[i]).split('\n');
- }
- }
-
- for (i = 0; (uri = uris[i]); ++i) {
- if (/^#/.test(uri)) {
- // lines which start with "#" are comments
- continue;
- }
- if (/^[a-z-]+:/i.test(uri)) {
- // close enough to a url
- this.remote.addTorrentByUrl(uri, paused);
- }
- }
-
- ev.preventDefault();
- return false;
- },
-
- hideUploadDialog: function () {
- $('body.open_showing').removeClass('open_showing');
- $('#upload_container').hide();
- this.updateButtonStates();
- },
-
- confirmUploadClicked: function () {
- this.uploadTorrentFile(true);
- this.hideUploadDialog();
- },
-
- hideMoveDialog: function () {
- $('#move_container').hide();
- this.updateButtonStates();
- },
-
- confirmMoveClicked: function () {
- this.moveSelectedTorrents(true);
- this.hideUploadDialog();
- },
-
- hideRenameDialog: function () {
- $('body.open_showing').removeClass('open_showing');
- $('#rename_container').hide();
- },
-
- confirmRenameClicked: function () {
- const torrents = this.getSelectedTorrents();
- this.renameTorrent(torrents[0], $('input#torrent_rename_name').attr('value'));
- this.hideRenameDialog();
- },
-
- removeClicked: function (ev) {
- if (this.isButtonEnabled(ev)) {
- this.removeSelectedTorrents();
- this.hideMobileAddressbar();
- }
- },
-
- // turn the periodic ajax session refresh on & off
- togglePeriodicSessionRefresh: function (enabled) {
- const that = this,
- msec = 8000;
-
- function callback() {
- that.loadDaemonPrefs(undefined, rescheduleTimeout);
- }
-
- function rescheduleTimeout() {
- that.sessionTimeout = setTimeout(callback, msec);
- }
-
- clearTimeout(this.sessionTimeout);
- delete this.sessionTimeout;
-
- if (enabled) {
- rescheduleTimeout();
- }
- },
-
- toggleTurtleClicked: function () {
- const o = {};
- o[RPC._TurtleState] = !$('#turtle-button').hasClass('selected');
- this.remote.savePrefs(o);
- },
-
- /*--------------------------------------------
- *
- * I N T E R F A C E F U N C T I O N S
- *
- *--------------------------------------------*/
-
- onPrefsDialogClosed: function () {
- $('#prefs-button').removeClass('selected');
- },
-
- togglePrefsDialogClicked: function (ev) {
- const e = $('#prefs-button');
-
- if (e.hasClass('selected')) {
- this.prefsDialog.close();
- } else {
- e.addClass('selected');
- this.prefsDialog.show();
- }
- },
-
- setFilterText: function (search) {
- this.filterText = search ? search.trim() : null;
- this.refilter(true);
- },
-
- setSortMethod: function (sort_method) {
- this.setPref(Prefs._SortMethod, sort_method);
- this.refilter(true);
- },
-
- setSortDirection: function (direction) {
- this.setPref(Prefs._SortDirection, direction);
- this.refilter(true);
- },
-
- onMenuClicked: function (event, ui) {
- let o, dir;
- const id = ui.id;
- const remote = this.remote;
- const element = ui.target;
-
- if (ui.group == 'sort-mode') {
- element.selectMenuItem();
- this.setSortMethod(id.replace(/sort_by_/, ''));
- } else if (element.hasClass('upload-speed')) {
- o = {};
- o[RPC._UpSpeedLimit] = parseInt(element.text());
- o[RPC._UpSpeedLimited] = true;
- remote.savePrefs(o);
- } else if (element.hasClass('download-speed')) {
- o = {};
- o[RPC._DownSpeedLimit] = parseInt(element.text());
- o[RPC._DownSpeedLimited] = true;
- remote.savePrefs(o);
- } else {
- switch (id) {
- case 'statistics':
- this.showStatsDialog();
- break;
-
- case 'hotkeys':
- this.showHotkeysDialog();
- break;
-
- case 'about-button':
- o = 'Transmission ' + this.serverVersion;
- $('#about-dialog #about-title').html(o);
- $('#about-dialog').dialog({
- title: 'About',
- show: 'fade',
- hide: 'fade',
- });
- break;
-
- case 'homepage':
- window.open('https://transmissionbt.com/');
- break;
-
- case 'tipjar':
- window.open('https://transmissionbt.com/donate/');
- break;
-
- case 'unlimited_download_rate':
- o = {};
- o[RPC._DownSpeedLimited] = false;
- remote.savePrefs(o);
- break;
-
- case 'limited_download_rate':
- o = {};
- o[RPC._DownSpeedLimited] = true;
- remote.savePrefs(o);
- break;
-
- case 'unlimited_upload_rate':
- o = {};
- o[RPC._UpSpeedLimited] = false;
- remote.savePrefs(o);
- break;
-
- case 'limited_upload_rate':
- o = {};
- o[RPC._UpSpeedLimited] = true;
- remote.savePrefs(o);
- break;
-
- case 'reverse_sort_order':
- if (element.menuItemIsSelected()) {
- dir = Prefs._SortAscending;
- element.deselectMenuItem();
- } else {
- dir = Prefs._SortDescending;
- element.selectMenuItem();
- }
- this.setSortDirection(dir);
- break;
-
- case 'toggle_notifications':
- Notifications && Notifications.toggle();
- break;
-
- default:
- console.log('unhandled: ' + id);
- break;
- }
- }
- },
-
- onTorrentChanged: function (ev, tor) {
- // update our dirty fields
- this.dirtyTorrents[tor.getId()] = true;
-
- // enqueue ui refreshes
- this.refilterSoon();
- this.updateButtonsSoon();
- },
-
- updateFromTorrentGet: function (updates, removed_ids) {
- let i, o, t, id, needed, callback, fields;
- const needinfo = [];
-
- for (i = 0; (o = updates[i]); ++i) {
- id = o.id;
- if ((t = this._torrents[id])) {
- needed = t.needsMetaData();
- t.refresh(o);
- if (needed && !t.needsMetaData()) {
- needinfo.push(id);
- }
- } else {
- t = this._torrents[id] = new Torrent(o);
- this.dirtyTorrents[id] = true;
- callback = $.proxy(this.onTorrentChanged, this);
- $(t).bind('dataChanged', callback);
- // do we need more info for this torrent?
- if (!('name' in t.fields) || !('status' in t.fields)) {
- needinfo.push(id);
- }
-
- t.notifyOnFieldChange(
- 'status',
- $.proxy(function (newValue, oldValue) {
- if (
- oldValue === Torrent._StatusDownload &&
- (newValue == Torrent._StatusSeed || newValue == Torrent._StatusSeedWait)
- ) {
- $(this).trigger('downloadComplete', [t]);
- } else if (
- oldValue === Torrent._StatusSeed &&
- newValue === Torrent._StatusStopped &&
- t.isFinished()
- ) {
- $(this).trigger('seedingComplete', [t]);
- } else {
- $(this).trigger('statusChange', [t]);
- }
- }, this)
- );
- }
- }
-
- if (needinfo.length) {
- // whee, new torrents! get their initial information.
- fields = ['id'].concat(Torrent.Fields.Metadata, Torrent.Fields.Stats);
- this.updateTorrents(needinfo, fields);
- this.refilterSoon();
- }
-
- if (removed_ids) {
- this.deleteTorrents(removed_ids);
- this.refilterSoon();
- }
- },
-
- updateTorrents: function (ids, fields, callback) {
- const that = this;
-
- function f(updates, removedIds) {
- if (callback) {
- callback();
- }
-
- that.updateFromTorrentGet(updates, removedIds);
- }
-
- this.remote.updateTorrents(ids, fields, f);
- },
-
- refreshTorrents: function () {
- const callback = $.proxy(this.refreshTorrents, this);
- const msec = this[Prefs._RefreshRate] * 1000;
- const fields = ['id'].concat(Torrent.Fields.Stats);
-
- // send a request right now
- this.updateTorrents('recently-active', fields);
-
- // schedule the next request
- clearTimeout(this.refreshTorrentsTimeout);
- this.refreshTorrentsTimeout = setTimeout(callback, msec);
- },
-
- initializeTorrents: function () {
- const fields = ['id'].concat(Torrent.Fields.Metadata, Torrent.Fields.Stats);
- this.updateTorrents(null, fields);
- },
-
- onRowClicked: function (ev) {
- const meta_key = ev.metaKey || ev.ctrlKey,
- row = ev.currentTarget.row;
-
- // handle the per-row "torrent_resume" button
- if (ev.target.className === 'torrent_resume') {
- this.startTorrent(row.getTorrent());
- return;
- }
-
- // handle the per-row "torrent_pause" button
- if (ev.target.className === 'torrent_pause') {
- this.stopTorrent(row.getTorrent());
- return;
- }
-
- // Prevents click carrying to parent element
- // which deselects all on click
- ev.stopPropagation();
-
- if (isMobileDevice) {
- if (row.isSelected()) {
- this.setInspectorVisible(true);
- }
- this.setSelectedRow(row);
- } else if (ev.shiftKey) {
- this.selectRange(row);
- // Need to deselect any selected text
- window.focus();
-
- // Apple-Click, not selected
- } else if (!row.isSelected() && meta_key) {
- this.selectRow(row);
-
- // Regular Click, not selected
- } else if (!row.isSelected()) {
- this.setSelectedRow(row);
-
- // Apple-Click, selected
- } else if (row.isSelected() && meta_key) {
- this.deselectRow(row);
-
- // Regular Click, selected
- } else if (row.isSelected()) {
- this.setSelectedRow(row);
- }
-
- this._last_torrent_clicked = row.getTorrentId();
- },
-
- deleteTorrents: function (ids) {
- let i, id;
-
- if (ids && ids.length) {
- for (i = 0; (id = ids[i]); ++i) {
- this.dirtyTorrents[id] = true;
- delete this._torrents[id];
- }
- this.refilter();
- }
- },
-
- shouldAddedTorrentsStart: function () {
- return this.prefsDialog.shouldAddedTorrentsStart();
- },
-
- /*
- * Select a torrent file to upload
- */
- uploadTorrentFile: function (confirmed) {
- const fileInput = $('input#torrent_upload_file');
- const folderInput = $('input#add-dialog-folder-input');
- const startInput = $('input#torrent_auto_start');
- const urlInput = $('input#torrent_upload_url');
-
- if (!confirmed) {
- // update the upload dialog's fields
- fileInput.attr('value', '');
- urlInput.attr('value', '');
- startInput.attr('checked', this.shouldAddedTorrentsStart());
- folderInput.attr('value', $('#download-dir').val());
- folderInput.change($.proxy(this.updateFreeSpaceInAddDialog, this));
- this.updateFreeSpaceInAddDialog();
-
- // show the dialog
- $('#upload_container').show();
- urlInput.focus();
- } else {
- const paused = !startInput.is(':checked');
- const destination = folderInput.val();
- const remote = this.remote;
-
- jQuery.each(fileInput[0].files, function (i, file) {
- const reader = new FileReader();
- reader.onload = function (e) {
- const contents = e.target.result;
- const key = 'base64,';
- const index = contents.indexOf(key);
- if (index > -1) {
- const metainfo = contents.substring(index + key.length);
- const o = {
- method: 'torrent-add',
- arguments: {
- paused: paused,
- 'download-dir': destination,
- metainfo: metainfo,
- },
- };
- remote.sendRequest(o, function (response) {
- if (response.result != 'success') {
- alert('Error adding "' + file.name + '": ' + response.result);
- }
- });
- }
- };
- reader.readAsDataURL(file);
- });
-
- let url = $('#torrent_upload_url').val();
- if (url != '') {
- if (url.match(/^[0-9a-f]{40}$/i)) {
- url = 'magnet:?xt=urn:btih:' + url;
- }
- const o = {
- method: 'torrent-add',
- arguments: {
- paused: paused,
- 'download-dir': destination,
- filename: url,
- },
- };
- remote.sendRequest(o, function (response) {
- if (response.result != 'success') {
- alert('Error adding "' + url + '": ' + response.result);
- }
- });
- }
- }
- },
-
- promptSetLocation: function (confirmed, torrents) {
- if (!confirmed) {
- let path;
- if (torrents.length === 1) {
- path = torrents[0].getDownloadDir();
- } else {
- path = $('#download-dir').val();
- }
- $('input#torrent_path').attr('value', path);
- $('#move_container').show();
- $('#torrent_path').focus();
- } else {
- const ids = this.getTorrentIds(torrents);
- this.remote.moveTorrents(ids, $('input#torrent_path').val(), this.refreshTorrents, this);
- $('#move_container').hide();
- }
- },
-
- moveSelectedTorrents: function (confirmed) {
- const torrents = this.getSelectedTorrents();
- if (torrents.length) {
- this.promptSetLocation(confirmed, torrents);
- }
- },
-
- removeSelectedTorrents: function () {
- const torrents = this.getSelectedTorrents();
- if (torrents.length) {
- this.promptToRemoveTorrents(torrents);
- }
- },
-
- removeSelectedTorrentsAndData: function () {
- const torrents = this.getSelectedTorrents();
- if (torrents.length) {
- this.promptToRemoveTorrentsAndData(torrents);
- }
- },
-
- promptToRemoveTorrents: function (torrents) {
- if (torrents.length === 1) {
- const torrent = torrents[0];
- const header = 'Remove ' + torrent.getName() + '?';
- const message =
- 'Once removed, continuing the transfer will require the torrent file. Are you sure you want to remove it?';
- dialog.confirm(header, message, 'Remove', function () {
- transmission.removeTorrents(torrents);
- });
- } else {
- const header = 'Remove ' + torrents.length + ' transfers?';
- const message =
- 'Once removed, continuing the transfers will require the torrent files. Are you sure you want to remove them?';
- dialog.confirm(header, message, 'Remove', function () {
- transmission.removeTorrents(torrents);
- });
- }
- },
-
- promptToRemoveTorrentsAndData: function (torrents) {
- if (torrents.length === 1) {
- const torrent = torrents[0];
- const header = 'Remove ' + torrent.getName() + ' and delete data?';
- const message =
- 'All data downloaded for this torrent will be deleted. Are you sure you want to remove it?';
-
- dialog.confirm(header, message, 'Remove', function () {
- transmission.removeTorrentsAndData(torrents);
- });
- } else {
- const header = 'Remove ' + torrents.length + ' transfers and delete data?';
- const message =
- 'All data downloaded for these torrents will be deleted. Are you sure you want to remove them?';
-
- dialog.confirm(header, message, 'Remove', function () {
- transmission.removeTorrentsAndData(torrents);
- });
- }
- },
-
- removeTorrents: function (torrents) {
- const ids = this.getTorrentIds(torrents);
- this.remote.removeTorrents(ids, this.refreshTorrents, this);
- },
-
- removeTorrentsAndData: function (torrents) {
- this.remote.removeTorrentsAndData(torrents);
- },
-
- promptToRenameTorrent: function (torrent) {
- $('body').addClass('open_showing');
- $('input#torrent_rename_name').attr('value', torrent.getName());
- $('#rename_container').show();
- $('#torrent_rename_name').focus();
- },
-
- renameSelectedTorrents: function () {
- const torrents = this.getSelectedTorrents();
- if (torrents.length != 1) {
- dialog.alert('Renaming', 'You can rename only one torrent at a time.', 'Ok');
- } else {
- this.promptToRenameTorrent(torrents[0]);
- }
- },
-
- onTorrentRenamed: function (response) {
- let torrent;
- if (
- response.result === 'success' &&
- response.arguments &&
- (torrent = this._torrents[response.arguments.id])
- ) {
- torrent.refresh(response.arguments);
- }
- },
-
- renameTorrent: function (torrent, newname) {
- const oldpath = torrent.getName();
- this.remote.renameTorrent([torrent.getId()], oldpath, newname, this.onTorrentRenamed, this);
- },
-
- verifySelectedTorrents: function () {
- this.verifyTorrents(this.getSelectedTorrents());
- },
-
- reannounceSelectedTorrents: function () {
- this.reannounceTorrents(this.getSelectedTorrents());
- },
-
- startAllTorrents: function (force) {
- this.startTorrents(this.getAllTorrents(), force);
- },
- startSelectedTorrents: function (force) {
- this.startTorrents(this.getSelectedTorrents(), force);
- },
- startTorrent: function (torrent) {
- this.startTorrents([torrent], false);
- },
-
- startTorrents: function (torrents, force) {
- this.remote.startTorrents(this.getTorrentIds(torrents), force, this.refreshTorrents, this);
- },
- verifyTorrent: function (torrent) {
- this.verifyTorrents([torrent]);
- },
- verifyTorrents: function (torrents) {
- this.remote.verifyTorrents(this.getTorrentIds(torrents), this.refreshTorrents, this);
- },
-
- reannounceTorrent: function (torrent) {
- this.reannounceTorrents([torrent]);
- },
- reannounceTorrents: function (torrents) {
- this.remote.reannounceTorrents(this.getTorrentIds(torrents), this.refreshTorrents, this);
- },
-
- stopAllTorrents: function () {
- this.stopTorrents(this.getAllTorrents());
- },
- stopSelectedTorrents: function () {
- this.stopTorrents(this.getSelectedTorrents());
- },
- stopTorrent: function (torrent) {
- this.stopTorrents([torrent]);
- },
- stopTorrents: function (torrents) {
- this.remote.stopTorrents(this.getTorrentIds(torrents), this.refreshTorrents, this);
- },
- changeFileCommand: function (torrentId, rowIndices, command) {
- this.remote.changeFileCommand(torrentId, rowIndices, command);
- },
-
- hideMobileAddressbar: function (delaySecs) {
- if (isMobileDevice && !scroll_timeout) {
- const callback = $.proxy(this.doToolbarHide, this);
- const msec = delaySecs * 1000 || 150;
- scroll_timeout = setTimeout(callback, msec);
- }
- },
- doToolbarHide: function () {
- window.scrollTo(0, 1);
- scroll_timeout = null;
- },
-
- // Queue
- moveTop: function () {
- this.remote.moveTorrentsToTop(this.getSelectedTorrentIds(), this.refreshTorrents, this);
- },
- moveUp: function () {
- this.remote.moveTorrentsUp(this.getSelectedTorrentIds(), this.refreshTorrents, this);
- },
- moveDown: function () {
- this.remote.moveTorrentsDown(this.getSelectedTorrentIds(), this.refreshTorrents, this);
- },
- moveBottom: function () {
- this.remote.moveTorrentsToBottom(this.getSelectedTorrentIds(), this.refreshTorrents, this);
- },
-
- /***
- ****
- ***/
-
- updateGuiFromSession: function (o) {
- let limit, limited, e, b, text;
- const fmt = Transmission.fmt;
- const menu = $('#footer_super_menu');
-
- this.serverVersion = o.version;
-
- this.prefsDialog.set(o);
-
- if (RPC._TurtleState in o) {
- b = o[RPC._TurtleState];
- e = $('#turtle-button');
- text = [
- 'Click to ',
- b ? 'disable' : 'enable',
- ' Temporary Speed Limits (',
- fmt.speed(o[RPC._TurtleUpSpeedLimit]),
- ' up,',
- fmt.speed(o[RPC._TurtleDownSpeedLimit]),
- ' down)',
- ].join('');
- e.toggleClass('selected', b);
- e.attr('title', text);
- }
-
- if (this.isMenuEnabled && RPC._DownSpeedLimited in o && RPC._DownSpeedLimit in o) {
- limit = o[RPC._DownSpeedLimit];
- limited = o[RPC._DownSpeedLimited];
-
- e = menu.find('#limited_download_rate');
- e.html('Limit (' + fmt.speed(limit) + ')');
-
- if (!limited) {
- e = menu.find('#unlimited_download_rate');
- }
- e.selectMenuItem();
- }
-
- if (this.isMenuEnabled && RPC._UpSpeedLimited in o && RPC._UpSpeedLimit in o) {
- limit = o[RPC._UpSpeedLimit];
- limited = o[RPC._UpSpeedLimited];
-
- e = menu.find('#limited_upload_rate');
- e.html('Limit (' + fmt.speed(limit) + ')');
-
- if (!limited) {
- e = menu.find('#unlimited_upload_rate');
- }
- e.selectMenuItem();
- }
- },
-
- updateStatusbar: function () {
- let i, row;
- let u = 0;
- let d = 0;
- const fmt = Transmission.fmt;
- const torrents = this.getAllTorrents();
-
- // up/down speed
- for (i = 0; (row = torrents[i]); ++i) {
- u += row.getUploadSpeed();
- d += row.getDownloadSpeed();
- }
-
- $('#speed-up-container').toggleClass('active', u > 0);
- $('#speed-up-label').text(fmt.speedBps(u));
-
- $('#speed-dn-container').toggleClass('active', d > 0);
- $('#speed-dn-label').text(fmt.speedBps(d));
-
- // visible torrents
- $('#filter-count').text(fmt.countString('Transfer', 'Transfers', this._rows.length));
- },
-
- setEnabled: function (key, flag) {
- $(key).toggleClass('disabled', !flag);
- },
-
- updateFilterSelect: function () {
- let i, names, name, str, o;
- const trackers = this.getTrackers();
-
- // build a sorted list of names
- names = [];
- for (name in trackers) {
- names.push(name);
- }
- names.sort();
-
- // build the new html
- if (!this.filterTracker) {
- str = 'All ';
- } else {
- str = 'All ';
- }
- for (i = 0; (name = names[i]); ++i) {
- o = trackers[name];
- str += '' + name + ' ';
- }
-
- if (!this.filterTrackersStr || this.filterTrackersStr !== str) {
- this.filterTrackersStr = str;
- $('#filter-tracker').html(str);
- }
- },
-
- updateButtonsSoon: function () {
- if (!this.buttonRefreshTimer) {
- const callback = $.proxy(this.updateButtonStates, this);
- const msec = 100;
-
- this.buttonRefreshTimer = setTimeout(callback, msec);
- }
- },
-
- calculateTorrentStates: function (callback) {
- const stats = {
- total: 0,
- active: 0,
- paused: 0,
- sel: 0,
- activeSel: 0,
- pausedSel: 0,
- queuedSel: 0,
- };
-
- clearTimeout(this.buttonRefreshTimer);
- delete this.buttonRefreshTimer;
-
- for (var i = 0, row; (row = this._rows[i]); ++i) {
- const isStopped = row.getTorrent().isStopped();
- const isSelected = row.isSelected();
- const isQueued = row.getTorrent().isQueued();
- ++stats.total;
- if (!isStopped) {
- ++stats.active;
- }
- if (isStopped) {
- ++stats.paused;
- }
- if (isSelected) {
- ++stats.sel;
- }
- if (isSelected && !isStopped) {
- ++stats.activeSel;
- }
- if (isSelected && isStopped) {
- ++stats.pausedSel;
- }
- if (isSelected && isQueued) {
- ++stats.queuedSel;
- }
- }
-
- callback(stats);
- },
-
- updateButtonStates: function () {
- const tr = this;
- const e = this.elements;
-
- this.calculateTorrentStates(function (s) {
- tr.setEnabled(e.toolbar_pause_button, s.activeSel > 0);
- tr.setEnabled(e.toolbar_start_button, s.pausedSel > 0);
- tr.setEnabled(e.toolbar_remove_button, s.sel > 0);
- });
- },
-
- /****
- *****
- ***** INSPECTOR
- *****
- ****/
-
- inspectorIsVisible: function () {
- return $('#torrent_inspector').is(':visible');
- },
- toggleInspector: function () {
- this.setInspectorVisible(!this.inspectorIsVisible());
- },
- setInspectorVisible: function (visible) {
- if (visible) {
- this.inspector.setTorrents(this.getSelectedTorrents());
- }
-
- // update the ui widgetry
- $('#torrent_inspector').toggle(visible);
- $('#toolbar-inspector').toggleClass('selected', visible);
- this.hideMobileAddressbar();
- if (isMobileDevice) {
- $('body').toggleClass('inspector_showing', visible);
- } else {
- const w = visible ? $('#torrent_inspector').outerWidth() + 1 + 'px' : '0px';
- $('#torrent_container')[0].style.right = w;
- }
- },
-
- /****
- *****
- ***** FILTER
- *****
- ****/
-
- refilterSoon: function () {
- if (!this.refilterTimer) {
- const tr = this,
- callback = function () {
- tr.refilter(false);
- },
- msec = 100;
- this.refilterTimer = setTimeout(callback, msec);
- }
- },
-
- sortRows: function (rows) {
- let i,
- tor,
- row,
- id2row = {},
- torrents = [];
-
- for (i = 0; (row = rows[i]); ++i) {
- tor = row.getTorrent();
- torrents.push(tor);
- id2row[tor.getId()] = row;
- }
-
- Torrent.sortTorrents(torrents, this[Prefs._SortMethod], this[Prefs._SortDirection]);
-
- for (i = 0; (tor = torrents[i]); ++i) {
- rows[i] = id2row[tor.getId()];
- }
- },
-
- refilter: function (rebuildEverything) {
- let i, e, id, t, row, tmp, rows, clean_rows, dirty_rows, frag;
- const sort_mode = this[Prefs._SortMethod];
- const sort_direction = this[Prefs._SortDirection];
- const filter_mode = this[Prefs._FilterMode];
- const filter_text = this.filterText;
- const filter_tracker = this.filterTracker;
- const renderer = this.torrentRenderer;
- const list = this.elements.torrent_list;
-
- const old_sel_count = $(list).children('.selected').length;
-
- this.updateFilterSelect();
-
- clearTimeout(this.refilterTimer);
- delete this.refilterTimer;
-
- if (rebuildEverything) {
- $(list).empty();
- this._rows = [];
- for (id in this._torrents) {
- this.dirtyTorrents[id] = true;
- }
- }
-
- // rows that overlap with dirtyTorrents need to be refiltered.
- // those that don't are 'clean' and don't need refiltering.
- clean_rows = [];
- dirty_rows = [];
- for (i = 0; (row = this._rows[i]); ++i) {
- if (row.getTorrentId() in this.dirtyTorrents) {
- dirty_rows.push(row);
- } else {
- clean_rows.push(row);
- }
- }
-
- // remove the dirty rows from the dom
- e = [];
- for (i = 0; (row = dirty_rows[i]); ++i) {
- e.push(row.getElement());
- }
- $(e).detach();
-
- // drop any dirty rows that don't pass the filter test
- tmp = [];
- for (i = 0; (row = dirty_rows[i]); ++i) {
- id = row.getTorrentId();
- t = this._torrents[id];
- if (t && t.test(filter_mode, filter_text, filter_tracker)) {
- tmp.push(row);
- }
- delete this.dirtyTorrents[id];
- }
- dirty_rows = tmp;
-
- // make new rows for dirty torrents that pass the filter test
- // but don't already have a row
- for (id in this.dirtyTorrents) {
- t = this._torrents[id];
- if (t && t.test(filter_mode, filter_text, filter_tracker)) {
- row = new TorrentRow(renderer, this, t);
- e = row.getElement();
- e.row = row;
- dirty_rows.push(row);
- $(e).click($.proxy(this.onRowClicked, this));
- $(e).dblclick($.proxy(this.toggleInspector, this));
- }
- }
-
- // sort the dirty rows
- this.sortRows(dirty_rows);
-
- // now we have two sorted arrays of rows
- // and can do a simple two-way sorted merge.
- rows = [];
- let ci = 0,
- cmax = clean_rows.length;
- let di = 0,
- dmax = dirty_rows.length;
- frag = document.createDocumentFragment();
- while (ci != cmax || di != dmax) {
- var push_clean;
-
- if (ci == cmax) {
- push_clean = false;
- } else if (di == dmax) {
- push_clean = true;
- } else {
- const c = Torrent.compareTorrents(
- clean_rows[ci].getTorrent(),
- dirty_rows[di].getTorrent(),
- sort_mode,
- sort_direction
- );
- push_clean = c < 0;
- }
-
- if (push_clean) {
- rows.push(clean_rows[ci++]);
- } else {
- row = dirty_rows[di++];
- e = row.getElement();
-
- if (ci !== cmax) {
- list.insertBefore(e, clean_rows[ci].getElement());
- } else {
- frag.appendChild(e);
- }
-
- rows.push(row);
- }
- }
- list.appendChild(frag);
-
- // update our implementation fields
- this._rows = rows;
- this.dirtyTorrents = {};
-
- // jquery's even/odd starts with 1 not 0, so invert its logic
- e = rows.map((row) => row.getElement());
- $(e).filter(':odd').addClass('even');
- $(e).filter(':even').removeClass('even');
-
- // sync gui
- this.updateStatusbar();
- if (old_sel_count !== $(list).children('.selected').length) {
- this.selectionChanged();
- }
- },
-
- setFilterMode: function (mode) {
- // set the state
- this.setPref(Prefs._FilterMode, mode);
-
- // refilter
- this.refilter(true);
- },
-
- onFilterModeClicked: function (ev) {
- this.setFilterMode($('#filter-mode').val());
- },
-
- onFilterTrackerClicked: function (ev) {
- const tracker = $('#filter-tracker').val();
- this.setFilterTracker(tracker === 'all' ? null : tracker);
- },
-
- setFilterTracker: function (domain) {
- // update which tracker is selected in the popup
- const key = domain ? this.getReadableDomain(domain) : 'all';
- const id = '#show-tracker-' + key;
-
- $(id).addClass('selected').siblings().removeClass('selected');
-
- this.filterTracker = domain;
- this.refilter(true);
- },
-
- // example: "tracker.ubuntu.com" returns "ubuntu.com"
- getDomainName: function (host) {
- const dot = host.indexOf('.');
- if (dot !== host.lastIndexOf('.')) {
- host = host.slice(dot + 1);
- }
-
- return host;
- },
-
- // example: "ubuntu.com" returns "Ubuntu"
- getReadableDomain: function (name) {
- if (name.length) {
- name = name.charAt(0).toUpperCase() + name.slice(1);
- }
- const dot = name.indexOf('.');
- if (dot !== -1) {
- name = name.slice(0, dot);
- }
- return name;
- },
-
- getTrackers: function () {
- const ret = {};
-
- const torrents = this.getAllTorrents();
- for (let i = 0, torrent; (torrent = torrents[i]); ++i) {
- const names = [];
- const trackers = torrent.getTrackers();
-
- for (let j = 0, tracker; (tracker = trackers[j]); ++j) {
- var uri,
- announce = tracker.announce;
-
- if (announce in this.uriCache) {
- uri = this.uriCache[announce];
- } else {
- uri = this.uriCache[announce] = new URL(announce);
- uri.domain = this.getDomainName(uri.host);
- uri.name = this.getReadableDomain(uri.domain);
- }
-
- if (!(uri.name in ret)) {
- ret[uri.name] = {
- uri: uri,
- domain: uri.domain,
- count: 0,
- };
- }
-
- if (names.indexOf(uri.name) === -1) {
- names.push(uri.name);
- }
- }
-
- for (const name of names) {
- ret[name].count++;
- }
- }
-
- return ret;
- },
-
- /***
- ****
- **** Compact Mode
- ****
- ***/
-
- toggleCompactClicked: function () {
- this.setCompactMode(!this[Prefs._CompactDisplayState]);
- },
- setCompactMode: function (is_compact) {
- const key = Prefs._CompactDisplayState;
- const was_compact = this[key];
-
- if (was_compact !== is_compact) {
- this.setPref(key, is_compact);
- this.onCompactModeChanged();
- }
- },
- initCompactMode: function () {
- this.onCompactModeChanged();
- },
- onCompactModeChanged: function () {
- const compact = this[Prefs._CompactDisplayState];
-
- // update the ui: footer button
- $('#compact-button').toggleClass('selected', compact);
-
- // update the ui: torrent list
- this.torrentRenderer = compact ? new TorrentRendererCompact() : new TorrentRendererFull();
- this.refilter(true);
- },
-
- /***
- ****
- **** Statistics
- ****
- ***/
-
- // turn the periodic ajax stats refresh on & off
- togglePeriodicStatsRefresh: function (enabled) {
- const that = this,
- msec = 5000;
-
- function callback() {
- that.loadDaemonStats(undefined, rescheduleTimeout);
- }
-
- function rescheduleTimeout() {
- that.statsTimeout = setTimeout(callback, msec);
- }
-
- clearTimeout(this.statsTimeout);
- delete this.statsTimeout;
-
- if (enabled) {
- rescheduleTimeout();
- }
- },
-
- loadDaemonStats: function (async, callback) {
- this.remote.loadDaemonStats(
- function (data) {
- this.updateStats(data['arguments']);
-
- if (callback) {
- callback();
- }
- },
- this,
- async
- );
- },
-
- // Process new session stats from the server
- updateStats: function (stats) {
- let s, ratio;
- const fmt = Transmission.fmt;
-
- s = stats['current-stats'];
- ratio = Math.ratio(s.uploadedBytes, s.downloadedBytes);
- $('#stats-session-uploaded').html(fmt.size(s.uploadedBytes));
- $('#stats-session-downloaded').html(fmt.size(s.downloadedBytes));
- $('#stats-session-ratio').html(fmt.ratioString(ratio));
- $('#stats-session-duration').html(fmt.timeInterval(s.secondsActive));
-
- s = stats['cumulative-stats'];
- ratio = Math.ratio(s.uploadedBytes, s.downloadedBytes);
- $('#stats-total-count').html(s.sessionCount + ' times');
- $('#stats-total-uploaded').html(fmt.size(s.uploadedBytes));
- $('#stats-total-downloaded').html(fmt.size(s.downloadedBytes));
- $('#stats-total-ratio').html(fmt.ratioString(ratio));
- $('#stats-total-duration').html(fmt.timeInterval(s.secondsActive));
- },
-
- showStatsDialog: function () {
- this.loadDaemonStats();
- this.hideMobileAddressbar();
- this.togglePeriodicStatsRefresh(true);
- $('#stats-dialog').dialog({
- close: $.proxy(this.onStatsDialogClosed, this),
- show: 'fade',
- hide: 'fade',
- title: 'Statistics',
- });
- },
-
- onStatsDialogClosed: function () {
- this.hideMobileAddressbar();
- this.togglePeriodicStatsRefresh(false);
- },
-
- /***
- ****
- **** Hotkeys
- ****
- ***/
- showHotkeysDialog: function () {
- $('#hotkeys-dialog').dialog({
- title: 'Hotkeys',
- show: 'fade',
- hide: 'fade',
- });
- },
-};
diff --git a/web/package.json b/web/package.json
index 40e9a355a..c47230315 100644
--- a/web/package.json
+++ b/web/package.json
@@ -3,60 +3,51 @@
"main": "index.js",
"repository": "https://github.com/transmission/transmission",
"license": "MIT",
- "babel": {
- "plugins": [
- "@babel/plugin-proposal-class-properties"
- ],
- "presets": []
- },
- "eslintConfig": {
- "env": {
- "browser": true,
- "es6": true,
- "jquery": true
- },
- "extends": "eslint:recommended",
- "parser": "@babel/eslint-parser",
- "parserOptions": {
- "sourceType": "module"
- },
- "rules": {
- "curly": ["error", "all"],
- "no-undef": "off",
- "no-unused-vars": "off",
- "no-var": "off",
- "prefer-const": "off",
- "semi": ["error", "always"]
- }
- },
- "prettier": {
- "arrowParens": "always",
- "bracketSpacing": true,
- "embeddedLanguageFormatting": "auto",
- "htmlWhitespaceSensitivity": "css",
- "insertPragma": false,
- "jsxBracketSameLine": false,
- "jsxSingleQuote": false,
- "printWidth": 100,
- "proseWrap": "preserve",
- "quoteProps": "as-needed",
- "requirePragma": false,
- "semi": true,
- "singleQuote": true,
- "tabWidth": 2,
- "trailingComma": "es5",
- "useTabs": false,
- "vueIndentScriptAndStyle": false
- },
"scripts": {
- "lint": "prettier --loglevel warn --check javascript/*js && eslint javascript/*js",
- "lint:fix": "prettier --loglevel warn -w javascript/*js && eslint --fix javascript/*js"
+ "build": "webpack --config webpack.config.js",
+ "css": "sass --no-source-map style/",
+ "css:map": "sass style/",
+ "lint": "run-p --silent lint:eslint lint:stylelint lint:prettier",
+ "lint:fix": "run-s lint:eslint:fix lint:stylelint:fix lint:prettier:fix",
+ "lint:eslint": "eslint src/*.js",
+ "lint:eslint:fix": "eslint --fix src/*.js",
+ "lint:prettier": "prettier --loglevel warn --check package.json public_html/index.html style/*scss src/*.js",
+ "lint:prettier:fix": "prettier --loglevel warn -w package.json public_html/index.html style/*scss src/*.js",
+ "lint:stylelint": "stylelint style/*scss",
+ "lint:stylelint:fix": "stylelint --fix style/*scss"
},
"devDependencies": {
"@babel/core": "^7.11.6",
"@babel/eslint-parser": "^7.11.5",
"@babel/plugin-proposal-class-properties": "^7.10.4",
- "eslint": "^7.9.0",
- "prettier": "^2.1.2"
+ "css-loader": "^4.3.0",
+ "eslint": "^7.11.0",
+ "eslint-plugin-sonarjs": "^0.5.0",
+ "eslint-plugin-unicorn": "^23.0.0",
+ "file-loader": "^6.1.0",
+ "img-optimize-loader": "^1.0.7",
+ "mini-css-extract-plugin": "^0.11.3",
+ "node-sass": "^4.14.1",
+ "npm-run-all": "^4.1.5",
+ "optimize-css-assets-webpack-plugin": "^5.0.4",
+ "prettier": "^2.1.2",
+ "sass": "^1.26.11",
+ "sass-loader": "^10.0.2",
+ "style-loader": "^1.2.1",
+ "stylelint": "^13.7.1",
+ "stylelint-config-prettier": "^8.0.2",
+ "stylelint-config-primer": "^9.2.1",
+ "stylelint-config-sass-guidelines": "^7.1.0",
+ "stylelint-config-standard": "^20.0.0",
+ "svgo": "^1.3.2",
+ "svgo-loader": "^2.2.1",
+ "terser-webpack-plugin": "^4.2.2",
+ "url-loader": "^4.1.0",
+ "webpack": "^4.44.2",
+ "webpack-bundle-analyzer": "^3.9.0",
+ "webpack-cli": "^3.3.12"
+ },
+ "dependencies": {
+ "lodash.isequal": "^4.5.0"
}
}
diff --git a/web/prettier.config.js b/web/prettier.config.js
new file mode 100644
index 000000000..978f34bfc
--- /dev/null
+++ b/web/prettier.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ "singleQuote": true,
+};
diff --git a/web/images/favicon.ico b/web/public_html/images/favicon.ico
similarity index 100%
rename from web/images/favicon.ico
rename to web/public_html/images/favicon.ico
diff --git a/web/images/favicon.png b/web/public_html/images/favicon.png
similarity index 100%
rename from web/images/favicon.png
rename to web/public_html/images/favicon.png
diff --git a/web/images/webclip-icon.png b/web/public_html/images/webclip-icon.png
similarity index 100%
rename from web/images/webclip-icon.png
rename to web/public_html/images/webclip-icon.png
diff --git a/web/public_html/index.html b/web/public_html/index.html
new file mode 100755
index 000000000..8863e964d
--- /dev/null
+++ b/web/public_html/index.html
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Transmission Web Interface
+
+
+
+
+
+
+
+ Show
+
+ All
+ Active
+ Downloading
+ Seeding
+ Paused
+ Finished
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/src/about-dialog.js b/web/src/about-dialog.js
new file mode 100644
index 000000000..ab48bf219
--- /dev/null
+++ b/web/src/about-dialog.js
@@ -0,0 +1,58 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { createDialogContainer } from './utils.js';
+
+export class AboutDialog extends EventTarget {
+ constructor(version_info) {
+ super();
+
+ this.elements = AboutDialog._create(version_info);
+ this.elements.dismiss.addEventListener('click', () => this._onDismiss());
+ document.body.append(this.elements.root);
+ this.elements.dismiss.focus();
+ }
+
+ close() {
+ this.elements.root.remove();
+ this.dispatchEvent(new Event('close'));
+ delete this.elements;
+ }
+
+ _onDismiss() {
+ this.close();
+ }
+
+ static _create(version_info) {
+ const elements = createDialogContainer('about-dialog');
+ elements.root.setAttribute('aria-label', 'About transmission');
+ elements.heading.textContent = 'Transmission';
+ elements.dismiss.textContent = 'Close';
+
+ let e = document.createElement('div');
+ e.classList.add('about-dialog-version-number');
+ e.textContent = version_info.version;
+ elements.heading.append(e);
+
+ e = document.createElement('div');
+ e.classList.add('about-dialog-version-checksum');
+ e.textContent = version_info.checksum;
+ elements.heading.append(e);
+
+ e = document.createElement('div');
+ e.textContent = 'A fast and easy bitTorrent client';
+ elements.workarea.append(e);
+ e = document.createElement('div');
+ e.textContent = 'Copyright © The Transmission Project';
+ elements.workarea.append(e);
+
+ elements.confirm.remove();
+ delete elements.confirm;
+
+ return elements;
+ }
+}
diff --git a/web/src/action-manager.js b/web/src/action-manager.js
new file mode 100644
index 000000000..d44165a59
--- /dev/null
+++ b/web/src/action-manager.js
@@ -0,0 +1,216 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+export class ActionManager extends EventTarget {
+ constructor() {
+ super();
+ this.actions = Object.seal({
+ 'deselect-all': {
+ enabled: false,
+ shortcut: 'Control+A',
+ text: 'Deselect all',
+ },
+ 'move-bottom': { enabled: false, text: 'Move to the back of the queue' },
+ 'move-down': { enabled: false, text: 'Move down in the queue' },
+ 'move-top': { enabled: false, text: 'Move to the front of the queue' },
+ 'move-up': { enabled: false, text: 'Move up in the queue' },
+ 'open-torrent': {
+ enabled: true,
+ shortcut: 'Alt+O',
+ text: 'Open torrent…',
+ },
+ 'pause-all-torrents': { enabled: false, text: 'Pause all' },
+ 'pause-selected-torrents': {
+ enabled: false,
+ shortcut: 'Alt+U',
+ text: 'Pause',
+ },
+ 'reannounce-selected-torrents': {
+ enabled: false,
+ text: 'Ask tracker for more peers',
+ },
+ 'remove-selected-torrents': { enabled: false, text: 'Remove from list…' },
+ 'resume-selected-torrents': {
+ enabled: false,
+ shortcut: 'Alt+R',
+ text: 'Resume',
+ },
+ 'resume-selected-torrents-now': { enabled: false, text: 'Resume now' },
+ 'select-all': { enabled: false, shortcut: 'Alt+A', text: 'Select all' },
+ 'show-about-dialog': { enabled: true, text: 'About' },
+ 'show-inspector': {
+ enabled: true,
+ shortcut: 'Alt+I',
+ text: 'Torrent Inspector',
+ },
+ 'show-move-dialog': {
+ enabled: false,
+ shortcut: 'Alt+L',
+ text: 'Set location…',
+ },
+ 'show-overflow-menu': { enabled: true, text: 'More options…' },
+ 'show-preferences-dialog': {
+ enabled: true,
+ shortcut: 'Alt+P',
+ text: 'Edit preferences',
+ },
+ 'show-rename-dialog': {
+ enabled: false,
+ shortcut: 'Alt+N',
+ text: 'Rename…',
+ },
+ 'show-shortcuts-dialog': { enabled: true, text: 'Keyboard shortcuts' },
+ 'show-statistics-dialog': {
+ enabled: true,
+ shortcut: 'Alt+S',
+ text: 'Statistics',
+ },
+ 'start-all-torrents': { enabled: false, text: 'Start all' },
+ 'toggle-compact-rows': { enabled: true, text: 'Compact rows' },
+ 'trash-selected-torrents': {
+ enabled: false,
+ text: 'Trash data and remove from list…',
+ },
+ 'verify-selected-torrents': {
+ enabled: false,
+ shortcut: 'Alt+V',
+ text: 'Verify local data',
+ },
+ });
+ }
+
+ click(name) {
+ if (this.isEnabled(name)) {
+ const event_ = new Event('click');
+ event_.action = name;
+ this.dispatchEvent(event_);
+ }
+ }
+
+ getActionForShortcut(shortcut) {
+ for (const [name, properties] of Object.entries(this.actions)) {
+ if (shortcut === properties.shortcut) {
+ return name;
+ }
+ }
+ return null;
+ }
+
+ // return a map of shortcuts to action names
+ allShortcuts() {
+ return new Map(
+ Object.entries(this.actions)
+ .filter(([, properties]) => properties.shortcut)
+ .map(([name, properties]) => [properties.shortcut, name])
+ );
+ }
+
+ isEnabled(name) {
+ return this._getAction(name).enabled;
+ }
+
+ text(name) {
+ return this._getAction(name).text;
+ }
+
+ keyshortcuts(name) {
+ return this._getAction(name).shortcut;
+ }
+
+ update(event_) {
+ const counts = ActionManager._recount(event_.selected, event_.nonselected);
+ this._updateStates(counts);
+ }
+
+ _getAction(name) {
+ const action = this.actions[name];
+ if (!action) {
+ throw new Error(`no such action: ${name}`);
+ }
+ return action;
+ }
+
+ static _recount(selected, nonselected) {
+ const test = (tor) => tor.isStopped();
+ const total = selected.length + nonselected.length;
+ const selected_paused = selected.filter(test).length;
+ const selected_active = selected.length - selected_paused;
+ const nonselected_paused = nonselected.filter(test).length;
+ const nonselected_active = nonselected.length - nonselected_paused;
+ const paused = selected_paused + nonselected_paused;
+ const active = selected_active + nonselected_active;
+ const selected_queued = selected.filter((tor) => tor.isQueued()).length;
+
+ return {
+ active,
+ nonselected_active,
+ nonselected_paused,
+ paused,
+ selected: selected.length,
+ selected_active,
+ selected_paused,
+ selected_queued,
+ total,
+ };
+ }
+
+ _updateStates(counts) {
+ const set_enabled = (enabled, actions) => {
+ for (const action of actions) {
+ this._updateActionState(action, enabled);
+ }
+ };
+
+ set_enabled(counts.selected_paused > 0, ['resume-selected-torrents']);
+
+ set_enabled(counts.paused > 0, ['start-all-torrents']);
+
+ set_enabled(counts.active > 0, ['pause-all-torrents']);
+
+ set_enabled(counts.selected_paused > 0 || counts.selected_queued > 0, [
+ 'resume-selected-torrents-now',
+ ]);
+
+ set_enabled(counts.selected_active > 0, [
+ 'pause-selected-torrents',
+ 'reannounce-selected-torrents',
+ ]);
+
+ set_enabled(counts.selected > 0, [
+ 'deselect-all',
+ 'move-bottom',
+ 'move-down',
+ 'move-top',
+ 'move-up',
+ 'show-inspector',
+ 'show-move-dialog',
+ 'remove-selected-torrents',
+ 'trash-selected-torrents',
+ 'verify-selected-torrents',
+ ]);
+
+ set_enabled(counts.selected === 1, ['show-rename-dialog']);
+
+ set_enabled(counts.selected < counts.total, ['select-all']);
+ }
+
+ _updateActionState(name, enabled) {
+ const action = this.actions[name];
+ if (!action) {
+ throw new Error(`no such action: ${name}`);
+ }
+
+ if (action.enabled !== enabled) {
+ action.enabled = enabled;
+
+ const event = new Event('change');
+ event.action = name;
+ event.enabled = enabled;
+ this.dispatchEvent(event);
+ }
+ }
+}
diff --git a/web/src/alert-dialog.js b/web/src/alert-dialog.js
new file mode 100644
index 000000000..9235721d3
--- /dev/null
+++ b/web/src/alert-dialog.js
@@ -0,0 +1,46 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { createDialogContainer } from './utils.js';
+
+export class AlertDialog extends EventTarget {
+ constructor(options) {
+ super();
+
+ // options: heading, message
+ this.elements = AlertDialog._create(options);
+ this.elements.dismiss.addEventListener('click', () => this._onDismiss());
+ this.options = options;
+ document.body.append(this.elements.root);
+ this.elements.dismiss.focus();
+ }
+
+ close() {
+ if (!this.closed) {
+ this.elements.root.remove();
+ this.dispatchEvent(new Event('close'));
+ for (const key of Object.keys(this)) {
+ delete this[key];
+ }
+ this.closed = true;
+ }
+ }
+
+ _onDismiss() {
+ this.close();
+ }
+
+ static _create(options) {
+ const { heading, message } = options;
+ const elements = createDialogContainer('confirm-dialog');
+ elements.confirm.remove();
+ delete elements.confirm;
+ elements.heading.textContent = heading;
+ elements.workarea.textContent = message;
+ return elements;
+ }
+}
diff --git a/web/src/context-menu.js b/web/src/context-menu.js
new file mode 100644
index 000000000..612f19f9d
--- /dev/null
+++ b/web/src/context-menu.js
@@ -0,0 +1,102 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { setEnabled } from './utils.js';
+
+export class ContextMenu extends EventTarget {
+ constructor(action_manager) {
+ super();
+
+ this.action_listener = this._update.bind(this);
+ this.action_manager = action_manager;
+ this.action_manager.addEventListener('change', this.action_listener);
+
+ Object.assign(this, this._create());
+ this.show();
+ }
+
+ show() {
+ for (const [action, item] of Object.entries(this.actions)) {
+ setEnabled(item, this.action_manager.isEnabled(action));
+ }
+ document.body.append(this.root);
+ }
+
+ close() {
+ if (!this.closed) {
+ this.action_manager.removeEventListener('change', this.action_listener);
+ this.root.remove();
+ this.dispatchEvent(new Event('close'));
+ for (const key of Object.keys(this)) {
+ delete this[key];
+ }
+ this.closed = true;
+ }
+ }
+
+ _update(event_) {
+ const e = this.actions[event_.action];
+ if (e) {
+ setEnabled(e, event_.enabled);
+ }
+ }
+
+ _create() {
+ const root = document.createElement('div');
+ root.role = 'menu';
+ root.classList.add('context-menu', 'popup');
+
+ const actions = {};
+ const add_item = (action) => {
+ const item = document.createElement('div');
+ const text = this.action_manager.text(action);
+ item.role = 'menuitem';
+ item.classList.add('context-menuitem');
+ item.dataset.action = action;
+ item.textContent = text;
+ const keyshortcuts = this.action_manager.keyshortcuts(action);
+ if (keyshortcuts) {
+ item.setAttribute('aria-keyshortcuts', keyshortcuts);
+ }
+ item.addEventListener('click', () => {
+ this.action_manager.click(action);
+ this.close();
+ });
+ actions[action] = item;
+ root.append(item);
+ };
+
+ const add_separator = () => {
+ const item = document.createElement('div');
+ item.classList.add('context-menu-separator');
+ root.append(item);
+ };
+
+ add_item('resume-selected-torrents');
+ add_item('resume-selected-torrents-now');
+ add_item('pause-selected-torrents');
+ add_separator();
+ add_item('move-top');
+ add_item('move-up');
+ add_item('move-down');
+ add_item('move-bottom');
+ add_separator();
+ add_item('remove-selected-torrents');
+ add_item('trash-selected-torrents');
+ add_separator();
+ add_item('verify-selected-torrents');
+ add_item('show-move-dialog');
+ add_item('show-rename-dialog');
+ add_separator();
+ add_item('reannounce-selected-torrents');
+ add_separator();
+ add_item('select-all');
+ add_item('deselect-all');
+
+ return { actions, root };
+ }
+}
diff --git a/web/src/file-row.js b/web/src/file-row.js
new file mode 100644
index 000000000..ea5d5cbe3
--- /dev/null
+++ b/web/src/file-row.js
@@ -0,0 +1,197 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { Formatter } from './formatter.js';
+import { makeUUID, setChecked, setEnabled, setTextContent } from './utils.js';
+
+export class FileRow extends EventTarget {
+ isDone() {
+ return this.fields.have >= this.fields.size;
+ }
+
+ isEditable() {
+ return this.fields.torrent.getFileCount() > 1 && !this.isDone();
+ }
+
+ refreshWantedHTML() {
+ const e = this.elements.root;
+ e.classList.toggle('skip', !this.fields.isWanted);
+ e.classList.toggle('complete', this.isDone());
+ setEnabled(e.checkbox, this.isEditable());
+ e.checkbox.checked = this.fields.isWanted;
+ }
+
+ refreshProgressHTML() {
+ const { size, have } = this.fields;
+ const pct = 100 * (size ? have / size : 1);
+ const fmt = Formatter;
+ const c = `${fmt.size(have)} of ${fmt.size(size)} (${fmt.percentString(
+ pct
+ )}%)`;
+ setTextContent(this.elements.progress, c);
+ }
+
+ refresh() {
+ let have = 0;
+ let high = false;
+ let low = false;
+ let normal = false;
+ let size = 0;
+ let wanted = false;
+
+ // loop through the file_indices that affect this row
+ const files = this.fields.torrent.getFiles();
+ for (const index of this.fields.indices) {
+ const file = files[index];
+ have += file.bytesCompleted;
+ size += file.length;
+ wanted |= file.wanted;
+ switch (file.priority) {
+ case -1:
+ low = true;
+ break;
+ case 1:
+ high = true;
+ break;
+ default:
+ normal = true;
+ break;
+ }
+ }
+
+ setChecked(this.elements.priority_low_button, low);
+ setChecked(this.elements.priority_normal_button, normal);
+ setChecked(this.elements.priority_high_button, high);
+
+ if (this.fields.have !== have || this.fields.size !== size) {
+ this.fields.have = have;
+ this.fields.size = size;
+ this.refreshProgressHTML();
+ }
+
+ if (this.fields.isWanted !== wanted) {
+ this.fields.isWanted = wanted;
+ this.refreshWantedHTML();
+ }
+ }
+
+ fireWantedChanged(wanted) {
+ const e = new Event('wantedToggled');
+ e.indices = [...this.fields.indices];
+ e.wanted = wanted;
+ this.dispatchEvent(e);
+ }
+
+ firePriorityChanged(priority) {
+ const e = new Event('priorityToggled');
+ e.indices = [...this.fields.indices];
+ e.priority = priority;
+ this.dispatchEvent(e);
+ }
+
+ createRow(torrent, depth, name, even) {
+ const root = document.createElement('li');
+ root.classList.add(
+ 'inspector-torrent-file-list-entry',
+ even ? 'even' : 'odd'
+ );
+
+ this.elements.root = root;
+
+ let e = document.createElement('input');
+ const check_id = makeUUID();
+ e.type = 'checkbox';
+ e.className = 'file-wanted-control';
+ e.title = 'Download file';
+ e.id = check_id;
+ e.addEventListener('change', (event_) =>
+ this.fireWantedChanged(event_.target.checked)
+ );
+ root.checkbox = e;
+ root.append(e);
+
+ e = document.createElement('label');
+ e.className = 'inspector-torrent-file-list-entry-name';
+ e.setAttribute('for', check_id);
+ setTextContent(e, name);
+ root.append(e);
+
+ e = document.createElement('div');
+ e.className = 'inspector-torrent-file-list-entry-progress';
+ root.append(e);
+ this.elements.progress = e;
+
+ e = document.createElement('div');
+ e.className = 'file-priority-radiobox';
+ const box = e;
+
+ const priority_click_listener = (event_) =>
+ this.firePriorityChanged(event_.target.value);
+
+ e = document.createElement('input');
+ e.type = 'radio';
+ e.value = -1;
+ e.className = 'low';
+ e.title = 'Low Priority';
+ e.addEventListener('click', priority_click_listener);
+ this.elements.priority_low_button = e;
+ box.append(e);
+
+ e = document.createElement('input');
+ e.type = 'radio';
+ e.value = 0;
+ e.className = 'normal';
+ e.title = 'Normal Priority';
+ e.addEventListener('click', priority_click_listener);
+ this.elements.priority_normal_button = e;
+ box.append(e);
+
+ e = document.createElement('input');
+ e.type = 'radio';
+ e.value = 1;
+ e.title = 'High Priority';
+ e.className = 'high';
+ e.addEventListener('click', priority_click_listener);
+ this.elements.priority_high_button = e;
+ box.append(e);
+
+ root.append(box);
+
+ root.style.paddingLeft = `${depth * 20}px`;
+
+ this.refresh();
+ }
+
+ /// PUBLIC
+
+ getElement() {
+ return this.elements.root;
+ }
+
+ constructor(torrent, depth, name, indices, even) {
+ super();
+
+ this.fields = {
+ have: 0,
+ indices,
+ isWanted: true,
+ // priorityHigh: false,
+ // priorityLow: false,
+ // priorityNormal: false,
+ size: 0,
+ torrent,
+ };
+ this.elements = {
+ priority_high_button: null,
+ priority_low_button: null,
+ priority_normal_button: null,
+ progress: null,
+ root: null,
+ };
+ this.createRow(torrent, depth, name, even);
+ }
+}
diff --git a/web/src/formatter.js b/web/src/formatter.js
new file mode 100644
index 000000000..e4b5c7e55
--- /dev/null
+++ b/web/src/formatter.js
@@ -0,0 +1,184 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+const plural_rules = new Intl.PluralRules();
+const current_locale = plural_rules.resolvedOptions().locale;
+const number_format = new Intl.NumberFormat(current_locale);
+
+const kilo = 1000;
+const mem_formatters = [
+ new Intl.NumberFormat(current_locale, { style: 'unit', unit: 'byte' }),
+ new Intl.NumberFormat(current_locale, { style: 'unit', unit: 'kilobyte' }),
+ new Intl.NumberFormat(current_locale, { style: 'unit', unit: 'megabyte' }),
+ new Intl.NumberFormat(current_locale, { style: 'unit', unit: 'gigabyte' }),
+ new Intl.NumberFormat(current_locale, { style: 'unit', unit: 'terabyte' }),
+ new Intl.NumberFormat(current_locale, { style: 'unit', unit: 'petabyte' }),
+];
+
+const fmt_kBps = new Intl.NumberFormat(current_locale, {
+ style: 'unit',
+ unit: 'kilobyte-per-second',
+});
+const fmt_MBps = new Intl.NumberFormat(current_locale, {
+ style: 'unit',
+ unit: 'megabyte-per-second',
+});
+
+export class Formatter {
+ static countString(msgid, msgid_plural, n) {
+ return `${this.number(n)} ${this.ngettext(msgid, msgid_plural, n)}`;
+ }
+
+ // Formats the a memory size into a human-readable string
+ // @param {Number} bytes the filesize in bytes
+ // @return {String} human-readable string
+ static mem(bytes) {
+ if (bytes < 0) {
+ return 'Unknown';
+ }
+ if (bytes === 0) {
+ return 'None';
+ }
+
+ let size = bytes;
+ for (const nf of mem_formatters) {
+ if (size < kilo) {
+ return nf.format(Math.floor(size));
+ }
+ size /= kilo;
+ }
+
+ return 'E2BIG';
+ }
+
+ static ngettext(msgid, msgid_plural, n) {
+ return plural_rules.select(n) === 'one' ? msgid : msgid_plural;
+ }
+
+ // format a percentage to a string
+ static percentString(x) {
+ const decimal_places = x < 100 ? 1 : 0;
+ return this._toTruncFixed(x, decimal_places);
+ }
+
+ /*
+ * Format a ratio to a string
+ */
+ static ratioString(x) {
+ if (x === -1) {
+ return 'None';
+ }
+ if (x === -2) {
+ return '∞';
+ }
+ return this.percentString(x);
+ }
+
+ /**
+ * Formats the a disk capacity or file size into a human-readable string
+ * @param {Number} bytes the filesize in bytes
+ * @return {String} human-readable string
+ */
+ static size(bytes) {
+ return this.mem(bytes);
+ }
+
+ static speed(KBps) {
+ return KBps < 999.95 ? fmt_kBps.format(KBps) : fmt_MBps.format(KBps / 1000);
+ }
+
+ static speedBps(Bps) {
+ return this.speed(this.toKBps(Bps));
+ }
+
+ static timeInterval(seconds) {
+ const days = Math.floor(seconds / 86400);
+ if (days) {
+ return this.countString('day', 'days', days);
+ }
+
+ const hours = Math.floor((seconds % 86400) / 3600);
+ if (hours) {
+ return this.countString('hour', 'hours', hours);
+ }
+
+ const minutes = Math.floor((seconds % 3600) / 60);
+ if (minutes) {
+ return this.countString('minute', 'minutes', minutes);
+ }
+
+ seconds = Math.floor(seconds % 60);
+ return this.countString('second', 'seconds', seconds);
+ }
+
+ static timestamp(seconds) {
+ if (!seconds) {
+ return 'N/A';
+ }
+
+ const myDate = new Date(seconds * 1000);
+ const now = new Date();
+
+ let date = '';
+ let time = '';
+
+ const sameYear = now.getFullYear() === myDate.getFullYear();
+ const sameMonth = now.getMonth() === myDate.getMonth();
+
+ const dateDiff = now.getDate() - myDate.getDate();
+ if (sameYear && sameMonth && Math.abs(dateDiff) <= 1) {
+ if (dateDiff === 0) {
+ date = 'Today';
+ } else if (dateDiff === 1) {
+ date = 'Yesterday';
+ } else {
+ date = 'Tomorrow';
+ }
+ } else {
+ date = myDate.toDateString();
+ }
+
+ let hours = myDate.getHours();
+ let period = 'AM';
+ if (hours > 12) {
+ hours = hours - 12;
+ period = 'PM';
+ }
+ if (hours === 0) {
+ hours = 12;
+ }
+ if (hours < 10) {
+ hours = `0${hours}`;
+ }
+ let minutes = myDate.getMinutes();
+ if (minutes < 10) {
+ minutes = `0${minutes}`;
+ }
+ seconds = myDate.getSeconds();
+ if (seconds < 10) {
+ seconds = `0${seconds}`;
+ }
+
+ time = [hours, minutes, seconds].join(':');
+
+ return [date, time, period].join(' ');
+ }
+
+ static toKBps(Bps) {
+ return Math.floor(Bps / kilo);
+ }
+
+ static number(number) {
+ return number_format.format(number);
+ }
+
+ /** Round a string of a number to a specified number of decimal places */
+ static _toTruncFixed(number, places) {
+ const returnValue = Math.floor(number * 10 ** places) / 10 ** places;
+ return returnValue.toFixed(places);
+ }
+}
diff --git a/web/src/inspector.js b/web/src/inspector.js
new file mode 100644
index 000000000..02bfc3797
--- /dev/null
+++ b/web/src/inspector.js
@@ -0,0 +1,927 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { FileRow } from './file-row.js';
+import { Formatter } from './formatter.js';
+import { Torrent } from './torrent.js';
+import {
+ OutsideClickListener,
+ Utils,
+ createTabsContainer,
+ setTextContent,
+} from './utils.js';
+
+const peer_column_classes = [
+ 'encryption',
+ 'speed-up',
+ 'speed-down',
+ 'percent-done',
+ 'status',
+ 'peer-address',
+ 'peer-app-name',
+];
+
+export class Inspector extends EventTarget {
+ constructor(controller) {
+ super();
+
+ this.closed = false;
+ this.controller = controller;
+ this.elements = this._create();
+ this.current_page = this.elements.info.root;
+ this.interval = setInterval(this._refreshTorrents.bind(this), 3000);
+ this.name = 'inspector';
+ this.selection_listener = (event_) => this._setTorrents(event_.selected);
+ this.torrent_listener = () => this._updateCurrentPage();
+ this.torrents = [];
+ this.file_torrent = null;
+ this.file_torrent_n = null;
+ this.file_rows = null;
+ this.outside = new OutsideClickListener(this.elements.root);
+ this.outside.addEventListener('click', () => this.close());
+ Object.seal(this);
+
+ controller.addEventListener(
+ 'torrent-selection-changed',
+ this.selection_listener
+ );
+ this._setTorrents(this.controller.getSelectedTorrents());
+
+ document.body.append(this.elements.root);
+ }
+
+ close() {
+ if (!this.closed) {
+ this.outside.stop();
+ clearInterval(this.interval);
+ this._setTorrents([]);
+ this.elements.root.remove();
+ this.controller.removeEventListener(
+ 'torrent-selection-changed',
+ this.selection_listener
+ );
+ this.dispatchEvent(new Event('close'));
+ for (const property of Object.keys(this)) {
+ this[property] = null;
+ }
+ this.closed = true;
+ }
+ }
+
+ static _createInfoPage() {
+ const root = document.createElement('div');
+ root.classList.add('inspector-info-page');
+ const elements = { root };
+
+ const append_section_title = (text) => {
+ const label = document.createElement('div');
+ label.textContent = text;
+ label.classList.add('section-label');
+ root.append(label);
+ };
+
+ const append_row = (text) => {
+ const lhs = document.createElement('label');
+ setTextContent(lhs, text);
+ root.append(lhs);
+
+ const rhs = document.createElement('label');
+ root.append(rhs);
+ return rhs;
+ };
+
+ append_section_title('Activity');
+ let rows = [
+ ['have', 'Have:'],
+ ['availability', 'Availability:'],
+ ['uploaded', 'Uploaded:'],
+ ['downloaded', 'Downloaded:'],
+ ['state', 'State:'],
+ ['running_time', 'Running time:'],
+ ['remaining_time', 'Remaining:'],
+ ['last_activity', 'Last activity:'],
+ ['error', 'Error:'],
+ ];
+ for (const [name, text] of rows) {
+ elements[name] = append_row(text);
+ }
+
+ append_section_title('Details');
+ rows = [
+ ['size', 'Size:'],
+ ['location', 'Location:'],
+ ['hash', 'Hash:'],
+ ['privacy', 'Privacy:'],
+ ['origin', 'Origin:'],
+ ['comment', 'Comment:'],
+ ];
+ for (const [name, text] of rows) {
+ elements[name] = append_row(text);
+ }
+
+ return elements;
+ }
+
+ static _createListPage(list_type, list_id) {
+ const root = document.createElement('div');
+ const list = document.createElement(list_type);
+ list.id = list_id;
+ root.append(list);
+ return { list, root };
+ }
+
+ static _createTiersPage() {
+ return Inspector._createListPage('div', 'inspector-tiers-list');
+ }
+
+ static _createFilesPage() {
+ return Inspector._createListPage('ul', 'inspector-file-list');
+ }
+
+ static _createPeersPage() {
+ const table = document.createElement('table');
+ table.classList.add('peer-list');
+ const thead = document.createElement('thead');
+ const tr = document.createElement('tr');
+ const names = ['', 'Up', 'Down', 'Done', 'Status', 'Address', 'Client'];
+ names.forEach((name, index) => {
+ const th = document.createElement('th');
+ const classname = peer_column_classes[index];
+ if (classname === 'encryption') {
+ th.dataset.encrypted = true;
+ }
+ th.classList.add(classname);
+ setTextContent(th, name);
+ tr.append(th);
+ });
+ const tbody = document.createElement('tbody');
+ thead.append(tr);
+ table.append(thead);
+ table.append(tbody);
+ return {
+ root: table,
+ tbody,
+ };
+ }
+
+ _create() {
+ const pages = {
+ files: Inspector._createFilesPage(),
+ info: Inspector._createInfoPage(),
+ peers: Inspector._createPeersPage(),
+ tiers: Inspector._createTiersPage(),
+ };
+
+ const on_activated = (page) => {
+ this.current_page = page;
+ this._updateCurrentPage();
+ };
+
+ const elements = createTabsContainer(
+ 'inspector',
+ [
+ ['inspector-tab-info', pages.info.root],
+ ['inspector-tab-peers', pages.peers.root],
+ ['inspector-tab-tiers', pages.tiers.root],
+ ['inspector-tab-files', pages.files.root],
+ ],
+ on_activated.bind(this)
+ );
+
+ return { ...elements, ...pages };
+ }
+
+ _setTorrents(torrents) {
+ // update the inspector when a selected torrent's data changes.
+ const key = 'dataChanged';
+ const callback = this.torrent_listener;
+ this.torrents.forEach((t) => t.removeEventListener(key, callback));
+ this.torrents = [...torrents];
+ this.torrents.forEach((t) => t.addEventListener(key, callback));
+
+ this._refreshTorrents();
+ this._updateCurrentPage();
+ }
+
+ static _needsExtraInfo(torrents) {
+ return torrents.some((tor) => !tor.hasExtraInfo());
+ }
+
+ _refreshTorrents() {
+ const { controller, torrents } = this;
+ const ids = torrents.map((t) => t.getId());
+
+ if (ids && ids.length > 0) {
+ const fields = ['id', ...Torrent.Fields.StatsExtra];
+ if (Inspector._needsExtraInfo(torrents)) {
+ fields.push(...Torrent.Fields.InfoExtra);
+ }
+
+ controller.updateTorrents(ids, fields);
+ }
+ }
+
+ _updateCurrentPage() {
+ const { elements } = this;
+ switch (this.current_page) {
+ case elements.files.root:
+ this._updateFiles();
+ break;
+ case elements.info.root:
+ this._updateInfo();
+ break;
+ case elements.peers.root:
+ this._updatePeers();
+ break;
+ case elements.tiers.root:
+ this._updateTiers();
+ break;
+ default:
+ console.warn('unexpected page');
+ console.log(this.current_page);
+ }
+ }
+
+ _updateInfo() {
+ const none = 'None';
+ const mixed = 'Mixed';
+ const unknown = 'Unknown';
+ const fmt = Formatter;
+ const now = Date.now();
+ const { torrents } = this;
+ const e = this.elements;
+ const sizeWhenDone = torrents.reduce(
+ (accumulator, t) => accumulator + t.getSizeWhenDone(),
+ 0
+ );
+
+ // state
+ let string = null;
+ if (torrents.length === 0) {
+ string = none;
+ } else if (torrents.every((t) => t.isFinished())) {
+ string = 'Finished';
+ } else if (torrents.every((t) => t.isStopped())) {
+ string = 'Paused';
+ } else {
+ const get = (t) => t.getStateString();
+ const first = get(torrents[0]);
+ string = torrents.every((t) => get(t) === first) ? first : mixed;
+ }
+ setTextContent(e.info.state, string);
+ const stateString = string;
+
+ // have
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const verified = torrents.reduce(
+ (accumulator, t) => accumulator + t.getHaveValid(),
+ 0
+ );
+ const unverified = torrents.reduce(
+ (accumulator, t) => accumulator + t.getHaveUnchecked(),
+ 0
+ );
+ const leftUntilDone = torrents.reduce(
+ (accumulator, t) => accumulator + t.getLeftUntilDone(),
+ 0
+ );
+
+ const d =
+ 100 *
+ (sizeWhenDone ? (sizeWhenDone - leftUntilDone) / sizeWhenDone : 1);
+ string = fmt.percentString(d);
+
+ if (!unverified && !leftUntilDone) {
+ string = `${fmt.size(verified)} (100%)`;
+ } else if (!unverified) {
+ string = `${fmt.size(verified)} of ${fmt.size(
+ sizeWhenDone
+ )} (${string}%)`;
+ } else {
+ string = `${fmt.size(verified)} of ${fmt.size(
+ sizeWhenDone
+ )} (${string}%), ${fmt.size(unverified)} Unverified`;
+ }
+ }
+ setTextContent(e.info.have, string);
+
+ // availability
+ if (torrents.length === 0) {
+ string = none;
+ } else if (sizeWhenDone === 0) {
+ string = none;
+ } else {
+ const available = torrents.reduce(
+ (accumulator, t) => t.getHave() + t.getDesiredAvailable(),
+ 0
+ );
+ string = `${fmt.percentString((100 * available) / sizeWhenDone)}%`;
+ }
+ setTextContent(e.info.availability, string);
+
+ // downloaded
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const d = torrents.reduce(
+ (accumulator, t) => accumulator + t.getDownloadedEver(),
+ 0
+ );
+ const f = torrents.reduce(
+ (accumulator, t) => accumulator + t.getFailedEver(),
+ 0
+ );
+ string = f ? `${fmt.size(d)} (${fmt.size(f)} corrupt)` : fmt.size(d);
+ }
+ setTextContent(e.info.downloaded, string);
+
+ // uploaded
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const u = torrents.reduce(
+ (accumulator, t) => accumulator + t.getUploadedEver(),
+ 0
+ );
+ const d =
+ torrents.reduce(
+ (accumulator, t) => accumulator + t.getDownloadedEver(),
+ 0
+ ) ||
+ torrents.reduce((accumulator, t) => accumulator + t.getHaveValid(), 0);
+ string = `${fmt.size(u)} (Ratio: ${fmt.ratioString(Utils.ratio(u, d))})`;
+ }
+ setTextContent(e.info.uploaded, string);
+
+ // running time
+ if (torrents.length === 0) {
+ string = none;
+ } else if (torrents.every((t) => t.isStopped())) {
+ string = stateString; // paused || finished}
+ } else {
+ const get = (t) => t.getStartDate();
+ const first = get(torrents[0]);
+ string = !torrents.every((t) => get(t) === first)
+ ? mixed
+ : fmt.timeInterval(now / 1000 - first);
+ }
+ setTextContent(e.info.running_time, string);
+
+ // remaining time
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const get = (t) => t.getETA();
+ const first = get(torrents[0]);
+ if (!torrents.every((t) => get(t) === first)) {
+ string = mixed;
+ } else if (first < 0) {
+ string = unknown;
+ } else {
+ string = fmt.timeInterval(first);
+ }
+ }
+ setTextContent(e.info.remaining_time, string);
+
+ // last active at
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const latest = torrents.reduce(
+ (accumulator, t) => Math.max(accumulator, t.getLastActivity()),
+ -1
+ );
+ const now_seconds = Math.floor(now / 1000);
+ if (0 < latest && latest <= now_seconds) {
+ const idle_secs = now_seconds - latest;
+ string =
+ idle_secs < 5 ? 'Active now' : `${fmt.timeInterval(idle_secs)} ago`;
+ } else {
+ string = none;
+ }
+ }
+ setTextContent(e.info.last_activity, string);
+
+ // error
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const get = (t) => t.getErrorString();
+ const first = get(torrents[0]);
+ string = torrents.every((t) => get(t) === first) ? first : mixed;
+ }
+ setTextContent(e.info.error, string || none);
+
+ // size
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const size = torrents.reduce(
+ (accumulator, t) => accumulator + t.getTotalSize(),
+ 0
+ );
+ if (!size) {
+ string = 'None';
+ } else {
+ const get = (t) => t.getPieceSize();
+ const pieceCount = torrents.reduce(
+ (accumulator, t) => accumulator + t.getPieceCount(),
+ 0
+ );
+ const pieceString = fmt.number(pieceCount);
+ const pieceSize = get(torrents[0]);
+ string = torrents.every((t) => get(t) === pieceSize)
+ ? `${fmt.size(size)} (${pieceString} pieces @ ${fmt.mem(pieceSize)})`
+ : `${fmt.size(size)} (${pieceString} pieces)`;
+ }
+ }
+ setTextContent(e.info.size, string);
+
+ // hash
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const get = (t) => t.getHashString();
+ const first = get(torrents[0]);
+ string = torrents.every((t) => get(t) === first) ? first : mixed;
+ }
+ setTextContent(e.info.hash, string);
+
+ // privacy
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const get = (t) => t.getPrivateFlag();
+ const first = get(torrents[0]);
+ if (!torrents.every((t) => get(t) === first)) {
+ string = mixed;
+ } else if (first) {
+ string = 'Private to this tracker -- DHT and PEX disabled';
+ } else {
+ string = 'Public torrent';
+ }
+ }
+ setTextContent(e.info.privacy, string);
+
+ // comment
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const get = (t) => t.getComment();
+ const first = get(torrents[0]);
+ string = torrents.every((t) => get(t) === first) ? first : mixed;
+ }
+ string = string || none;
+ if (string.startsWith('https://') || string.startsWith('http://')) {
+ string = encodeURI(string);
+ Utils.setInnerHTML(
+ e.info.comment,
+ `${string} `
+ );
+ } else {
+ setTextContent(e.info.comment, string);
+ }
+
+ // origin
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ let get = (t) => t.getCreator();
+ const creator = get(torrents[0]);
+ const mixed_creator = !torrents.every((t) => get(t) === creator);
+
+ get = (t) => t.getDateCreated();
+ const date = get(torrents[0]);
+ const mixed_date = !torrents.every((t) => get(t) === date);
+
+ const empty_creator = !creator || !creator.length;
+ const empty_date = !date;
+ if (mixed_creator || mixed_date) {
+ string = mixed;
+ } else if (empty_creator && empty_date) {
+ string = unknown;
+ } else if (empty_date && !empty_creator) {
+ string = `Created by ${creator}`;
+ } else if (empty_creator && !empty_date) {
+ string = `Created on ${new Date(date * 1000).toDateString()}`;
+ } else {
+ string = `Created by ${creator} on ${new Date(
+ date * 1000
+ ).toDateString()}`;
+ }
+ }
+ setTextContent(e.info.origin, string);
+
+ // location
+ if (torrents.length === 0) {
+ string = none;
+ } else {
+ const get = (t) => t.getDownloadDir();
+ const first = get(torrents[0]);
+ string = torrents.every((t) => get(t) === first) ? first : mixed;
+ }
+ setTextContent(e.info.location, string);
+ }
+
+ /// PEERS PAGE
+
+ static _peerStatusTitle(flag_string) {
+ const texts = Object.seal({
+ '?': "We unchoked this peer, but they're not interested",
+ D: 'Downloading from this peer',
+ E: 'Encrypted Connection',
+ H: 'Peer was discovered through Distributed Hash Table (DHT)',
+ I: 'Peer is an incoming connection',
+ K: "Peer has unchoked us, but we're not interested",
+ O: 'Optimistic unchoke',
+ T: 'Peer is connected via uTP',
+ U: 'Uploading to peer',
+ X: 'Peer was discovered through Peer Exchange (PEX)',
+ d: "We would download from this peer if they'd let us",
+ u: "We would upload to this peer if they'd ask",
+ });
+
+ return [...flag_string]
+ .filter((ch) => texts[ch])
+ .map((ch) => `${ch}: ${texts[ch]}`)
+ .join('\n');
+ }
+
+ _updatePeers() {
+ const fmt = Formatter;
+ const { torrents } = this;
+ const { tbody } = this.elements.peers;
+
+ const cell_setters = [
+ (peer, td) => {
+ td.dataset.encrypted = peer.isEncrypted;
+ },
+ (peer, td) =>
+ setTextContent(
+ td,
+ peer.rateToPeer ? fmt.speedBps(peer.rateToPeer) : ''
+ ),
+ (peer, td) =>
+ setTextContent(
+ td,
+ peer.rateToClient ? fmt.speedBps(peer.rateToClient) : ''
+ ),
+ (peer, td) => setTextContent(td, `${Math.floor(peer.progress * 100)}%`),
+ (peer, td) => {
+ setTextContent(td, peer.flagStr);
+ td.setAttribute('title', Inspector._peerStatusTitle(peer.flagStr));
+ },
+ (peer, td) => setTextContent(td, peer.address),
+ (peer, td) => setTextContent(td, peer.clientName),
+ ];
+
+ const rows = [];
+ for (const tor of torrents) {
+ // torrent name
+ const tortr = document.createElement('tr');
+ tortr.classList.add('torrent-row');
+ const tortd = document.createElement('td');
+ tortd.setAttribute('colspan', cell_setters.length);
+ setTextContent(tortd, tor.getName());
+ tortr.append(tortd);
+ rows.push(tortr);
+
+ // peers
+ for (const peer of tor.getPeers()) {
+ const tr = document.createElement('tr');
+ tr.classList.add('peer-row');
+ cell_setters.forEach((setter, index) => {
+ const td = document.createElement('td');
+ td.classList.add(peer_column_classes[index]);
+ setter(peer, td);
+ tr.append(td);
+ });
+ rows.push(tr);
+ }
+
+ // TODO: modify instead of rebuilding wholesale?
+ while (tbody.firstChild) {
+ tbody.firstChild.remove();
+ }
+ tbody.append(...rows);
+ }
+ }
+
+ /// TRACKERS PAGE
+
+ static getAnnounceState(tracker) {
+ switch (tracker.announceState) {
+ case Torrent._TrackerActive:
+ return 'Announce in progress';
+ case Torrent._TrackerWaiting: {
+ const timeUntilAnnounce = Math.max(
+ 0,
+ tracker.nextAnnounceTime - new Date().getTime() / 1000
+ );
+ return `Next announce in ${Formatter.timeInterval(timeUntilAnnounce)}`;
+ }
+ case Torrent._TrackerQueued:
+ return 'Announce is queued';
+ case Torrent._TrackerInactive:
+ return tracker.isBackup
+ ? 'Tracker will be used as a backup'
+ : 'Announce not scheduled';
+ default:
+ return `unknown announce state: ${tracker.announceState}`;
+ }
+ }
+
+ static lastAnnounceStatus(tracker) {
+ let lastAnnounceLabel = 'Last Announce';
+ let lastAnnounce = ['N/A'];
+
+ if (tracker.hasAnnounced) {
+ const lastAnnounceTime = Formatter.timestamp(tracker.lastAnnounceTime);
+ if (tracker.lastAnnounceSucceeded) {
+ lastAnnounce = [
+ lastAnnounceTime,
+ ' (got ',
+ Formatter.countString('peer', 'peers', tracker.lastAnnouncePeerCount),
+ ')',
+ ];
+ } else {
+ lastAnnounceLabel = 'Announce error';
+ lastAnnounce = [
+ tracker.lastAnnounceResult ? `${tracker.lastAnnounceResult} - ` : '',
+ lastAnnounceTime,
+ ];
+ }
+ }
+ return {
+ label: lastAnnounceLabel,
+ value: lastAnnounce.join(''),
+ };
+ }
+
+ static lastScrapeStatus(tracker) {
+ let lastScrapeLabel = 'Last Scrape';
+ let lastScrape = 'N/A';
+
+ if (tracker.hasScraped) {
+ const lastScrapeTime = Formatter.timestamp(tracker.lastScrapeTime);
+ if (tracker.lastScrapeSucceeded) {
+ lastScrape = lastScrapeTime;
+ } else {
+ lastScrapeLabel = 'Scrape error';
+ lastScrape =
+ (tracker.lastScrapeResult ? `${tracker.lastScrapeResult} - ` : '') +
+ lastScrapeTime;
+ }
+ }
+ return {
+ label: lastScrapeLabel,
+ value: lastScrape,
+ };
+ }
+
+ _updateTiers() {
+ const na = 'N/A';
+ const { list } = this.elements.tiers;
+ const { torrents } = this;
+
+ const rows = [];
+ for (const tor of torrents) {
+ const group = document.createElement('div');
+ group.classList.add('inspector-group');
+ rows.push(group);
+
+ // if >1 torrent to be shown, give a title
+ if (torrents.length > 1) {
+ const title = document.createElement('div');
+ title.classList.add('tier-list-torrent');
+ setTextContent(title, tor.getName());
+ rows.push(title);
+ }
+
+ tor.getTrackers().forEach((tracker, index) => {
+ const announceState = Inspector.getAnnounceState(tracker);
+ const lastAnnounceStatusHash = Inspector.lastAnnounceStatus(tracker);
+ const lastScrapeStatusHash = Inspector.lastScrapeStatus(tracker);
+
+ const tier_div = document.createElement('div');
+ tier_div.classList.add('tier-list-row', index % 2 ? 'odd' : 'even');
+
+ let element = document.createElement('div');
+ element.classList.add('tier-list-tracker');
+ setTextContent(
+ element,
+ `${tracker.domain || tracker.host || tracker.announce} - tier ${
+ tracker.tier + 1
+ }`
+ );
+ element.setAttribute('title', tracker.announce);
+ tier_div.append(element);
+
+ element = document.createElement('div');
+ element.classList.add('tier-announce');
+ setTextContent(
+ element,
+ `${lastAnnounceStatusHash.label}: ${lastAnnounceStatusHash.value}`
+ );
+ tier_div.append(element);
+
+ element = document.createElement('div');
+ element.classList.add('tier-seeders');
+ setTextContent(
+ element,
+ `Seeders: ${tracker.seederCount > -1 ? tracker.seederCount : na}`
+ );
+ tier_div.append(element);
+
+ element = document.createElement('div');
+ element.classList.add('tier-state');
+ setTextContent(element, announceState);
+ tier_div.append(element);
+
+ element = document.createElement('div');
+ element.classList.add('tier-leechers');
+ setTextContent(
+ element,
+ `Leechers: ${tracker.leecherCount > -1 ? tracker.leecherCount : na}`
+ );
+ tier_div.append(element);
+
+ element = document.createElement('div');
+ element.classList.add('tier-scrape');
+ setTextContent(
+ element,
+ `${lastScrapeStatusHash.label}: ${lastScrapeStatusHash.value}`
+ );
+ tier_div.append(element);
+
+ element = document.createElement('div');
+ element.classList.add('tier-downloads');
+ setTextContent(
+ element,
+ `Downloads: ${
+ tracker.downloadCount > -1 ? tracker.downloadCount : na
+ }`
+ );
+ tier_div.append(element);
+
+ rows.push(tier_div);
+ });
+ }
+
+ // TODO: modify instead of rebuilding wholesale?
+ while (list.firstChild) {
+ list.firstChild.remove();
+ }
+ list.append(...rows);
+ }
+
+ /// FILES PAGE
+
+ _changeFileCommand(fileIndices, command) {
+ const { controller, file_torrent } = this;
+ const torrentId = file_torrent.getId();
+ controller.changeFileCommand(torrentId, fileIndices, command);
+ }
+
+ _onFileWantedToggled(event_) {
+ const { indices, wanted } = event_;
+ this._changeFileCommand(
+ indices,
+ wanted ? 'files-wanted' : 'files-unwanted'
+ );
+ }
+
+ _onFilePriorityToggled(event_) {
+ const { indices, priority } = event_;
+
+ let command = null;
+ switch (priority) {
+ case -1:
+ command = 'priority-low';
+ break;
+ case 1:
+ command = 'priority-high';
+ break;
+ default:
+ command = 'priority-normal';
+ break;
+ }
+
+ this._changeFileCommand(indices, command);
+ }
+
+ _clearFileList() {
+ const { list } = this.elements.files;
+ while (list.firstChild) {
+ list.firstChild.remove();
+ }
+
+ this.file_torrent = null;
+ this.file_torrent_n = null;
+ this.file_rows = null;
+ }
+
+ static createFileTreeModel(tor) {
+ const leaves = [];
+ const tree = {
+ children: {},
+ file_indices: [],
+ };
+
+ tor.getFiles().forEach((file, index) => {
+ const { name } = file;
+ const tokens = name.split('/');
+ let walk = tree;
+ for (const [index_, token] of tokens.entries()) {
+ let sub = walk.children[token];
+ if (!sub) {
+ walk.children[token] = sub = {
+ children: {},
+ depth: index_,
+ file_indices: [],
+ name: token,
+ parent: walk,
+ };
+ }
+ walk = sub;
+ }
+ walk.file_index = index;
+ delete walk.children;
+ leaves.push(walk);
+ });
+
+ for (const leaf of leaves) {
+ const { file_index } = leaf;
+ let walk = leaf;
+ do {
+ walk.file_indices.push(file_index);
+ walk = walk.parent;
+ } while (walk);
+ }
+
+ return tree;
+ }
+
+ addNodeToView(tor, parent, sub, index) {
+ const row = new FileRow(
+ tor,
+ sub.depth,
+ sub.name,
+ sub.file_indices,
+ index % 2
+ );
+ row.addEventListener('wantedToggled', this._onFileWantedToggled.bind(this));
+ row.addEventListener(
+ 'priorityToggled',
+ this._onFilePriorityToggled.bind(this)
+ );
+ this.file_rows.push(row);
+ parent.append(row.getElement());
+ }
+
+ addSubtreeToView(tor, parent, sub, index) {
+ if (sub.parent) {
+ this.addNodeToView(tor, parent, sub, index++);
+ }
+ if (sub.children) {
+ for (const value of Object.values(sub.children)) {
+ index = this.addSubtreeToView(tor, parent, value, index);
+ }
+ }
+ return index;
+ }
+
+ _updateFiles() {
+ const { list } = this.elements.files;
+ const { torrents } = this;
+
+ // only show one torrent at a time
+ if (torrents.length !== 1) {
+ this._clearFileList();
+ return;
+ }
+
+ const [tor] = torrents;
+ const n = tor.getFiles().length;
+ if (tor !== this.file_torrent || n !== this.file_torrent_n) {
+ // rebuild the file list...
+ this._clearFileList();
+ this.file_torrent = tor;
+ this.file_torrent_n = n;
+ this.file_rows = [];
+ const fragment = document.createDocumentFragment();
+ const tree = Inspector.createFileTreeModel(tor);
+ this.addSubtreeToView(tor, fragment, tree, 0);
+ list.append(fragment);
+ } else {
+ // ...refresh the already-existing file list
+ this.file_rows.forEach((row) => row.refresh());
+ }
+ }
+}
diff --git a/web/src/main.js b/web/src/main.js
new file mode 100644
index 000000000..c036fb15e
--- /dev/null
+++ b/web/src/main.js
@@ -0,0 +1,29 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { ActionManager } from './action-manager.js';
+import { Notifications } from './notifications.js';
+import { Prefs } from './prefs.js';
+import { Transmission } from './transmission.js';
+import { debounce } from './utils.js';
+
+import '../style/transmission-app.scss';
+
+function main() {
+ const action_manager = new ActionManager();
+ const prefs = new Prefs();
+ const notifications = new Notifications(prefs);
+ const transmission = new Transmission(action_manager, notifications, prefs);
+
+ const scroll_soon = debounce(() =>
+ transmission.elements.torrent_list.scrollTo(0, 1)
+ );
+ window.addEventListener('load', scroll_soon);
+ window.onorientationchange = scroll_soon;
+}
+
+document.addEventListener('DOMContentLoaded', main);
diff --git a/web/src/move-dialog.js b/web/src/move-dialog.js
new file mode 100644
index 000000000..c5ea8f561
--- /dev/null
+++ b/web/src/move-dialog.js
@@ -0,0 +1,84 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+let default_path = '';
+
+import { createDialogContainer } from './utils.js';
+
+export class MoveDialog extends EventTarget {
+ constructor(controller, remote) {
+ super();
+
+ this.controller = controller;
+ this.remote = remote;
+ this.elements = {};
+ this.torrents = [];
+
+ this.show();
+ }
+
+ show() {
+ const torrents = this.controller.getSelectedTorrents();
+ if (torrents.length === 0) {
+ return;
+ }
+
+ default_path = default_path || torrents[0].getDownloadDir();
+
+ this.torrents = torrents;
+ this.elements = MoveDialog._create();
+ this.elements.confirm.addEventListener('click', () => this._onConfirm());
+ this.elements.dismiss.addEventListener('click', () => this._onDismiss());
+ this.elements.entry.value = default_path;
+ document.body.append(this.elements.root);
+
+ this.elements.entry.focus();
+ }
+
+ close() {
+ this.elements.root.remove();
+
+ this.dispatchEvent(new Event('close'));
+
+ delete this.controller;
+ delete this.remote;
+ delete this.elements;
+ delete this.torrents;
+ }
+
+ _onDismiss() {
+ this.close();
+ }
+
+ _onConfirm() {
+ const ids = this.torrents.map((tor) => tor.getId());
+ const path = this.elements.entry.value.trim();
+ default_path = path;
+ this.remote.moveTorrents(ids, path);
+ this.close();
+ }
+
+ static _create() {
+ const elements = createDialogContainer('move-dialog');
+ elements.root.setAttribute('aria-label', 'Move Torrent');
+ elements.heading.textContent = 'Set Torrent Location';
+ confirm.textContent = 'Apply';
+
+ const label = document.createElement('label');
+ label.setAttribute('for', 'torrent-path');
+ label.textContent = 'Location:';
+ elements.workarea.append(label);
+
+ const entry = document.createElement('input');
+ entry.setAttribute('type', 'text');
+ entry.id = 'torrent-path';
+ elements.entry = entry;
+ elements.workarea.append(entry);
+
+ return elements;
+ }
+}
diff --git a/web/src/notifications.js b/web/src/notifications.js
new file mode 100644
index 000000000..caa1ed1f3
--- /dev/null
+++ b/web/src/notifications.js
@@ -0,0 +1,60 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { setTextContent } from './utils.js';
+
+export class Notifications {
+ constructor(prefs) {
+ this._prefs = prefs;
+ this._elements = {
+ toggle: document.querySelector('#toggle-notifications'),
+ };
+ }
+
+ _setEnabled(enabled) {
+ this.prefs.notifications_enabled = enabled;
+ setTextContent(
+ this._toggle,
+ `${enabled ? 'Disable' : 'Enable'} Notifications`
+ );
+ }
+
+ _requestPermission() {
+ Notification.requestPermission().then((s) =>
+ this._setEnabled(s === 'granted')
+ );
+ }
+
+ toggle() {
+ if (this._enabled) {
+ this._setEnabled(false);
+ } else if (Notification.permission === 'granted') {
+ this._setEnabled(true);
+ } else if (Notification.permission !== 'denied') {
+ this._requestPermission();
+ }
+ }
+
+ /*
+ // TODO:
+ // $(transmission).bind('downloadComplete seedingComplete', (event, torrent) => {
+ // if (notificationsEnabled) {
+ const title = `${event.type === 'downloadComplete' ? 'Download' : 'Seeding'} complete`;
+ const content = torrent.getName();
+ const notification = window.webkitNotifications.createNotification(
+ 'style/transmission/images/logo.png',
+ title,
+ content
+ );
+ notification.show();
+ setTimeout(() => {
+ notification.cancel();
+ }, 5000);
+ }
+ });
+*/
+}
diff --git a/web/src/open-dialog.js b/web/src/open-dialog.js
new file mode 100644
index 000000000..91d76c946
--- /dev/null
+++ b/web/src/open-dialog.js
@@ -0,0 +1,194 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { AlertDialog } from './alert-dialog.js';
+import { Formatter } from './formatter.js';
+import { createDialogContainer, makeUUID } from './utils.js';
+
+export class OpenDialog extends EventTarget {
+ constructor(controller, remote) {
+ super();
+
+ this.controller = controller;
+ this.remote = remote;
+
+ this.elements = this._create();
+ this.elements.dismiss.addEventListener('click', () => this._onDismiss());
+ this.elements.confirm.addEventListener('click', () => this._onConfirm());
+ this._updateFreeSpaceInAddDialog();
+ document.body.append(this.elements.root);
+ this.elements.url_input.focus();
+ }
+
+ close() {
+ if (!this.closed) {
+ clearInterval(this.interval);
+
+ this.elements.root.remove();
+ this.dispatchEvent(new Event('close'));
+
+ for (const key of Object.keys(this)) {
+ delete this[key];
+ }
+ this.closed = true;
+ }
+ }
+
+ _onDismiss() {
+ this.close();
+ }
+
+ _updateFreeSpaceInAddDialog() {
+ const path = this.elements.folder_input.value;
+ this.remote.getFreeSpace(path, (dir, bytes) => {
+ const string = bytes > 0 ? `${Formatter.size(bytes)} Free` : '';
+ this.elements.freespace.textContent = string;
+ });
+ }
+
+ _onConfirm() {
+ const { remote } = this;
+ const { file_input, folder_input, start_input, url_input } = this.elements;
+ const paused = !start_input.checked;
+ const destination = folder_input.value.trim();
+
+ for (const file of file_input.files) {
+ const reader = new FileReader();
+ reader.addEventListener('load', (e) => {
+ const contents = e.target.result;
+ const key = 'base64,';
+ const index = contents.indexOf(key);
+ if (index === -1) {
+ return;
+ }
+ const o = {
+ arguments: {
+ 'download-dir': destination,
+ metainfo: contents.slice(Math.max(0, index + key.length)),
+ paused,
+ },
+ method: 'torrent-add',
+ };
+ console.log(o);
+ remote.sendRequest(o, (response) => {
+ if (response.result !== 'success') {
+ alert(`Error adding "${file.name}": ${response.result}`);
+ this.controller.setCurrentPopup(
+ new AlertDialog({
+ heading: `Error adding "${file.name}"`,
+ message: response.result,
+ })
+ );
+ }
+ });
+ });
+ reader.readAsDataURL(file);
+ }
+
+ let url = url_input.value.trim();
+ if (url.length > 0) {
+ if (url.match(/^[\da-f]{40}$/i)) {
+ url = `magnet:?xt=urn:btih:${url}`;
+ }
+ const o = {
+ arguments: {
+ 'download-dir': destination,
+ filename: url,
+ paused,
+ },
+ method: 'torrent-add',
+ };
+ console.log(o);
+ remote.sendRequest(o, (payload, response) => {
+ if (response.result !== 'success') {
+ this.controller.setCurrentPopup(
+ new AlertDialog({
+ heading: `Error adding "${url}"`,
+ message: response.result,
+ })
+ );
+ }
+ });
+ }
+
+ this._onDismiss();
+ }
+
+ _create() {
+ const elements = createDialogContainer();
+ const { confirm, root, heading, workarea } = elements;
+
+ root.classList.add('open-torrent');
+ heading.textContent = 'Add Torrents';
+ confirm.textContent = 'Add';
+
+ let input_id = makeUUID();
+ let label = document.createElement('label');
+ label.setAttribute('for', input_id);
+ label.textContent = 'Please select torrent files to add:';
+ workarea.append(label);
+
+ let input = document.createElement('input');
+ input.type = 'file';
+ input.name = 'torrent-files[]';
+ input.id = input_id;
+ input.multiple = 'multiple';
+ workarea.append(input);
+ elements.file_input = input;
+
+ input_id = makeUUID();
+ label = document.createElement('label');
+ label.setAttribute('for', input_id);
+ label.textContent = 'Or enter a URL:';
+ workarea.append(label);
+
+ input = document.createElement('input');
+ input.type = 'url';
+ input.id = input_id;
+ workarea.append(input);
+ elements.url_input = input;
+
+ input_id = makeUUID();
+ label = document.createElement('label');
+ label.id = 'add-dialog-folder-label';
+ label.for = input_id;
+ label.textContent = 'Destination folder:';
+ workarea.append(label);
+
+ const freespace = document.createElement('span');
+ freespace.id = 'free-space-text';
+ label.append(freespace);
+ workarea.append(label);
+ elements.freespace = freespace;
+
+ input = document.createElement('input');
+ input.type = 'text';
+ input.id = 'add-dialog-folder-input';
+ input.addEventListener('change', () => this._updateFreeSpaceInAddDialog());
+ input.value = this.controller.session_properties['download-dir'];
+ workarea.append(input);
+ elements.folder_input = input;
+
+ const checkarea = document.createElement('div');
+ workarea.append(checkarea);
+
+ const check = document.createElement('input');
+ check.type = 'checkbox';
+ check.id = 'auto-start-check';
+ check.checked = this.controller.shouldAddedTorrentsStart();
+ checkarea.append(check);
+ elements.start_input = check;
+
+ label = document.createElement('label');
+ label.id = 'auto-start-label';
+ label.setAttribute('for', check.id);
+ label.textContent = 'Start when added';
+ checkarea.append(label);
+
+ return elements;
+ }
+}
diff --git a/web/src/overflow-menu.js b/web/src/overflow-menu.js
new file mode 100644
index 000000000..a5888c8c1
--- /dev/null
+++ b/web/src/overflow-menu.js
@@ -0,0 +1,466 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { Formatter } from './formatter.js';
+import { Prefs } from './prefs.js';
+import { RPC } from './remote.js';
+import { OutsideClickListener, setEnabled } from './utils.js';
+
+export class OverflowMenu extends EventTarget {
+ constructor(session_manager, prefs, remote, action_manager) {
+ super();
+
+ this.action_listener = this._onActionChange.bind(this);
+ this.action_manager = action_manager;
+ this.action_manager.addEventListener('change', this.action_listener);
+
+ this.prefs_listener = this._onPrefsChange.bind(this);
+ this.prefs = prefs;
+ this.prefs.addEventListener('change', this.prefs_listener);
+
+ this.closed = false;
+ this.remote = remote;
+ this.name = 'overflow-menu';
+
+ this.session_listener = this._onSessionChange.bind(this);
+ this.session_manager = session_manager;
+ this.session_manager.addEventListener(
+ 'session-change',
+ this.session_listener
+ );
+
+ const { session_properties } = session_manager;
+ Object.assign(this, this._create(session_properties));
+
+ this.outside = new OutsideClickListener(this.root);
+ this.outside.addEventListener('click', () => this.close());
+ Object.seal(this);
+
+ this.show();
+ }
+
+ show() {
+ document.body.append(this.root);
+ }
+
+ close() {
+ if (!this.closed) {
+ this.outside.stop();
+ this.session_manager.removeEventListener(
+ 'session-change',
+ this.session_listener
+ );
+ this.action_manager.removeEventListener('change', this.action_listener);
+ this.prefs.removeEventListener('change', this.prefs_listener);
+
+ this.root.remove();
+ this.dispatchEvent(new Event('close'));
+
+ for (const key of Object.keys(this)) {
+ this[key] = null;
+ }
+ this.closed = true;
+ }
+ }
+
+ _onSessionChange(event_) {
+ const { alt_speed_check } = this.elements;
+ const { session_properties } = event_;
+ alt_speed_check.checked = session_properties[RPC._TurtleState];
+ }
+
+ _onPrefsChange(event_) {
+ switch (event_.key) {
+ case Prefs.SortDirection:
+ case Prefs.SortMode:
+ this.root.querySelector(`[data-pref="${event_.key}"]`).value =
+ event_.value;
+ break;
+ default:
+ break;
+ }
+ }
+
+ _onActionChange(event_) {
+ const element = this.actions[event_.action];
+ if (element) {
+ this._updateElement(element);
+ }
+ }
+
+ _updateElement(element) {
+ if (element.dataset.action) {
+ const { action } = element.dataset;
+ const shortcuts = this.action_manager.keyshortcuts(action);
+ if (shortcuts) {
+ element.setAttribute('aria-keyshortcuts', shortcuts);
+ }
+ setEnabled(element, this.action_manager.isEnabled(action));
+ }
+ }
+
+ _onClick(event_) {
+ const { action, pref } = event_.target.dataset;
+
+ if (action) {
+ this.action_manager.click(action);
+ return;
+ }
+
+ if (pref) {
+ this.prefs[pref] = event_.target.value;
+ return;
+ }
+
+ console.log('unhandled');
+ console.log(event_);
+ console.trace();
+ }
+
+ _create(session_properties) {
+ const actions = {};
+ const on_click = this._onClick.bind(this);
+ const elements = {};
+
+ const make_section = (classname, title) => {
+ const section = document.createElement('fieldset');
+ section.classList.add('section', classname);
+ const legend = document.createElement('legend');
+ legend.classList.add('title');
+ legend.textContent = title;
+ section.append(legend);
+ return section;
+ };
+
+ const make_button = (parent, text, action) => {
+ const e = document.createElement('button');
+ e.textContent = text;
+ e.addEventListener('click', on_click);
+ parent.append(e);
+ if (action) {
+ e.dataset.action = action;
+ }
+ return e;
+ };
+
+ const root = document.createElement('div');
+ root.classList.add('overflow-menu', 'popup');
+
+ let section = make_section('display', 'Display');
+ root.append(section);
+
+ let options = document.createElement('div');
+ options.id = 'display-options';
+ section.append(options);
+
+ // sort mode
+
+ let div = document.createElement('div');
+ options.append(div);
+
+ let label = document.createElement('label');
+ label.id = 'display-sort-mode-label';
+ label.textContent = 'Sort by';
+ div.append(label);
+
+ let select = document.createElement('select');
+ select.id = 'display-sort-mode-select';
+ select.dataset.pref = Prefs.SortMode;
+ div.append(select);
+
+ const sort_modes = [
+ [Prefs.SortByActivity, 'Activity'],
+ [Prefs.SortByAge, 'Age'],
+ [Prefs.SortByName, 'Name'],
+ [Prefs.SortByProgress, 'Progress'],
+ [Prefs.SortByQueue, 'Queue order'],
+ [Prefs.SortByRatio, 'Ratio'],
+ [Prefs.SortBySize, 'Size'],
+ [Prefs.SortByState, 'State'],
+ ];
+ for (const [value, text] of sort_modes) {
+ const option = document.createElement('option');
+ option.value = value;
+ option.textContent = text;
+ select.append(option);
+ }
+
+ label.setAttribute('for', select.id);
+ select.value = this.prefs.sort_mode;
+ select.addEventListener('change', (event_) => {
+ this.prefs.sort_mode = event_.target.value;
+ });
+
+ // sort direction
+
+ div = document.createElement('div');
+ options.append(div);
+
+ let check = document.createElement('input');
+ check.id = 'display-sort-reverse-check';
+ check.dataset.pref = Prefs.SortDirection;
+ check.type = 'checkbox';
+ div.append(check);
+
+ label = document.createElement('label');
+ label.id = 'display-sort-reverse-label';
+ label.setAttribute('for', check.id);
+ label.textContent = 'Reverse sort';
+ div.append(label);
+
+ check.checked = this.prefs.sort_direction !== Prefs.SortAscending;
+ check.addEventListener('input', (event_) => {
+ this.prefs.sort_direction = event_.target.checked
+ ? Prefs.SortDescending
+ : Prefs.SortAscending;
+ });
+
+ // compact
+
+ div = document.createElement('div');
+ options.append(div);
+
+ const action = 'toggle-compact-rows';
+ check = document.createElement('input');
+ check.id = 'display-compact-check';
+ check.dataset.action = action;
+ check.type = 'checkbox';
+ div.append(check);
+
+ label = document.createElement('label');
+ label.id = 'display-compact-label';
+ label.for = check.id;
+ label.setAttribute('for', check.id);
+ label.textContent = this.action_manager.text(action);
+ div.append(label);
+
+ check.checked = this.prefs.display_mode === Prefs.DisplayCompact;
+ check.addEventListener('input', (event_) => {
+ const { checked } = event_.target;
+ this.prefs.display_mode = checked
+ ? Prefs.DisplayCompact
+ : Prefs.DisplayFull;
+ });
+
+ // fullscreen
+
+ div = document.createElement('div');
+ options.append(div);
+
+ check = document.createElement('input');
+ check.id = 'display-fullscreen-check';
+ check.type = 'checkbox';
+ const is_fullscreen = () => document.fullscreenElement !== null;
+ check.checked = is_fullscreen();
+ check.addEventListener('input', () => {
+ if (is_fullscreen()) {
+ document.exitFullscreen();
+ } else {
+ document.body.requestFullscreen();
+ }
+ });
+ document.addEventListener('fullscreenchange', () => {
+ check.checked = is_fullscreen();
+ });
+ div.append(check);
+
+ label = document.createElement('label');
+ label.id = 'display-fullscreen-label';
+ label.for = check.id;
+ label.setAttribute('for', check.id);
+ label.textContent = 'Fullscreen';
+ div.append(label);
+
+ section = make_section('speed', 'Speed Limit');
+ root.append(section);
+
+ options = document.createElement('div');
+ options.id = 'speed-options';
+ section.append(options);
+
+ // speed up
+
+ div = document.createElement('div');
+ div.classList.add('speed-up');
+ options.append(div);
+
+ label = document.createElement('label');
+ label.id = 'speed-up-label';
+ label.textContent = 'Upload:';
+ div.append(label);
+
+ const unlimited = 'Unlimited';
+ select = document.createElement('select');
+ select.id = 'speed-up-select';
+ div.append(select);
+
+ const speeds = ['10', '100', '200', '500', '750', unlimited];
+ for (const speed of [
+ ...new Set(speeds)
+ .add(`${session_properties[RPC._UpSpeedLimit]}`)
+ .values(),
+ ].sort()) {
+ const option = document.createElement('option');
+ option.value = speed;
+ option.textContent =
+ speed === unlimited ? unlimited : Formatter.speed(speed);
+ select.append(option);
+ }
+
+ label.setAttribute('for', select.id);
+ select.value = session_properties[RPC._UpSpeedLimited]
+ ? `${session_properties[RPC._UpSpeedLimit]}`
+ : unlimited;
+ select.addEventListener('change', (event_) => {
+ const { value } = event_.target;
+ console.log(event_);
+ if (event_.target.value === unlimited) {
+ this.remote.savePrefs({ [RPC._UpSpeedLimited]: false });
+ } else {
+ this.remote.savePrefs({
+ [RPC._UpSpeedLimited]: true,
+ [RPC._UpSpeedLimit]: Number.parseInt(value, 10),
+ });
+ }
+ });
+
+ // speed down
+
+ div = document.createElement('div');
+ div.classList.add('speed-down');
+ options.append(div);
+
+ label = document.createElement('label');
+ label.id = 'speed-down-label';
+ label.textContent = 'Download:';
+ div.append(label);
+
+ select = document.createElement('select');
+ select.id = 'speed-down-select';
+ div.append(select);
+
+ for (const speed of [
+ ...new Set(speeds)
+ .add(`${session_properties[RPC._DownSpeedLimit]}`)
+ .values(),
+ ].sort()) {
+ const option = document.createElement('option');
+ option.value = speed;
+ option.textContent = speed;
+ select.append(option);
+ }
+
+ label.setAttribute('for', select.id);
+ select.value = session_properties[RPC._DownSpeedLimited]
+ ? `${session_properties[RPC._DownSpeedLimit]}`
+ : unlimited;
+ select.addEventListener('change', (event_) => {
+ const { value } = event_.target;
+ console.log(event_);
+ if (event_.target.value === unlimited) {
+ this.remote.savePrefs({ [RPC._DownSpeedLimited]: false });
+ } else {
+ this.remote.savePrefs({
+ [RPC._DownSpeedLimited]: true,
+ [RPC._DownSpeedLimit]: Number.parseInt(value, 10),
+ });
+ }
+ });
+
+ // alt speed
+
+ div = document.createElement('div');
+ div.classList.add('alt-speed');
+ options.append(div);
+
+ check = document.createElement('input');
+ check.id = 'alt-speed-check';
+ check.type = 'checkbox';
+ check.checked = session_properties[RPC._TurtleState];
+ check.addEventListener('change', (event_) => {
+ this.remote.savePrefs({
+ [RPC._TurtleState]: event_.target.checked,
+ });
+ });
+ div.append(check);
+ elements.alt_speed_check = check;
+
+ label = document.createElement('label');
+ label.id = 'alt-speed-image';
+ label.setAttribute('for', check.id);
+ div.append(label);
+
+ label = document.createElement('label');
+ label.id = 'alt-speed-label';
+ label.setAttribute('for', check.id);
+ label.textContent = 'Use Temp limits';
+ div.append(label);
+
+ label = document.createElement('label');
+ label.id = 'alt-speed-values-label';
+ label.setAttribute('for', check.id);
+
+ const up = Formatter.speed(session_properties[RPC._TurtleUpSpeedLimit]);
+ const dn = Formatter.speed(session_properties[RPC._TurtleDownSpeedLimit]);
+ label.textContent = `(${up} up, ${dn} down)`;
+ div.append(label);
+
+ section = make_section('actions', 'Actions');
+ root.append(section);
+
+ for (const action_name of [
+ 'show-preferences-dialog',
+ 'pause-all-torrents',
+ 'start-all-torrents',
+ ]) {
+ const text = this.action_manager.text(action_name);
+ actions[action_name] = make_button(section, text, action_name);
+ }
+
+ section = make_section('info', 'Info');
+ root.append(section);
+
+ options = document.createElement('div');
+ section.append(options);
+
+ for (const action_name of [
+ 'show-about-dialog',
+ 'show-shortcuts-dialog',
+ 'show-statistics-dialog',
+ ]) {
+ const text = this.action_manager.text(action_name);
+ actions[action_name] = make_button(options, text, action_name);
+ }
+
+ section = make_section('links', 'Links');
+ root.append(section);
+
+ options = document.createElement('div');
+ section.append(options);
+
+ let e = document.createElement('a');
+ e.href = 'https://transmissionbt.com/';
+ e.tabindex = '0';
+ e.textContent = 'Homepage';
+ options.append(e);
+
+ e = document.createElement('a');
+ e.href = 'https://transmissionbt.com/donate/';
+ e.tabindex = '0';
+ e.textContent = 'Tip Jar';
+ options.append(e);
+
+ e = document.createElement('a');
+ e.href = 'https://github.com/transmission/transmission/';
+ e.tabindex = '0';
+ e.textContent = 'Source Code';
+ options.append(e);
+
+ Object.values(actions).forEach(this._updateElement.bind(this));
+ return { actions, elements, root };
+ }
+}
diff --git a/web/src/prefs-dialog.js b/web/src/prefs-dialog.js
new file mode 100644
index 000000000..10f2a0826
--- /dev/null
+++ b/web/src/prefs-dialog.js
@@ -0,0 +1,710 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { Formatter } from './formatter.js';
+import {
+ OutsideClickListener,
+ createTabsContainer,
+ makeUUID,
+ setEnabled,
+ setTextContent,
+} from './utils.js';
+
+export class PrefsDialog extends EventTarget {
+ static _initTimeDropDown(e) {
+ for (let index = 0; index < 24 * 4; ++index) {
+ const hour = Number.parseInt(index / 4, 10);
+ const mins = (index % 4) * 15;
+ const value = index * 15;
+ const content = `${hour}:${mins || '00'}`;
+ e.options[index] = new Option(content, value);
+ }
+ }
+
+ static _initDayDropDown(e) {
+ const options = [
+ ['Everyday', '127'],
+ ['Weekdays', '62'],
+ ['Weekends', '65'],
+ ['Sunday', '1'],
+ ['Monday', '2'],
+ ['Tuesday', '4'],
+ ['Wednesday', '8'],
+ ['Thursday', '16'],
+ ['Friday', '32'],
+ ['Saturday', '64'],
+ ];
+ for (let index = 0; options[index]; ++index) {
+ const [text, value] = options[index];
+ e.options[index] = new Option(text, value);
+ }
+ }
+
+ _checkPort() {
+ const element = this.elements.network.port_status_label;
+ element.removeAttribute('data-open');
+ setTextContent(element, 'Checking...');
+ this.remote.checkPort(this._onPortChecked, this);
+ }
+
+ _onPortChecked(response) {
+ const element = this.elements.network.port_status_label;
+ const is_open = response.arguments['port-is-open'];
+ element.dataset.open = is_open;
+ setTextContent(element, is_open ? 'Open' : 'Closed');
+ }
+
+ _setBlocklistButtonEnabled(b) {
+ const e = this.elements.peers.blocklist_update_button;
+ setEnabled(e, b);
+ e.value = b ? 'Update' : 'Updating...';
+ }
+
+ static _getValue(e) {
+ switch (e.type) {
+ case 'checkbox':
+ case 'radio':
+ return e.checked;
+
+ case 'number':
+ case 'text':
+ case 'url': {
+ const string = e.value;
+ if (Number.parseInt(string, 10).toString() === string) {
+ return Number.parseInt(string, 10);
+ }
+ if (Number.parseFloat(string).toString() === string) {
+ return Number.parseFloat(string);
+ }
+ return string;
+ }
+
+ default:
+ return null;
+ }
+ }
+
+ // this callback is for controls whose changes can be applied
+ // immediately, like checkboxs, radioboxes, and selects
+ _onControlChanged(event_) {
+ const { key } = event_.target.dataset;
+ this.remote.savePrefs({
+ [key]: PrefsDialog._getValue(event_.target),
+ });
+ if (key === 'peer-port' || key === 'port-forwarding-enabled') {
+ this._checkPort();
+ }
+ }
+
+ _onDialogClosed() {
+ this.dispatchEvent(new Event('closed'));
+ }
+
+ // update the dialog's controls
+ _update(o) {
+ if (!o) {
+ return;
+ }
+
+ this._setBlocklistButtonEnabled(true);
+
+ for (const [key, value] of Object.entries(o)) {
+ for (const element of this.elements.root.querySelectorAll(
+ `[data-key="${key}"]`
+ )) {
+ if (key === 'blocklist-size') {
+ const n = Formatter.number(value);
+ element.innerHTML = `Blocklist has ${n} rules`;
+ setTextContent(this.elements.peers.blocklist_update_button, 'Update');
+ } else {
+ switch (element.type) {
+ case 'checkbox':
+ case 'radio':
+ if (element.checked !== value) {
+ element.checked = value;
+ element.dispatchEvent(new Event('change'));
+ }
+ break;
+ case 'text':
+ case 'url':
+ case 'email':
+ case 'number':
+ case 'search':
+ // don't change the text if the user's editing it.
+ // it's very annoying when that happens!
+ if (
+ // eslint-disable-next-line eqeqeq
+ element.value != value &&
+ element !== document.activeElement
+ ) {
+ element.value = value;
+ element.dispatchEvent(new Event('change'));
+ }
+ break;
+ case 'select-one':
+ if (element.value !== value) {
+ element.value = value;
+ element.dispatchEvent(new Event('change'));
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ shouldAddedTorrentsStart() {
+ return this.data.elements.root.find('#start-added-torrents')[0].checked;
+ }
+
+ static _createCheckAndLabel(id, text) {
+ const root = document.createElement('div');
+ root.id = id;
+
+ const check = document.createElement('input');
+ check.id = makeUUID();
+ check.type = 'checkbox';
+ root.append(check);
+
+ const label = document.createElement('label');
+ label.textContent = text;
+ label.setAttribute('for', check.id);
+ root.append(label);
+
+ return { check, label, root };
+ }
+
+ static _enableIfChecked(element, check) {
+ const callback = () => {
+ if (element.tagName === 'INPUT') {
+ setEnabled(element, check.checked);
+ } else {
+ element.classList.toggle('disabled', !check.checked);
+ }
+ };
+ check.addEventListener('change', callback);
+ callback();
+ }
+
+ static _createTorrentsPage() {
+ const root = document.createElement('div');
+ root.classList.add('prefs-torrents-page');
+
+ let label = document.createElement('div');
+ label.textContent = 'Downloading';
+ label.classList.add('section-label');
+ root.append(label);
+
+ label = document.createElement('label');
+ label.textContent = 'Download to:';
+ root.append(label);
+
+ let input = document.createElement('input');
+ input.type = 'text';
+ input.id = makeUUID();
+ input.dataset.key = 'download-dir';
+ label.setAttribute('for', input.id);
+ root.append(input);
+ const download_dir = input;
+
+ let cal = PrefsDialog._createCheckAndLabel(
+ 'autostart-div',
+ 'Start when added'
+ );
+ cal.check.dataset.key = 'start-added-torrents';
+ root.append(cal.root);
+ const autostart_check = cal.check;
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'suffix-div',
+ `Append "part" to incomplete files' names`
+ );
+ cal.check.dataset.key = 'rename-partial-files';
+ root.append(cal.root);
+ const suffix_check = cal.check;
+
+ label = document.createElement('div');
+ label.textContent = 'Seeding';
+ label.classList.add('section-label');
+ root.append(label);
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'stop-ratio-div',
+ 'Stop seeding at ratio:'
+ );
+ cal.check.dataset.key = 'seedRatioLimited';
+ root.append(cal.root);
+ const stop_ratio_check = cal.check;
+
+ input = document.createElement('input');
+ input.type = 'number';
+ input.dataset.key = 'seedRatioLimit';
+ root.append(input);
+ PrefsDialog._enableIfChecked(input, cal.check);
+ const stop_ratio_input = input;
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'stop-idle-div',
+ 'Stop seeding if idle for N mins:'
+ );
+ cal.check.dataset.key = 'idle-seeding-limit-enabled';
+ root.append(cal.root);
+ const stop_idle_check = cal.check;
+
+ input = document.createElement('input');
+ input.type = 'number';
+ input.dataset.key = 'idle-seeding-limit';
+ root.append(input);
+ PrefsDialog._enableIfChecked(input, cal.check);
+ const stop_idle_input = input;
+
+ return {
+ autostart_check,
+ download_dir,
+ root,
+ stop_idle_check,
+ stop_idle_input,
+ stop_ratio_check,
+ stop_ratio_input,
+ suffix_check,
+ };
+ }
+
+ static _createSpeedPage() {
+ const root = document.createElement('div');
+ root.classList.add('prefs-speed-page');
+
+ let label = document.createElement('div');
+ label.textContent = 'Speed Limits';
+ label.classList.add('section-label');
+ root.append(label);
+
+ let cal = PrefsDialog._createCheckAndLabel(
+ 'upload-speed-div',
+ 'Upload (kB/s):'
+ );
+ cal.check.dataset.key = 'speed-limit-up-enabled';
+ root.append(cal.root);
+ const upload_speed_check = cal.check;
+
+ let input = document.createElement('input');
+ input.type = 'number';
+ input.dataset.key = 'speed-limit-up';
+ root.append(input);
+ PrefsDialog._enableIfChecked(input, cal.check);
+ const upload_speed_input = input;
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'download-speed-div',
+ 'Download (kB/s):'
+ );
+ cal.check.dataset.key = 'speed-limit-down-enabled';
+ root.append(cal.root);
+ const download_speed_check = cal.check;
+
+ input = document.createElement('input');
+ input.type = 'number';
+ input.dataset.key = 'speed-limit-down';
+ root.append(input);
+ PrefsDialog._enableIfChecked(input, cal.check);
+ const download_speed_input = input;
+
+ label = document.createElement('div');
+ label.textContent = 'Alternative Speed Limits';
+ label.classList.add('section-label', 'alt-speed-section-label');
+ root.append(label);
+
+ label = document.createElement('div');
+ label.textContent =
+ 'Override normal speed limits manually or at scheduled times';
+ label.classList.add('alt-speed-label');
+ root.append(label);
+
+ label = document.createElement('label');
+ label.textContent = 'Upload (kB/s):';
+ root.append(label);
+
+ input = document.createElement('input');
+ input.type = 'number';
+ input.dataset.key = 'alt-speed-up';
+ input.id = makeUUID();
+ label.setAttribute('for', input.id);
+ root.append(input);
+ const alt_upload_speed_input = input;
+
+ label = document.createElement('label');
+ label.textContent = 'Download (kB/s):';
+ root.append(label);
+
+ input = document.createElement('input');
+ input.type = 'number';
+ input.dataset.key = 'alt-speed-down';
+ input.id = makeUUID();
+ label.setAttribute('for', input.id);
+ root.append(input);
+ const alt_download_speed_input = input;
+
+ cal = PrefsDialog._createCheckAndLabel('alt-times-div', 'Scheduled times');
+ cal.check.dataset.key = 'alt-speed-time-enabled';
+ root.append(cal.root);
+ const alt_times_check = cal.check;
+
+ label = document.createElement('label');
+ label.textContent = 'From:';
+ PrefsDialog._enableIfChecked(label, cal.check);
+ root.append(label);
+
+ let select = document.createElement('select');
+ select.id = makeUUID();
+ select.dataset.key = 'alt-speed-time-begin';
+ PrefsDialog._initTimeDropDown(select);
+ label.setAttribute('for', select.id);
+ root.append(select);
+ PrefsDialog._enableIfChecked(select, cal.check);
+ const alt_from_select = select;
+
+ label = document.createElement('label');
+ label.textContent = 'To:';
+ PrefsDialog._enableIfChecked(label, cal.check);
+ root.append(label);
+
+ select = document.createElement('select');
+ select.id = makeUUID();
+ select.dataset.key = 'alt-speed-time-end';
+ PrefsDialog._initTimeDropDown(select);
+ label.setAttribute('for', select.id);
+ root.append(select);
+ PrefsDialog._enableIfChecked(select, cal.check);
+ const alt_to_select = select;
+
+ label = document.createElement('label');
+ label.textContent = 'On days:';
+ PrefsDialog._enableIfChecked(label, cal.check);
+ root.append(label);
+
+ select = document.createElement('select');
+ select.id = makeUUID();
+ select.dataset.key = 'alt-speed-time-day';
+ PrefsDialog._initDayDropDown(select);
+ label.setAttribute('for', select.id);
+ root.append(select);
+ PrefsDialog._enableIfChecked(select, cal.check);
+ const alt_days_select = select;
+
+ return {
+ alt_days_select,
+ alt_download_speed_input,
+ alt_from_select,
+ alt_times_check,
+ alt_to_select,
+ alt_upload_speed_input,
+ download_speed_check,
+ download_speed_input,
+ root,
+ upload_speed_check,
+ upload_speed_input,
+ };
+ }
+
+ static _createPeersPage() {
+ const root = document.createElement('div');
+ root.classList.add('prefs-peers-page');
+
+ let label = document.createElement('div');
+ label.textContent = 'Connections';
+ label.classList.add('section-label');
+ root.append(label);
+
+ let cal = PrefsDialog._createCheckAndLabel(
+ 'max-peers-per-torrent-div',
+ 'Max peers per torrent:'
+ );
+ root.append(cal.root);
+ const max_peers_per_torrent_check = cal.check;
+
+ let input = document.createElement('input');
+ input.type = 'number';
+ input.dataset.key = 'peer-limit-per-torrent';
+ root.append(input);
+ PrefsDialog._enableIfChecked(input, cal.check);
+ const max_peers_per_torrent_input = input;
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'max-peers-overall-div',
+ 'Max peers overall:'
+ );
+ root.append(cal.root);
+ const max_peers_overall_check = cal.check;
+
+ input = document.createElement('input');
+ input.type = 'number';
+ input.dataset.key = 'peer-limit-global';
+ root.append(input);
+ PrefsDialog._enableIfChecked(input, cal.check);
+ const max_peers_overall_input = input;
+
+ label = document.createElement('div');
+ label.textContent = 'Options';
+ label.classList.add('section-label');
+ root.append(label);
+
+ label = document.createElement('label');
+ label.textContent = 'Encryption mode:';
+ root.append(label);
+
+ const select = document.createElement('select');
+ select.id = makeUUID();
+ select.dataset.key = 'encryption';
+ select.options[0] = new Option('Prefer encryption', 'preferred');
+ select.options[1] = new Option('Allow encryption', 'tolerated');
+ select.options[2] = new Option('Require encryption', 'required');
+ root.append(select);
+ const encryption_select = select;
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'use-pex-div',
+ 'Use PEX to find more peers'
+ );
+ cal.check.title =
+ "PEX is a tool for exchanging peer lists with the peers you're connected to.";
+ cal.check.dataset.key = 'pex-enabled';
+ cal.label.title = cal.check.title;
+ root.append(cal.root);
+ const pex_check = cal.check;
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'use-dht-div',
+ 'Use DHT to find more peers'
+ );
+ cal.check.title = 'DHT is a tool for finding peers without a tracker.';
+ cal.check.dataset.key = 'dht-enabled';
+ cal.label.title = cal.check.title;
+ root.append(cal.root);
+ const dht_check = cal.check;
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'use-lpd-div',
+ 'Use LPD to find more peers'
+ );
+ cal.check.title = 'LPD is a tool for finding peers on your local network.';
+ cal.check.dataset.key = 'lpd-enabled';
+ cal.label.title = cal.check.title;
+ root.append(cal.root);
+ const lpd_check = cal.check;
+
+ label = document.createElement('div');
+ label.textContent = 'Blocklist';
+ label.classList.add('section-label');
+ root.append(label);
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'blocklist-enabled-div',
+ 'Enable blocklist:'
+ );
+ cal.check.dataset.key = 'blocklist-enabled';
+ root.append(cal.root);
+ const blocklist_enabled_check = cal.check;
+
+ input = document.createElement('input');
+ input.type = 'url';
+ input.value = 'http://www.example.com/blocklist';
+ input.dataset.key = 'blocklist-url';
+ root.append(input);
+ PrefsDialog._enableIfChecked(input, cal.check);
+ const blocklist_url_input = input;
+
+ label = document.createElement('label');
+ label.textContent = 'Blocklist has {n} rules';
+ label.dataset.key = 'blocklist-size';
+ label.classList.add('blocklist-size-label');
+ PrefsDialog._enableIfChecked(label, cal.check);
+ root.append(label);
+
+ const button = document.createElement('button');
+ button.classList.add('blocklist-update-button');
+ button.textContent = 'Update';
+ root.append(button);
+ PrefsDialog._enableIfChecked(button, cal.check);
+ const blocklist_update_button = button;
+
+ return {
+ blocklist_enabled_check,
+ blocklist_update_button,
+ blocklist_url_input,
+ dht_check,
+ encryption_select,
+ lpd_check,
+ max_peers_overall_check,
+ max_peers_overall_input,
+ max_peers_per_torrent_check,
+ max_peers_per_torrent_input,
+ pex_check,
+ root,
+ };
+ }
+
+ static _createNetworkPage() {
+ const root = document.createElement('div');
+ root.classList.add('prefs-network-page');
+
+ let label = document.createElement('div');
+ label.textContent = 'Listening Port';
+ label.classList.add('section-label');
+ root.append(label);
+
+ label = document.createElement('label');
+ label.textContent = 'Peer listening port:';
+ root.append(label);
+
+ const input = document.createElement('input');
+ input.type = 'number';
+ input.dataset.key = 'peer-port';
+ input.id = makeUUID();
+ label.setAttribute('for', input.id);
+ root.append(input);
+ const port_input = input;
+
+ const port_status_div = document.createElement('div');
+ port_status_div.classList.add('port-status');
+ label = document.createElement('label');
+ label.textContent = 'Port is';
+ port_status_div.append(label);
+ const port_status_label = document.createElement('label');
+ port_status_label.textContent = '?';
+ port_status_label.classList.add('port-status-label');
+ port_status_div.append(port_status_label);
+ root.append(port_status_div);
+
+ let cal = PrefsDialog._createCheckAndLabel(
+ 'randomize-port',
+ 'Randomize port on launch'
+ );
+ cal.check.dataset.key = 'peer-port-random-on-start';
+ root.append(cal.root);
+ const random_port_check = cal.check;
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'port-forwarding',
+ 'Use port forwarding from my router'
+ );
+ cal.check.dataset.key = 'port-forwarding-enabled';
+ root.append(cal.root);
+ const port_forwarding_check = cal.check;
+
+ label = document.createElement('div');
+ label.textContent = 'Options';
+ label.classList.add('section-label');
+ root.append(label);
+
+ cal = PrefsDialog._createCheckAndLabel(
+ 'utp-enabled',
+ 'Enable uTP for peer communication'
+ );
+ cal.check.dataset.key = 'utp-enabled';
+ root.append(cal.root);
+ const utp_check = cal.check;
+
+ return {
+ port_forwarding_check,
+ port_input,
+ port_status_label,
+ random_port_check,
+ root,
+ utp_check,
+ };
+ }
+
+ static _create() {
+ const pages = {
+ network: PrefsDialog._createNetworkPage(),
+ peers: PrefsDialog._createPeersPage(),
+ speed: PrefsDialog._createSpeedPage(),
+ torrents: PrefsDialog._createTorrentsPage(),
+ };
+
+ const elements = createTabsContainer('prefs-dialog', [
+ ['prefs-tab-torrent', pages.torrents.root],
+ ['prefs-tab-speed', pages.speed.root],
+ ['prefs-tab-peers', pages.peers.root],
+ ['prefs-tab-network', pages.network.root],
+ ]);
+
+ return { ...elements, ...pages };
+ }
+
+ constructor(session_manager, remote) {
+ super();
+
+ this.closed = false;
+ this.session_manager = session_manager;
+ this.remote = remote;
+ this.update_soon = () =>
+ this._update(this.session_manager.session_properties);
+
+ this.elements = PrefsDialog._create();
+ this.elements.peers.blocklist_update_button.addEventListener(
+ 'click',
+ (event_) => {
+ setTextContent(event_.target, 'Updating blocklist...');
+ this.remote.updateBlocklist();
+ this._setBlocklistButtonEnabled(false);
+ }
+ );
+ this.outside = new OutsideClickListener(this.elements.root);
+ this.outside.addEventListener('click', () => this.close());
+
+ Object.seal(this);
+
+ // listen for user input
+ const on_change = this._onControlChanged.bind(this);
+ const walk = (o) => {
+ for (const element of Object.values(o)) {
+ if (element.tagName === 'INPUT') {
+ switch (element.type) {
+ case 'checkbox':
+ case 'radio':
+ case 'number':
+ case 'text':
+ case 'url':
+ element.addEventListener('change', on_change);
+ break;
+ default:
+ console.trace(`unhandled input: ${element.type}`);
+ break;
+ }
+ }
+ }
+ };
+ walk(this.elements.network);
+ walk(this.elements.peers);
+ walk(this.elements.speed);
+ walk(this.elements.torrents);
+
+ this.session_manager.addEventListener('session-change', this.update_soon);
+ this.update_soon();
+
+ document.body.append(this.elements.root);
+ }
+
+ close() {
+ if (!this.closed) {
+ this.outside.stop();
+ this.session_manager.removeEventListener(
+ 'session-change',
+ this.update_soon
+ );
+ this.elements.root.remove();
+ dispatchEvent(new Event('close'));
+ for (const key of Object.keys(this)) {
+ this[key] = null;
+ }
+ this.closed = true;
+ }
+ }
+}
diff --git a/web/src/prefs.js b/web/src/prefs.js
new file mode 100644
index 000000000..722d0c1da
--- /dev/null
+++ b/web/src/prefs.js
@@ -0,0 +1,128 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { debounce } from './utils.js';
+
+export class Prefs extends EventTarget {
+ constructor() {
+ super();
+
+ this._cache = {};
+
+ this.dispatchPrefsChange = debounce((key, old_value, value) => {
+ const event = new Event('change');
+ Object.assign(event, { key, old_value, value });
+ this.dispatchEvent(event);
+ });
+
+ for (const [key, default_value] of Object.entries(Prefs._Defaults)) {
+ // populate the cache...
+ this._set(key, Prefs._getCookie(key, default_value));
+
+ // add property getter/setters...
+ Object.defineProperty(this, key.replaceAll('-', '_'), {
+ get: () => this._get(key),
+ set: (value) => {
+ this._set(key, value);
+ },
+ });
+ }
+
+ Object.seal(this);
+ }
+
+ entries() {
+ return Object.entries(this._cache);
+ }
+
+ keys() {
+ return Object.keys(this._cache);
+ }
+
+ _get(key) {
+ const { _cache } = this;
+ if (!Object.prototype.hasOwnProperty.call(_cache, key)) {
+ throw new Error(key);
+ }
+ return _cache[key];
+ }
+
+ _set(key, value) {
+ const { _cache } = this;
+ const old_value = _cache[key];
+ if (old_value !== value) {
+ _cache[key] = value;
+ Prefs._setCookie(key, value);
+ this.dispatchPrefsChange(key, old_value, value);
+ }
+ }
+
+ static _setCookie(key, value) {
+ const date = new Date();
+ date.setFullYear(date.getFullYear() + 1);
+ document.cookie = `${key}=${value}; SameSite=Strict; expires=${date.toGMTString()}; path=/`;
+ }
+
+ static _getCookie(key, fallback) {
+ const value = Prefs._readCookie(key);
+ if (value === null) {
+ return fallback;
+ }
+ if (value === 'true') {
+ return true;
+ }
+ if (value === 'false') {
+ return false;
+ }
+ if (value.match(/^\d+$/)) {
+ return Number.parseInt(value, 10);
+ }
+ return value;
+ }
+
+ static _readCookie(key) {
+ const value = `; ${document.cookie}`;
+ const parts = value.split(`; ${key}=`);
+ return parts.length === 2 ? parts.pop().split(';').shift() : null;
+ }
+}
+
+Prefs.AltSpeedEnabled = 'alt-speed-enabled';
+Prefs.DisplayCompact = 'compact';
+Prefs.DisplayFull = 'full';
+Prefs.DisplayMode = 'display-mode';
+Prefs.FilterActive = 'active';
+Prefs.FilterAll = 'all';
+Prefs.FilterDownloading = 'downloading';
+Prefs.FilterFinished = 'finished';
+Prefs.FilterMode = 'filter-mode';
+Prefs.FilterPaused = 'paused';
+Prefs.FilterSeeding = 'seeding';
+Prefs.NotificationsEnabled = 'notifications-enabled';
+Prefs.RefreshRate = 'refresh-rate-sec';
+Prefs.SortAscending = 'ascending';
+Prefs.SortByActivity = 'activity';
+Prefs.SortByAge = 'age';
+Prefs.SortByName = 'name';
+Prefs.SortByProgress = 'progress';
+Prefs.SortByQueue = 'queue';
+Prefs.SortByRatio = 'ratio';
+Prefs.SortBySize = 'size';
+Prefs.SortByState = 'state';
+Prefs.SortDescending = 'descending';
+Prefs.SortDirection = 'sort-direction';
+Prefs.SortMode = 'sort-mode';
+
+Prefs._Defaults = {
+ [Prefs.AltSpeedEnabled]: false,
+ [Prefs.DisplayMode]: Prefs.DisplayFull,
+ [Prefs.FilterMode]: Prefs.FilterAll,
+ [Prefs.NotificationsEnabled]: false,
+ [Prefs.RefreshRate]: 5,
+ [Prefs.SortDirection]: Prefs.SortAscending,
+ [Prefs.SortMode]: Prefs.SortByName,
+};
diff --git a/web/src/remote.js b/web/src/remote.js
new file mode 100644
index 000000000..8e060274a
--- /dev/null
+++ b/web/src/remote.js
@@ -0,0 +1,314 @@
+/**
+ * Copyright © Charles Kerr, Dave Perrett, Malcolm Jarvis and Bruno Bierbaumer
+ *
+ * This file is licensed under the GPLv2.
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ */
+
+import { AlertDialog } from './alert-dialog.js';
+
+export const RPC = {
+ _DaemonVersion: 'version',
+ _DownSpeedLimit: 'speed-limit-down',
+ _DownSpeedLimited: 'speed-limit-down-enabled',
+ _QueueMoveBottom: 'queue-move-bottom',
+ _QueueMoveDown: 'queue-move-down',
+ _QueueMoveTop: 'queue-move-top',
+ _QueueMoveUp: 'queue-move-up',
+ _Root: '../rpc',
+ _TurtleDownSpeedLimit: 'alt-speed-down',
+ _TurtleState: 'alt-speed-enabled',
+ _TurtleUpSpeedLimit: 'alt-speed-up',
+ _UpSpeedLimit: 'speed-limit-up',
+ _UpSpeedLimited: 'speed-limit-up-enabled',
+};
+
+export class Remote {
+ // TODO: decouple from controller
+ constructor(controller) {
+ this._controller = controller;
+ this._error = '';
+ this._session_id = '';
+ }
+
+ sendRequest(data, callback, context) {
+ const headers = new Headers();
+ headers.append('cache-control', 'no-cache');
+ headers.append('content-type', 'application/json');
+ headers.append('pragma', 'no-cache');
+ if (this._session_id) {
+ headers.append(Remote._SessionHeader, this._session_id);
+ }
+
+ let response_argument = null;
+ fetch(RPC._Root, {
+ body: JSON.stringify(data),
+ headers,
+ method: 'POST',
+ })
+ .then((response) => {
+ response_argument = response;
+ if (response.status === 409) {
+ const error = new Error(Remote._SessionHeader);
+ error.header = response.headers.get(Remote._SessionHeader);
+ throw error;
+ }
+ return response.json();
+ })
+ .then((payload) => {
+ if (callback) {
+ callback.call(context, payload, response_argument);
+ }
+ })
+ .catch((error) => {
+ if (error.message === Remote._SessionHeader) {
+ // copy the session header and try again
+ this._session_id = error.header;
+ this.sendRequest(data, callback, context);
+ return;
+ }
+ console.trace(error);
+ this._controller.togglePeriodicSessionRefresh(false);
+ this._controller.setCurrentPopup(
+ new AlertDialog({
+ heading: 'Connection failed',
+ message:
+ 'Could not connect to the server. You may need to reload the page to reconnect.',
+ })
+ );
+ });
+ }
+
+ // TODO: return a Promise
+ loadDaemonPrefs(callback, context) {
+ const o = {
+ method: 'session-get',
+ };
+ this.sendRequest(o, callback, context);
+ }
+
+ checkPort(callback, context) {
+ const o = {
+ method: 'port-test',
+ };
+ this.sendRequest(o, callback, context);
+ }
+
+ renameTorrent(torrentIds, oldpath, newname, callback, context) {
+ const o = {
+ arguments: {
+ ids: torrentIds,
+ name: newname,
+ path: oldpath,
+ },
+ method: 'torrent-rename-path',
+ };
+ this.sendRequest(o, callback, context);
+ }
+
+ loadDaemonStats(callback, context) {
+ const o = {
+ method: 'session-stats',
+ };
+ this.sendRequest(o, callback, context);
+ }
+
+ updateTorrents(torrentIds, fields, callback, context) {
+ const o = {
+ arguments: {
+ fields,
+ format: 'table',
+ },
+ method: 'torrent-get',
+ };
+ if (torrentIds) {
+ o.arguments.ids = torrentIds;
+ }
+ this.sendRequest(o, (response) => {
+ const arguments_ = response['arguments'];
+ callback.call(context, arguments_.torrents, arguments_.removed);
+ });
+ }
+
+ getFreeSpace(dir, callback, context) {
+ const o = {
+ arguments: {
+ path: dir,
+ },
+ method: 'free-space',
+ };
+ this.sendRequest(o, (response) => {
+ const arguments_ = response['arguments'];
+ callback.call(context, arguments_.path, arguments_['size-bytes']);
+ });
+ }
+
+ changeFileCommand(torrentId, fileIndices, command) {
+ const arguments_ = {
+ ids: [torrentId],
+ };
+ arguments_[command] = fileIndices;
+ this.sendRequest(
+ {
+ arguments: arguments_,
+ method: 'torrent-set',
+ },
+ () => {
+ this._controller.refreshTorrents([torrentId]);
+ }
+ );
+ }
+
+ sendTorrentSetRequests(method, torrent_ids, arguments_, callback, context) {
+ if (!arguments_) {
+ arguments_ = {};
+ }
+ arguments_['ids'] = torrent_ids;
+ const o = {
+ arguments: arguments_,
+ method,
+ };
+ this.sendRequest(o, callback, context);
+ }
+
+ sendTorrentActionRequests(method, torrent_ids, callback, context) {
+ this.sendTorrentSetRequests(method, torrent_ids, null, callback, context);
+ }
+
+ startTorrents(torrent_ids, noqueue, callback, context) {
+ const name = noqueue ? 'torrent-start-now' : 'torrent-start';
+ this.sendTorrentActionRequests(name, torrent_ids, callback, context);
+ }
+ stopTorrents(torrent_ids, callback, context) {
+ this.sendTorrentActionRequests(
+ 'torrent-stop',
+ torrent_ids,
+ callback,
+ context
+ );
+ }
+
+ moveTorrents(torrent_ids, new_location, callback, context) {
+ this.sendTorrentSetRequests(
+ 'torrent-set-location',
+ torrent_ids,
+ {
+ location: new_location,
+ move: true,
+ },
+ callback,
+ context
+ );
+ }
+
+ removeTorrents(torrent_ids, callback, context) {
+ this.sendTorrentActionRequests(
+ 'torrent-remove',
+ torrent_ids,
+ callback,
+ context
+ );
+ }
+ removeTorrentsAndData(torrents) {
+ const o = {
+ arguments: {
+ 'delete-local-data': true,
+ ids: [],
+ },
+ method: 'torrent-remove',
+ };
+
+ if (torrents) {
+ for (let index = 0, length_ = torrents.length; index < length_; ++index) {
+ o.arguments.ids.push(torrents[index].getId());
+ }
+ }
+ this.sendRequest(o, () => {
+ this._controller.refreshTorrents();
+ });
+ }
+ verifyTorrents(torrent_ids, callback, context) {
+ this.sendTorrentActionRequests(
+ 'torrent-verify',
+ torrent_ids,
+ callback,
+ context
+ );
+ }
+ reannounceTorrents(torrent_ids, callback, context) {
+ this.sendTorrentActionRequests(
+ 'torrent-reannounce',
+ torrent_ids,
+ callback,
+ context
+ );
+ }
+ addTorrentByUrl(url, options) {
+ if (url.match(/^[\da-f]{40}$/i)) {
+ url = `magnet:?xt=urn:btih:${url}`;
+ }
+ const o = {
+ arguments: {
+ filename: url,
+ paused: options.paused,
+ },
+ method: 'torrent-add',
+ };
+ this.sendRequest(o, () => {
+ this._controller.refreshTorrents();
+ });
+ }
+ savePrefs(arguments_) {
+ const o = {
+ arguments: arguments_,
+ method: 'session-set',
+ };
+ this.sendRequest(o, () => {
+ this._controller.loadDaemonPrefs();
+ });
+ }
+ updateBlocklist() {
+ const o = {
+ method: 'blocklist-update',
+ };
+ this.sendRequest(o, () => {
+ this._controller.loadDaemonPrefs();
+ });
+ }
+
+ // Added queue calls
+ moveTorrentsToTop(torrent_ids, callback, context) {
+ this.sendTorrentActionRequests(
+ RPC._QueueMoveTop,
+ torrent_ids,
+ callback,
+ context
+ );
+ }
+ moveTorrentsToBottom(torrent_ids, callback, context) {
+ this.sendTorrentActionRequests(
+ RPC._QueueMoveBottom,
+ torrent_ids,
+ callback,
+ context
+ );
+ }
+ moveTorrentsUp(torrent_ids, callback, context) {
+ this.sendTorrentActionRequests(
+ RPC._QueueMoveUp,
+ torrent_ids,
+ callback,
+ context
+ );
+ }
+ moveTorrentsDown(torrent_ids, callback, context) {
+ this.sendTorrentActionRequests(
+ RPC._QueueMoveDown,
+ torrent_ids,
+ callback,
+ context
+ );
+ }
+}
+
+Remote._SessionHeader = 'X-Transmission-Session-Id';
diff --git a/web/src/remove-dialog.js b/web/src/remove-dialog.js
new file mode 100644
index 000000000..a0385e9a6
--- /dev/null
+++ b/web/src/remove-dialog.js
@@ -0,0 +1,86 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { createDialogContainer } from './utils.js';
+
+export class RemoveDialog extends EventTarget {
+ constructor(options) {
+ super();
+
+ // options: remote, torrents, trash
+ this.options = options;
+ this.elements = RemoveDialog._create(options);
+ this.elements.dismiss.addEventListener('click', () => this._onDismiss());
+ this.elements.confirm.addEventListener('click', () => this._onConfirm());
+ document.body.append(this.elements.root);
+ this.elements.dismiss.focus();
+ }
+
+ close() {
+ if (!this.closed) {
+ this.elements.root.remove();
+ this.dispatchEvent(new Event('close'));
+ for (const key of Object.keys(this)) {
+ delete this[key];
+ }
+ this.closed = true;
+ }
+ }
+
+ _onDismiss() {
+ this.close();
+ }
+
+ _onConfirm() {
+ const { torrents } = this.options;
+ if (torrents.length > 0) {
+ if (this.options.trash) {
+ this.options.remote.removeTorrentsAndData(torrents);
+ } else {
+ this.options.remote.removeTorrents(torrents);
+ }
+ }
+
+ this.close();
+ }
+
+ static _create(options) {
+ const { trash } = options;
+ const { heading, message } = RemoveDialog._createMessage(options);
+
+ const elements = createDialogContainer('remove-dialog');
+ elements.heading.textContent = heading;
+ elements.message.textContent = message;
+ elements.confirm.textContent = trash ? 'Trash' : 'Remove';
+ return elements;
+ }
+
+ static _createMessage(options) {
+ let heading = null;
+ let message = null;
+ const { torrents } = options;
+ const [torrent] = torrents;
+ if (options.trash && torrents.length === 1) {
+ heading = `Remove ${torrent.getName()} and delete data?`;
+ message =
+ 'All data downloaded for this torrent will be deleted. Are you sure you want to remove it?';
+ } else if (options.trash) {
+ heading = `Remove ${torrents.length} transfers and delete data?`;
+ message =
+ 'All data downloaded for these torrents will be deleted. Are you sure you want to remove them?';
+ } else if (torrents.length === 1) {
+ heading = `Remove ${torrent.getName()}?`;
+ message =
+ 'Once removed, continuing the transfer will require the torrent file. Are you sure you want to remove it?';
+ } else {
+ heading = `Remove ${torrents.length} transfers?`;
+ message =
+ 'Once removed, continuing the transfers will require the torrent files. Are you sure you want to remove them?';
+ }
+ return { heading, message };
+ }
+}
diff --git a/web/src/rename-dialog.js b/web/src/rename-dialog.js
new file mode 100644
index 000000000..2434cc1d6
--- /dev/null
+++ b/web/src/rename-dialog.js
@@ -0,0 +1,86 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { createDialogContainer } from './utils.js';
+
+export class RenameDialog extends EventTarget {
+ constructor(controller, remote) {
+ super();
+
+ this.controller = controller;
+ this.remote = remote;
+ this.elements = {};
+ this.torrents = [];
+
+ this.show();
+ }
+
+ show() {
+ const torrents = this.controller.getSelectedTorrents();
+ if (torrents.length !== 1) {
+ console.trace();
+ return;
+ }
+
+ this.torrents = torrents;
+ this.elements = RenameDialog._create();
+ this.elements.entry.value = torrents[0].getName();
+ document.body.append(this.elements.root);
+
+ this.elements.entry.focus();
+ }
+
+ close() {
+ this.elements.root.remove();
+
+ this.dispatchEvent(new Event('close'));
+
+ delete this.controller;
+ delete this.remote;
+ delete this.elements;
+ delete this.torrents;
+ }
+
+ _onDismiss() {
+ this.close();
+ }
+
+ _onConfirm() {
+ const [tor] = this.torrents;
+ const old_name = tor.getName();
+ const new_name = this.elements.entry.value;
+ this.remote.renameTorrent([tor.getId()], old_name, new_name, (response) => {
+ if (response.result === 'success') {
+ tor.refresh(response.arguments);
+ }
+ });
+
+ this.close();
+ }
+
+ static _create() {
+ const elements = createDialogContainer('rename-dialog');
+ elements.root.setAttribute('aria-label', 'Rename Torrent');
+ elements.heading.textContent = 'Enter new name:';
+ elements.confirm.textContent = 'Rename';
+ elements.dismiss.addEventListener('click', () => this._onDismiss());
+ elements.confirm.addEventListener('click', () => this._onConfirm());
+
+ const label = document.createElement('label');
+ label.setAttribute('for', 'torrent-rename-name');
+ label.textContent = 'Enter new name:';
+ elements.workarea.append(label);
+
+ const entry = document.createElement('input');
+ entry.setAttribute('type', 'text');
+ entry.id = 'torrent-rename-name';
+ elements.entry = entry;
+ elements.workarea.append(entry);
+
+ return elements;
+ }
+}
diff --git a/web/src/shortcuts-dialog.js b/web/src/shortcuts-dialog.js
new file mode 100644
index 000000000..b8d9c7e3d
--- /dev/null
+++ b/web/src/shortcuts-dialog.js
@@ -0,0 +1,82 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { createDialogContainer } from './utils.js';
+
+export class ShortcutsDialog extends EventTarget {
+ constructor(action_manager) {
+ super();
+
+ this.elements = ShortcutsDialog._create(action_manager);
+ this.elements.dismiss.addEventListener('click', () => this._onDismiss());
+ document.body.append(this.elements.root);
+ this.elements.dismiss.focus();
+ }
+
+ close() {
+ this.elements.root.remove();
+ this.dispatchEvent(new Event('close'));
+ delete this.elements;
+ }
+
+ _onDismiss() {
+ this.close();
+ }
+
+ static _create(action_manager) {
+ const elements = createDialogContainer('shortcuts-dialog');
+ elements.root.setAttribute('aria-label', 'Keyboard Shortcuts');
+
+ const table = document.createElement('table');
+ const thead = document.createElement('thead');
+ table.append(thead);
+
+ let tr = document.createElement('tr');
+ thead.append(tr);
+
+ let th = document.createElement('th');
+ th.textContent = 'Key';
+ tr.append(th);
+
+ th = document.createElement('th');
+ th.textContent = 'Action';
+ tr.append(th);
+
+ const tbody = document.createElement('tbody');
+ table.append(tbody);
+
+ const o = {};
+ for (const [shortcut, name] of action_manager.allShortcuts().entries()) {
+ const tokens = shortcut.split('+');
+ const sortKey = [tokens.pop(), ...tokens].join('+');
+ o[sortKey] = { name, shortcut };
+ }
+
+ for (const [, values] of Object.entries(o).sort()) {
+ const { name, shortcut } = values;
+ tr = document.createElement('tr');
+ tbody.append(tr);
+
+ let td = document.createElement('td');
+ td.textContent = shortcut.replaceAll('+', ' + ');
+ tr.append(td);
+
+ td = document.createElement('td');
+ td.textContent = action_manager.text(name);
+ tr.append(td);
+ }
+
+ elements.heading.textContent = 'Transmission';
+ elements.dismiss.textContent = 'Close';
+
+ elements.heading.textContent = 'Keyboard shortcuts';
+ elements.message.append(table);
+ elements.confirm.remove();
+ delete elements.confirm;
+ return elements;
+ }
+}
diff --git a/web/src/statistics-dialog.js b/web/src/statistics-dialog.js
new file mode 100644
index 000000000..77c76ac7e
--- /dev/null
+++ b/web/src/statistics-dialog.js
@@ -0,0 +1,103 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { Formatter } from './formatter.js';
+import {
+ Utils,
+ setTextContent,
+ createDialogContainer,
+ createInfoSection,
+} from './utils.js';
+
+export class StatisticsDialog extends EventTarget {
+ constructor(remote) {
+ super();
+
+ this.remote = remote;
+
+ const updateDaemon = () =>
+ this.remote.loadDaemonStats((data) => this._update(data.arguments));
+ const delay_msec = 5000;
+ this.interval = setInterval(updateDaemon, delay_msec);
+ updateDaemon();
+
+ this.elements = StatisticsDialog._create();
+ this.elements.dismiss.addEventListener('click', () => this._onDismiss());
+ document.body.append(this.elements.root);
+ this.elements.dismiss.focus();
+ }
+
+ close() {
+ if (!this.closed) {
+ clearInterval(this.interval);
+ this.elements.root.remove();
+ for (const key of Object.keys(this)) {
+ delete this[key];
+ }
+ this.closed = true;
+ }
+ }
+
+ _onDismiss() {
+ this.close();
+ }
+
+ _update(stats) {
+ console.log(stats);
+ const fmt = Formatter;
+
+ let s = stats['current-stats'];
+ let ratio = Utils.ratio(s.uploadedBytes, s.downloadedBytes);
+ setTextContent(this.elements.session.up, fmt.size(s.uploadedBytes));
+ setTextContent(this.elements.session.down, fmt.size(s.downloadedBytes));
+ setTextContent(this.elements.session.ratio, fmt.ratioString(ratio));
+ setTextContent(
+ this.elements.session.time,
+ fmt.timeInterval(s.secondsActive)
+ );
+
+ s = stats['cumulative-stats'];
+ ratio = Utils.ratio(s.uploadedBytes, s.downloadedBytes);
+ setTextContent(this.elements.total.up, fmt.size(s.uploadedBytes));
+ setTextContent(this.elements.total.down, fmt.size(s.downloadedBytes));
+ setTextContent(this.elements.total.ratio, fmt.ratioString(ratio));
+ setTextContent(this.elements.total.time, fmt.timeInterval(s.secondsActive));
+ }
+
+ static _create() {
+ const elements = createDialogContainer('statistics-dialog');
+ const { workarea } = elements;
+ elements.confirm.remove();
+ elements.dismiss.textContent = 'Close';
+ delete elements.confirm;
+
+ const heading_text = 'Statistics';
+ elements.root.setAttribute('aria-label', heading_text);
+ elements.heading.textContent = heading_text;
+
+ const labels = ['Uploaded:', 'Downloaded:', 'Ratio:', 'Running time:'];
+ let section = createInfoSection('Current session', labels);
+ const [sup, sdown, sratio, stime] = section.children;
+ const session = (elements.session = {});
+ session.up = sup;
+ session.down = sdown;
+ session.ratio = sratio;
+ session.time = stime;
+ workarea.append(section.root);
+
+ section = createInfoSection('Total', labels);
+ const [tup, tdown, tratio, ttime] = section.children;
+ const total = (elements.total = {});
+ total.up = tup;
+ total.down = tdown;
+ total.ratio = tratio;
+ total.time = ttime;
+ workarea.append(section.root);
+
+ return elements;
+ }
+}
diff --git a/web/src/torrent-row.js b/web/src/torrent-row.js
new file mode 100644
index 000000000..c099992a8
--- /dev/null
+++ b/web/src/torrent-row.js
@@ -0,0 +1,408 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { Formatter } from './formatter.js';
+import { Torrent } from './torrent.js';
+import { setTextContent } from './utils.js';
+
+class TorrentRendererHelper {
+ static getProgressInfo(controller, t) {
+ const status = t.getStatus();
+ const classList = ['torrent-progress-bar'];
+ let percent = null;
+
+ if (status === Torrent._StatusStopped) {
+ classList.push('paused');
+ }
+
+ if (t.needsMetaData()) {
+ classList.push('magnet');
+ percent = Math.round(t.getMetadataPercentComplete() * 100);
+ } else if (status === Torrent._StatusCheck) {
+ classList.push('verify');
+ percent = Math.round(t.getRecheckProgress() * 100);
+ } else if (t.getLeftUntilDone() > 0) {
+ classList.push('leech');
+ percent = Math.round(t.getPercentDone() * 100);
+ } else {
+ classList.push('seed');
+ const seed_ratio_limit = t.seedRatioLimit(controller);
+ percent =
+ seed_ratio_limit > 0
+ ? (t.getUploadRatio() * 100) / seed_ratio_limit
+ : 100;
+ }
+ if (t.isQueued()) {
+ classList.push('queued');
+ }
+
+ return {
+ classList,
+ percent,
+ };
+ }
+
+ static renderProgressbar(controller, t, progressbar) {
+ const info = TorrentRendererHelper.getProgressInfo(controller, t);
+ progressbar.className = info.classList.join(' ');
+ progressbar.style['background-size'] = `${info.percent}% 100%, 100% 100%`;
+ }
+
+ static formatUL(t) {
+ return `▲${Formatter.speedBps(t.getUploadSpeed())}`;
+ }
+ static formatDL(t) {
+ return `▼${Formatter.speedBps(t.getDownloadSpeed())}`;
+ }
+
+ static formatETA(t) {
+ const eta = t.getETA();
+ if (eta < 0 || eta >= 999 * 60 * 60) {
+ return '';
+ }
+ return `ETA: ${Formatter.timeInterval(eta)}`;
+ }
+}
+
+///
+
+export class TorrentRendererFull {
+ static getPeerDetails(t) {
+ const fmt = Formatter;
+
+ const error = t.getErrorMessage();
+ if (error) {
+ return error;
+ }
+
+ if (t.isDownloading()) {
+ const peer_count = t.getPeersConnected();
+ const webseed_count = t.getWebseedsSendingToUs();
+
+ if (webseed_count && peer_count) {
+ // Downloading from 2 of 3 peer(s) and 2 webseed(s)
+ return [
+ 'Downloading from',
+ t.getPeersSendingToUs(),
+ 'of',
+ fmt.countString('peer', 'peers', peer_count),
+ 'and',
+ fmt.countString('web seed', 'web seeds', webseed_count),
+ '–',
+ TorrentRendererHelper.formatDL(t),
+ TorrentRendererHelper.formatUL(t),
+ ].join(' ');
+ }
+ if (webseed_count) {
+ // Downloading from 2 webseed(s)
+ return [
+ 'Downloading from',
+ fmt.countString('web seed', 'web seeds', webseed_count),
+ '–',
+ TorrentRendererHelper.formatDL(t),
+ TorrentRendererHelper.formatUL(t),
+ ].join(' ');
+ }
+
+ // Downloading from 2 of 3 peer(s)
+ return [
+ 'Downloading from',
+ t.getPeersSendingToUs(),
+ 'of',
+ fmt.countString('peer', 'peers', peer_count),
+ '–',
+ TorrentRendererHelper.formatDL(t),
+ TorrentRendererHelper.formatUL(t),
+ ].join(' ');
+ }
+
+ if (t.isSeeding()) {
+ return [
+ 'Seeding to',
+ t.getPeersGettingFromUs(),
+ 'of',
+ fmt.countString('peer', 'peers', t.getPeersConnected()),
+ '-',
+ TorrentRendererHelper.formatUL(t),
+ ].join(' ');
+ }
+
+ if (t.isChecking()) {
+ return [
+ 'Verifying local data (',
+ Formatter.percentString(100 * t.getRecheckProgress()),
+ '% tested)',
+ ].join('');
+ }
+
+ return t.getStateString();
+ }
+
+ static getProgressDetails(controller, t) {
+ if (t.needsMetaData()) {
+ let MetaDataStatus = 'retrieving';
+ if (t.isStopped()) {
+ MetaDataStatus = 'needs';
+ }
+ const percent = 100 * t.getMetadataPercentComplete();
+ return [
+ `Magnetized transfer - ${MetaDataStatus} metadata (`,
+ Formatter.percentString(percent),
+ '%)',
+ ].join('');
+ }
+
+ const sizeWhenDone = t.getSizeWhenDone();
+ const totalSize = t.getTotalSize();
+ const is_done = t.isDone() || t.isSeeding();
+ const c = [];
+
+ if (is_done) {
+ if (totalSize === sizeWhenDone) {
+ // seed: '698.05 MiB'
+ c.push(Formatter.size(totalSize));
+ } else {
+ // partial seed: '127.21 MiB of 698.05 MiB (18.2%)'
+ c.push(
+ Formatter.size(sizeWhenDone),
+ ' of ',
+ Formatter.size(t.getTotalSize()),
+ ' (',
+ t.getPercentDoneStr(),
+ '%)'
+ );
+ }
+ // append UL stats: ', uploaded 8.59 GiB (Ratio: 12.3)'
+ c.push(
+ ', uploaded ',
+ Formatter.size(t.getUploadedEver()),
+ ' (Ratio ',
+ Formatter.ratioString(t.getUploadRatio()),
+ ')'
+ );
+ } else {
+ // not done yet
+ c.push(
+ Formatter.size(sizeWhenDone - t.getLeftUntilDone()),
+ ' of ',
+ Formatter.size(sizeWhenDone),
+ ' (',
+ t.getPercentDoneStr(),
+ '%)'
+ );
+ }
+
+ // maybe append eta
+ if (!t.isStopped() && (!is_done || t.seedRatioLimit(controller) > 0)) {
+ c.push(' - ');
+ const eta = t.getETA();
+ if (eta < 0 || eta >= 999 * 60 * 60 /* arbitrary */) {
+ c.push('remaining time unknown');
+ } else {
+ c.push(Formatter.timeInterval(t.getETA()), ' remaining');
+ }
+ }
+
+ return c.join('');
+ }
+
+ // eslint-disable-next-line class-methods-use-this
+ render(controller, t, root) {
+ const is_stopped = t.isStopped();
+
+ // name
+ let e = root._name_container;
+ setTextContent(e, t.getName());
+ e.classList.toggle('paused', is_stopped);
+
+ // progressbar
+ TorrentRendererHelper.renderProgressbar(controller, t, root._progressbar);
+ root._progressbar.classList.add('full');
+
+ // peer details
+ const has_error = t.getError() !== Torrent._ErrNone;
+ e = root._peer_details_container;
+ e.classList.toggle('error', has_error);
+ setTextContent(e, TorrentRendererFull.getPeerDetails(t));
+
+ // progress details
+ e = root._progress_details_container;
+ setTextContent(e, TorrentRendererFull.getProgressDetails(controller, t));
+
+ // pause/resume button
+ e = root._toggle_running_button;
+ e.alt = is_stopped ? 'Resume' : 'Pause';
+ e.dataset.action = is_stopped ? 'resume' : 'pause';
+ }
+
+ // eslint-disable-next-line class-methods-use-this
+ createRow(torrent) {
+ const root = document.createElement('li');
+ root.className = 'torrent';
+
+ const icon = document.createElement('div');
+ icon.classList.add('icon');
+ icon.dataset.iconMimeType = torrent
+ .getPrimaryMimeType()
+ .split('/', 1)
+ .pop();
+ icon.dataset.iconMultifile = torrent.getFileCount() > 1 ? 'true' : 'false';
+
+ const name = document.createElement('div');
+ name.className = 'torrent-name';
+
+ const peers = document.createElement('div');
+ peers.className = 'torrent-peer-details';
+
+ const progress = document.createElement('div');
+ progress.classList.add('torrent-progress');
+ const progressbar = document.createElement('div');
+ progressbar.classList.add('torrent-progress-bar', 'full');
+ progress.append(progressbar);
+ const button = document.createElement('a');
+ button.className = 'torrent-pauseresume-button';
+ progress.append(button);
+
+ const details = document.createElement('div');
+ details.className = 'torrent-progress-details';
+
+ root.append(icon);
+ root.append(name);
+ root.append(peers);
+ root.append(progress);
+ root.append(details);
+
+ root._icon = icon;
+ root._name_container = name;
+ root._peer_details_container = peers;
+ root._progress_details_container = details;
+ root._progressbar = progressbar;
+ root._toggle_running_button = button;
+
+ return root;
+ }
+}
+
+///
+
+export class TorrentRendererCompact {
+ static getPeerDetails(t) {
+ const errorMessage = t.getErrorMessage();
+ if (errorMessage) {
+ return errorMessage;
+ }
+ if (t.isDownloading()) {
+ const have_dn = t.getDownloadSpeed() > 0;
+ const have_up = t.getUploadSpeed() > 0;
+
+ if (!have_up && !have_dn) {
+ return 'Idle';
+ }
+
+ const s = [`${TorrentRendererHelper.formatETA(t)} `];
+ if (have_dn) {
+ s.push(TorrentRendererHelper.formatDL(t));
+ }
+ if (have_up) {
+ s.push(TorrentRendererHelper.formatUL(t));
+ }
+ return s.join(' ');
+ }
+ if (t.isSeeding()) {
+ return `Ratio: ${Formatter.ratioString(
+ t.getUploadRatio()
+ )}, ${TorrentRendererHelper.formatUL(t)}`;
+ }
+ return t.getStateString();
+ }
+
+ // eslint-disable-next-line class-methods-use-this
+ render(controller, t, root) {
+ // name
+ let e = root._name_container;
+ e.classList.toggle('paused', t.isStopped());
+ setTextContent(e, t.getName());
+
+ // peer details
+ const has_error = t.getError() !== Torrent._ErrNone;
+ e = root._details_container;
+ e.classList.toggle('error', has_error);
+ setTextContent(e, TorrentRendererCompact.getPeerDetails(t));
+
+ // progressbar
+ TorrentRendererHelper.renderProgressbar(controller, t, root._progressbar);
+ root._progressbar.classList.add('compact');
+ }
+
+ // eslint-disable-next-line class-methods-use-this
+ createRow(torrent) {
+ const progressbar = document.createElement('div');
+ progressbar.classList.add('torrent-progress-bar', 'compact');
+
+ const icon = document.createElement('div');
+ icon.classList.add('icon');
+ icon.dataset.iconMimeType = torrent
+ .getPrimaryMimeType()
+ .split('/', 1)
+ .pop();
+ icon.dataset.iconMultifile = torrent.getFileCount() > 1 ? 'true' : 'false';
+
+ const details = document.createElement('div');
+ details.className = 'torrent-peer-details compact';
+
+ const name = document.createElement('div');
+ name.className = 'torrent-name compact';
+
+ const root = document.createElement('li');
+ root.append(progressbar);
+ root.append(details);
+ root.append(name);
+ root.append(icon);
+ root.className = 'torrent compact';
+ root._progressbar = progressbar;
+ root._details_container = details;
+ root._name_container = name;
+ return root;
+ }
+}
+
+///
+
+export class TorrentRow {
+ constructor(view, controller, torrent) {
+ this._view = view;
+ this._torrent = torrent;
+ this._element = view.createRow(torrent);
+
+ const update = () => this.render(controller);
+ this._torrent.addEventListener('dataChanged', update);
+ update();
+ }
+
+ getElement() {
+ return this._element;
+ }
+
+ render(controller) {
+ const tor = this.getTorrent();
+ if (tor) {
+ this._view.render(controller, tor, this.getElement());
+ }
+ }
+
+ isSelected() {
+ return this.getElement().classList.contains('selected');
+ }
+
+ getTorrent() {
+ return this._torrent;
+ }
+
+ getTorrentId() {
+ return this.getTorrent().getId();
+ }
+}
diff --git a/web/src/torrent.js b/web/src/torrent.js
new file mode 100644
index 000000000..cb1727274
--- /dev/null
+++ b/web/src/torrent.js
@@ -0,0 +1,668 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import { Formatter } from './formatter.js';
+import { Prefs } from './prefs.js';
+import { deepEqual } from './utils.js';
+
+/// DOMAINS
+
+// example: "tracker.ubuntu.com" returns "ubuntu.com"
+function getDomainName(host) {
+ const dot = host.indexOf('.');
+ if (dot !== host.lastIndexOf('.')) {
+ host = host.slice(dot + 1);
+ }
+ return host;
+}
+
+// example: "ubuntu.com" returns "Ubuntu"
+function getReadableDomain(name) {
+ if (name.length > 0) {
+ name = name.charAt(0).toUpperCase() + name.slice(1);
+ }
+ const dot = name.indexOf('.');
+ if (dot !== -1) {
+ name = name.slice(0, dot);
+ }
+ return name;
+}
+
+// key: url string
+// val: { domain, readable_domain }
+const announce_to_domain_cache = {};
+
+function getAnnounceDomain(announce) {
+ if (announce_to_domain_cache[announce]) {
+ return announce_to_domain_cache[announce];
+ }
+
+ const url = new URL(announce);
+ const domain = getDomainName(url.host);
+ const name = getReadableDomain(domain);
+ const o = { domain, name, url };
+ announce_to_domain_cache[announce] = o;
+ return o;
+}
+
+///
+
+export class Torrent extends EventTarget {
+ constructor(data) {
+ super();
+
+ this.fieldObservers = {};
+ this.fields = {};
+ this.refresh(data);
+ }
+
+ notifyOnFieldChange(field, callback) {
+ this.fieldObservers[field] = this.fieldObservers[field] || [];
+ this.fieldObservers[field].push(callback);
+ }
+
+ setField(o, name, value) {
+ const old_value = o[name];
+
+ if (deepEqual(old_value, value)) {
+ return false;
+ }
+
+ const observers = this.fieldObservers[name];
+ if (o === this.fields && observers && observers.length > 0) {
+ for (const observer of observers) {
+ observer.call(this, value, old_value, name);
+ }
+ }
+ o[name] = value;
+ return true;
+ }
+
+ // fields.files is an array of unions of RPC's "files" and "fileStats" objects.
+ updateFiles(files) {
+ let changed = false;
+ const myfiles = this.fields.files || [];
+ const keys = ['length', 'name', 'bytesCompleted', 'wanted', 'priority'];
+
+ for (const [index, f] of files.entries()) {
+ const myfile = myfiles[index] || {};
+ for (const key of keys) {
+ if (key in f) {
+ changed |= this.setField(myfile, key, f[key]);
+ }
+ }
+ myfiles[index] = myfile;
+ }
+ this.fields.files = myfiles;
+ return changed;
+ }
+
+ static collateTrackers(trackers) {
+ return trackers.map((t) => t.announce.toLowerCase()).join('\t');
+ }
+
+ refreshFields(data) {
+ let changed = false;
+
+ for (const [key, value] of Object.entries(data)) {
+ switch (key) {
+ case 'files':
+ case 'fileStats': // merge files and fileStats together
+ changed |= this.updateFiles(value);
+ break;
+ case 'trackerStats': // 'trackerStats' is a superset of 'trackers'...
+ changed |= this.setField(this.fields, 'trackers', value);
+ break;
+ case 'trackers': // ...so only save 'trackers' if we don't have it already
+ if (!(key in this.fields)) {
+ changed |= this.setField(this.fields, key, value);
+ }
+ break;
+ default:
+ changed |= this.setField(this.fields, key, value);
+ }
+ }
+
+ return changed;
+ }
+
+ refresh(data) {
+ if (this.refreshFields(data)) {
+ this.dispatchEvent(new Event('dataChanged'));
+ }
+ }
+
+ ///
+
+ // simple accessors
+ getComment() {
+ return this.fields.comment;
+ }
+ getCreator() {
+ return this.fields.creator;
+ }
+ getDateAdded() {
+ return this.fields.addedDate;
+ }
+ getDateCreated() {
+ return this.fields.dateCreated;
+ }
+ getDesiredAvailable() {
+ return this.fields.desiredAvailable;
+ }
+ getDownloadDir() {
+ return this.fields.downloadDir;
+ }
+ getDownloadSpeed() {
+ return this.fields.rateDownload;
+ }
+ getDownloadedEver() {
+ return this.fields.downloadedEver;
+ }
+ getError() {
+ return this.fields.error;
+ }
+ getErrorString() {
+ return this.fields.errorString;
+ }
+ getETA() {
+ return this.fields.eta;
+ }
+ getFailedEver() {
+ return this.fields.corruptEver;
+ }
+ getFiles() {
+ return this.fields.files || [];
+ }
+ getFile(index) {
+ return this.fields.files[index];
+ }
+ getFileCount() {
+ return this.fields['file-count'];
+ }
+ getHashString() {
+ return this.fields.hashString;
+ }
+ getHave() {
+ return this.getHaveValid() + this.getHaveUnchecked();
+ }
+ getHaveUnchecked() {
+ return this.fields.haveUnchecked;
+ }
+ getHaveValid() {
+ return this.fields.haveValid;
+ }
+ getId() {
+ return this.fields.id;
+ }
+ getLastActivity() {
+ return this.fields.activityDate;
+ }
+ getLeftUntilDone() {
+ return this.fields.leftUntilDone;
+ }
+ getMetadataPercentComplete() {
+ return this.fields.metadataPercentComplete;
+ }
+ getName() {
+ return this.fields.name || 'Unknown';
+ }
+ getPeers() {
+ return this.fields.peers || [];
+ }
+ getPeersConnected() {
+ return this.fields.peersConnected;
+ }
+ getPeersGettingFromUs() {
+ return this.fields.peersGettingFromUs;
+ }
+ getPeersSendingToUs() {
+ return this.fields.peersSendingToUs;
+ }
+ getPieceCount() {
+ return this.fields.pieceCount;
+ }
+ getPieceSize() {
+ return this.fields.pieceSize;
+ }
+ getPrimaryMimeType() {
+ return this.fields['primary-mime-type'];
+ }
+ getPrivateFlag() {
+ return this.fields.isPrivate;
+ }
+ getQueuePosition() {
+ return this.fields.queuePosition;
+ }
+ getRecheckProgress() {
+ return this.fields.recheckProgress;
+ }
+ getSeedRatioLimit() {
+ return this.fields.seedRatioLimit;
+ }
+ getSeedRatioMode() {
+ return this.fields.seedRatioMode;
+ }
+ getSizeWhenDone() {
+ return this.fields.sizeWhenDone;
+ }
+ getStartDate() {
+ return this.fields.startDate;
+ }
+ getStatus() {
+ return this.fields.status;
+ }
+ getTotalSize() {
+ return this.fields.totalSize;
+ }
+ getTrackers() {
+ const trackers = this.fields.trackers || [];
+ for (const tracker of trackers) {
+ if (tracker.announce && !tracker.domain) {
+ Object.assign(tracker, getAnnounceDomain(tracker.announce));
+ }
+ }
+ return this.fields.trackers;
+ }
+ getUploadSpeed() {
+ return this.fields.rateUpload;
+ }
+ getUploadRatio() {
+ return this.fields.uploadRatio;
+ }
+ getUploadedEver() {
+ return this.fields.uploadedEver;
+ }
+ getWebseedsSendingToUs() {
+ return this.fields.webseedsSendingToUs;
+ }
+ isFinished() {
+ return this.fields.isFinished;
+ }
+
+ // derived accessors
+ hasExtraInfo() {
+ return 'hashString' in this.fields;
+ }
+ isSeeding() {
+ return this.getStatus() === Torrent._StatusSeed;
+ }
+ isStopped() {
+ return this.getStatus() === Torrent._StatusStopped;
+ }
+ isChecking() {
+ return this.getStatus() === Torrent._StatusCheck;
+ }
+ isDownloading() {
+ return this.getStatus() === Torrent._StatusDownload;
+ }
+ isQueued() {
+ return (
+ this.getStatus() === Torrent._StatusDownloadWait ||
+ this.getStatus() === Torrent._StatusSeedWait
+ );
+ }
+ isDone() {
+ return this.getLeftUntilDone() < 1;
+ }
+ needsMetaData() {
+ return this.getMetadataPercentComplete() < 1;
+ }
+ getActivity() {
+ return this.getDownloadSpeed() + this.getUploadSpeed();
+ }
+ getPercentDoneStr() {
+ return Formatter.percentString(100 * this.getPercentDone());
+ }
+ getPercentDone() {
+ return this.fields.percentDone;
+ }
+ getStateString() {
+ switch (this.getStatus()) {
+ case Torrent._StatusStopped:
+ return this.isFinished() ? 'Seeding complete' : 'Paused';
+ case Torrent._StatusCheckWait:
+ return 'Queued for verification';
+ case Torrent._StatusCheck:
+ return 'Verifying local data';
+ case Torrent._StatusDownloadWait:
+ return 'Queued for download';
+ case Torrent._StatusDownload:
+ return 'Downloading';
+ case Torrent._StatusSeedWait:
+ return 'Queued for seeding';
+ case Torrent._StatusSeed:
+ return 'Seeding';
+ case null:
+ return 'Unknown';
+ default:
+ return 'Error';
+ }
+ }
+ seedRatioLimit(controller) {
+ switch (this.getSeedRatioMode()) {
+ case Torrent._RatioUseGlobal:
+ return controller.seedRatioLimit();
+ case Torrent._RatioUseLocal:
+ return this.getSeedRatioLimit();
+ default:
+ return -1;
+ }
+ }
+ getErrorMessage() {
+ const string = this.getErrorString();
+ switch (this.getError()) {
+ case Torrent._ErrTrackerWarning:
+ return `Tracker returned a warning: ${string}`;
+ case Torrent._ErrTrackerError:
+ return `Tracker returned an error: ${string}`;
+ case Torrent._ErrLocalError:
+ return `Error: ${string}`;
+ default:
+ return null;
+ }
+ }
+ getCollatedName() {
+ const f = this.fields;
+ if (!f.collatedName && f.name) {
+ f.collatedName = f.name.toLowerCase();
+ }
+ return f.collatedName || '';
+ }
+ getCollatedTrackers() {
+ const f = this.fields;
+ if (!f.collatedTrackers && f.trackers) {
+ f.collatedTrackers = Torrent.collateTrackers(f.trackers);
+ }
+ return f.collatedTrackers || '';
+ }
+
+ /****
+ *****
+ ****/
+
+ testState(state) {
+ const s = this.getStatus();
+
+ switch (state) {
+ case Prefs.FilterActive:
+ return (
+ this.getPeersGettingFromUs() > 0 ||
+ this.getPeersSendingToUs() > 0 ||
+ this.getWebseedsSendingToUs() > 0 ||
+ this.isChecking()
+ );
+ case Prefs.FilterSeeding:
+ return s === Torrent._StatusSeed || s === Torrent._StatusSeedWait;
+ case Prefs.FilterDownloading:
+ return (
+ s === Torrent._StatusDownload || s === Torrent._StatusDownloadWait
+ );
+ case Prefs.FilterPaused:
+ return this.isStopped();
+ case Prefs.FilterFinished:
+ return this.isFinished();
+ default:
+ return true;
+ }
+ }
+
+ /**
+ * @param filter one of Prefs.Filter*
+ * @param search substring to look for, or null
+ * @return true if it passes the test, false if it fails
+ */
+ test(state, search, tracker) {
+ // flter by state...
+ let pass = this.testState(state);
+
+ // maybe filter by text...
+ if (pass && search && search.length > 0) {
+ pass = this.getCollatedName().includes(search.toLowerCase());
+ }
+
+ // maybe filter by tracker...
+ if (pass && tracker && tracker.length > 0) {
+ pass = this.getCollatedTrackers().includes(tracker);
+ }
+
+ return pass;
+ }
+
+ static compareById(ta, tb) {
+ return ta.getId() - tb.getId();
+ }
+ static compareByName(ta, tb) {
+ return (
+ ta.getCollatedName().localeCompare(tb.getCollatedName()) ||
+ Torrent.compareById(ta, tb)
+ );
+ }
+ static compareByQueue(ta, tb) {
+ return ta.getQueuePosition() - tb.getQueuePosition();
+ }
+ static compareByAge(ta, tb) {
+ const a = ta.getDateAdded();
+ const b = tb.getDateAdded();
+
+ return b - a || Torrent.compareByQueue(ta, tb);
+ }
+ static compareByState(ta, tb) {
+ const a = ta.getStatus();
+ const b = tb.getStatus();
+
+ return b - a || Torrent.compareByQueue(ta, tb);
+ }
+ static compareByActivity(ta, tb) {
+ const a = ta.getActivity();
+ const b = tb.getActivity();
+
+ return b - a || Torrent.compareByState(ta, tb);
+ }
+ static compareByRatio(ta, tb) {
+ const a = ta.getUploadRatio();
+ const b = tb.getUploadRatio();
+
+ if (a < b) {
+ return 1;
+ }
+ if (a > b) {
+ return -1;
+ }
+ return Torrent.compareByState(ta, tb);
+ }
+ static compareByProgress(ta, tb) {
+ const a = ta.getPercentDone();
+ const b = tb.getPercentDone();
+
+ return a - b || Torrent.compareByRatio(ta, tb);
+ }
+ static compareBySize(ta, tb) {
+ const a = ta.getTotalSize();
+ const b = tb.getTotalSize();
+
+ return a - b || Torrent.compareByName(ta, tb);
+ }
+
+ static compareTorrents(a, b, sortMode, sortDirection) {
+ let index = 0;
+
+ switch (sortMode) {
+ case Prefs.SortByActivity:
+ index = Torrent.compareByActivity(a, b);
+ break;
+ case Prefs.SortByAge:
+ index = Torrent.compareByAge(a, b);
+ break;
+ case Prefs.SortByQueue:
+ index = Torrent.compareByQueue(a, b);
+ break;
+ case Prefs.SortByProgress:
+ index = Torrent.compareByProgress(a, b);
+ break;
+ case Prefs.SortBySize:
+ index = Torrent.compareBySize(a, b);
+ break;
+ case Prefs.SortByState:
+ index = Torrent.compareByState(a, b);
+ break;
+ case Prefs.SortByRatio:
+ index = Torrent.compareByRatio(a, b);
+ break;
+ case Prefs.SortByName:
+ index = Torrent.compareByName(a, b);
+ break;
+ default:
+ console.log(`Unrecognized sort mode: ${sortMode}`);
+ index = Torrent.compareByName(a, b);
+ break;
+ }
+
+ if (sortDirection === Prefs.SortDescending) {
+ index = -index;
+ }
+
+ return index;
+ }
+
+ /**
+ * @param torrents an array of Torrent objects
+ * @param sortMode one of Prefs.SortBy*
+ * @param sortDirection Prefs.SortAscending or Prefs.SortDescending
+ */
+ static sortTorrents(torrents, sortMode, sortDirection) {
+ switch (sortMode) {
+ case Prefs.SortByActivity:
+ torrents.sort(this.compareByActivity);
+ break;
+ case Prefs.SortByAge:
+ torrents.sort(this.compareByAge);
+ break;
+ case Prefs.SortByName:
+ torrents.sort(this.compareByName);
+ break;
+ case Prefs.SortByProgress:
+ torrents.sort(this.compareByProgress);
+ break;
+ case Prefs.SortByQueue:
+ torrents.sort(this.compareByQueue);
+ break;
+ case Prefs.SortByRatio:
+ torrents.sort(this.compareByRatio);
+ break;
+ case Prefs.SortBySize:
+ torrents.sort(this.compareBySize);
+ break;
+ case Prefs.SortByState:
+ torrents.sort(this.compareByState);
+ break;
+ default:
+ console.log(`Unrecognized sort mode: ${sortMode}`);
+ torrents.sort(this.compareByName);
+ break;
+ }
+
+ if (sortDirection === Prefs.SortDescending) {
+ torrents.reverse();
+ }
+
+ return torrents;
+ }
+}
+
+// Torrent.fields.status
+Torrent._StatusStopped = 0;
+Torrent._StatusCheckWait = 1;
+Torrent._StatusCheck = 2;
+Torrent._StatusDownloadWait = 3;
+Torrent._StatusDownload = 4;
+Torrent._StatusSeedWait = 5;
+Torrent._StatusSeed = 6;
+
+// Torrent.fields.seedRatioMode
+Torrent._RatioUseGlobal = 0;
+Torrent._RatioUseLocal = 1;
+Torrent._RatioUnlimited = 2;
+
+// Torrent.fields.error
+Torrent._ErrNone = 0;
+Torrent._ErrTrackerWarning = 1;
+Torrent._ErrTrackerError = 2;
+Torrent._ErrLocalError = 3;
+
+// TrackerStats' announceState
+Torrent._TrackerInactive = 0;
+Torrent._TrackerWaiting = 1;
+Torrent._TrackerQueued = 2;
+Torrent._TrackerActive = 3;
+
+Torrent.Fields = {};
+
+// commonly used fields which only need to be loaded once,
+// either on startup or when a magnet finishes downloading its metadata
+// finishes downloading its metadata
+Torrent.Fields.Metadata = [
+ 'addedDate',
+ 'file-count',
+ 'name',
+ 'primary-mime-type',
+ 'totalSize',
+];
+
+// commonly used fields which need to be periodically refreshed
+Torrent.Fields.Stats = [
+ 'error',
+ 'errorString',
+ 'eta',
+ 'isFinished',
+ 'isStalled',
+ 'leftUntilDone',
+ 'metadataPercentComplete',
+ 'peersConnected',
+ 'peersGettingFromUs',
+ 'peersSendingToUs',
+ 'percentDone',
+ 'queuePosition',
+ 'rateDownload',
+ 'rateUpload',
+ 'recheckProgress',
+ 'seedRatioMode',
+ 'seedRatioLimit',
+ 'sizeWhenDone',
+ 'status',
+ 'trackers',
+ 'downloadDir',
+ 'uploadedEver',
+ 'uploadRatio',
+ 'webseedsSendingToUs',
+];
+
+// fields used by the inspector which only need to be loaded once
+Torrent.Fields.InfoExtra = [
+ 'comment',
+ 'creator',
+ 'dateCreated',
+ 'files',
+ 'hashString',
+ 'isPrivate',
+ 'pieceCount',
+ 'pieceSize',
+];
+
+// fields used in the inspector which need to be periodically refreshed
+Torrent.Fields.StatsExtra = [
+ 'activityDate',
+ 'corruptEver',
+ 'desiredAvailable',
+ 'downloadedEver',
+ 'fileStats',
+ 'haveUnchecked',
+ 'haveValid',
+ 'peers',
+ 'startDate',
+ 'trackerStats',
+];
diff --git a/web/src/transmission.js b/web/src/transmission.js
new file mode 100644
index 000000000..ba02b2569
--- /dev/null
+++ b/web/src/transmission.js
@@ -0,0 +1,1105 @@
+/**
+ * Copyright © Charles Kerr, Dave Perrett, Malcolm Jarvis and Bruno Bierbaumer
+ *
+ * This file is licensed under the GPLv2.
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ */
+
+import { AboutDialog } from './about-dialog.js';
+import { ContextMenu } from './context-menu.js';
+import { Formatter } from './formatter.js';
+import { Inspector } from './inspector.js';
+import { MoveDialog } from './move-dialog.js';
+import { OpenDialog } from './open-dialog.js';
+import { OverflowMenu } from './overflow-menu.js';
+import { Prefs } from './prefs.js';
+import { PrefsDialog } from './prefs-dialog.js';
+import { Remote, RPC } from './remote.js';
+import { RemoveDialog } from './remove-dialog.js';
+import { RenameDialog } from './rename-dialog.js';
+import { ShortcutsDialog } from './shortcuts-dialog.js';
+import { StatisticsDialog } from './statistics-dialog.js';
+import { Torrent } from './torrent.js';
+import {
+ TorrentRow,
+ TorrentRendererCompact,
+ TorrentRendererFull,
+} from './torrent-row.js';
+import {
+ debounce,
+ deepEqual,
+ setEnabled,
+ setTextContent,
+ movePopup,
+} from './utils.js';
+
+export class Transmission extends EventTarget {
+ constructor(action_manager, notifications, prefs) {
+ super();
+
+ // Initialize the helper classes
+ this.action_manager = action_manager;
+ this.notifications = notifications;
+ this.prefs = prefs;
+ this.remote = new Remote(this);
+
+ this.addEventListener('torrent-selection-changed', (event_) =>
+ this.action_manager.update(event_)
+ );
+
+ // Initialize the implementation fields
+ this.filterText = '';
+ this._torrents = {};
+ this._rows = [];
+ this.dirtyTorrents = new Set();
+
+ this.refilterSoon = debounce(() => this._refilter(false));
+ this.refilterAllSoon = debounce(() => this._refilter(true));
+
+ this.boundPopupCloseListener = this.popupCloseListener.bind(this);
+ this.dispatchSelectionChangedSoon = debounce(
+ () => this._dispatchSelectionChanged(),
+ 200
+ );
+
+ // listen to actions
+ // TODO: consider adding a mutator listener here to pick up dynamic additions
+ for (const element of document.querySelectorAll(`button[data-action]`)) {
+ const { action } = element.dataset;
+ setEnabled(element, this.action_manager.isEnabled(action));
+ element.addEventListener('click', () => {
+ this.action_manager.click(action);
+ });
+ }
+
+ document
+ .querySelector('#filter-tracker')
+ .addEventListener('change', (event_) => {
+ this.setFilterTracker(
+ event_.target.value === 'all' ? null : event_.target.value
+ );
+ });
+
+ this.action_manager.addEventListener('change', (event_) => {
+ for (const element of document.querySelectorAll(
+ `[data-action="${event_.action}"]`
+ )) {
+ setEnabled(element, event_.enabled);
+ }
+ });
+
+ this.action_manager.addEventListener('click', (event_) => {
+ switch (event_.action) {
+ case 'deselect-all':
+ this._deselectAll();
+ break;
+ case 'move-bottom':
+ this._moveBottom();
+ break;
+ case 'move-down':
+ this._moveDown();
+ break;
+ case 'move-top':
+ this._moveTop();
+ break;
+ case 'move-up':
+ this._moveUp();
+ break;
+ case 'open-torrent':
+ this.setCurrentPopup(new OpenDialog(this, this.remote));
+ break;
+ case 'pause-all-torrents':
+ this._stopTorrents(this._getAllTorrents());
+ break;
+ case 'pause-selected-torrents':
+ this._stopTorrents(this.getSelectedTorrents());
+ break;
+ case 'reannounce-selected-torrents':
+ this._reannounceTorrents(this.getSelectedTorrents());
+ break;
+ case 'remove-selected-torrents':
+ this._removeSelectedTorrents(false);
+ break;
+ case 'resume-selected-torrents':
+ this._startSelectedTorrents(false);
+ break;
+ case 'resume-selected-torrents-now':
+ this._startSelectedTorrents(true);
+ break;
+ case 'select-all':
+ this._selectAll();
+ break;
+ case 'show-about-dialog':
+ this.setCurrentPopup(new AboutDialog(this.version_info));
+ break;
+ case 'show-inspector':
+ this.setCurrentPopup(new Inspector(this));
+ break;
+ case 'show-move-dialog':
+ this.setCurrentPopup(new MoveDialog(this, this.remote));
+ break;
+ case 'show-overflow-menu':
+ {
+ this.setCurrentPopup(
+ new OverflowMenu(
+ this,
+ this.prefs,
+ this.remote,
+ this.action_manager
+ )
+ );
+ const btnbox = document
+ .querySelector('#toolbar-overflow')
+ .getBoundingClientRect();
+ movePopup(
+ this.popup.root,
+ btnbox.left + btnbox.width,
+ btnbox.top + btnbox.height,
+ document.body
+ );
+ }
+ break;
+ case 'show-preferences-dialog':
+ this.setCurrentPopup(new PrefsDialog(this, this.remote));
+ break;
+ case 'show-shortcuts-dialog':
+ this.setCurrentPopup(new ShortcutsDialog(this.action_manager));
+ break;
+ case 'show-statistics-dialog':
+ this.setCurrentPopup(new StatisticsDialog(this.remote));
+ break;
+ case 'show-rename-dialog':
+ this.setCurrentPopup(new RenameDialog(this, this.remote));
+ break;
+ case 'start-all-torrents':
+ this._startTorrents(this._getAllTorrents());
+ break;
+ case 'toggle-compact-rows':
+ this.prefs.display_mode =
+ this.prefs.display_mode !== Prefs.DisplayCompact
+ ? Prefs.DisplayCompact
+ : Prefs.DisplayFull;
+ break;
+ case 'trash-selected-torrents':
+ this._removeSelectedTorrents(true);
+ break;
+ case 'verify-selected-torrents':
+ this._verifyTorrents(this.getSelectedTorrents());
+ break;
+ default:
+ console.warn(`unhandled action: ${event_.action}`);
+ }
+ });
+
+ // listen to filter changes
+ let e = document.querySelector('#filter-mode');
+ e.value = this.prefs.filter_mode;
+ e.addEventListener('change', (event_) => {
+ this.prefs.filter_mode = event_.target.value;
+ });
+
+ //if (!isMobileDevice) {
+ document.addEventListener('keydown', this._keyDown.bind(this));
+ document.addEventListener('keyup', this._keyUp.bind(this));
+ e = document.querySelector('#torrent-container');
+ e.addEventListener('click', () => {
+ if (this.popup && this.popup.name !== 'inspector') {
+ this.setCurrentPopup(null);
+ } else {
+ this._deselectAll();
+ }
+ });
+ e.addEventListener('dragenter', Transmission._dragenter);
+ e.addEventListener('dragover', Transmission._dragenter);
+ e.addEventListener('drop', this._drop.bind(this));
+ this._setupSearchBox();
+ //}
+
+ this.elements = {
+ torrent_list: document.querySelector('#torrent-list'),
+ };
+
+ this.elements.torrent_list.addEventListener('contextmenu', (event_) => {
+ // ensure the clicked row is selected
+ let row_element = event.target;
+ while (row_element && !row_element.classList.contains('torrent')) {
+ row_element = row_element.parentNode;
+ }
+ const row = this._rows.find((r) => r.getElement() === row_element);
+ if (row && !row.isSelected()) {
+ this._setSelectedRow(row);
+ }
+
+ const popup = new ContextMenu(this.action_manager);
+ this.setCurrentPopup(popup);
+ movePopup(
+ popup.root,
+ event_.x,
+ event_.y,
+ document.querySelector('#torrent-container')
+ );
+ event_.preventDefault();
+ });
+
+ // Get preferences & torrents from the daemon
+ this.loadDaemonPrefs();
+ this._initializeTorrents();
+ this.refreshTorrents();
+ this.togglePeriodicSessionRefresh(true);
+
+ // this.updateButtonsSoon();
+
+ this.prefs.addEventListener('change', ({ key, value }) =>
+ this._onPrefChanged(key, value)
+ );
+ this.prefs
+ .entries()
+ .forEach(([key, value]) => this._onPrefChanged(key, value));
+ }
+
+ loadDaemonPrefs() {
+ this.remote.loadDaemonPrefs((data) => {
+ this.session_properties = data.arguments;
+ });
+ }
+
+ get session_properties() {
+ return this._session_properties;
+ }
+ set session_properties(o) {
+ if (deepEqual(this._session_properties, o)) {
+ return;
+ }
+
+ this._session_properties = Object.seal(o);
+ const event = new Event('session-change');
+ event.session_properties = o;
+ this.dispatchEvent(event);
+
+ // TODO: maybe have this in a listener handler?
+ this._updateGuiFromSession(o);
+ }
+
+ _setupSearchBox() {
+ const e = document.querySelector('#torrent-search');
+ const blur_token = 'blur';
+ e.classList.add(blur_token);
+ e.addEventListener('blur', () => e.classList.add(blur_token));
+ e.addEventListener('focus', () => e.classList.remove(blur_token));
+ e.addEventListener('keyup', () => this._setFilterText(e.value));
+ }
+
+ _onPrefChanged(key, value) {
+ switch (key) {
+ case Prefs.DisplayMode: {
+ this.torrentRenderer =
+ value === 'compact'
+ ? new TorrentRendererCompact()
+ : new TorrentRendererFull();
+ this.refilterAllSoon();
+ break;
+ }
+
+ case Prefs.FilterMode:
+ case Prefs.SortDirection:
+ case Prefs.SortMode:
+ this.refilterAllSoon();
+ break;
+
+ case Prefs.RefreshRate: {
+ clearInterval(this.refreshTorrentsInterval);
+ const callback = this.refreshTorrents.bind(this);
+ const msec = Math.max(2, this.prefs.refresh_rate_sec) * 1000;
+ this.refreshTorrentsInterval = setInterval(callback, msec);
+ break;
+ }
+
+ case Prefs.AltSpeedEnabled:
+ case Prefs.NotificationsEnabled:
+ default:
+ /*noop*/
+ break;
+ }
+ }
+
+ /// UTILITIES
+
+ _getAllTorrents() {
+ return Object.values(this._torrents);
+ }
+
+ static _getTorrentIds(torrents) {
+ return torrents.map((t) => t.getId());
+ }
+
+ seedRatioLimit() {
+ const p = this.session_properties;
+ if (p && p.seedRatioLimited) {
+ return p.seedRatioLimit;
+ }
+ return -1;
+ }
+
+ /// SELECTION
+
+ _getSelectedRows() {
+ return this._rows.filter((r) => r.isSelected());
+ }
+
+ getSelectedTorrents() {
+ return this._getSelectedRows().map((r) => r.getTorrent());
+ }
+
+ _getSelectedTorrentIds() {
+ return Transmission._getTorrentIds(this.getSelectedTorrents());
+ }
+
+ _setSelectedRow(row) {
+ const e_sel = row ? row.getElement() : null;
+ for (const e of this.elements.torrent_list.children) {
+ e.classList.toggle('selected', e === e_sel);
+ }
+ this.dispatchSelectionChangedSoon();
+ }
+
+ _selectRow(row) {
+ row.getElement().classList.add('selected');
+ this.dispatchSelectionChangedSoon();
+ }
+
+ _deselectRow(row) {
+ row.getElement().classList.remove('selected');
+ this.dispatchSelectionChangedSoon();
+ }
+
+ _selectAll() {
+ for (const e of this.elements.torrent_list.children) {
+ e.classList.add('selected');
+ }
+ this.dispatchSelectionChangedSoon();
+ }
+
+ _deselectAll() {
+ for (const e of this.elements.torrent_list.children) {
+ e.classList.remove('selected');
+ }
+ this.dispatchSelectionChangedSoon();
+ delete this._last_torrent_clicked;
+ }
+
+ _indexOfLastTorrent() {
+ return this._rows.findIndex(
+ (row) => row.getTorrentId() === this._last_torrent_clicked
+ );
+ }
+
+ // Select a range from this row to the last clicked torrent
+ _selectRange(row) {
+ const last = this._indexOfLastTorrent();
+
+ if (last === -1) {
+ this._selectRow(row);
+ } else {
+ // select the range between the prevous & current
+ const next = this._rows.indexOf(row);
+ const min = Math.min(last, next);
+ const max = Math.max(last, next);
+ for (let index = min; index <= max; ++index) {
+ this._selectRow(this._rows[index]);
+ }
+ }
+
+ this.dispatchSelectionChangedSoon();
+ }
+
+ _dispatchSelectionChanged() {
+ const nonselected = [];
+ const selected = [];
+ this._rows.forEach((r) =>
+ (r.isSelected() ? selected : nonselected).push(r.getTorrent())
+ );
+
+ const event = new Event('torrent-selection-changed');
+ event.nonselected = nonselected;
+ event.selected = selected;
+ this.dispatchEvent(event);
+ }
+
+ /*--------------------------------------------
+ *
+ * E V E N T F U N C T I O N S
+ *
+ *--------------------------------------------*/
+
+ static _createKeyShortcutFromKeyboardEvent(event_) {
+ const a = [];
+ if (event_.ctrlKey) {
+ a.push('Control');
+ }
+ if (event_.altKey) {
+ a.push('Alt');
+ }
+ if (event_.metaKey) {
+ a.push('Meta');
+ }
+ if (event_.shitKey) {
+ a.push('Shift');
+ }
+ a.push(event_.key.length === 1 ? event_.key.toUpperCase() : event_.key);
+ return a.join('+');
+ }
+
+ // Process key events
+ _keyDown(event_) {
+ const { keyCode } = event_;
+
+ // look for a shortcut
+ const aria_keys = Transmission._createKeyShortcutFromKeyboardEvent(event_);
+ const action = this.action_manager.getActionForShortcut(aria_keys);
+ if (action) {
+ event_.preventDefault();
+ this.action_manager.click(action);
+ return;
+ }
+
+ const esc_key = keyCode === 27; // esc key pressed
+ if (esc_key && this.popup) {
+ this.setCurrentPopup(null);
+ event_.preventDefault();
+ return;
+ }
+
+ const any_popup_active = document.querySelector('.popup:not(.hidden)');
+ const is_input_focused = event_.target.matches('input');
+ const rows = this._rows;
+
+ // Some shortcuts can only be used if the following conditions are met:
+ // 1. when no input fields are focused
+ // 2. when no other dialogs are visible
+ // 3. when the meta or ctrl key isn't pressed (i.e. opening dev tools shouldn't trigger the info panel)
+ if (
+ !is_input_focused &&
+ !any_popup_active &&
+ !event_.metaKey &&
+ !event_.ctrlKey
+ ) {
+ const shift_key = keyCode === 16; // shift key pressed
+ const up_key = keyCode === 38; // up key pressed
+ const dn_key = keyCode === 40; // down key pressed
+ if ((up_key || dn_key) && rows.length > 0) {
+ const last = this._indexOfLastTorrent();
+ const anchor = this._shift_index;
+ const min = 0;
+ const max = rows.length - 1;
+ let index = last;
+
+ if (dn_key && index + 1 <= max) {
+ ++index;
+ } else if (up_key && index - 1 >= min) {
+ --index;
+ }
+
+ const r = rows[index];
+
+ if (anchor >= 0) {
+ // user is extending the selection
+ // with the shift + arrow keys...
+ if (
+ (anchor <= last && last < index) ||
+ (anchor >= last && last > index)
+ ) {
+ this._selectRow(r);
+ } else if (
+ (anchor >= last && index > last) ||
+ (anchor <= last && last > index)
+ ) {
+ this._deselectRow(rows[last]);
+ }
+ } else {
+ if (event_.shiftKey) {
+ this._selectRange(r);
+ } else {
+ this._setSelectedRow(r);
+ }
+ }
+ if (r) {
+ this._last_torrent_clicked = r.getTorrentId();
+ r.getElement().scrollIntoView();
+ event_.preventDefault();
+ }
+ } else if (shift_key) {
+ this._shift_index = this._indexOfLastTorrent();
+ }
+ }
+ }
+
+ _keyUp(event_) {
+ if (event_.keyCode === 16) {
+ // shift key pressed
+ delete this._shift_index;
+ }
+ }
+
+ static _dragenter(event_) {
+ if (event_.dataTransfer && event_.dataTransfer.types) {
+ const copy_types = new Set(['text/uri-list', 'text/plain']);
+ if (event_.dataTransfer.types.some((type) => copy_types.has(type))) {
+ event_.stopPropagation();
+ event_.preventDefault();
+ event_.dataTransfer.dropEffect = 'copy';
+ return false;
+ }
+ } else if (event_.dataTransfer) {
+ event_.dataTransfer.dropEffect = 'none';
+ }
+ return true;
+ }
+
+ static _isValidURL(string) {
+ try {
+ const url = new URL(string);
+ return url ? true : false;
+ } catch {
+ return false;
+ }
+ }
+
+ shouldAddedTorrentsStart() {
+ return this.session_properties['start-added-torrents'];
+ }
+
+ _drop(event_) {
+ const paused = !this.shouldAddedTorrentsStart();
+
+ if (!event_.dataTransfer || !event_.dataTransfer.types) {
+ return true;
+ }
+
+ const type = event_.data.Transfer.types
+ .filter((t) => ['text/uri-list', 'text/plain'].contains(t))
+ .pop();
+ event_.dataTransfer
+ .getData(type)
+ .split('\n')
+ .map((string) => string.trim())
+ .filter((string) => Transmission._isValidURL(string))
+ .forEach((uri) => this.remote.addTorrentByUrl(uri, paused));
+
+ event_.preventDefault();
+ return false;
+ }
+
+ // turn the periodic ajax session refresh on & off
+ togglePeriodicSessionRefresh(enabled) {
+ if (!enabled && this.sessionInterval) {
+ clearInterval(this.sessionInterval);
+ delete this.sessionInterval;
+ }
+ if (enabled) {
+ this.loadDaemonPrefs();
+ if (!this.sessionInterval) {
+ const msec = 8000;
+ this.sessionInterval = setInterval(
+ this.loadDaemonPrefs.bind(this),
+ msec
+ );
+ }
+ }
+ }
+
+ _setFilterText(search) {
+ this.filterText = search ? search.trim() : null;
+ this.refilterAllSoon();
+ }
+
+ _onTorrentChanged(event_) {
+ // update our dirty fields
+ const tor = event_.currentTarget;
+ this.dirtyTorrents.add(tor.getId());
+
+ // enqueue ui refreshes
+ this.refilterSoon();
+ }
+
+ updateTorrents(ids, fields) {
+ this.remote.updateTorrents(ids, fields, (table, removed_ids) => {
+ const needinfo = [];
+
+ const keys = table.shift();
+ const o = {};
+ for (const row of table) {
+ keys.forEach((key, index) => {
+ o[key] = row[index];
+ });
+ const { id } = o;
+ let t = this._torrents[id];
+ if (t) {
+ const needed = t.needsMetaData();
+ t.refresh(o);
+ if (needed && !t.needsMetaData()) {
+ needinfo.push(id);
+ }
+ } else {
+ t = this._torrents[id] = new Torrent(o);
+ t.addEventListener('dataChanged', this._onTorrentChanged.bind(this));
+ this.dirtyTorrents.add(id);
+ // do we need more info for this torrent?
+ if (!('name' in t.fields) || !('status' in t.fields)) {
+ needinfo.push(id);
+ }
+ }
+ }
+
+ if (needinfo.length > 0) {
+ // whee, new torrents! get their initial information.
+ const more_fields = ['id'].concat(
+ Torrent.Fields.Metadata,
+ Torrent.Fields.Stats
+ );
+ this.updateTorrents(needinfo, more_fields);
+ this.refilterSoon();
+ }
+
+ if (removed_ids) {
+ this._deleteTorrents(removed_ids);
+ this.refilterSoon();
+ }
+ });
+ }
+ /*
+TODO: fix this when notifications get fixed
+ t.notifyOnFieldChange('status', (newValue, oldValue) => {
+ if (
+ oldValue === Torrent._StatusDownload &&
+ (newValue === Torrent._StatusSeed || newValue === Torrent._StatusSeedWait)
+ ) {
+ $(this).trigger('downloadComplete', [t]);
+ } else if (
+ oldValue === Torrent._StatusSeed &&
+ newValue === Torrent._StatusStopped &&
+ t.isFinished()
+ ) {
+ $(this).trigger('seedingComplete', [t]);
+ } else {
+ $(this).trigger('statusChange', [t]);
+ }
+ });
+*/
+
+ refreshTorrents() {
+ const fields = ['id'].concat(Torrent.Fields.Stats);
+ this.updateTorrents('recently-active', fields);
+ }
+
+ _initializeTorrents() {
+ const fields = ['id'].concat(Torrent.Fields.Metadata, Torrent.Fields.Stats);
+ this.updateTorrents(null, fields);
+ }
+
+ _onRowClicked(event_) {
+ const meta_key = event_.metaKey || event_.ctrlKey,
+ { row } = event_.currentTarget;
+
+ if (this.popup && this.popup.name !== 'inspector') {
+ this.setCurrentPopup(null);
+ return;
+ }
+
+ // handle the per-row pause/resume button
+ if (event_.target.classList.contains('torrent-pauseresume-button')) {
+ switch (event_.target.dataset.action) {
+ case 'pause':
+ this._stopTorrents([row.getTorrent()]);
+ break;
+ case 'resume':
+ this._startTorrents([row.getTorrent()]);
+ break;
+ default:
+ break;
+ }
+ }
+
+ // Prevents click carrying to parent element
+ // which deselects all on click
+ event_.stopPropagation();
+
+ // TODO: long-click should raise inspector
+ if (event_.shiftKey) {
+ this._selectRange(row);
+ // Need to deselect any selected text
+ window.focus();
+
+ // Apple-Click, not selected
+ } else if (!row.isSelected() && meta_key) {
+ this._selectRow(row);
+
+ // Regular Click, not selected
+ } else if (!row.isSelected()) {
+ this._setSelectedRow(row);
+
+ // Apple-Click, selected
+ } else if (row.isSelected() && meta_key) {
+ this._deselectRow(row);
+
+ // Regular Click, selected
+ } else if (row.isSelected()) {
+ this._setSelectedRow(row);
+ }
+
+ this._last_torrent_clicked = row.getTorrentId();
+ }
+
+ _deleteTorrents(ids) {
+ if (ids && ids.length > 0) {
+ for (const id of ids) {
+ this.dirtyTorrents.add(id);
+ delete this._torrents[id];
+ }
+ this.refilterSoon();
+ }
+ }
+
+ _removeSelectedTorrents(trash) {
+ const torrents = this.getSelectedTorrents();
+ if (torrents.length > 0) {
+ this.setCurrentPopup(
+ new RemoveDialog({ remote: this.remote, torrents, trash })
+ );
+ }
+ }
+
+ _startSelectedTorrents(force) {
+ this._startTorrents(this.getSelectedTorrents(), force);
+ }
+
+ _startTorrents(torrents, force) {
+ this.remote.startTorrents(
+ Transmission._getTorrentIds(torrents),
+ force,
+ this.refreshTorrents,
+ this
+ );
+ }
+ _verifyTorrents(torrents) {
+ this.remote.verifyTorrents(
+ Transmission._getTorrentIds(torrents),
+ this.refreshTorrents,
+ this
+ );
+ }
+
+ _reannounceTorrents(torrents) {
+ this.remote.reannounceTorrents(
+ Transmission._getTorrentIds(torrents),
+ this.refreshTorrents,
+ this
+ );
+ }
+
+ _stopTorrents(torrents) {
+ this.remote.stopTorrents(
+ Transmission._getTorrentIds(torrents),
+ this.refreshTorrents,
+ this
+ );
+ }
+ changeFileCommand(torrentId, rowIndices, command) {
+ this.remote.changeFileCommand(torrentId, rowIndices, command);
+ }
+
+ // Queue
+ _moveTop() {
+ this.remote.moveTorrentsToTop(
+ this._getSelectedTorrentIds(),
+ this.refreshTorrents,
+ this
+ );
+ }
+ _moveUp() {
+ this.remote.moveTorrentsUp(
+ this._getSelectedTorrentIds(),
+ this.refreshTorrents,
+ this
+ );
+ }
+ _moveDown() {
+ this.remote.moveTorrentsDown(
+ this._getSelectedTorrentIds(),
+ this.refreshTorrents,
+ this
+ );
+ }
+ _moveBottom() {
+ this.remote.moveTorrentsToBottom(
+ this._getSelectedTorrentIds(),
+ this.refreshTorrents,
+ this
+ );
+ }
+
+ ///
+
+ _updateGuiFromSession(o) {
+ const [, version, checksum] = o.version.match(/(.*)\s\(([\da-f]+)\)/);
+ this.version_info = {
+ checksum,
+ version,
+ };
+
+ const element = document.querySelector('#toolbar-overflow');
+ element.classList.toggle('alt-speed-enabled', o[RPC._TurtleState]);
+ }
+
+ _updateStatusbar() {
+ const fmt = Formatter;
+ const torrents = this._getAllTorrents();
+
+ const u = torrents.reduce(
+ (accumulator, tor) => accumulator + tor.getUploadSpeed(),
+ 0
+ );
+ const d = torrents.reduce(
+ (accumulator, tor) => accumulator + tor.getDownloadSpeed(),
+ 0
+ );
+ const string = fmt.countString('Transfer', 'Transfers', this._rows.length);
+
+ setTextContent(document.querySelector('#speed-up-label'), fmt.speedBps(u));
+ setTextContent(document.querySelector('#speed-dn-label'), fmt.speedBps(d));
+ setTextContent(document.querySelector('#filter-count'), string);
+ }
+
+ _updateFilterSelect() {
+ const trackers = this._getTrackers();
+ const names = Object.keys(trackers).sort();
+
+ // build the new html
+ let string = '';
+ string += !this.filterTracker
+ ? 'All '
+ : 'All ';
+ for (const name of names) {
+ const o = trackers[name];
+ string += `${name} `;
+ }
+
+ if (!this.filterTrackersStr || this.filterTrackersStr !== string) {
+ this.filterTrackersStr = string;
+ document.querySelector('#filter-tracker').innerHTML = string;
+ }
+ }
+
+ /// FILTER
+
+ sortRows(rows) {
+ const torrents = rows.map((row) => row.getTorrent());
+ const id2row = rows.reduce((accumulator, row) => {
+ accumulator[row.getTorrent().getId()] = row;
+ return accumulator;
+ }, {});
+ Torrent.sortTorrents(
+ torrents,
+ this.prefs.sort_mode,
+ this.prefs.sort_direction
+ );
+ torrents.forEach((tor, index) => (rows[index] = id2row[tor.getId()]));
+ }
+
+ _refilter(rebuildEverything) {
+ const { sort_mode, sort_direction, filter_mode } = this.prefs;
+ const filter_text = this.filterText;
+ const filter_tracker = this.filterTracker;
+ const renderer = this.torrentRenderer;
+ const list = this.elements.torrent_list;
+
+ const countRows = () => [...list.children].length;
+ const countSelectedRows = () =>
+ [...list.children].reduce(
+ (n, e) => (n + e.classList.contains('selected') ? 1 : 0),
+ 0
+ );
+ const old_row_count = countRows();
+ const old_sel_count = countSelectedRows();
+
+ this._updateFilterSelect();
+
+ clearTimeout(this.refilterTimer);
+ delete this.refilterTimer;
+
+ if (rebuildEverything) {
+ while (list.firstChild) {
+ list.firstChild.remove();
+ }
+ this._rows = [];
+ this.dirtyTorrents = new Set(Object.keys(this._torrents));
+ }
+
+ // rows that overlap with dirtyTorrents need to be refiltered.
+ // those that don't are 'clean' and don't need refiltering.
+ const clean_rows = [];
+ let dirty_rows = [];
+ for (const row of this._rows) {
+ if (this.dirtyTorrents.has(row.getTorrentId())) {
+ dirty_rows.push(row);
+ } else {
+ clean_rows.push(row);
+ }
+ }
+
+ // remove the dirty rows from the dom
+ for (const row of dirty_rows) {
+ row.getElement().remove();
+ }
+
+ // drop any dirty rows that don't pass the filter test
+ const temporary = [];
+ for (const row of dirty_rows) {
+ const id = row.getTorrentId();
+ const t = this._torrents[id];
+ if (t && t.test(filter_mode, filter_text, filter_tracker)) {
+ temporary.push(row);
+ }
+ this.dirtyTorrents.delete(id);
+ }
+ dirty_rows = temporary;
+
+ // make new rows for dirty torrents that pass the filter test
+ // but don't already have a row
+ for (const id of this.dirtyTorrents.values()) {
+ const t = this._torrents[id];
+ if (t && t.test(filter_mode, filter_text, filter_tracker)) {
+ const row = new TorrentRow(renderer, this, t);
+ const e = row.getElement();
+ e.row = row;
+ dirty_rows.push(row);
+ e.addEventListener('click', this._onRowClicked.bind(this));
+ e.addEventListener('dblclick', () =>
+ this.action_manager.click('show-inspector')
+ );
+ }
+ }
+
+ // sort the dirty rows
+ this.sortRows(dirty_rows);
+
+ // now we have two sorted arrays of rows
+ // and can do a simple two-way sorted merge.
+ const rows = [];
+ const cmax = clean_rows.length;
+ const dmax = dirty_rows.length;
+ const frag = document.createDocumentFragment();
+ let ci = 0;
+ let di = 0;
+ while (ci !== cmax || di !== dmax) {
+ let push_clean = null;
+ if (ci === cmax) {
+ push_clean = false;
+ } else if (di === dmax) {
+ push_clean = true;
+ } else {
+ const c = Torrent.compareTorrents(
+ clean_rows[ci].getTorrent(),
+ dirty_rows[di].getTorrent(),
+ sort_mode,
+ sort_direction
+ );
+ push_clean = c < 0;
+ }
+
+ if (push_clean) {
+ rows.push(clean_rows[ci++]);
+ } else {
+ const row = dirty_rows[di++];
+ const e = row.getElement();
+
+ if (ci !== cmax) {
+ list.insertBefore(e, clean_rows[ci].getElement());
+ } else {
+ frag.append(e);
+ }
+
+ rows.push(row);
+ }
+ }
+ list.append(frag);
+
+ // update our implementation fields
+ this._rows = rows;
+ this.dirtyTorrents.clear();
+
+ // set the odd/even property
+ rows
+ .map((row) => row.getElement())
+ .forEach((e, index) => {
+ const even = index % 2 === 0;
+ e.classList.toggle('even', even);
+ e.classList.toggle('odd', !even);
+ });
+
+ this._updateStatusbar();
+ if (
+ old_sel_count !== countSelectedRows() ||
+ old_row_count !== countRows()
+ ) {
+ this.dispatchSelectionChangedSoon();
+ }
+ }
+
+ setFilterTracker(domain) {
+ const e = document.querySelector('#filter-tracker');
+ e.value = domain ? Transmission._getReadableDomain(domain) : 'all';
+
+ this.filterTracker = domain;
+ this.refilterAllSoon();
+ }
+
+ _getTrackers() {
+ const returnValue = {};
+
+ for (const torrent of this._getAllTorrents()) {
+ const names = new Set();
+
+ for (const tracker of torrent.getTrackers()) {
+ const { domain, name } = tracker;
+
+ if (!returnValue[name]) {
+ returnValue[name] = { count: 0, domain };
+ }
+
+ names.add(name);
+ }
+
+ for (const name of names.values()) {
+ ++returnValue[name].count;
+ }
+ }
+
+ return returnValue;
+ }
+
+ ///
+
+ popupCloseListener(event_) {
+ if (event_.target !== this.popup) {
+ throw new Error(event_);
+ }
+ this.popup.removeEventListener('close', this.boundPopupCloseListener);
+ delete this.popup;
+ }
+
+ setCurrentPopup(popup) {
+ if (this.popup) {
+ this.popup.close();
+ }
+
+ this.popup = popup;
+
+ if (this.popup) {
+ this.popup.addEventListener('close', this.boundPopupCloseListener);
+ }
+ }
+}
diff --git a/web/src/utils.js b/web/src/utils.js
new file mode 100644
index 000000000..e6c49aa1e
--- /dev/null
+++ b/web/src/utils.js
@@ -0,0 +1,278 @@
+/*
+ * This file Copyright (C) 2020 Mnemosyne LLC
+ *
+ * It may be used under the GNU GPL versions 2 or 3
+ * or any future license endorsed by Mnemosyne LLC.
+ */
+
+import isEqual from 'lodash.isequal';
+
+export class Utils {
+ /**
+ * Checks to see if the content actually changed before poking the DOM.
+ */
+ static setInnerHTML(e, html) {
+ if (!e) {
+ return;
+ }
+
+ /* innerHTML is listed as a string, but the browser seems to change it.
+ * For example, "∞" gets changed to "∞" somewhere down the line.
+ * So, let's use an arbitrary different field to test our state... */
+ if (e.currentHTML !== html) {
+ e.currentHTML = html;
+ e.innerHTML = html;
+ }
+ }
+
+ /** Given a numerator and denominator, return a ratio string */
+ static ratio(numerator, denominator) {
+ let result = Math.floor((100 * numerator) / denominator) / 100;
+
+ // check for special cases
+ if (
+ result === Number.POSITIVE_INFINITY ||
+ result === Number.NEGATIVE_INFINITY
+ ) {
+ result = -2;
+ } else if (Number.isNaN(result)) {
+ result = -1;
+ }
+
+ return result;
+ }
+}
+
+export function createTabsContainer(id, tabs, callback) {
+ const root = document.createElement('div');
+ root.id = id;
+ root.classList.add('tabs-container');
+
+ const buttons = document.createElement('div');
+ buttons.classList.add('tabs-buttons');
+ root.append(buttons);
+
+ const pages = document.createElement('div');
+ pages.classList.add('tabs-pages');
+ root.append(pages);
+
+ const button_array = [];
+ for (const [button_id, page] of tabs) {
+ const button = document.createElement('button');
+ button.id = button_id;
+ button.classList.add('tabs-button');
+ button.setAttribute('type', 'button');
+ buttons.append(button);
+ button_array.push(button);
+
+ page.classList.add('hidden', 'tabs-page');
+ pages.append(page);
+
+ button.addEventListener('click', () => {
+ for (const element of buttons.children) {
+ element.classList.toggle('selected', element === button);
+ }
+ for (const element of pages.children) {
+ element.classList.toggle('hidden', element !== page);
+ }
+ if (callback) {
+ callback(page);
+ }
+ });
+ }
+
+ button_array[0].classList.add('selected');
+ pages.children[0].classList.remove('hidden');
+
+ return {
+ buttons: button_array,
+ root,
+ };
+}
+
+export function createDialogContainer(id) {
+ const root = document.createElement('dialog');
+ root.classList.add('dialog-container', 'popup', id);
+ root.open = true;
+ root.setAttribute('role', 'dialog');
+
+ const win = document.createElement('div');
+ win.classList.add('dialog-window');
+ root.append(win);
+
+ const logo = document.createElement('div');
+ logo.classList.add('dialog-logo');
+ win.append(logo);
+
+ const heading = document.createElement('div');
+ heading.classList.add('dialog-heading');
+ win.append(heading);
+
+ const message = document.createElement('div');
+ message.classList.add('dialog-message');
+ win.append(message);
+
+ const workarea = document.createElement('div');
+ workarea.classList.add('dialog-workarea');
+ win.append(workarea);
+
+ const buttons = document.createElement('div');
+ buttons.classList.add('dialog-buttons');
+ win.append(buttons);
+
+ const bbegin = document.createElement('span');
+ bbegin.classList.add('dialog-buttons-begin');
+ buttons.append(bbegin);
+
+ const dismiss = document.createElement('button');
+ dismiss.classList.add('dialog-dismiss-button');
+ dismiss.textContent = 'Cancel';
+ buttons.append(dismiss);
+
+ const confirm = document.createElement('button');
+ confirm.textContent = 'OK';
+ buttons.append(confirm);
+
+ const bend = document.createElement('span');
+ bend.classList.add('dialog-buttons-end');
+ buttons.append(bend);
+
+ return {
+ confirm,
+ dismiss,
+ heading,
+ message,
+ root,
+ workarea,
+ };
+}
+
+export function makeUUID() {
+ // source: https://stackoverflow.com/a/2117523/6568470
+ return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>
+ (
+ c ^
+ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))
+ ).toString(16)
+ );
+}
+
+export function createSection(title) {
+ const root = document.createElement('fieldset');
+ root.classList.add('section');
+
+ const legend = document.createElement('legend');
+ legend.classList.add('title');
+ legend.textContent = title;
+ root.append(legend);
+
+ const content = document.createElement('div');
+ content.classList.add('content');
+ root.append(content);
+
+ return { content, root };
+}
+
+export function createInfoSection(title, labels) {
+ const children = [];
+ const { root, content } = createSection(title);
+
+ for (const label_text of labels) {
+ const label_element = document.createElement('label');
+ label_element.textContent = label_text;
+ content.append(label_element);
+
+ const item = document.createElement('div');
+ item.id = makeUUID();
+ content.append(item);
+ label_element.setAttribute('for', item.id);
+ children.push(item);
+ }
+
+ return { children, root };
+}
+
+export function debounce(callback, wait = 100) {
+ let timeout = null;
+ return (...arguments_) => {
+ if (!timeout) {
+ timeout = setTimeout(() => {
+ timeout = null;
+ callback(arguments_);
+ }, wait);
+ }
+ };
+}
+
+export function deepEqual(a, b) {
+ return isEqual(a, b);
+}
+
+function setOrDeleteAttribute(element, attribute, b) {
+ if (b) {
+ element.setAttribute(attribute, true);
+ } else {
+ element.removeAttribute(attribute);
+ }
+}
+export function setEnabled(element, b) {
+ setOrDeleteAttribute(element, 'disabled', !b);
+}
+export function setChecked(element, b) {
+ setOrDeleteAttribute(element, 'checked', b);
+}
+
+function getBestMenuPos(r, bounds) {
+ let { x, y } = r;
+ const { width, height } = r;
+
+ if (x > bounds.x + bounds.width - width && x - width >= bounds.x) {
+ x -= width;
+ } else {
+ x = Math.min(x, bounds.x + bounds.width - width);
+ }
+
+ if (y > bounds.y + bounds.height - height && y - height >= bounds.y) {
+ y -= height;
+ } else {
+ y = Math.min(y, bounds.y + bounds.height - height);
+ }
+
+ return new DOMRect(x, y, width, height);
+}
+
+export function movePopup(popup, x, y, boundingElement) {
+ const initial_pos = new DOMRect(x, y, popup.clientWidth, popup.clientHeight);
+ const clamped_pos = getBestMenuPos(
+ initial_pos,
+ boundingElement.getBoundingClientRect()
+ );
+ popup.style.left = `${clamped_pos.left}px`;
+ popup.style.top = `${clamped_pos.top}px`;
+}
+
+export class OutsideClickListener extends EventTarget {
+ constructor(element) {
+ super();
+ this.listener = (event_) => {
+ if (!element.contains(event_.target)) {
+ this.dispatchEvent(new MouseEvent(event_.type, event_));
+ event_.preventDefault();
+ }
+ };
+ Object.seal(this);
+ this.start();
+ }
+ start() {
+ setTimeout(() => document.addEventListener('click', this.listener), 0);
+ }
+ stop() {
+ document.removeEventListener('click', this.listener);
+ }
+}
+
+export function setTextContent(e, text) {
+ if (e.textContent !== text) {
+ e.textContent = text;
+ }
+}
diff --git a/web/style/images/README.md b/web/style/images/README.md
new file mode 100644
index 000000000..bcc4466be
--- /dev/null
+++ b/web/style/images/README.md
@@ -0,0 +1,69 @@
+
+# GOT BETTER ICONS? PULL REQUESTS WELCOMED
+
+## Material Icons
+
+https://github.com/google/material-design-icons/
+https://material.io/resources/icons/
+
+* analytics.svg
+* horizontal-rule.svg
+* pause-circle-active.svg (pause-circle-filled.svg)
+* pause-circle-idle.svg (pause-circle-filled.svg)
+* play-circle-active.svg (play-circle-filled.svg)
+* play-circle-idle.svg (play-circle-filled.svg)
+* router.svg
+
+## Bootstrap Icons
+
+https://github.com/twbs/icons
+https://icons.getbootstrap.com/icons/
+license: MIT
+
+* chevron-down.svg
+* chevron-up.svg
+* files.svg
+* gear-fill.svg
+* lock-fill.svg
+* search.svg
+* three-dots-vertical.svg
+
+## Adwaita Icons
+
+https://gitlab.gnome.org/GNOME/adwaita-icon-theme
+license: CC-BY-SA 3.0
+
+* audio-x-generic.png
+* folder.png
+* font-x-generic.png
+* image-x-generic.png
+* package-x-generic.png
+* text-x-generic.png
+* video-x-generic.png
+
+
+## SVG Repo
+
+https://www.svgrepo.com/
+license: CC0
+
+* checkered-flag.svg
+* cloud-networking.svg
+* globa-server.svg
+* team.svg
+* top-speed.svg (license: MIT)
+* up-and-down-arrows.svg
+
+
+## Custom Icons
+
+license: MIT
+
+* blue-turtle.png
+* logo.png
+* toolbar-close.png
+* toolbar-folder.png
+* toolbar-info.png
+* toolbar-pause.png
+* toolbar-start.png
+* turtle.png
diff --git a/web/style/images/analytics.svg b/web/style/images/analytics.svg
new file mode 100644
index 000000000..5c1a57802
--- /dev/null
+++ b/web/style/images/analytics.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/web/style/images/application-x-executable.png b/web/style/images/application-x-executable.png
new file mode 100644
index 000000000..f5606d7e0
Binary files /dev/null and b/web/style/images/application-x-executable.png differ
diff --git a/web/style/images/audio-x-generic.png b/web/style/images/audio-x-generic.png
new file mode 100644
index 000000000..18f187229
Binary files /dev/null and b/web/style/images/audio-x-generic.png differ
diff --git a/web/style/transmission/images/blue-turtle.png b/web/style/images/blue-turtle.png
similarity index 100%
rename from web/style/transmission/images/blue-turtle.png
rename to web/style/images/blue-turtle.png
diff --git a/web/style/images/checkered-flag.svg b/web/style/images/checkered-flag.svg
new file mode 100644
index 000000000..604261f67
--- /dev/null
+++ b/web/style/images/checkered-flag.svg
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/style/images/chevron-down.svg b/web/style/images/chevron-down.svg
new file mode 100644
index 000000000..88a251e0d
--- /dev/null
+++ b/web/style/images/chevron-down.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/web/style/images/chevron-up.svg b/web/style/images/chevron-up.svg
new file mode 100644
index 000000000..3e9437e75
--- /dev/null
+++ b/web/style/images/chevron-up.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/web/style/images/diagram-3-fill.svg b/web/style/images/diagram-3-fill.svg
new file mode 100644
index 000000000..620c7c67a
--- /dev/null
+++ b/web/style/images/diagram-3-fill.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/web/style/images/files.svg b/web/style/images/files.svg
new file mode 100644
index 000000000..c53f1e360
--- /dev/null
+++ b/web/style/images/files.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/web/style/images/folder.png b/web/style/images/folder.png
new file mode 100644
index 000000000..46f54b1af
Binary files /dev/null and b/web/style/images/folder.png differ
diff --git a/web/style/images/font-x-generic.png b/web/style/images/font-x-generic.png
new file mode 100644
index 000000000..2b98efef7
Binary files /dev/null and b/web/style/images/font-x-generic.png differ
diff --git a/web/style/images/gear-fill.svg b/web/style/images/gear-fill.svg
new file mode 100644
index 000000000..9865bfdce
--- /dev/null
+++ b/web/style/images/gear-fill.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/web/style/images/horizontal-rule.svg b/web/style/images/horizontal-rule.svg
new file mode 100644
index 000000000..3cb3300ed
--- /dev/null
+++ b/web/style/images/horizontal-rule.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/web/style/images/image-x-generic.png b/web/style/images/image-x-generic.png
new file mode 100644
index 000000000..9a4af9342
Binary files /dev/null and b/web/style/images/image-x-generic.png differ
diff --git a/web/style/images/lock-fill.svg b/web/style/images/lock-fill.svg
new file mode 100644
index 000000000..6552d3570
--- /dev/null
+++ b/web/style/images/lock-fill.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/web/style/transmission/images/logo.png b/web/style/images/logo.png
similarity index 100%
rename from web/style/transmission/images/logo.png
rename to web/style/images/logo.png
diff --git a/web/style/images/package-x-generic.png b/web/style/images/package-x-generic.png
new file mode 100644
index 000000000..70fc92820
Binary files /dev/null and b/web/style/images/package-x-generic.png differ
diff --git a/web/style/images/pause-circle-active.svg b/web/style/images/pause-circle-active.svg
new file mode 100644
index 000000000..2f2cb114a
--- /dev/null
+++ b/web/style/images/pause-circle-active.svg
@@ -0,0 +1 @@
+
diff --git a/web/style/images/pause-circle-idle.svg b/web/style/images/pause-circle-idle.svg
new file mode 100644
index 000000000..1c2f127ba
--- /dev/null
+++ b/web/style/images/pause-circle-idle.svg
@@ -0,0 +1 @@
+
diff --git a/web/style/images/play-circle-active.svg b/web/style/images/play-circle-active.svg
new file mode 100644
index 000000000..b8e97e4f8
--- /dev/null
+++ b/web/style/images/play-circle-active.svg
@@ -0,0 +1 @@
+
diff --git a/web/style/images/play-circle-idle.svg b/web/style/images/play-circle-idle.svg
new file mode 100644
index 000000000..816b68731
--- /dev/null
+++ b/web/style/images/play-circle-idle.svg
@@ -0,0 +1 @@
+
diff --git a/web/style/images/router.svg b/web/style/images/router.svg
new file mode 100644
index 000000000..3b1250ae7
--- /dev/null
+++ b/web/style/images/router.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/web/style/images/search.svg b/web/style/images/search.svg
new file mode 100644
index 000000000..3bd1605bc
--- /dev/null
+++ b/web/style/images/search.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/web/style/images/team.svg b/web/style/images/team.svg
new file mode 100644
index 000000000..1128b6af5
--- /dev/null
+++ b/web/style/images/team.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/style/images/text-x-generic.png b/web/style/images/text-x-generic.png
new file mode 100644
index 000000000..20e73bac4
Binary files /dev/null and b/web/style/images/text-x-generic.png differ
diff --git a/web/style/images/three-dots-vertical.svg b/web/style/images/three-dots-vertical.svg
new file mode 100644
index 000000000..c3e01f770
--- /dev/null
+++ b/web/style/images/three-dots-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/web/style/transmission/images/toolbar-close.png b/web/style/images/toolbar-close.png
similarity index 100%
rename from web/style/transmission/images/toolbar-close.png
rename to web/style/images/toolbar-close.png
diff --git a/web/style/transmission/images/toolbar-folder.png b/web/style/images/toolbar-folder.png
similarity index 100%
rename from web/style/transmission/images/toolbar-folder.png
rename to web/style/images/toolbar-folder.png
diff --git a/web/style/transmission/images/toolbar-info.png b/web/style/images/toolbar-info.png
similarity index 100%
rename from web/style/transmission/images/toolbar-info.png
rename to web/style/images/toolbar-info.png
diff --git a/web/style/transmission/images/toolbar-pause.png b/web/style/images/toolbar-pause.png
similarity index 100%
rename from web/style/transmission/images/toolbar-pause.png
rename to web/style/images/toolbar-pause.png
diff --git a/web/style/transmission/images/toolbar-start.png b/web/style/images/toolbar-start.png
similarity index 100%
rename from web/style/transmission/images/toolbar-start.png
rename to web/style/images/toolbar-start.png
diff --git a/web/style/transmission/images/turtle.png b/web/style/images/turtle.png
similarity index 100%
rename from web/style/transmission/images/turtle.png
rename to web/style/images/turtle.png
diff --git a/web/style/images/up-and-down-arrows.svg b/web/style/images/up-and-down-arrows.svg
new file mode 100644
index 000000000..53e390a87
--- /dev/null
+++ b/web/style/images/up-and-down-arrows.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/style/images/video-x-generic.png b/web/style/images/video-x-generic.png
new file mode 100644
index 000000000..1e5f6453a
Binary files /dev/null and b/web/style/images/video-x-generic.png differ
diff --git a/web/style/jqueryui/images/ui-bg_flat_0_aaaaaa_40x100.png b/web/style/jqueryui/images/ui-bg_flat_0_aaaaaa_40x100.png
deleted file mode 100644
index be476d182..000000000
Binary files a/web/style/jqueryui/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-bg_flat_75_ffffff_40x100.png b/web/style/jqueryui/images/ui-bg_flat_75_ffffff_40x100.png
deleted file mode 100644
index e36540bbf..000000000
Binary files a/web/style/jqueryui/images/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-bg_glass_55_fbf9ee_1x400.png b/web/style/jqueryui/images/ui-bg_glass_55_fbf9ee_1x400.png
deleted file mode 100644
index 0aa2dd09b..000000000
Binary files a/web/style/jqueryui/images/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-bg_glass_65_ffffff_1x400.png b/web/style/jqueryui/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100644
index 3e56dbdca..000000000
Binary files a/web/style/jqueryui/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-bg_glass_75_dadada_1x400.png b/web/style/jqueryui/images/ui-bg_glass_75_dadada_1x400.png
deleted file mode 100644
index 6b8b33a18..000000000
Binary files a/web/style/jqueryui/images/ui-bg_glass_75_dadada_1x400.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-bg_glass_75_e6e6e6_1x400.png b/web/style/jqueryui/images/ui-bg_glass_75_e6e6e6_1x400.png
deleted file mode 100644
index 81e2065be..000000000
Binary files a/web/style/jqueryui/images/ui-bg_glass_75_e6e6e6_1x400.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-bg_glass_95_fef1ec_1x400.png b/web/style/jqueryui/images/ui-bg_glass_95_fef1ec_1x400.png
deleted file mode 100644
index 7172755b8..000000000
Binary files a/web/style/jqueryui/images/ui-bg_glass_95_fef1ec_1x400.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/web/style/jqueryui/images/ui-bg_highlight-soft_75_cccccc_1x100.png
deleted file mode 100644
index ae3ccae06..000000000
Binary files a/web/style/jqueryui/images/ui-bg_highlight-soft_75_cccccc_1x100.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-icons_222222_256x240.png b/web/style/jqueryui/images/ui-icons_222222_256x240.png
deleted file mode 100644
index 4fc55d81d..000000000
Binary files a/web/style/jqueryui/images/ui-icons_222222_256x240.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-icons_2e83ff_256x240.png b/web/style/jqueryui/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644
index 6dbca64aa..000000000
Binary files a/web/style/jqueryui/images/ui-icons_2e83ff_256x240.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-icons_454545_256x240.png b/web/style/jqueryui/images/ui-icons_454545_256x240.png
deleted file mode 100644
index df904816f..000000000
Binary files a/web/style/jqueryui/images/ui-icons_454545_256x240.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-icons_888888_256x240.png b/web/style/jqueryui/images/ui-icons_888888_256x240.png
deleted file mode 100644
index 26dba55c4..000000000
Binary files a/web/style/jqueryui/images/ui-icons_888888_256x240.png and /dev/null differ
diff --git a/web/style/jqueryui/images/ui-icons_cd0a0a_256x240.png b/web/style/jqueryui/images/ui-icons_cd0a0a_256x240.png
deleted file mode 100644
index 8dea01967..000000000
Binary files a/web/style/jqueryui/images/ui-icons_cd0a0a_256x240.png and /dev/null differ
diff --git a/web/style/jqueryui/jquery-ui.min.css b/web/style/jqueryui/jquery-ui.min.css
deleted file mode 100644
index f2903ea86..000000000
--- a/web/style/jqueryui/jquery-ui.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*! jQuery UI - v1.11.4 - 2015-03-11
-* http://jqueryui.com
-* Includes: core.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, draggable.css, menu.css, progressbar.css, resizable.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
-* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
\ No newline at end of file
diff --git a/web/style/transmission-app.scss b/web/style/transmission-app.scss
new file mode 100644
index 000000000..9d1fe2b4a
--- /dev/null
+++ b/web/style/transmission-app.scss
@@ -0,0 +1,1615 @@
+@use 'sass:color';
+@use 'sass:math';
+
+// Color palette recycled from GitHub Primer.
+// Please use those values if you need to add colors.
+// https://primer.style/css/support/color-system
+$blue-100: #dbedff;
+$blue-200: #c8e1ff;
+$blue-300: #79b8ff;
+$blue-700: #044289;
+$green-100: #dcffe4;
+$green-200: #bef5cb;
+$green-300: #85e89d;
+$green-500: #28a745;
+$green-700: #176f2c;
+$grey-100: #f6f8fa;
+$grey-200: #e1e4e8;
+$grey-300: #d1d5da;
+$grey-400: #959da5;
+$grey-500: #6a737d;
+$grey-800: #2f363d;
+$pink-300: #f692ce;
+$pink-700: #b93a86;
+$purple-000: #f5f0ff;
+$purple-100: #e6dcfd;
+$red-500: #d73a49;
+$white: #fff;
+$yellow-200: #fff5b1;
+$yellow-300: #ffea7f;
+$yellow-700: #dbab09;
+
+// Z-INDEX ENUM
+// $z-index-progressbar: 1;
+$z-index-popup: 2;
+
+// SVG ICONS -- see images/README.md for sources and license details
+// Are you a designer? New icon PRs welcomed!
+$image-analytics: 'images/analytics.svg';
+$image-baseline: 'images/horizontal-rule.svg';
+$image-files: 'images/files.svg';
+$image-chevron-dn: 'images/chevron-down.svg';
+$image-chevron-up: 'images/chevron-up.svg';
+$image-lock-fill: 'images/lock-fill.svg';
+$image-network: 'images/router.svg';
+$image-overflow: 'images/three-dots-vertical.svg';
+$image-pause-circle-active: 'images/pause-circle-active.svg';
+$image-pause-circle-idle: 'images/pause-circle-idle.svg';
+$image-peers: 'images/team.svg';
+$image-play-circle-active: 'images/play-circle-active.svg';
+$image-play-circle-idle: 'images/play-circle-idle.svg';
+$image-speed: 'images/checkered-flag.svg';
+$image-tiers: 'images/diagram-3-fill.svg';
+$image-upload-download: 'images/up-and-down-arrows.svg';
+
+@mixin for-phone-only {
+ @media (max-width: 599px) {
+ @content;
+ }
+}
+@mixin for-tablet-portrait-up {
+ @media (min-width: 600px) {
+ @content;
+ }
+}
+// @mixin for-tablet-landscape-up {media (min-width: 900px) { @content; }}
+// @mixin for-desktop-up {@media (min-width: 1200px) { @content; }}
+// @mixin for-big-desktop-up {@media (min-width: 1800px) { @content; }}
+
+/// MIXINS
+
+@mixin image-on-vertical-gradient($src, $topColor, $bottomColor) {
+ background-image: url($src), linear-gradient($topColor, $bottomColor);
+}
+
+@mixin button {
+ border: 1px solid var(--color-border);
+ cursor: pointer;
+ display: inline-block;
+ padding: 3px;
+ user-select: none;
+}
+
+@mixin rounded-box($radius) {
+ border-radius: $radius;
+}
+
+@mixin rounded-button($radius) {
+ @include button;
+ border-radius: $radius;
+}
+
+/// GLOBAL
+
+:root {
+ --color-bg-even: #{$white};
+ --color-bg-hover: #{$grey-100};
+ --color-bg-menu: #{$grey-200};
+ --color-bg-odd: #{$grey-100};
+ --color-bg-selection-1: #{$purple-100};
+ --color-bg-selection-2: #{$purple-000};
+ --color-border: #{$grey-400};
+ --color-fg-disabled: #{$grey-400};
+ --color-fg-error: #{$red-500};
+ --color-fg-name: #{$grey-800};
+ --color-fg-port-closed: #{$red-500};
+ --color-fg-port-open: #{$green-500};
+ @media (prefers-color-scheme: dark) {
+ --color-fg-primary: #{$grey-100};
+ --color-fg-secondary: #{$grey-400};
+ --color-fg-tertiary: #{$grey-500};
+ }
+ @media (prefers-color-scheme: light) {
+ --color-fg-primary: #{$grey-800};
+ --color-fg-secondary: #{$grey-500};
+ --color-fg-tertiary: #{$grey-400};
+ }
+ --color-progressbar-background-1: #{$grey-100};
+ --color-progressbar-background-2: #{$grey-400};
+ --color-progressbar-verify-1: #{$pink-300};
+ --color-progressbar-verify-2: #{$pink-700};
+ --color-progressbar-magnet-1: #{$yellow-300};
+ --color-progressbar-magnet-2: #{$yellow-700};
+ --color-progressbar-magnet-paused-1: #{$yellow-200};
+ --color-progressbar-magnet-paused-2: #{$grey-500};
+ --color-progressbar-leech-paused-1: #{$blue-200};
+ --color-progressbar-leech-paused-2: #{$grey-500};
+ --color-progressbar-leech-queued-1: #{$blue-100};
+ --color-progressbar-leech-queued-2: #{$blue-300};
+ --color-progressbar-leech-1: #{$blue-300};
+ --color-progressbar-leech-2: #{$blue-700};
+ --color-progressbar-seed-paused-1: #{$green-200};
+ --color-progressbar-seed-paused-2: #{$grey-500};
+ --color-progressbar-seed-queued-1: #{$green-100};
+ --color-progressbar-seed-queued-2: #{$green-300};
+ --color-progressbar-seed-1: #{$green-300};
+ --color-progressbar-seed-2: #{$green-700};
+ --color-tab-deselected-1: #{$grey-100};
+ --color-tab-deselected-2: #{$grey-400};
+ --color-tab-selected-1: #{$purple-100};
+ --color-tab-selected-2: #{$purple-000};
+ --color-toolbar-background: linear-gradient(#{$grey-300}, #{$grey-400});
+}
+
+html,
+body {
+ color: var(--color-fg-primary);
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ height: 100%;
+ margin: 0;
+ overflow: hidden;
+}
+
+img {
+ border: 0;
+}
+
+a {
+ outline: 0;
+}
+
+.hidden {
+ display: none;
+}
+
+.even {
+ background-color: var(--color-bg-even);
+}
+.odd {
+ background-color: var(--color-bg-odd);
+}
+
+.mainwin {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ position: relative;
+
+ > * {
+ margin: 0;
+ padding: 0;
+ }
+}
+
+.mainwin-workarea {
+ display: flex;
+ flex: 1;
+ flex-direction: row;
+ overflow: auto;
+}
+
+/// TOOLBAR
+
+$toolbar-height-number: 36;
+$toolbar-height: $toolbar-height-number * 1px;
+
+#mainwin-toolbar {
+ align-items: center;
+ background: var(--color-toolbar-background);
+ border-bottom: 1px solid var(--color-border);
+ display: flex;
+ flex-direction: row;
+ height: $toolbar-height;
+ margin: 0;
+ padding: 2px;
+ width: 100%;
+
+ button {
+ background-color: transparent;
+ background-position: center;
+ background-repeat: no-repeat;
+ border: 0;
+ cursor: pointer;
+ height: $toolbar-height;
+ margin-right: 6px;
+ user-select: none;
+ width: $toolbar-height;
+
+ &:hover:not(:disabled) {
+ background-color: var(--color-bg-hover);
+ }
+
+ &:disabled {
+ cursor: default;
+ opacity: 0.25;
+ }
+ }
+
+ > .toolbar-separator {
+ border-left: 1px solid var(--color-border);
+ height: 25px;
+ margin: 0 6px 0 0;
+ }
+
+ :nth-last-child(2) {
+ border: 0;
+ flex-grow: 1;
+ }
+}
+
+#toolbar-open {
+ background-image: url('images/toolbar-folder.png');
+}
+
+#toolbar-remove {
+ background-image: url('images/toolbar-close.png');
+}
+
+#toolbar-start {
+ background-image: url('images/toolbar-start.png');
+}
+
+#toolbar-pause {
+ background-image: url('images/toolbar-pause.png');
+}
+
+#toolbar-inspector {
+ background-image: url('images/toolbar-info.png');
+}
+
+#toolbar-overflow {
+ background-color: transparent;
+ background-image: url($image-overflow);
+ background-position: center;
+ background-size: 26px;
+ margin-right: 4px;
+ width: 36px;
+
+ &.alt-speed-enabled {
+ background-image: url('images/blue-turtle.png'), url($image-overflow);
+ background-position: bottom left, center, center;
+ background-size: 16px 9px, 26px, 26px;
+ }
+}
+
+/// FILTERBAR
+
+// $filterbar-height-number: 30;
+// $filterbar-height: $filterbar-height-number * 1px;
+
+.mainwin-filterbar {
+ align-items: center;
+ background: var(--color-toolbar-background);
+ border-bottom: 1px solid var(--color-border);
+ display: flex;
+ flex-direction: row;
+ font-size: smaller;
+ // height: $filterbar-height;
+ width: 100%;
+
+ @include for-phone-only {
+ > :not(select):not(input) {
+ display: none;
+ }
+ > input {
+ min-width: 50px;
+ }
+ > input,
+ > select {
+ height: 100%;
+ }
+ }
+
+ > * {
+ padding: 0 5px;
+ }
+}
+
+#torrent-search {
+ &.blur {
+ color: var(--color-fg-tertiary);
+ }
+}
+
+$speed-icon-size: 12px;
+
+.speed-up-icon {
+ background-image: url($image-chevron-up);
+ background-repeat: no-repeat;
+ background-size: $speed-icon-size $speed-icon-size;
+ height: $speed-icon-size;
+ width: $speed-icon-size;
+}
+
+.speed-dn-icon {
+ background-image: url($image-chevron-dn);
+ background-repeat: no-repeat;
+ background-size: $speed-icon-size $speed-icon-size;
+ height: $speed-icon-size;
+ width: $speed-icon-size;
+}
+
+/// TORRENT CONTAINER
+
+$pauseresume-size-number: 14;
+$pauseresume-size: $pauseresume-size-number * 1px;
+$progressbar-border-number: 1;
+$progressbar-height-number: 14;
+$popup-top: 61px; // TODO: ugly that this is hardcoded
+
+.flex {
+ flex-grow: 1;
+}
+
+#torrent-container {
+ flex-grow: 1;
+ left: 0;
+ margin: 0;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ padding: 0;
+ right: 0;
+}
+
+.torrent-container {
+ background-color: $white;
+}
+
+.torrent-list {
+ $app-image: 'images/application-x-executable.png';
+ $audio-image: 'images/audio-x-generic.png';
+ $folder-image: 'images/folder.png';
+ $font-image: 'images/font-x-generic.png';
+ $image-image: 'images/image-x-generic.png';
+ $package-image: 'images/package-x-generic.png';
+ $text-image: 'images/folder.png';
+ $text-image: 'images/text-x-generic.png';
+ $video-image: 'images/video-x-generic.png';
+
+ cursor: pointer;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ text-align: left;
+ width: 100%;
+
+ .torrent {
+ border-bottom: 1px solid var(--color-border);
+ color: var(--color-fg-secondary);
+ user-select: none;
+
+ &.paused {
+ color: var(--color-fg-disabled);
+ }
+
+ .icon {
+ background-position: center, top left;
+
+ @mixin mime-icon-compact($mime-icon) {
+ background-image: url($mime-icon);
+
+ &[data-icon-multifile='true'] {
+ background-image: url($mime-icon), url($folder-image);
+ }
+ }
+
+ &[data-icon-mime-type='audio'] {
+ @include mime-icon-compact($audio-image);
+ }
+
+ &[data-icon-mime-type='application'] {
+ @include mime-icon-compact($app-image);
+ }
+
+ &[data-icon-mime-type='font'] {
+ @include mime-icon-compact($font-image);
+ }
+
+ &[data-icon-mime-type='image'] {
+ @include mime-icon-compact($image-image);
+ }
+
+ &[data-icon-mime-type='model'] {
+ @include mime-icon-compact($package-image);
+ }
+
+ &[data-icon-mime-type='text'] {
+ @include mime-icon-compact($text-image);
+ }
+
+ &[data-icon-mime-type='video'] {
+ @include mime-icon-compact($video-image);
+ }
+ }
+
+ &.compact {
+ $icon-size-num: 16;
+ $icon-size: $icon-size-num * 1px;
+
+ align-items: center;
+ display: flex;
+ flex-direction: row-reverse;
+
+ .icon {
+ background-size: $icon-size, $icon-size-num * 0.5px;
+ flex-shrink: 0;
+ height: $icon-size;
+ width: $icon-size;
+ }
+
+ > * {
+ margin: 4px 5px;
+ }
+ }
+
+ &:not(.compact) {
+ $icon-size-num: 32;
+ $icon-size: $icon-size-num * 1px;
+ align-items: center;
+ display: grid;
+ grid-column-gap: 12px;
+ grid-template-areas:
+ 'icon name'
+ 'icon peers'
+ 'icon progressbar'
+ 'icon progress-text';
+ grid-template-columns: $icon-size 1fr;
+ padding: 2px 12px;
+
+ .icon {
+ background-size: $icon-size, $icon-size-num * 0.5px;
+ grid-area: icon;
+ height: $icon-size;
+ width: $icon-size;
+ }
+
+ .torrent-name {
+ grid-area: name;
+ }
+
+ .torrent-peer-details {
+ grid-area: peers;
+ }
+
+ .torrent-progress {
+ display: flex;
+ flex-direction: row;
+ grid-area: progressbar;
+ }
+
+ .torrent-progress-details {
+ grid-area: progress-text;
+ }
+
+ > * {
+ margin: 1px 0;
+ }
+ }
+
+ &.selected {
+ background-color: var(--color-bg-selection-1);
+ }
+
+ &.selected .torrent-progress-details.error,
+ &.selected .torrent-peer-details.error {
+ color: $white;
+ }
+ }
+
+ .icon {
+ background-position: center;
+ background-repeat: no-repeat;
+ }
+
+ .torrent-pauseresume-button {
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-size: $pauseresume-size;
+ margin-left: math.floor($pauseresume-size-number / 2) * 1px;
+ width: $pauseresume-size;
+
+ &[data-action='pause'] {
+ background-image: url($image-pause-circle-idle);
+ &:active,
+ &:hover {
+ background-image: url($image-pause-circle-active);
+ }
+ }
+ &[data-action='resume'] {
+ background-image: url($image-play-circle-idle);
+ &:active,
+ &:hover {
+ background-image: url($image-play-circle-active);
+ }
+ }
+ }
+
+ .torrent-progress-details.error,
+ .torrent-peer-details.error {
+ color: var(--color-fg-error);
+ }
+
+ .torrent-name {
+ font-weight: bold;
+ margin-bottom: 2px;
+ margin-top: 2px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+
+ &.compact {
+ flex: 1;
+ font-size: 1em;
+ font-weight: normal;
+ }
+
+ &:not(.paused) {
+ color: var(--color-fg-name);
+ }
+ }
+
+ .torrent-progress-details,
+ .torrent-peer-details {
+ font-size: x-small;
+ }
+
+ .torrent-progress-bar {
+ background-repeat: no-repeat;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ height: ($progressbar-height-number - ($progressbar-border-number * 2)) *
+ 1px;
+
+ &.full {
+ flex-grow: 1;
+ margin: 2px 0;
+ }
+ &.compact {
+ min-width: 50px;
+ width: 50px;
+ }
+
+ @function progressbar-gradient($color1, $color2) {
+ @return linear-gradient(to bottom, $color1, $color2 80%);
+ }
+
+ @mixin progressbar-background($color1, $color2) {
+ background: progressbar-gradient($color1, $color2),
+ progressbar-gradient(
+ var(--color-progressbar-background-1),
+ var(--color-progressbar-background-2)
+ );
+ background-repeat: no-repeat;
+ }
+
+ &.leech.paused {
+ @include progressbar-background(
+ var(--color-progressbar-leech-paused-1),
+ var(--color-progressbar-leech-paused-2)
+ );
+ }
+ &.leech.queued {
+ @include progressbar-background(
+ var(--color-progressbar-leech-queued-1),
+ var(--color-progressbar-leech-queued-2)
+ );
+ }
+ &.leech {
+ @include progressbar-background(
+ var(--color-progressbar-leech-1),
+ var(--color-progressbar-leech-2)
+ );
+ }
+ &.magnet.paused {
+ @include progressbar-background(
+ var(--color-progressbar-magnet-paused-1),
+ var(--color-progressbar-magnet-paused-2)
+ );
+ }
+ &.magnet {
+ @include progressbar-background(
+ var(--color-progressbar-magnet-1),
+ var(--color-progressbar-magnet-2)
+ );
+ }
+ &.seed.paused {
+ @include progressbar-background(
+ var(--color-progressbar-seed-paused-1),
+ var(--color-progressbar-seed-paused-2)
+ );
+ }
+ &.seed.queued {
+ @include progressbar-background(
+ var(--color-progressbar-seed-queued-1),
+ var(--color-progressbar-seed-queued-2)
+ );
+ }
+ &.seed {
+ @include progressbar-background(
+ var(--color-progressbar-seed-1),
+ var(--color-progressbar-seed-2)
+ );
+ }
+ &.verify {
+ @include progressbar-background(
+ var(--color-progressbar-verify-1),
+ var(--color-progressbar-verify-2)
+ );
+ }
+ }
+}
+
+/// PREFERENCES DIALOG
+
+@mixin tab-image($image-url) {
+ background-image: url($image-url),
+ linear-gradient(
+ var(--color-tab-deselected-1),
+ var(--color-tab-deselected-2)
+ );
+
+ &:active,
+ &:checked,
+ &.selected {
+ background-image: url($image-url),
+ linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2));
+ }
+}
+
+#inspector-tab-info {
+ @include tab-image($image-analytics);
+}
+
+#inspector-tab-peers {
+ @include tab-image($image-peers);
+}
+
+#inspector-tab-tiers {
+ @include tab-image($image-tiers);
+}
+
+#inspector-tab-files {
+ @include tab-image($image-files);
+}
+
+#inspector,
+#prefs-dialog {
+ @include for-phone-only {
+ left: 0;
+ }
+ @include for-tablet-portrait-up {
+ border-left: 1px solid var(--color-fg-secondary);
+ width: 570px;
+ }
+}
+
+#prefs-dialog {
+ $background-color: $white;
+
+ background: $background-color;
+ bottom: 0;
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);
+ position: absolute;
+ right: 0;
+ top: $popup-top;
+ z-index: $z-index-popup;
+
+ .tabs-page {
+ grid-column-gap: 8px;
+ grid-row-gap: 5px;
+ grid-template-columns: 1fr 1fr;
+ margin: 20px;
+
+ &:not(.hidden) {
+ display: grid;
+ }
+
+ .section-label {
+ font-weight: bold;
+ grid-column: span 2;
+ margin-left: -20px;
+ padding-bottom: 5px;
+
+ &:not(:first-of-type) {
+ margin-top: 20px;
+ }
+ }
+ }
+
+ .alt-speed-section-label {
+ background: transparent url('images/blue-turtle.png') no-repeat;
+ background-position: left 4px;
+ padding-left: 22px;
+ }
+
+ :disabled,
+ .disabled {
+ color: var(--color-fg-disabled);
+ }
+
+ #alt-times-div,
+ #autostart-div,
+ #port-forwarding,
+ #randomize-port,
+ #suffix-div,
+ #use-dht-div,
+ #use-lpd-div,
+ #use-pex-div,
+ #utp-enabled,
+ .alt-speed-label {
+ grid-column: span 2;
+ }
+
+ .blocklist-size-label,
+ .blocklist-update-button,
+ .port-status {
+ grid-column: 2 / 3;
+ }
+
+ .blocklist-size-label {
+ font-size: smaller;
+ }
+ .blocklist-size-number {
+ font-weight: bolder;
+ }
+
+ .port-status-label {
+ display: inline-block;
+ font-weight: bold;
+ margin-left: 5px;
+ &[data-open='true'] {
+ color: var(--color-fg-port-open);
+ }
+ &[data-open='false'] {
+ color: var(--color-fg-port-closed);
+ }
+ }
+
+ .alt-speed-label {
+ font-size: smaller;
+ font-style: lighter;
+ // nudge it up next to the section label
+ margin: -10px 0 10px -20px;
+ }
+}
+
+#prefs-dialog.ui-tabs .ui-tabs-panel {
+ padding: 0;
+ user-select: none;
+}
+
+.prefs-section {
+ text-align: left;
+
+ > * {
+ padding: 0 8px 8px;
+ }
+
+ .title {
+ font-size: larger;
+ font-weight: bold;
+ padding-left: 0;
+ }
+
+ .row {
+ .key {
+ float: left;
+ padding-top: 3px;
+
+ > * {
+ margin-left: 0;
+ }
+ }
+
+ .value {
+ margin-left: 150px;
+
+ > * {
+ width: 100%;
+ }
+ }
+ }
+
+ .checkbox-row {
+ > input {
+ margin: 0;
+ }
+
+ > label {
+ margin-left: 5px;
+ }
+ }
+
+ #alternative-speed-limits-title {
+ background: transparent url('images/blue-turtle.png') no-repeat;
+ padding-left: 18px;
+ }
+
+ #alternative-speed-limits-desc {
+ font-size: smaller;
+ padding-bottom: 4px;
+ }
+}
+
+/// TABS
+
+.tabs-container {
+ align-items: stretch;
+ background: $white;
+ border-left: solid 1px var(--color-border);
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ position: absolute;
+ right: 0;
+ top: $popup-top;
+ z-index: $z-index-popup;
+ @include for-phone-only {
+ left: 0;
+ }
+ @include for-tablet-portrait-up {
+ width: 550px;
+ }
+}
+
+.tabs-buttons {
+ align-self: center;
+ display: flex;
+ padding: 10px;
+
+ button {
+ @include button;
+ appearance: none;
+ padding: 3px;
+ }
+}
+
+.file-priority-radiobox,
+.tabs-buttons {
+ $radius: 8px;
+ :first-child {
+ border-bottom-left-radius: $radius;
+ border-top-left-radius: $radius;
+ }
+ :last-child {
+ border-bottom-right-radius: $radius;
+ border-top-right-radius: $radius;
+ }
+}
+
+.tabs-pages {
+ box-sizing: border-box;
+ flex: 1;
+ overflow-x: hidden;
+ overflow-y: auto;
+ @include for-phone-only {
+ padding: 0 8px 20px;
+ }
+ @include for-tablet-portrait-up {
+ padding: 0 20px 20px;
+ }
+}
+
+.tabs-button {
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+/// INSPECTOR
+
+#inspector {
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);
+}
+
+.inspector-info-page {
+ // TODO: this is (mostly) copied from prefs-dialog.
+ // can it be folded into a single set of rules?
+
+ grid-column-gap: 8px;
+ grid-row-gap: 5px;
+ grid-template-columns: auto 1fr;
+ margin: 20px;
+
+ &:not(.hidden) {
+ display: grid;
+ }
+
+ .section-label {
+ font-weight: bold;
+ grid-column: span 2;
+ margin-left: -20px;
+ padding-bottom: 5px;
+
+ &:not(:first-of-type) {
+ margin-top: 20px;
+ }
+ }
+
+ :not(.section-label) {
+ // this section is not copied
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+ }
+}
+
+#inspector .tabs-button,
+#prefs-dialog .tabs-button {
+ background-size: 20px 20px, 40px 30px;
+ height: 30px;
+ margin: 0;
+ padding: 0;
+ width: 40px;
+}
+
+#prefs-tab-torrent {
+ @include tab-image($image-upload-download);
+}
+
+#prefs-tab-speed {
+ @include tab-image($image-speed);
+}
+
+#prefs-tab-peers {
+ @include tab-image($image-peers);
+}
+
+#prefs-tab-network {
+ @include tab-image($image-network);
+}
+
+.inspector-info-page {
+ padding: 12px;
+}
+
+#inspector-file-list {
+ margin: 0;
+ padding: 0;
+
+ .inspector-torrent-file-list-entry {
+ display: grid;
+ grid-column-gap: 5px;
+ grid-template-areas:
+ 'check name priority'
+ 'blank1 info blank2';
+ grid-template-columns: 20px 1fr 65px;
+ margin-bottom: 4px;
+ padding: 5px;
+
+ &.skip {
+ opacity: 0.5;
+ }
+ }
+
+ .file-wanted-control {
+ grid-area: check;
+ }
+
+ .inspector-torrent-file-list-entry-name {
+ color: var(--color-fg-name);
+ cursor: pointer;
+ grid-area: name;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .inspector-torrent-file-list-entry.skip
+ > .inspector-torrent-file-list-entry-name {
+ color: var(--color-fg-disabled);
+ }
+
+ .inspector-torrent-file-list-entry-progress {
+ color: var(--color-fg-secondary);
+ grid-area: info;
+ }
+
+ .single-file .inspector-torrent-file-list-entry > .file-wanted-control,
+ .inspector-torrent-file-list-entry.complete > .file-wanted-control {
+ cursor: default;
+ }
+}
+
+#inspector-header {
+ margin: 8px 0;
+}
+
+#torrent-inspector-name {
+ font-size: large;
+ font-weight: bold;
+}
+
+#inspector-tiers-list {
+ color: var(--color-fg-secondary);
+ margin: 0 10px;
+ padding: 0 12px;
+
+ .tier-list-row {
+ display: grid;
+ grid-column-gap: 8px;
+ grid-row-gap: 4px;
+ margin-top: 8px;
+ }
+
+ .tier-list-torrent {
+ color: var(--color-fg-primary);
+ font-size: larger;
+ font-weight: bolder;
+ margin-left: -12px;
+ overflow-x: hidden;
+ padding-top: 20px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .tier-list-tracker {
+ font-weight: bolder;
+ grid-column: span 2;
+ margin-top: 8px;
+ padding-bottom: 4px;
+ }
+
+ .tier-announce,
+ .tier-scrape,
+ .tier-state {
+ text-align: left;
+ }
+
+ .tier-downloads,
+ .tier-leechers,
+ .tier-seeders {
+ text-align: right;
+ }
+}
+
+// Peers Tab
+
+.peer-list {
+ $table-border-color: $grey-100;
+ $table-border: 1px solid $table-border-color;
+
+ border: $table-border;
+ border-collapse: collapse;
+ cursor: default;
+ table-layout: fixed;
+ text-align: left;
+ width: 100%;
+
+ td,
+ th {
+ font-size: smaller;
+ padding: 5px;
+ }
+
+ td {
+ border: $table-border;
+ color: var(--color-fg-secondary);
+ // padding: 5px 10px;
+ }
+
+ .torrent-row td {
+ background: $table-border-color;
+ color: var(--color-fg-primary);
+ font-size: normal;
+ font-weight: bolder;
+ overflow-x: hidden;
+ padding: 10px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .encryption {
+ width: 16px;
+ &[data-encrypted='true'] {
+ background: transparent url($image-lock-fill) center center no-repeat;
+ height: 16px;
+ width: 16px;
+ }
+ }
+
+ .peer-address,
+ .percent-done,
+ .speed-down,
+ .speed-up {
+ text-align: right;
+ }
+
+ .percent-done {
+ width: 10%;
+ }
+ .speed-down,
+ .speed-up {
+ width: 15%;
+ }
+ .peer-address {
+ width: 25%;
+ }
+
+ .peer-app-name {
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ @include for-phone-only {
+ display: none;
+ }
+ @include for-tablet-portrait-up {
+ width: 25%;
+ }
+ }
+
+ .status {
+ cursor: pointer;
+ }
+}
+
+/// FILE PRIORITY BUTTONS
+
+.file-priority-radiobox {
+ $size-number: 20;
+ $size: $size-number * 1px;
+ $halfsize: math.floor($size-number / 2) * 1px;
+
+ grid-area: priority;
+
+ > * {
+ @include button;
+ appearance: none;
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: $halfsize, $size;
+ height: $size;
+ margin: 0;
+ padding: 0;
+ width: $size;
+ }
+
+ > .low {
+ @include tab-image($image-chevron-dn);
+ border-right-width: 0;
+ }
+
+ > .normal {
+ @include tab-image($image-baseline);
+ }
+
+ > .high {
+ @include tab-image($image-chevron-up);
+ border-left-width: 0;
+ }
+}
+
+/// CONTEXT MENU
+
+.context-menu {
+ $background-color: var(--color-bg-menu);
+ $disabled-color: var(--color-fg-disabled);
+
+ background: $background-color;
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);
+ position: absolute;
+ z-index: $z-index-popup;
+
+ .context-menuitem {
+ list-style: none;
+ padding: 5px 10px;
+
+ &:hover:not(:disabled),
+ &:focus:not(:disabled) {
+ background-image: linear-gradient($white, var(--color-bg-menu));
+ cursor: pointer;
+ }
+
+ &:disabled {
+ color: $disabled-color;
+ cursor: none;
+ }
+ }
+}
+
+.context-menu-separator {
+ border-bottom: 1px solid var(--color-fg-secondary);
+ margin-bottom: 10px;
+ padding-bottom: 10px;
+}
+
+/// OVERFLOW MENU
+
+.overflow-menu {
+ background: linear-gradient(
+ 160deg,
+ #d21,
+ 1%,
+ var(--color-bg-hover),
+ 40%,
+ var(--color-bg-menu)
+ );
+ border-radius: 8px;
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);
+ padding: 20px;
+ position: fixed;
+ width: 200px;
+ z-index: $z-index-popup;
+
+ fieldset {
+ border: 0;
+ margin-bottom: 8px;
+ padding: 0;
+ }
+
+ > .actions,
+ > .info,
+ > .links {
+ display: flex;
+ flex-direction: column;
+ }
+
+ legend {
+ font-weight: bolder;
+ margin-bottom: 4px;
+ }
+
+ legend ~ * {
+ margin-left: 12px;
+ }
+
+ a,
+ button,
+ label {
+ color: var(--color-fg-primary);
+ font-size: 1em;
+
+ &:disabled {
+ color: var(--color-fg-disabled);
+ cursor: default;
+ }
+
+ &:focus:not(:disabled),
+ &:hover:not(:disabled) {
+ background-color: var(--color-bg-hover);
+ }
+ }
+
+ a,
+ button {
+ background: transparent;
+ border: 0;
+ cursor: pointer;
+ display: block;
+ padding: 4px 0;
+ text-align: left;
+ text-decoration: none;
+ width: 150px;
+ }
+
+ .input-and-label {
+ align-items: center;
+ display: inline-flex;
+ flex-direction: row;
+ }
+
+ #display-options {
+ > * {
+ align-items: center;
+ display: inline-flex;
+ flex-direction: row;
+
+ > * {
+ margin: 4px;
+ }
+
+ :first-child {
+ margin-left: 0;
+ }
+
+ :last-child {
+ margin-right: 0;
+ }
+ }
+ }
+
+ #speed-options {
+ display: flex;
+ flex-direction: column;
+
+ > .speed-up,
+ > .speed-down {
+ align-items: center;
+ display: flex;
+ flex-direction: row;
+ padding: 4px 0;
+
+ > label {
+ overflow: hidden;
+ width: 80px;
+ }
+ }
+
+ .alt-speed {
+ display: grid;
+ grid-column-gap: 5px;
+ grid-row-gap: 5px;
+ grid-template-areas:
+ 'check lb'
+ 'turtle values';
+ grid-template-columns: 20px 1fr;
+ margin-bottom: 4px;
+ }
+
+ #alt-speed-check {
+ grid-area: check;
+
+ &:checked ~ #alt-speed-image {
+ background-image: url('images/blue-turtle.png');
+ }
+
+ &:not(:checked) ~ #alt-speed-image {
+ background-image: url('images/turtle.png');
+ }
+ }
+
+ #alt-speed-image {
+ background-position: center;
+ background-repeat: no-repeat;
+ grid-area: turtle;
+ }
+
+ #alt-speed-label {
+ grid-area: lb;
+ }
+
+ #alt-speed-values-label {
+ font-size: small;
+ grid-area: values;
+ }
+ }
+}
+
+// hide the fullscreen button unless we're on mobile
+@include for-tablet-portrait-up {
+ #display-fullscreen-check,
+ #display-fullscreen-label {
+ display: none;
+ }
+}
+
+/// DIALOGS
+
+$dialog-padding-number: 20;
+$dialog-logo-padding-number: $dialog-padding-number * 2 / 3;
+$logo-size: 64px;
+
+@include for-phone-only {
+ .dialog-buttons {
+ padding-top: $dialog-logo-padding-number * 1px;
+ }
+
+ .dialog-container {
+ opacity: 96%;
+ position: absolute;
+ top: $popup-top;
+ width: 100%;
+ }
+
+ .dialog-logo {
+ padding-bottom: $dialog-logo-padding-number * 1px;
+ }
+
+ .dialog-window {
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ }
+}
+@include for-tablet-portrait-up {
+ .dialog-container {
+ left: 50%;
+ min-width: 400px;
+ position: absolute;
+ top: $popup-top * 2;
+ transform: translateX(-50%);
+ }
+
+ .dialog-heading {
+ grid-area: heading;
+ }
+
+ .dialog-logo {
+ grid-area: icon;
+ padding-right: $dialog-logo-padding-number * 1px;
+ }
+
+ .dialog-window {
+ display: grid;
+ grid-column-gap: 12px;
+ grid-template-areas:
+ 'icon heading'
+ 'icon message'
+ 'icon workarea'
+ 'icon buttons';
+ grid-template-columns: $logo-size 1fr;
+ padding: 2px 12px;
+ }
+}
+
+.dialog-buttons {
+ display: flex;
+ float: right;
+ grid-area: buttons;
+ margin: 10px 0 0;
+ text-align: center;
+
+ button {
+ appearance: none;
+ background: transparent;
+ border: 1px solid var(--color-border);
+ border-radius: 5px;
+ color: var(--color-fg-name);
+ margin-left: 8px;
+ padding: 8px;
+ text-decoration: none;
+ }
+
+ a:hover,
+ a:active {
+ background: linear-gradient($white, var(--color-bg-menu));
+ }
+}
+
+.dialog-buttons-begin {
+ flex-grow: 1;
+}
+
+.dialog-buttons-end {
+ display: none;
+}
+
+.dialog-container {
+ border: 0;
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);
+ color: var(--color-fg-primary);
+ display: block;
+ margin: 0;
+ padding: 0;
+ z-index: $z-index-popup;
+}
+
+.dialog-heading {
+ align-items: center;
+ display: flex;
+ font-size: 1.2em;
+ font-weight: bold;
+}
+
+.dialog-logo {
+ background: transparent url('images/logo.png') top left no-repeat;
+ height: $logo-size;
+ width: $logo-size;
+}
+
+.dialog-message {
+ grid-area: message;
+ margin: 10px 0 0;
+}
+
+.dialog-window {
+ background: linear-gradient(160deg, #d21, 1%, #f7f7f7, 40%, #ccc);
+ height: 100%;
+ padding: $dialog-padding-number * 1px;
+}
+
+.dialog-workarea {
+ display: flex;
+ flex-direction: column;
+ grid-area: workarea;
+ margin: 10px 0 0;
+
+ > * {
+ margin-bottom: 5px;
+ }
+}
+
+/// ABOUT DIALOG
+
+.about-dialog .dialog-workarea > * {
+ margin-bottom: 10px;
+}
+
+.about-dialog-version-number {
+ margin-left: 4px;
+}
+
+.about-dialog-version-checksum {
+ font-size: small;
+ font-style: italic;
+ font-weight: normal;
+ margin-left: auto;
+ padding-left: 10px;
+}
+
+/// HOTKEYS DIALOG
+
+.shortcuts-dialog {
+ table {
+ border-collapse: collapse;
+ width: 100%;
+ }
+
+ th,
+ td {
+ border: 1px solid var(--color-border);
+ padding: 5px 10px;
+ }
+}
+
+/// RENAME DIALOG
+
+#torrent-rename-name {
+ min-width: 400px;
+}
+
+/// SET-LOCATION DIALOG
+
+#move-container #torrent-path {
+ min-width: 400px;
+}
+
+/// STATISTICS DIALOG
+
+.tabs-pages,
+.inspector-info-page,
+.statistics-dialog {
+ .content {
+ column-gap: 16px;
+ display: grid;
+ grid-row-gap: 6px;
+ grid-template-columns: auto 1fr;
+ margin-top: 4px;
+
+ @include for-phone-only {
+ margin: 4px 0 16px;
+ }
+ @include for-tablet-portrait-up {
+ margin: 4px 16px 16px;
+ }
+
+ div {
+ word-break: break-word;
+ }
+ }
+
+ fieldset {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ }
+
+ legend {
+ font-weight: bolder;
+ margin-bottom: 4px;
+ }
+}
+
+/// UPLOAD DIALOG
+
+#free-space-text {
+ display: inline-block;
+ float: right;
+ font-size: smaller;
+ font-style: italic;
+}
+
+#torrent-upload-frame {
+ border: 0;
+ display: block; /* Don't change this : safari forms won't target hidden frames (they open a new window) */
+ height: 0;
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ top: -1000px;
+ width: 0;
+}
+
+.ui-menu {
+ width: 200px;
+}
diff --git a/web/style/transmission/common.css b/web/style/transmission/common.css
deleted file mode 100644
index dd23ddd89..000000000
--- a/web/style/transmission/common.css
+++ /dev/null
@@ -1,1275 +0,0 @@
-/*--------------------------------------
- *
- * G L O B A L
- *
- *--------------------------------------*/
-html {
- margin: 0;
- padding: 0;
- height: 100%;
-}
-
-body {
- font: 62.5% "lucida grande", Tahoma, Verdana, Arial, Helvetica, sans-serif;
- /* Resets 1em to 10px */
- color: #222;
- /* !important; */
- background: #FFF;
- text-align: center;
- margin: 0 0 30px;
- overflow: hidden;
-}
-body img {
- border: none;
-}
-body a {
- outline: 0;
-}
-
-/***
-****
-**** ABOUT DIALOG
-****
-***/
-#about-dialog > * {
- text-align: center;
-}
-#about-dialog > #about-logo {
- background: transparent url("images/logo.png") top left no-repeat;
- width: 64px;
- height: 64px;
- margin-left: 100px;
-}
-#about-dialog > #about-title {
- font-size: 1.3em;
- font-weight: bold;
-}
-
-/***
-****
-**** HOTKEYS DIALOG
-****
-***/
-#hotkeys-dialog table {
- width: 100%;
- border-collapse: collapse;
-}
-#hotkeys-dialog table th, #hotkeys-dialog table td {
- border: 1px solid #AAA;
-}
-
-/***
-****
-**** TOOLBAR
-****
-***/
-div#toolbar {
- width: 100%;
- height: 36px;
- margin: 0px;
- padding: 2px;
- border-bottom: 1px solid #AAA;
- background-color: #cccccc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#ddd), to(#bbb));
- background-image: -webkit-linear-gradient(top, #ddd, #bbb);
- background-image: -moz-linear-gradient(top, #ddd, #bbb);
- background-image: -ms-linear-gradient(top, #ddd, #bbb);
- background-image: -o-linear-gradient(top, #ddd, #bbb);
- background-image: linear-gradient(top, #ddd, #bbb);
-}
-div#toolbar > * {
- cursor: pointer;
- -moz-user-select: none;
- -webkit-user-select: none;
- display: inline-block;
- border-style: solid;
- border-color: #aaa;
- border-width: 1px;
- padding: 3px;
- width: 34px;
- height: 34px;
- float: left;
- border: none;
- padding: 0px 3px;
- background-position: center center;
- background-repeat: no-repeat;
-}
-div#toolbar > div.toolbar-separator {
- height: 25px;
- margin-top: 8px;
- margin-bottom: 5px;
- border-left: 1px solid #aaa;
- width: 3px;
-}
-div#toolbar > div#toolbar-open {
- background-image: url("images/toolbar-folder.png");
-}
-div#toolbar > div#toolbar-remove {
- background-image: url("images/toolbar-close.png");
-}
-div#toolbar > div#toolbar-start {
- background-image: url("images/toolbar-start.png");
-}
-div#toolbar > div#toolbar-pause {
- background-image: url("images/toolbar-pause.png");
-}
-div#toolbar > div#toolbar-start-all {
- background-image: url("images/toolbar-start-all.png");
-}
-div#toolbar > div#toolbar-pause-all {
- background-image: url("images/toolbar-pause-all.png");
-}
-div#toolbar > div#toolbar-inspector {
- background-image: url("images/toolbar-info.png");
- float: right;
- margin-right: 4px;
-}
-div#toolbar > *.disabled {
- opacity: 0.25;
-}
-
-/***
-****
-**** STATUSBAR
-****
-***/
-#statusbar {
- height: 26px;
- width: 100%;
- border-bottom: 1px solid #AAA;
- overflow: hidden;
- position: relative;
- background-color: #cccccc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#ddd), to(#bbb));
- background-image: -webkit-linear-gradient(top, #ddd, #bbb);
- background-image: -moz-linear-gradient(top, #ddd, #bbb);
- background-image: -ms-linear-gradient(top, #ddd, #bbb);
- background-image: -o-linear-gradient(top, #ddd, #bbb);
- background-image: linear-gradient(top, #ddd, #bbb);
-}
-#statusbar #filter {
- float: left;
- margin-left: 5px;
-}
-#statusbar #filter input#torrent_search {
- height: 18px;
- width: 100px;
- border-radius: 6px;
-}
-#statusbar #filter input#torrent_search.blur {
- color: #999;
-}
-#statusbar #filter #filter-count {
- margin-left: 8px;
-}
-#statusbar #speed-info {
- float: right;
- margin-top: 5px;
- margin-right: 10px;
-}
-#statusbar #speed-info * {
- display: inline-block;
-}
-#statusbar #speed-info #speed-up-icon {
- margin-left: 8px;
- width: 8px;
- height: 8px;
- background: url("images/arrow-up.png") bottom no-repeat;
-}
-#statusbar #speed-info #speed-dn-icon {
- width: 8px;
- height: 8px;
- background: url("images/arrow-down.png") bottom no-repeat;
-}
-#statusbar #speed-info #speed-up-container, #statusbar #speed-info #speed-dn-container {
- display: inline;
-}
-
-/***
-****
-**** TORRENT CONTAINER
-****
-***/
-div#torrent_container {
- position: fixed;
- top: 68px;
- bottom: 22px;
- right: 0px;
- left: 0px;
- padding: 0px;
- margin: 0px;
- overflow: auto;
- -webkit-overflow-scrolling: touch;
-}
-
-ul.torrent_list {
- width: 100%;
- margin: 0;
- padding: 0;
- text-align: left;
- cursor: pointer;
- list-style-type: none;
- /**
- * Progressbar
- *
- * Each progressbar has three elemens: a parent container and two children,
- * complete and incomplete.
- *
- * The only thing needed to set the progressbar percentage is to set
- * the complete child's width as a percentage. This is because incomplete
- * is pinned to the full width and height of the parent, and complete
- * is pinned to the left side of the parent and has a higher z-index.
- *
- * The progressbar has different colors depending on its state, so there
- * are five 'decorator' classNames: paused, queued, magnet, leeching, seeding.
- */
-}
-ul.torrent_list li.torrent {
- border-bottom: 1px solid #ccc;
- padding: 4px 30px 5px 14px;
- color: #666;
- background-color: white;
-}
-ul.torrent_list li.torrent.compact {
- padding: 4px;
-}
-ul.torrent_list li.torrent.even {
- background-color: #F7F7F7;
-}
-ul.torrent_list li.torrent.selected {
- background-color: #cdcdff;
-}
-ul.torrent_list li.torrent.compact div.torrent_name {
- color: black;
-}
-ul.torrent_list li.torrent a {
- float: right;
- position: relative;
- right: -22px;
- top: 1px;
-}
-ul.torrent_list li.torrent a img {
- position: relative;
- right: -10px;
-}
-ul.torrent_list li.torrent a div {
- background: url("images/buttons/torrent_buttons.png");
- height: 14px;
- width: 14px;
-}
-ul.torrent_list li.torrent a div.torrent_pause {
- background-position: left top;
-}
-ul.torrent_list li.torrent a div.torrent_resume {
- background-position: center top;
-}
-ul.torrent_list li.torrent a:active div.torrent_pause {
- background-position: left bottom;
-}
-ul.torrent_list li.torrent a:active div.torrent_resume {
- background-position: center bottom;
-}
-ul.torrent_list li.torrent a:hover div.torrent_pause {
- background-position: left center;
-}
-ul.torrent_list li.torrent a:hover div.torrent_resume {
- background-position: center center;
-}
-ul.torrent_list li.torrent div.torrent_name {
- font-size: 1.3em;
- font-weight: bold;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- color: #222;
- margin-top: 2px;
- margin-bottom: 2px;
-}
-ul.torrent_list li.torrent div.torrent_name.compact {
- font-size: 1em;
- font-weight: normal;
-}
-ul.torrent_list li.torrent div.torrent_name.paused {
- font-weight: normal;
- color: #777;
-}
-ul.torrent_list li.torrent div.torrent_progress_details,
-ul.torrent_list li.torrent div.torrent_peer_details {
- clear: left;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-ul.torrent_list li.torrent div.torrent_progress_details.error,
-ul.torrent_list li.torrent div.torrent_peer_details.error {
- color: #F00;
-}
-ul.torrent_list li.torrent.selected div.torrent_progress_details.error, ul.torrent_list li.torrent.selected div.torrent_peer_details.error {
- color: #FFF;
-}
-ul.torrent_list div.torrent_progress_bar_container {
- height: 10px;
- position: relative;
-}
-ul.torrent_list div.torrent_progress_bar_container.compact {
- width: 50px;
- position: absolute;
- right: 10px;
- margin-top: 2px;
- /*float: right;*/
-}
-ul.torrent_list div.torrent_progress_bar_container.full {
- margin-top: 2px;
- margin-bottom: 5px;
-}
-ul.torrent_list div.torrent_peer_details.compact {
- margin-top: 2px;
- margin-right: 65px;
- /* leave room on the right for the progressbar */
- float: right;
- /* pins it next to progressbar & forces torrent_name to ellipsize when it bumps up against this div */
-}
-ul.torrent_list div.torrent_progress_bar {
- height: 100%;
- position: absolute;
- top: 0px;
- left: 0px;
- background-image: url("images/progress.png");
- background-repeat: repeat-x;
- border: 1px solid #888;
-}
-ul.torrent_list div.torrent_progress_bar.complete {
- z-index: 2;
-}
-ul.torrent_list div.torrent_progress_bar.complete.paused {
- background-position: left -30px;
- border-color: #989898;
-}
-ul.torrent_list div.torrent_progress_bar.complete.magnet {
- background-position: left -20px;
- border-color: #CFCFCF;
-}
-ul.torrent_list div.torrent_progress_bar.complete.leeching {
- background-position: left 0px;
- border-color: #3D9DEA;
-}
-ul.torrent_list div.torrent_progress_bar.complete.leeching.queued {
- background-position: left -70px;
- border-color: #889CA5;
-}
-ul.torrent_list div.torrent_progress_bar.complete.seeding {
- background-position: left -40px;
- border-color: #269E30;
-}
-ul.torrent_list div.torrent_progress_bar.complete.seeding.queued {
- background-position: left -60px;
- border-color: #8A998D;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete {
- z-index: 1;
- width: 100%;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete.paused {
- background-position: left -20px;
- border-color: #CFCFCF;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete.magnet {
- background-position: left -50px;
- border-color: #D47778;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete.leeching {
- background-position: left -20px;
- border-color: #CFCFCF;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete.leeching.queued {
- background-position: left -80px;
- border-color: #C4C4C4;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete.seeding {
- background-position: left -10px;
- border-color: #29AD35;
-}
-
-/***
-****
-**** PREFERENCES
-****
-***/
-#prefs-dialog.ui-tabs .ui-tabs-panel {
- padding: 0px;
- -moz-user-select: none;
- -webkit-user-select: none;
-}
-
-.prefs-section {
- margin: 10px;
- text-align: left;
-}
-.prefs-section > * {
- padding-top: 8px;
- padding-left: 8px;
-}
-.prefs-section .title {
- font-weight: bold;
- font-size: larger;
- padding-left: 0px;
-}
-.prefs-section .row .key {
- float: left;
- padding-top: 3px;
-}
-.prefs-section .row .key > * {
- margin-left: 0px;
-}
-.prefs-section .row .value {
- margin-left: 150px;
-}
-.prefs-section .row .value > * {
- width: 100%;
-}
-.prefs-section .checkbox-row > input {
- margin: 0px;
-}
-.prefs-section .checkbox-row > label {
- margin-left: 5px;
-}
-.prefs-section #alternative-speed-limits-title {
- padding-left: 18px;
- background: transparent url("images/blue-turtle.png") no-repeat;
-}
-.prefs-section #alternative-speed-limits-desc {
- font-size: smaller;
- padding-bottom: 4px;
-}
-.prefs-section #blocklist-info {
- font-size: smaller;
- margin-top: 3px;
-}
-
-/***
-****
-**** TORRENT INSPECTOR
-****
-***/
-div#torrent_inspector {
- overflow: auto;
- -webkit-overflow-scrolling: touch;
- text-align: left;
- padding: 15px;
- top: 68px;
- position: fixed;
- width: 570px;
- z-index: 5;
- border-left: 1px solid #888;
- bottom: 22px;
- right: 0px;
- /* Files Inspector Tab */
-}
-div#torrent_inspector #inspector-close {
- display: none;
-}
-div#torrent_inspector #inspector-tabs-wrapper {
- width: 100%;
- overflow: hidden;
- text-align: center;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs {
- display: inline-block;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > * {
- cursor: pointer;
- -moz-user-select: none;
- -webkit-user-select: none;
- display: inline-block;
- border-style: solid;
- border-color: #aaa;
- border-width: 1px;
- padding: 3px;
- width: 30px;
- height: 20px;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-info {
- -moz-border-radius-topleft: 5px;
- -moz-border-radius-bottomleft: 5px;
- border-top-left-radius: 5px;
- border-bottom-left-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/inspector-info.png");
- /* fallback */
- background-image: url("images/inspector-info.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-info.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-info.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/inspector-info.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/inspector-info.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
- border-left-width: 1px;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-info:active, div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-info.selected {
- background-color: #e6e6ff;
- background-image: url("images/inspector-info.png");
- /* fallback */
- background-image: url("images/inspector-info.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-info.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-info.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/inspector-info.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/inspector-info.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-peers {
- background-color: #dddddd;
- background-image: url("images/inspector-peers.png");
- /* fallback */
- background-image: url("images/inspector-peers.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-peers.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-peers.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/inspector-peers.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/inspector-peers.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-peers:active, div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-peers.selected {
- background-color: #e6e6ff;
- background-image: url("images/inspector-peers.png");
- /* fallback */
- background-image: url("images/inspector-peers.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-peers.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-peers.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/inspector-peers.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/inspector-peers.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-trackers {
- background-color: #dddddd;
- background-image: url("images/inspector-trackers.png");
- /* fallback */
- background-image: url("images/inspector-trackers.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-trackers.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-trackers.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/inspector-trackers.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/inspector-trackers.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-trackers:active, div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-trackers.selected {
- background-color: #e6e6ff;
- background-image: url("images/inspector-trackers.png");
- /* fallback */
- background-image: url("images/inspector-trackers.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-trackers.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-trackers.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/inspector-trackers.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/inspector-trackers.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-files {
- -moz-border-radius-topright: 5px;
- -moz-border-radius-bottomright: 5px;
- border-top-right-radius: 5px;
- border-bottom-right-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/inspector-files.png");
- /* fallback */
- background-image: url("images/inspector-files.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-files.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-files.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/inspector-files.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/inspector-files.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-files:active, div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-files.selected {
- background-color: #e6e6ff;
- background-image: url("images/inspector-files.png");
- /* fallback */
- background-image: url("images/inspector-files.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-files.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-files.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/inspector-files.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/inspector-files.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector_header {
- margin-top: 8px;
-}
-div#torrent_inspector #inspector_header #torrent_inspector_name {
- font-weight: bold;
- font-size: large;
-}
-div#torrent_inspector ul.tier_list {
- margin: 2px 0 8px 0;
- width: 100%;
- padding-left: 0px;
- text-align: left;
- display: block;
- cursor: default;
- list-style-type: none;
- list-style: none;
- list-style-image: none;
- clear: both;
-}
-div#torrent_inspector ul.tier_list li {
- overflow: hidden;
-}
-div#torrent_inspector ul.tier_list .tracker_activity {
- float: left;
- color: #666;
- width: 330px;
- display: table;
- margin-top: 1px;
-}
-div#torrent_inspector ul.tier_list .tracker_activity div {
- padding: 2px;
-}
-div#torrent_inspector ul.tier_list table {
- float: right;
- color: #666;
-}
-div#torrent_inspector ul.tier_list th {
- text-align: right;
-}
-div#torrent_inspector li.inspector_tracker_entry {
- padding: 3px 0 3px 2px;
- display: block;
-}
-div#torrent_inspector li.inspector_tracker_entry.odd {
- background-color: #EEEEEE;
-}
-div#torrent_inspector div.tracker_host {
- font-size: 1.2em;
- font-weight: bold;
- color: #222;
-}
-div#torrent_inspector #inspector_file_list {
- padding: 0 0 0 0;
- margin: 0 0 0 0;
- text-align: left;
- cursor: default;
- overflow: hidden;
-}
-div#torrent_inspector #inspector_file_list {
- width: 100%;
- margin: 6px 0 0 0;
- padding-top: 6px;
- padding-bottom: 10px;
- text-align: left;
- display: block;
- cursor: default;
- list-style-type: none;
- list-style: none;
- list-style-image: none;
- clear: both;
-}
-div#torrent_inspector li.inspector_torrent_file_list_entry {
- padding: 3px 0 3px 2px;
- display: block;
-}
-div#torrent_inspector li.inspector_torrent_file_list_entry.skip {
- color: #666;
-}
-div#torrent_inspector li.inspector_torrent_file_list_entry.even {
- background-color: #F7F7F7;
-}
-div#torrent_inspector div.inspector_torrent_file_list_entry_name {
- font-size: 1.2em;
- color: black;
- display: inline;
- margin-left: 0px;
-}
-div#torrent_inspector li.inspector_torrent_file_list_entry.skip > .inspector_torrent_file_list_entry_name {
- color: #999;
-}
-div#torrent_inspector div.inspector_torrent_file_list_entry_progress {
- color: #999;
- margin-left: 20px;
-}
-div#torrent_inspector ul.single_file li.inspector_torrent_file_list_entry > .file_wanted_control,
-div#torrent_inspector li.inspector_torrent_file_list_entry.complete > .file_wanted_control {
- cursor: default;
-}
-
-/* Peers Inspector Tab */
-#inspector_peers_list {
- padding: 0 0 0 0;
- margin: 0 0 0 0;
- text-align: left;
- cursor: default;
- overflow: hidden;
-}
-#inspector_peers_list > div.inspector_group {
- padding-bottom: 0;
- margin-bottom: 0;
-}
-
-table.peer_list {
- width: 100%;
- border-collapse: collapse;
- text-align: left;
- cursor: default;
- clear: both;
- table-layout: fixed;
-}
-table.peer_list .encryptedCol {
- width: 16px;
-}
-table.peer_list .upCol {
- width: 70px;
-}
-table.peer_list .downCol {
- width: 70px;
-}
-table.peer_list .percentCol {
- width: 30px;
- padding-right: 5px;
- text-align: right;
-}
-table.peer_list .statusCol {
- width: 40px;
- padding-right: 5px;
-}
-table.peer_list .addressCol {
- width: 180px;
-}
-table.peer_list .clientCol {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-tr.inspector_peer_entry div.encrypted-peer-cell {
- width: 16px;
- height: 16px;
- background: transparent url("images/lock_icon.png") no-repeat;
-}
-tr.inspector_peer_entry.odd {
- background-color: #EEEEEE;
-}
-
-/***
-**** File Priority Buttons
-***/
-div.file-priority-radiobox {
- display: inline;
- float: right;
- margin: 4px;
- margin-top: 2px;
-}
-div.file-priority-radiobox > * {
- cursor: pointer;
- -moz-user-select: none;
- -webkit-user-select: none;
- display: inline-block;
- border-style: solid;
- border-color: #aaa;
- border-width: 1px;
- padding: 3px;
- width: 20px;
- height: 12px;
-}
-div.file-priority-radiobox > div.low {
- -moz-border-radius-topleft: 5px;
- -moz-border-radius-bottomleft: 5px;
- border-top-left-radius: 5px;
- border-bottom-left-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/file-priority-low.png");
- /* fallback */
- background-image: url("images/file-priority-low.png"), -webkit-gradient(linear, left top, left bottom, from(#f1f1f1), to(#c9c9c9));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-low.png"), -webkit-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-low.png"), -moz-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* FF3.6+ */
- background-image: url("images/file-priority-low.png"), -ms-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* IE10 */
- background-image: url("images/file-priority-low.png"), -o-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
- border-right-width: 0px;
-}
-div.file-priority-radiobox > div.low:active, div.file-priority-radiobox > div.low.selected {
- background-color: #e6e6ff;
- background-image: url("images/file-priority-low.png");
- /* fallback */
- background-image: url("images/file-priority-low.png"), -webkit-gradient(linear, left top, left bottom, from(#d7d7ff), to(#f5f5ff));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-low.png"), -webkit-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-low.png"), -moz-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* FF3.6+ */
- background-image: url("images/file-priority-low.png"), -ms-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* IE10 */
- background-image: url("images/file-priority-low.png"), -o-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.file-priority-radiobox > div.normal {
- background-color: #dddddd;
- background-image: url("images/file-priority-normal.png");
- /* fallback */
- background-image: url("images/file-priority-normal.png"), -webkit-gradient(linear, left top, left bottom, from(#f1f1f1), to(#c9c9c9));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-normal.png"), -webkit-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-normal.png"), -moz-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* FF3.6+ */
- background-image: url("images/file-priority-normal.png"), -ms-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* IE10 */
- background-image: url("images/file-priority-normal.png"), -o-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.file-priority-radiobox > div.normal:active, div.file-priority-radiobox > div.normal.selected {
- background-color: #e6e6ff;
- background-image: url("images/file-priority-normal.png");
- /* fallback */
- background-image: url("images/file-priority-normal.png"), -webkit-gradient(linear, left top, left bottom, from(#d7d7ff), to(#f5f5ff));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-normal.png"), -webkit-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-normal.png"), -moz-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* FF3.6+ */
- background-image: url("images/file-priority-normal.png"), -ms-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* IE10 */
- background-image: url("images/file-priority-normal.png"), -o-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.file-priority-radiobox > div.high {
- -moz-border-radius-topright: 5px;
- -moz-border-radius-bottomright: 5px;
- border-top-right-radius: 5px;
- border-bottom-right-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/file-priority-high.png");
- /* fallback */
- background-image: url("images/file-priority-high.png"), -webkit-gradient(linear, left top, left bottom, from(#f1f1f1), to(#c9c9c9));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-high.png"), -webkit-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-high.png"), -moz-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* FF3.6+ */
- background-image: url("images/file-priority-high.png"), -ms-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* IE10 */
- background-image: url("images/file-priority-high.png"), -o-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
- border-left-width: 0px;
-}
-div.file-priority-radiobox > div.high:active, div.file-priority-radiobox > div.high.selected {
- background-color: #e6e6ff;
- background-image: url("images/file-priority-high.png");
- /* fallback */
- background-image: url("images/file-priority-high.png"), -webkit-gradient(linear, left top, left bottom, from(#d7d7ff), to(#f5f5ff));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-high.png"), -webkit-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-high.png"), -moz-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* FF3.6+ */
- background-image: url("images/file-priority-high.png"), -ms-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* IE10 */
- background-image: url("images/file-priority-high.png"), -o-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-
-/****
-*****
-***** MAIN WINDOW FOOTER
-*****
-****/
-div.torrent_footer {
- height: 22px;
- border-top: 1px solid #555;
- bottom: 0;
- position: fixed;
- width: 100%;
- z-index: 3;
- background-color: #cccccc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#ddd), to(#bbb));
- background-image: -webkit-linear-gradient(top, #ddd, #bbb);
- background-image: -moz-linear-gradient(top, #ddd, #bbb);
- background-image: -ms-linear-gradient(top, #ddd, #bbb);
- background-image: -o-linear-gradient(top, #ddd, #bbb);
- background-image: linear-gradient(top, #ddd, #bbb);
-}
-div.torrent_footer > div {
- float: left;
- margin: 2px 4px;
- width: 18px;
- height: 12px;
- padding: 2px 8px;
- float: left;
- border: 1px solid #888;
- -moz-user-select: none;
- -webkit-user-select: none;
-}
-div.torrent_footer #settings_menu {
- -moz-border-radius: 5px;
- border-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/settings.png");
- /* fallback */
- background-image: url("images/settings.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/settings.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/settings.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/settings.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/settings.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #settings_menu:active, div.torrent_footer #settings_menu.selected {
- background-color: #e6e6ff;
- background-image: url("images/settings.png");
- /* fallback */
- background-image: url("images/settings.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/settings.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/settings.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/settings.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/settings.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #prefs-button {
- -moz-border-radius: 5px;
- border-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/wrench.png");
- /* fallback */
- background-image: url("images/wrench.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/wrench.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/wrench.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/wrench.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/wrench.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #prefs-button:active, div.torrent_footer #prefs-button.selected {
- background-color: #e6e6ff;
- background-image: url("images/wrench.png");
- /* fallback */
- background-image: url("images/wrench.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/wrench.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/wrench.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/wrench.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/wrench.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #turtle-button {
- -moz-border-radius: 5px;
- border-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/turtle.png");
- /* fallback */
- background-image: url("images/turtle.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/turtle.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/turtle.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/turtle.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/turtle.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #turtle-button:active, div.torrent_footer #turtle-button.selected {
- background-color: #e6e6ff;
- background-image: url("images/turtle.png");
- /* fallback */
- background-image: url("images/turtle.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/turtle.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/turtle.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/turtle.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/turtle.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #turtle-button:active, div.torrent_footer #turtle-button.selected {
- background-color: #e6e6ff;
- background-image: url("images/blue-turtle.png");
- /* fallback */
- background-image: url("images/blue-turtle.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/blue-turtle.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/blue-turtle.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/blue-turtle.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/blue-turtle.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #compact-button {
- -moz-border-radius: 5px;
- border-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/compact.png");
- /* fallback */
- background-image: url("images/compact.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/compact.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/compact.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/compact.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/compact.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #compact-button:active, div.torrent_footer #compact-button.selected {
- background-color: #e6e6ff;
- background-image: url("images/compact.png");
- /* fallback */
- background-image: url("images/compact.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/compact.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/compact.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/compact.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/compact.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #freespace-info {
- float: right;
- text-align: right;
- border: 0px;
- width: 100px;
-}
-
-/****
-*****
-***** DIALOGS
-*****
-****/
-div.dialog_container {
- position: absolute;
- top: 0;
- left: 0px;
- margin: 0px;
- width: 100%;
- height: 100%;
- text-align: center;
- color: black;
- font-size: 1.1em;
-}
-
-div.dialog_container div.dialog_window {
- background-color: #eee;
- margin: 0 auto;
- opacity: 0.95;
- border-top: none;
- text-align: left;
- width: 420px;
- z-index: 10;
- overflow: hidden;
- position: relative;
- -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);
- top: 80px;
-}
-
-@media screen and (-webkit-min-device-pixel-ratio: 0) {
- div.dialog_container div.dialog_window {
- top: 0;
- margin-top: 71px;
- }
-}
-div.dialog_container .dialog_logo {
- width: 64px;
- height: 64px;
- margin: 20px 20px 0 20px;
- float: left;
- background: transparent url("images/logo.png") top left no-repeat;
-}
-
-div.dialog_container div.dialog_window h2.dialog_heading {
- display: block;
- float: left;
- width: 305px;
- font-size: 1.2em;
- color: black;
- margin-top: 20px;
-}
-
-div.dialog_container div.dialog_window div.dialog_message {
- float: left;
- padding-left: 3px;
- margin-left: -3px;
- width: 305px;
- overflow: hidden;
-}
-
-div.dialog_container div.dialog_window a {
- display: block;
- float: right;
- margin: 10px 20px 10px -8px;
- padding: 5px;
- background-color: #EEE;
- border: 1px solid #787878;
- width: 50px;
- height: 15px;
- text-align: center;
- font-weight: bold;
- text-decoration: none;
- color: #323232;
- -webkit-appearance: button;
- font: -webkit-control;
- cursor: default;
-}
-
-div.dialog_container div.dialog_window a:hover,
-div.dialog_container div.dialog_window a:active {
- background: #C0C8D6 url("images/filter_bar.png") bottom repeat-x;
-}
-
-div#upload_container div.dialog_window div.dialog_message label {
- margin-top: 15px;
- display: block;
-}
-
-div#upload_container div.dialog_window div.dialog_message input {
- width: 249px;
- margin: 3px 0 0 0;
- display: block;
-}
-
-div#upload_container div.dialog_window div.dialog_message input[type=text] {
- width: 245px;
- padding: 2px;
-}
-
-div#upload_container div.dialog_window div.dialog_message input[type=checkbox] {
- margin: 15px 3px 0 0;
- display: inline;
- width: auto;
-}
-
-div#upload_container div.dialog_window div.dialog_message #auto_start_label {
- display: inline;
-}
-
-div.dialog_container div.dialog_window form {
- margin: 0;
- padding: 0px;
-}
-
-div#move_container input#torrent_path {
- width: 286px;
- padding: 2px;
-}
-
-iframe#torrent_upload_frame {
- display: block;
- /* Don't change this : safari forms won't target hidden frames (they open a new window) */
- position: absolute;
- top: -1000px;
- left: -1000px;
- width: 0px;
- height: 0px;
- border: none;
- padding: 0;
- margin: 0;
-}
-
-/****
-*****
-***** POPUP MENU
-*****
-****/
-.ui-menu-item {
- text-align: left;
- white-space: nowrap;
-}
-
-#torrent_context_menu,
-#footer_super_menu {
- font-size: 1em;
- z-index: 3;
-}
-
-/*# sourceMappingURL=common.css.map */
diff --git a/web/style/transmission/common.scss b/web/style/transmission/common.scss
deleted file mode 100644
index 8d492643d..000000000
--- a/web/style/transmission/common.scss
+++ /dev/null
@@ -1,986 +0,0 @@
-@mixin verticalGradient($topColor, $bottomColor) {
- background-color: mix($topColor, $bottomColor);
- background-image: -webkit-gradient(linear, left top, left bottom, from($topColor), to($bottomColor));
- background-image: -webkit-linear-gradient(top, $topColor, $bottomColor);
- background-image: -moz-linear-gradient(top, $topColor, $bottomColor);
- background-image: -ms-linear-gradient(top, $topColor, $bottomColor);
- background-image: -o-linear-gradient(top, $topColor, $bottomColor);
- background-image: linear-gradient(top, $topColor, $bottomColor);
-}
-
-@mixin imageOnVerticalGradient($src, $topColor, $bottomColor) {
- background-color: mix($topColor, $bottomColor);
- background-image: url($src); /* fallback */
- background-image: url($src), -webkit-gradient(linear, left top, left bottom, from($topColor), to($bottomColor)); /* Saf4+, Chrome */
- background-image: url($src), -webkit-linear-gradient(top, $topColor, $bottomColor); /* Chrome 10+, Saf5.1+ */
- background-image: url($src), -moz-linear-gradient(top, $topColor, $bottomColor); /* FF3.6+ */
- background-image: url($src), -ms-linear-gradient(top, $topColor, $bottomColor); /* IE10 */
- background-image: url($src), -o-linear-gradient(top, $topColor, $bottomColor); /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-
-@mixin buttonImage($image-url, $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom) {
- @include imageOnVerticalGradient($image-url, $idle-color-top, $idle-color-bottom);
- &:active, &.selected {
- @include imageOnVerticalGradient($image-url, $active-color-top, $active-color-bottom);
- }
-}
-
-$nonselected-gradient-top: white;
-$nonselected-gradient-bottom: #BBB;
-$selection-color: #cdcdff;
-$selected-gradient-top: $selection-color;
-$selected-gradient-bottom: white;
-
-@mixin button {
- cursor: pointer;
- -moz-user-select: none;
- -webkit-user-select: none;
- display: inline-block;
- border-style: solid;
- border-color: #aaa;
- border-width: 1px;
- padding: 3px;
-}
-
-@mixin roundedBox($radius) {
- -moz-border-radius: $radius;
- border-radius: $radius;
-}
-
-@mixin leftRoundedBox($radius) {
- -moz-border-radius-topleft: $radius;
- -moz-border-radius-bottomleft: $radius;
- border-top-left-radius: $radius;
- border-bottom-left-radius: $radius;
-}
-@mixin rightRoundedBox($radius) {
- -moz-border-radius-topright: $radius;
- -moz-border-radius-bottomright: $radius;
- border-top-right-radius: $radius;
- border-bottom-right-radius: $radius;
-}
-
-@mixin roundedButton($radius) {
- @include button;
- @include roundedBox($radius);
-}
-
-/*--------------------------------------
- *
- * G L O B A L
- *
- *--------------------------------------*/
-
-html {
- margin: 0;
- padding: 0;
- height: 100%;
-}
-
-body {
- font: 62.5% "lucida grande", Tahoma, Verdana, Arial, Helvetica, sans-serif; /* Resets 1em to 10px */
- color: #222;/* !important; */
- background: #FFF;
- text-align: center;
- margin: 0 0 30px;
- overflow: hidden;
- img { border: none; }
- a { outline: 0; }
-}
-
-/***
-****
-**** ABOUT DIALOG
-****
-***/
-
-#about-dialog
-{
- > * {
- text-align: center;
- }
- > #about-logo {
- background: transparent url('images/logo.png') top left no-repeat;
- width: 64px;
- height: 64px;
- margin-left: 100px;
- }
- > #about-title {
- font-size: 1.3em;
- font-weight: bold;
- }
-}
-
-/***
-****
-**** HOTKEYS DIALOG
-****
-***/
-
-#hotkeys-dialog {
- table {
- width: 100%;
- border-collapse: collapse;
-
- th, td {
- border: 1px solid #AAA;
- }
- }
-}
-
-
-/***
-****
-**** TOOLBAR
-****
-***/
-$toolbar-gradient-top: #ddd;
-$toolbar-gradient-bottom: #bbb;
-$toolbar-height: 36px;
-
-div#toolbar
-{
- width: 100%;
- height: $toolbar-height;
- margin: 0px;
- padding: 2px;
- border-bottom: 1px solid #AAA;
- @include verticalGradient($toolbar-gradient-top, $toolbar-gradient-bottom);
-
- $idle-color-top: $nonselected-gradient-top;
- $idle-color-bottom: $nonselected-gradient-bottom;
- $active-color-top: $selected-gradient-top;
- $active-color-bottom: $selected-gradient-bottom;
-
- > * {
- @include button;
- width: 34px;
- height: 34px;
- float: left;
- border: none;
- padding: 0px 3px;
- background-position: center center;
- background-repeat: no-repeat;
- }
-
- >div.toolbar-separator {
- height: 25px;
- margin-top: 8px;
- margin-bottom: 5px;
- border-left: 1px solid #aaa;
- width: 3px;
- }
-
- > div#toolbar-open {
- background-image: url('images/toolbar-folder.png');
- }
- > div#toolbar-remove {
- background-image: url('images/toolbar-close.png');
- }
- > div#toolbar-start {
- background-image: url('images/toolbar-start.png');
- }
- > div#toolbar-pause {
- background-image: url('images/toolbar-pause.png');
- }
- > div#toolbar-start-all {
- background-image: url('images/toolbar-start-all.png');
- }
- > div#toolbar-pause-all {
- background-image: url('images/toolbar-pause-all.png');
- }
-
- > div#toolbar-inspector {
- background-image: url('images/toolbar-info.png');
- float: right;
- margin-right: 4px;
- }
-
- > *.disabled {
- opacity: 0.25;
- }
-}
-
-/***
-****
-**** STATUSBAR
-****
-***/
-
-$statusbar-gradient-top: #ddd;
-$statusbar-gradient-bottom: #bbb;
-$statusbar-height: 26px;
-
-#statusbar
-{
- height: $statusbar-height;
- width: 100%;
- border-bottom: 1px solid #AAA;
- overflow: hidden;
- position: relative;
- @include verticalGradient($statusbar-gradient-top, $statusbar-gradient-bottom);
-
- #filter
- {
- float: left;
- margin-left: 5px;
-
- input#torrent_search {
- height: 18px;
- width: 100px;
- border-radius: 6px;
- &.blur { color: #999; }
- }
-
- #filter-count { margin-left: 8px; }
- }
-
- #speed-info
- {
- float: right;
- margin-top: 5px;
- margin-right: 10px;
-
- * {
- display: inline-block;
- }
-
- #speed-up-icon {
- margin-left: 8px;
- width: 8px;
- height: 8px;
- background: url('images/arrow-up.png') bottom no-repeat;
- }
-
- #speed-dn-icon {
- width: 8px;
- height: 8px;
- background: url('images/arrow-down.png') bottom no-repeat;
- }
-
- #speed-up-container, #speed-dn-container {
- display: inline;
- }
- }
-}
-
-/***
-****
-**** TORRENT CONTAINER
-****
-***/
-
-$torrent-container-top: $toolbar-height + $statusbar-height + 6px;
-
-div#torrent_container {
- position: fixed;
- top: $torrent-container-top;
- bottom: 22px;
- right: 0px;
- left: 0px;
- padding: 0px;
- margin: 0px;
- overflow: auto;
- -webkit-overflow-scrolling: touch;
-}
-
-ul.torrent_list
-{
- width: 100%;
- margin: 0;
- padding: 0;
- text-align: left;
- cursor: pointer;
- list-style-type: none;
-
- li.torrent
- {
- border-bottom: 1px solid #ccc;
- padding: 4px 30px 5px 14px;
- color: #666;
- background-color: white;
-
- &.compact { padding: 4px; }
- &.even { background-color: #F7F7F7; }
- &.selected { background-color: $selection-color; }
- &.compact { div.torrent_name { color: black; } }
-
- // start-stop button
- a {
- float: right;
- position: relative;
- right: -22px;
- top: 1px;
-
- img {
- position: relative;
- right: -10px;
- }
-
- div {
- background: url('images/buttons/torrent_buttons.png');
- height: 14px;
- width: 14px;
- }
-
- div.torrent_pause { background-position: left top; }
- div.torrent_resume { background-position: center top; }
-
- &:active {
- div.torrent_pause { background-position: left bottom; }
- div.torrent_resume { background-position: center bottom; }
- }
- &:hover {
- div.torrent_pause { background-position: left center; }
- div.torrent_resume { background-position: center center; }
- }
- }
-
- div.torrent_name
- {
- font-size: 1.3em;
- font-weight: bold;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- color: #222;
- margin-top: 2px;
- margin-bottom: 2px;
-
- &.compact { font-size: 1.0em; font-weight: normal; }
- &.paused { font-weight: normal; color: #777; }
- }
-
- div.torrent_progress_details,
- div.torrent_peer_details {
- clear: left;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- div.torrent_progress_details.error,
- div.torrent_peer_details.error {
- color: #F00;
- }
-
- &.selected div.torrent_progress_details.error,
- &.selected div.torrent_peer_details.error {
- color: #FFF;
- }
- }
-
- /**
- * Progressbar
- *
- * Each progressbar has three elemens: a parent container and two children,
- * complete and incomplete.
- *
- * The only thing needed to set the progressbar percentage is to set
- * the complete child's width as a percentage. This is because incomplete
- * is pinned to the full width and height of the parent, and complete
- * is pinned to the left side of the parent and has a higher z-index.
- *
- * The progressbar has different colors depending on its state, so there
- * are five 'decorator' classNames: paused, queued, magnet, leeching, seeding.
- */
- div.torrent_progress_bar_container
- {
- height: 10px;
- position: relative;
-
- &.compact {
- width: 50px;
- position: absolute;
- right: 10px;
- margin-top: 2px;
- /*float: right;*/
- }
- &.full {
- margin-top: 2px;
- margin-bottom: 5px;
- }
- }
- div.torrent_peer_details.compact
- {
- margin-top: 2px;
- margin-right: 65px; /* leave room on the right for the progressbar */
- float: right; /* pins it next to progressbar & forces torrent_name to ellipsize when it bumps up against this div */
- }
- div.torrent_progress_bar
- {
- height: 100%;
- position: absolute;
- top: 0px;
- left: 0px;
- background-image: url('images/progress.png');
- background-repeat: repeat-x;
- border: 1px solid #888;
-
- &.complete { z-index: 2; }
- &.complete.paused { background-position: left -30px; border-color: #989898; }
- &.complete.magnet { background-position: left -20px; border-color: #CFCFCF; }
- &.complete.leeching { background-position: left 0px; border-color: #3D9DEA; }
- &.complete.leeching.queued { background-position: left -70px; border-color: #889CA5; }
- &.complete.seeding { background-position: left -40px; border-color: #269E30; }
- &.complete.seeding.queued { background-position: left -60px; border-color: #8A998D; }
- &.incomplete { z-index: 1; width: 100%; }
- &.incomplete.paused { background-position: left -20px; border-color: #CFCFCF; }
- &.incomplete.magnet { background-position: left -50px; border-color: #D47778; }
- &.incomplete.leeching { background-position: left -20px; border-color: #CFCFCF; }
- &.incomplete.leeching.queued { background-position: left -80px; border-color: #C4C4C4; }
- &.incomplete.seeding { background-position: left -10px; border-color: #29AD35; }
- }
-}
-
-/***
-****
-**** PREFERENCES
-****
-***/
-
-#prefs-dialog.ui-tabs .ui-tabs-panel {
- padding: 0px;
- -moz-user-select: none;
- -webkit-user-select: none;
-}
-
-.prefs-section
-{
- margin: 10px;
- text-align: left;
-
- > * {
- padding-top: 8px;
- padding-left: 8px;
- }
-
- .title {
- font-weight: bold;
- font-size: larger;
- padding-left: 0px;
- }
-
- .row {
- .key {
- float: left;
- padding-top: 3px;
- > * { margin-left: 0px; }
- }
- .value {
- margin-left: 150px;
- > * { width: 100%; }
- }
- }
-
- .checkbox-row {
- > input { margin: 0px; }
- > label { margin-left: 5px; }
- }
-
- #alternative-speed-limits-title {
- padding-left: 18px;
- background: transparent url('images/blue-turtle.png') no-repeat;
- }
-
- #alternative-speed-limits-desc {
- font-size: smaller;
- padding-bottom: 4px;
- }
-
- #blocklist-info {
- font-size: smaller;
- margin-top: 3px;
- }
-}
-
-/***
-****
-**** TORRENT INSPECTOR
-****
-***/
-
-$inspector-width: 570px;
-
-div#torrent_inspector
-{
- overflow: auto;
- -webkit-overflow-scrolling: touch;
- text-align: left;
- padding: 15px;
- top: $torrent-container-top;
- position: fixed;
- width: $inspector-width;
- z-index: 5;
- border-left: 1px solid #888;
- bottom: 22px;
- right: 0px;
-
- $idle-color-top: $nonselected-gradient-top;
- $idle-color-bottom: $nonselected-gradient-bottom;
- $active-color-top: $selected-gradient-top;
- $active-color-bottom: $selected-gradient-bottom;
-
- #inspector-close
- {
- display: none;
- }
-
- #inspector-tabs-wrapper
- {
- width: 100%;
- overflow: hidden;
- text-align: center;
-
- #inspector-tabs
- {
- $border-radius: 5px;
-
- display: inline-block;
-
- > * {
- @include button;
- width: 30px;
- height: 20px;
- }
-
- > #inspector-tab-info {
- @include leftRoundedBox($border-radius);
- @include buttonImage('images/inspector-info.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- border-left-width: 1px;
- }
-
- > #inspector-tab-peers {
- @include buttonImage('images/inspector-peers.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-
- > #inspector-tab-trackers {
- @include buttonImage('images/inspector-trackers.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-
- > #inspector-tab-files {
- @include rightRoundedBox($border-radius);
- @include buttonImage('images/inspector-files.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
- }
- }
-
- #inspector_header
- {
- margin-top: 8px;
-
- #torrent_inspector_name
- {
- font-weight: bold;
- font-size: large;
- }
- }
-
- ul.tier_list
- {
- margin: 2px 0 8px 0;
- width: 100%;
- padding-left: 0px;
- text-align: left;
- display: block;
- cursor: default;
- list-style-type: none;
- list-style: none;
- list-style-image: none;
- clear: both;
-
- li {
- overflow: hidden;
- }
- .tracker_activity {
- float: left;
- color: #666;
- width: 330px;
- display: table;
- margin-top: 1px;
- }
- .tracker_activity div {
- padding: 2px;
- }
- table {
- float: right;
- color: #666;
- }
- th {
- text-align: right;
- }
- }
-
- li.inspector_tracker_entry {
- padding: 3px 0 3px 2px;
- display: block;
-
- &.odd {
- background-color: #EEEEEE;
- }
- }
-
- div.tracker_host {
- font-size: 1.2em;
- font-weight: bold;
- color: #222;
- }
-
- /* Files Inspector Tab */
-
- #inspector_file_list {
- padding: 0 0 0 0;
- margin: 0 0 0 0;
- text-align: left;
- cursor: default;
- overflow: hidden;
- }
-
- #inspector_file_list {
- width: 100%;
- margin: 6px 0 0 0;
- padding-top: 6px;
- padding-bottom: 10px;
- text-align: left;
- display: block;
- cursor: default;
- list-style-type: none;
- list-style: none;
- list-style-image: none;
- clear: both;
- }
- li.inspector_torrent_file_list_entry {
- padding: 3px 0 3px 2px;
- display: block;
- &.skip { color: #666; }
- &.even { background-color: #F7F7F7; }
- }
-
- div.inspector_torrent_file_list_entry_name {
- font-size: 1.2em;
- color: black;
- display: inline;
- margin-left: 0px;
- }
- li.inspector_torrent_file_list_entry.skip>.inspector_torrent_file_list_entry_name {
- color: #999;
- }
- div.inspector_torrent_file_list_entry_progress {
- color: #999;
- margin-left: 20px;
- }
-
- ul.single_file li.inspector_torrent_file_list_entry>.file_wanted_control,
- li.inspector_torrent_file_list_entry.complete>.file_wanted_control {
- cursor: default;
- }
-}
-
-/* Peers Inspector Tab */
-#inspector_peers_list {
- padding: 0 0 0 0;
- margin: 0 0 0 0;
- text-align: left;
- cursor: default;
- overflow: hidden;
-
- > div.inspector_group {
- padding-bottom: 0;
- margin-bottom: 0;
- }
-}
-
-table.peer_list {
- width: 100%;
- border-collapse: collapse;
- text-align: left;
- cursor: default;
- clear: both;
- table-layout: fixed;
-
- .encryptedCol { width: 16px; }
- .upCol { width: 70px; }
- .downCol { width: 70px; }
- .percentCol { width: 30px; padding-right: 5px; text-align: right; }
- .statusCol { width: 40px; padding-right: 5px; }
- .addressCol { width: 180px; }
- .clientCol { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
-}
-
-tr.inspector_peer_entry
-{
- div.encrypted-peer-cell
- {
- width: 16px;
- height: 16px;
- background: transparent url('images/lock_icon.png') no-repeat;
- }
-
- &.odd
- {
- background-color: #EEEEEE;
- }
-}
-
-/***
-**** File Priority Buttons
-***/
-
-div.file-priority-radiobox
-{
- $border-radius: 5px;
-
- display: inline;
- float: right;
- margin: 4px;
- margin-top: 2px;
-
- > * {
- @include button;
- width: 20px;
- height: 12px;
- }
-
- // We have row after row of these buttons, so the flashy colors used in the inspector tabs look harsh here.
- // Keep the same basic color theme, but look less harsh, by cutting the gradient's color range.
- $idle-color-top: mix( $nonselected-gradient-top, $nonselected-gradient-bottom, 80% );
- $idle-color-bottom: mix( $nonselected-gradient-top, $nonselected-gradient-bottom, 20% );
- $active-color-top: mix( $selected-gradient-top, $selected-gradient-bottom, 80% );
- $active-color-bottom: mix( $selected-gradient-top, $selected-gradient-bottom, 20% );
-
- > div.low {
- @include leftRoundedBox($border-radius);
- @include buttonImage('images/file-priority-low.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- border-right-width: 0px;
- }
-
- > div.normal {
- @include buttonImage('images/file-priority-normal.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-
- > div.high {
- @include rightRoundedBox($border-radius);
- @include buttonImage('images/file-priority-high.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- border-left-width: 0px;
- }
-}
-
-
-/****
-*****
-***** MAIN WINDOW FOOTER
-*****
-****/
-
-div.torrent_footer
-{
- height: 22px;
- border-top: 1px solid #555;
- bottom: 0;
- position: fixed;
- width: 100%;
- z-index: 3;
-
- @include verticalGradient($statusbar-gradient-top, $statusbar-gradient-bottom);
-
- > div {
- float: left;
- margin: 2px 4px;
- width: 18px;
- height: 12px;
- padding: 2px 8px;
- float: left;
- border: 1px solid #888;
- -moz-user-select: none;
- -webkit-user-select: none;
- }
-
- $idle-color-top: $nonselected-gradient-top;
- $idle-color-bottom: $nonselected-gradient-bottom;
- $active-color-top: $selected-gradient-top;
- $active-color-bottom: $selected-gradient-bottom;
-
- #settings_menu {
- @include roundedBox(5px);
- @include buttonImage('images/settings.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-
- #prefs-button {
- @include roundedBox(5px);
- @include buttonImage('images/wrench.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-
- #turtle-button {
- @include roundedBox(5px);
- @include buttonImage('images/turtle.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- &:active, &.selected {
- @include imageOnVerticalGradient('images/blue-turtle.png', $active-color-top, $active-color-bottom);
- }
- }
-
- #compact-button {
- @include roundedBox(5px);
- @include buttonImage('images/compact.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-
- #freespace-info {
- float: right;
- text-align: right;
- border: 0px;
- width: 100px;
- }
-}
-
-/****
-*****
-***** DIALOGS
-*****
-****/
-
-div.dialog_container {
- position: absolute;
- top: 0;
- left: 0px;
- margin: 0px;
- width: 100%;
- height: 100%;
- text-align: center;
- color: black;
- font-size: 1.1em;
-}
-
-div.dialog_container div.dialog_window {
- background-color: #eee;
- margin: 0 auto;
- opacity: .95;
- border-top: none;
- text-align: left;
- width: 420px;
- z-index: 10;
- overflow: hidden;
- position: relative;
- -webkit-box-shadow: 0 3px 6px rgba(0,0,0,0.7);
- top: 80px;
-}
-@media screen and (-webkit-min-device-pixel-ratio:0) {
- div.dialog_container div.dialog_window {
- top: 0;
- margin-top: 71px;
- }
-}
-
-div.dialog_container .dialog_logo {
- width: 64px;
- height: 64px;
- margin: 20px 20px 0 20px;
- float: left;
- background: transparent url('images/logo.png') top left no-repeat;
-}
-
-div.dialog_container div.dialog_window h2.dialog_heading {
- display: block;
- float: left;
- width: 305px;
- font-size: 1.2em;
- color: black;
- margin-top: 20px;
-}
-
-div.dialog_container div.dialog_window div.dialog_message {
- float: left;
- padding-left: 3px;
- margin-left: -3px;
- width: 305px;
- overflow: hidden;
-}
-
-div.dialog_container div.dialog_window a {
- display: block;
- float: right;
- margin: 10px 20px 10px -8px;
- padding: 5px;
- background-color: #EEE;
- border: 1px solid #787878;
- width: 50px;
- height: 15px;
- text-align: center;
- font-weight: bold;
- text-decoration: none;
- color: #323232;
- -webkit-appearance: button;
- font: -webkit-control;
- cursor: default;
-}
-
-div.dialog_container div.dialog_window a:hover,
-div.dialog_container div.dialog_window a:active {
- background: #C0C8D6 url('images/filter_bar.png') bottom repeat-x;
-}
-
-div#upload_container div.dialog_window div.dialog_message label {
- margin-top: 15px;
- display: block;
-}
-
-div#upload_container div.dialog_window div.dialog_message input {
- width: 249px;
- margin: 3px 0 0 0;
- display: block;
-}
-
-div#upload_container div.dialog_window div.dialog_message input[type=text] {
- width: 245px;
- padding: 2px;
-}
-
-div#upload_container div.dialog_window div.dialog_message input[type=checkbox] {
- margin: 15px 3px 0 0;
- display: inline;
- width: auto;
-}
-
-div#upload_container div.dialog_window div.dialog_message #auto_start_label {
- display: inline;
-}
-
-div.dialog_container div.dialog_window form {
- margin: 0;
- padding: 0px;
-}
-
-div#move_container input#torrent_path {
- width: 286px;
- padding: 2px;
-}
-
-
-iframe#torrent_upload_frame {
- display: block; /* Don't change this : safari forms won't target hidden frames (they open a new window) */
- position: absolute;
- top: -1000px;
- left: -1000px;
- width: 0px;
- height: 0px;
- border: none;
- padding: 0;
- margin: 0;
-}
-
-/****
-*****
-***** POPUP MENU
-*****
-****/
-
-.ui-menu-item {
- text-align: left;
- white-space: nowrap;
-}
-
-#torrent_context_menu,
-#footer_super_menu {
- font-size: 1em;
- z-index: 3;
-}
diff --git a/web/style/transmission/images/arrow-down.png b/web/style/transmission/images/arrow-down.png
deleted file mode 100644
index a4ed5c040..000000000
Binary files a/web/style/transmission/images/arrow-down.png and /dev/null differ
diff --git a/web/style/transmission/images/arrow-up.png b/web/style/transmission/images/arrow-up.png
deleted file mode 100644
index 971e6071d..000000000
Binary files a/web/style/transmission/images/arrow-up.png and /dev/null differ
diff --git a/web/style/transmission/images/buttons/torrent_buttons.png b/web/style/transmission/images/buttons/torrent_buttons.png
deleted file mode 100644
index 12f50f836..000000000
Binary files a/web/style/transmission/images/buttons/torrent_buttons.png and /dev/null differ
diff --git a/web/style/transmission/images/compact.png b/web/style/transmission/images/compact.png
deleted file mode 100644
index cae1439d3..000000000
Binary files a/web/style/transmission/images/compact.png and /dev/null differ
diff --git a/web/style/transmission/images/file-priority-high.png b/web/style/transmission/images/file-priority-high.png
deleted file mode 100644
index 51c845568..000000000
Binary files a/web/style/transmission/images/file-priority-high.png and /dev/null differ
diff --git a/web/style/transmission/images/file-priority-low.png b/web/style/transmission/images/file-priority-low.png
deleted file mode 100644
index 0294332c9..000000000
Binary files a/web/style/transmission/images/file-priority-low.png and /dev/null differ
diff --git a/web/style/transmission/images/file-priority-normal.png b/web/style/transmission/images/file-priority-normal.png
deleted file mode 100644
index da88c9676..000000000
Binary files a/web/style/transmission/images/file-priority-normal.png and /dev/null differ
diff --git a/web/style/transmission/images/filter_bar.png b/web/style/transmission/images/filter_bar.png
deleted file mode 100644
index cb8256208..000000000
Binary files a/web/style/transmission/images/filter_bar.png and /dev/null differ
diff --git a/web/style/transmission/images/filter_icon.png b/web/style/transmission/images/filter_icon.png
deleted file mode 100644
index 5a5da8877..000000000
Binary files a/web/style/transmission/images/filter_icon.png and /dev/null differ
diff --git a/web/style/transmission/images/inspector-files.png b/web/style/transmission/images/inspector-files.png
deleted file mode 100644
index 5423af178..000000000
Binary files a/web/style/transmission/images/inspector-files.png and /dev/null differ
diff --git a/web/style/transmission/images/inspector-info.png b/web/style/transmission/images/inspector-info.png
deleted file mode 100644
index 40b109e92..000000000
Binary files a/web/style/transmission/images/inspector-info.png and /dev/null differ
diff --git a/web/style/transmission/images/inspector-peers.png b/web/style/transmission/images/inspector-peers.png
deleted file mode 100644
index e17d4799e..000000000
Binary files a/web/style/transmission/images/inspector-peers.png and /dev/null differ
diff --git a/web/style/transmission/images/inspector-trackers.png b/web/style/transmission/images/inspector-trackers.png
deleted file mode 100644
index 333e09710..000000000
Binary files a/web/style/transmission/images/inspector-trackers.png and /dev/null differ
diff --git a/web/style/transmission/images/lock_icon.png b/web/style/transmission/images/lock_icon.png
deleted file mode 100644
index 9250c6e4e..000000000
Binary files a/web/style/transmission/images/lock_icon.png and /dev/null differ
diff --git a/web/style/transmission/images/progress.png b/web/style/transmission/images/progress.png
deleted file mode 100644
index 11311743d..000000000
Binary files a/web/style/transmission/images/progress.png and /dev/null differ
diff --git a/web/style/transmission/images/settings.png b/web/style/transmission/images/settings.png
deleted file mode 100644
index 95680a130..000000000
Binary files a/web/style/transmission/images/settings.png and /dev/null differ
diff --git a/web/style/transmission/images/toolbar-pause-all.png b/web/style/transmission/images/toolbar-pause-all.png
deleted file mode 100644
index d638efacc..000000000
Binary files a/web/style/transmission/images/toolbar-pause-all.png and /dev/null differ
diff --git a/web/style/transmission/images/toolbar-start-all.png b/web/style/transmission/images/toolbar-start-all.png
deleted file mode 100644
index e19cd2207..000000000
Binary files a/web/style/transmission/images/toolbar-start-all.png and /dev/null differ
diff --git a/web/style/transmission/images/wrench.png b/web/style/transmission/images/wrench.png
deleted file mode 100644
index f5a1fb63d..000000000
Binary files a/web/style/transmission/images/wrench.png and /dev/null differ
diff --git a/web/style/transmission/mobile.css b/web/style/transmission/mobile.css
deleted file mode 100644
index a80d119df..000000000
--- a/web/style/transmission/mobile.css
+++ /dev/null
@@ -1,1115 +0,0 @@
-/*--------------------------------------
- *
- * G L O B A L
- *
- *--------------------------------------*/
-html {
- margin: 0;
- padding: 0;
-}
-
-body {
- font: 11px Helvetica, Arial, sans-serif;
- background: #FFF;
- text-align: center;
- margin: 0;
- padding: 0;
- width: 100%;
- overflow-x: hidden;
- -webkit-text-size-adjust: none;
-}
-body img {
- border: none;
-}
-body a {
- outline: 0;
-}
-body div#torrent_container {
- min-height: 328px;
-}
-body div.dialog_container {
- min-height: 326px;
-}
-body div#torrent_inspector {
- min-height: 329px;
-}
-body.landscape div#torrent_container {
- min-height: 147px;
-}
-body.landscape div#dialog_container, body.landscape div#torrent_inspector {
- min-height: 143px;
-}
-
-body.inspector_showing #torrent_filter_bar, body.inspector_showing #torrent_container,
-body.dialog_showing #torrent_filter_bar, body.dialog_showing #torrent_container, body.dialog_showing #torrent_inspector,
-body.prefs_showing #torrent_inspector, body.prefs_showing #torrent_filter_bar, body.prefs_showing #torrent_container,
-body.open_showing #torrent_filter_bar, body.open_showing #torrent_container {
- display: none !important;
-}
-
-/***
-****
-**** TOOLBAR
-****
-***/
-div#toolbar {
- width: 100%;
- height: 39px;
- margin: 0px;
- padding: 2px;
- border-bottom: 1px solid #AAA;
- background-color: #cccccc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#ddd), to(#bbb));
- background-image: -webkit-linear-gradient(top, #ddd, #bbb);
- background-image: -moz-linear-gradient(top, #ddd, #bbb);
- background-image: -ms-linear-gradient(top, #ddd, #bbb);
- background-image: -o-linear-gradient(top, #ddd, #bbb);
- background-image: linear-gradient(top, #ddd, #bbb);
-}
-div#toolbar > * {
- cursor: pointer;
- -moz-user-select: none;
- -webkit-user-select: none;
- display: inline-block;
- border-style: solid;
- border-color: #aaa;
- border-width: 1px;
- padding: 3px;
- margin-top: 5px;
- width: 34px;
- height: 34px;
- float: left;
- border: none;
- padding: 0px 3px;
- background-position: center center;
- background-repeat: no-repeat;
-}
-div#toolbar > div.toolbar-separator {
- height: 25px;
- margin-top: 8px;
- margin-bottom: 8px;
- border-left: 1px solid #aaa;
- width: 3px;
-}
-div#toolbar > div#toolbar-open {
- background-image: url("images/toolbar-folder.png");
-}
-div#toolbar > div#toolbar-remove {
- background-image: url("images/toolbar-close.png");
-}
-div#toolbar > div#toolbar-start {
- background-image: url("images/toolbar-start.png");
-}
-div#toolbar > div#toolbar-pause {
- background-image: url("images/toolbar-pause.png");
-}
-div#toolbar > div#toolbar-start-all {
- background-image: url("images/toolbar-start-all.png");
-}
-div#toolbar > div#toolbar-pause-all {
- background-image: url("images/toolbar-pause-all.png");
-}
-div#toolbar > div#toolbar-inspector {
- background-image: url("images/toolbar-info.png");
- float: right;
-}
-div#toolbar > *.disabled {
- opacity: 0.25;
-}
-
-/***
-****
-**** STATUSBAR
-****
-***/
-#statusbar {
- height: 24px;
- width: 100%;
- border-bottom: 1px solid #AAA;
- overflow: hidden;
- position: relative;
- background-color: #cccccc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#ddd), to(#bbb));
- background-image: -webkit-linear-gradient(top, #ddd, #bbb);
- background-image: -moz-linear-gradient(top, #ddd, #bbb);
- background-image: -ms-linear-gradient(top, #ddd, #bbb);
- background-image: -o-linear-gradient(top, #ddd, #bbb);
- background-image: linear-gradient(top, #ddd, #bbb);
-}
-#statusbar #filter {
- float: left;
- margin-left: 5px;
-}
-#statusbar #filter input#torrent_search {
- display: none;
-}
-#statusbar #filter #filter-count {
- margin-left: 8px;
-}
-#statusbar #speed-info {
- float: right;
- margin-top: 5px;
- margin-right: 10px;
-}
-#statusbar #speed-info * {
- display: inline-block;
-}
-#statusbar #speed-info #speed-up-icon {
- margin-left: 8px;
- width: 8px;
- height: 8px;
- background: url("images/arrow-up.png") bottom no-repeat;
-}
-#statusbar #speed-info #speed-dn-icon {
- width: 8px;
- height: 8px;
- background: url("images/arrow-down.png") bottom no-repeat;
-}
-#statusbar #speed-info #speed-up-container, #statusbar #speed-info #speed-dn-container {
- display: inline;
-}
-
-/***
-****
-**** TORRENT CONTAINER
-****
-***/
-ul.torrent_list {
- width: 100%;
- margin: 0;
- padding: 0;
- text-align: left;
- cursor: pointer;
- /**
- * Progressbar
- *
- * Each progressbar has three elemens: a parent container and two children,
- * complete and incomplete.
- *
- * The only thing needed to set the progressbar percentage is to set
- * the complete child's width as a percentage. This is because incomplete
- * is pinned to the full width and height of the parent, and complete
- * is pinned to the left side of the parent and has a higher z-index.
- *
- * The progressbar has different colors depending on its state, so there
- * are five 'decorator' classNames: paused, queued, magnet, leeching, seeding.
- */
-}
-ul.torrent_list li.torrent {
- border-bottom: 1px solid #ccc;
- padding: 4px 30px 5px 14px;
- color: #666;
- background-color: white;
-}
-ul.torrent_list li.torrent.compact {
- padding: 4px;
-}
-ul.torrent_list li.torrent.even {
- background-color: #F7F7F7;
-}
-ul.torrent_list li.torrent.selected {
- background-color: #cdcdff;
-}
-ul.torrent_list li.torrent.compact div.torrent_name {
- color: black;
-}
-ul.torrent_list li.torrent a {
- display: none;
-}
-ul.torrent_list li.torrent div.torrent_name {
- font-size: 1.3em;
- font-weight: bold;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- color: #222;
- margin-top: 2px;
- margin-bottom: 2px;
-}
-ul.torrent_list li.torrent div.torrent_name.compact {
- font-size: 1em;
- font-weight: normal;
-}
-ul.torrent_list li.torrent div.torrent_name.paused {
- font-weight: normal;
- color: #777;
-}
-ul.torrent_list li.torrent div.torrent_progress_details,
-ul.torrent_list li.torrent div.torrent_peer_details {
- clear: left;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-ul.torrent_list li.torrent div.torrent_progress_details.error,
-ul.torrent_list li.torrent div.torrent_peer_details.error {
- color: #F00;
-}
-ul.torrent_list li.torrent.selected div.torrent_progress_details.error, ul.torrent_list li.torrent.selected div.torrent_peer_details.error {
- color: #FFF;
-}
-ul.torrent_list div.torrent_progress_bar_container {
- height: 10px;
- position: relative;
-}
-ul.torrent_list div.torrent_progress_bar_container.compact {
- width: 50px;
- position: absolute;
- right: 10px;
- margin-top: 2px;
- /*float: right;*/
-}
-ul.torrent_list div.torrent_progress_bar_container.full {
- margin-top: 2px;
- margin-bottom: 5px;
-}
-ul.torrent_list div.torrent_peer_details.compact {
- margin-top: 2px;
- margin-right: 65px;
- /* leave room on the right for the progressbar */
- float: right;
- /* pins it next to progressbar & forces torrent_name to ellipsize when it bumps up against this div */
-}
-ul.torrent_list div.torrent_progress_bar {
- height: 100%;
- position: absolute;
- top: 0px;
- left: 0px;
- background-image: url("images/progress.png");
- background-repeat: repeat-x;
- border: 1px solid #888;
-}
-ul.torrent_list div.torrent_progress_bar.complete {
- z-index: 2;
-}
-ul.torrent_list div.torrent_progress_bar.complete.paused {
- background-position: left -30px;
- border-color: #989898;
-}
-ul.torrent_list div.torrent_progress_bar.complete.magnet {
- background-position: left -20px;
- border-color: #CFCFCF;
-}
-ul.torrent_list div.torrent_progress_bar.complete.leeching {
- background-position: left 0px;
- border-color: #3D9DEA;
-}
-ul.torrent_list div.torrent_progress_bar.complete.leeching.queued {
- background-position: left -70px;
- border-color: #889CA5;
-}
-ul.torrent_list div.torrent_progress_bar.complete.seeding {
- background-position: left -40px;
- border-color: #269E30;
-}
-ul.torrent_list div.torrent_progress_bar.complete.seeding.queued {
- background-position: left -60px;
- border-color: #8A998D;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete {
- z-index: 1;
- width: 100%;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete.paused {
- background-position: left -20px;
- border-color: #CFCFCF;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete.magnet {
- background-position: left -50px;
- border-color: #D47778;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete.leeching {
- background-position: left -20px;
- border-color: #CFCFCF;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete.leeching.queued {
- background-position: left -80px;
- border-color: #C4C4C4;
-}
-ul.torrent_list div.torrent_progress_bar.incomplete.seeding {
- background-position: left -10px;
- border-color: #29AD35;
-}
-
-/***
-****
-**** PREFERENCES
-****
-***/
-#prefs-dialog.ui-tabs .ui-tabs-panel {
- padding: 0px;
- -moz-user-select: none;
- -webkit-user-select: none;
-}
-
-.prefs-section {
- margin: 10px;
- text-align: left;
-}
-.prefs-section > * {
- padding-top: 8px;
- padding-left: 8px;
-}
-.prefs-section .title {
- font-weight: bold;
- font-size: larger;
- padding-left: 0px;
-}
-.prefs-section .row .key {
- float: left;
- padding-top: 3px;
-}
-.prefs-section .row .key > * {
- margin-left: 0px;
-}
-.prefs-section .row .value {
- margin-left: 150px;
-}
-.prefs-section .row .value > * {
- width: 100%;
-}
-.prefs-section .checkbox-row > input {
- margin: 0px;
-}
-.prefs-section .checkbox-row > label {
- margin-left: 5px;
-}
-.prefs-section #alternative-speed-limits-title {
- padding-left: 18px;
- background: transparent url("images/blue-turtle.png") no-repeat;
-}
-
-/***
-****
-**** TORRENT INSPECTOR
-****
-***/
-div#torrent_inspector {
- overflow: auto;
- text-align: left;
- padding: 15px;
- top: 0;
- position: relative;
- width: 100%;
- z-index: 2;
- /* Files Inspector Tab */
-}
-div#torrent_inspector #inspector-tabs-wrapper {
- width: 100%;
- overflow: hidden;
- text-align: center;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs {
- display: inline-block;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > * {
- cursor: pointer;
- -moz-user-select: none;
- -webkit-user-select: none;
- display: inline-block;
- border-style: solid;
- border-color: #aaa;
- border-width: 1px;
- padding: 3px;
- width: 30px;
- height: 20px;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-info {
- -moz-border-radius-topleft: 5px;
- -moz-border-radius-bottomleft: 5px;
- border-top-left-radius: 5px;
- border-bottom-left-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/inspector-info.png");
- /* fallback */
- background-image: url("images/inspector-info.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-info.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-info.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/inspector-info.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/inspector-info.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
- border-left-width: 1px;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-info:active, div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-info.selected {
- background-color: #e6e6ff;
- background-image: url("images/inspector-info.png");
- /* fallback */
- background-image: url("images/inspector-info.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-info.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-info.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/inspector-info.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/inspector-info.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-peers {
- background-color: #dddddd;
- background-image: url("images/inspector-peers.png");
- /* fallback */
- background-image: url("images/inspector-peers.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-peers.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-peers.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/inspector-peers.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/inspector-peers.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-peers:active, div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-peers.selected {
- background-color: #e6e6ff;
- background-image: url("images/inspector-peers.png");
- /* fallback */
- background-image: url("images/inspector-peers.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-peers.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-peers.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/inspector-peers.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/inspector-peers.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-trackers {
- background-color: #dddddd;
- background-image: url("images/inspector-trackers.png");
- /* fallback */
- background-image: url("images/inspector-trackers.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-trackers.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-trackers.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/inspector-trackers.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/inspector-trackers.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-trackers:active, div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-trackers.selected {
- background-color: #e6e6ff;
- background-image: url("images/inspector-trackers.png");
- /* fallback */
- background-image: url("images/inspector-trackers.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-trackers.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-trackers.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/inspector-trackers.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/inspector-trackers.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-files {
- -moz-border-radius-topright: 5px;
- -moz-border-radius-bottomright: 5px;
- border-top-right-radius: 5px;
- border-bottom-right-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/inspector-files.png");
- /* fallback */
- background-image: url("images/inspector-files.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-files.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-files.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/inspector-files.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/inspector-files.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-files:active, div#torrent_inspector #inspector-tabs-wrapper #inspector-tabs > #inspector-tab-files.selected {
- background-color: #e6e6ff;
- background-image: url("images/inspector-files.png");
- /* fallback */
- background-image: url("images/inspector-files.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/inspector-files.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/inspector-files.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/inspector-files.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/inspector-files.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div#torrent_inspector #inspector_header {
- margin-top: 8px;
-}
-div#torrent_inspector #inspector_header #torrent_inspector_name {
- font-weight: bold;
- font-size: large;
-}
-div#torrent_inspector ul.tier_list {
- margin: 2px 0 8px 0;
- width: 100%;
- padding-left: 0px;
- text-align: left;
- display: block;
- cursor: default;
- list-style-type: none;
- list-style: none;
- list-style-image: none;
- clear: both;
-}
-div#torrent_inspector ul.tier_list li {
- overflow: hidden;
-}
-div#torrent_inspector ul.tier_list .tracker_activity {
- float: left;
- color: #666;
- width: 200px;
- display: table;
- margin-top: 1px;
-}
-div#torrent_inspector ul.tier_list .tracker_activity div {
- padding: 2px;
-}
-div#torrent_inspector ul.tier_list table {
- float: right;
- color: #666;
-}
-div#torrent_inspector ul.tier_list th {
- text-align: right;
-}
-div#torrent_inspector li.inspector_tracker_entry {
- padding: 3px 0 3px 2px;
- display: block;
-}
-div#torrent_inspector li.inspector_tracker_entry.odd {
- background-color: #EEEEEE;
-}
-div#torrent_inspector div.tracker_host {
- font-size: 1.2em;
- font-weight: bold;
- color: #222;
-}
-div#torrent_inspector #inspector_file_list {
- padding: 0 0 0 0;
- margin: 0 0 0 0;
- text-align: left;
- cursor: default;
- overflow: hidden;
-}
-div#torrent_inspector #inspector_file_list {
- border-top: 1px solid #888;
- width: 100%;
- margin: 6px 0 0 0;
- padding-top: 6px;
- padding-bottom: 10px;
- text-align: left;
- display: block;
- cursor: default;
- list-style-type: none;
- list-style: none;
- list-style-image: none;
- clear: both;
-}
-div#torrent_inspector li.inspector_torrent_file_list_entry {
- padding: 3px 0 3px 2px;
- display: block;
-}
-div#torrent_inspector li.inspector_torrent_file_list_entry.skip {
- color: #666;
-}
-div#torrent_inspector li.inspector_torrent_file_list_entry.even {
- background-color: #F7F7F7;
-}
-div#torrent_inspector div.inspector_torrent_file_list_entry_name {
- font-size: 1.2em;
- color: black;
- display: inline;
- margin-left: 0px;
-}
-div#torrent_inspector li.inspector_torrent_file_list_entry.skip > .inspector_torrent_file_list_entry_name {
- color: #999;
-}
-div#torrent_inspector div.inspector_torrent_file_list_entry_progress {
- color: #999;
- margin-left: 20px;
-}
-div#torrent_inspector ul.single_file li.inspector_torrent_file_list_entry > .file_wanted_control,
-div#torrent_inspector li.inspector_torrent_file_list_entry.complete > .file_wanted_control {
- cursor: default;
-}
-
-/* Peers Inspector Tab */
-#inspector_peers_list {
- padding: 0 0 0 0;
- margin: 0 0 0 0;
- text-align: left;
- cursor: default;
- overflow: hidden;
-}
-#inspector_peers_list > div.inspector_group {
- padding-bottom: 0;
- margin-bottom: 0;
-}
-
-table.peer_list {
- width: 100%;
- border-collapse: collapse;
- text-align: left;
- cursor: default;
- clear: both;
- table-layout: fixed;
-}
-table.peer_list .encryptedCol {
- width: 16px;
-}
-table.peer_list .upCol {
- width: 70px;
-}
-table.peer_list .downCol {
- width: 70px;
-}
-table.peer_list .percentCol {
- width: 30px;
- padding-right: 5px;
- text-align: right;
-}
-table.peer_list .statusCol {
- width: 40px;
- padding-right: 5px;
-}
-table.peer_list .addressCol {
- width: 180px;
-}
-table.peer_list .clientCol {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-tr.inspector_peer_entry div.encrypted-peer-cell {
- width: 16px;
- height: 16px;
- background: transparent url("images/lock_icon.png") no-repeat;
-}
-tr.inspector_peer_entry.odd {
- background-color: #EEEEEE;
-}
-
-/***
-**** File Priority Buttons
-***/
-div.file-priority-radiobox {
- display: inline;
- float: right;
- margin: 4px;
- margin-top: 2px;
-}
-div.file-priority-radiobox > * {
- cursor: pointer;
- -moz-user-select: none;
- -webkit-user-select: none;
- display: inline-block;
- border-style: solid;
- border-color: #aaa;
- border-width: 1px;
- padding: 3px;
- width: 20px;
- height: 12px;
-}
-div.file-priority-radiobox > div.low {
- -moz-border-radius-topleft: 5px;
- -moz-border-radius-bottomleft: 5px;
- border-top-left-radius: 5px;
- border-bottom-left-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/file-priority-low.png");
- /* fallback */
- background-image: url("images/file-priority-low.png"), -webkit-gradient(linear, left top, left bottom, from(#f1f1f1), to(#c9c9c9));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-low.png"), -webkit-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-low.png"), -moz-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* FF3.6+ */
- background-image: url("images/file-priority-low.png"), -ms-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* IE10 */
- background-image: url("images/file-priority-low.png"), -o-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
- border-right-width: 0px;
-}
-div.file-priority-radiobox > div.low:active, div.file-priority-radiobox > div.low.selected {
- background-color: #e6e6ff;
- background-image: url("images/file-priority-low.png");
- /* fallback */
- background-image: url("images/file-priority-low.png"), -webkit-gradient(linear, left top, left bottom, from(#d7d7ff), to(#f5f5ff));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-low.png"), -webkit-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-low.png"), -moz-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* FF3.6+ */
- background-image: url("images/file-priority-low.png"), -ms-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* IE10 */
- background-image: url("images/file-priority-low.png"), -o-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.file-priority-radiobox > div.normal {
- background-color: #dddddd;
- background-image: url("images/file-priority-normal.png");
- /* fallback */
- background-image: url("images/file-priority-normal.png"), -webkit-gradient(linear, left top, left bottom, from(#f1f1f1), to(#c9c9c9));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-normal.png"), -webkit-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-normal.png"), -moz-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* FF3.6+ */
- background-image: url("images/file-priority-normal.png"), -ms-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* IE10 */
- background-image: url("images/file-priority-normal.png"), -o-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.file-priority-radiobox > div.normal:active, div.file-priority-radiobox > div.normal.selected {
- background-color: #e6e6ff;
- background-image: url("images/file-priority-normal.png");
- /* fallback */
- background-image: url("images/file-priority-normal.png"), -webkit-gradient(linear, left top, left bottom, from(#d7d7ff), to(#f5f5ff));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-normal.png"), -webkit-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-normal.png"), -moz-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* FF3.6+ */
- background-image: url("images/file-priority-normal.png"), -ms-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* IE10 */
- background-image: url("images/file-priority-normal.png"), -o-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.file-priority-radiobox > div.high {
- -moz-border-radius-topright: 5px;
- -moz-border-radius-bottomright: 5px;
- border-top-right-radius: 5px;
- border-bottom-right-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/file-priority-high.png");
- /* fallback */
- background-image: url("images/file-priority-high.png"), -webkit-gradient(linear, left top, left bottom, from(#f1f1f1), to(#c9c9c9));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-high.png"), -webkit-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-high.png"), -moz-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* FF3.6+ */
- background-image: url("images/file-priority-high.png"), -ms-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* IE10 */
- background-image: url("images/file-priority-high.png"), -o-linear-gradient(top, #f1f1f1, #c9c9c9);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
- border-left-width: 0px;
-}
-div.file-priority-radiobox > div.high:active, div.file-priority-radiobox > div.high.selected {
- background-color: #e6e6ff;
- background-image: url("images/file-priority-high.png");
- /* fallback */
- background-image: url("images/file-priority-high.png"), -webkit-gradient(linear, left top, left bottom, from(#d7d7ff), to(#f5f5ff));
- /* Saf4+, Chrome */
- background-image: url("images/file-priority-high.png"), -webkit-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/file-priority-high.png"), -moz-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* FF3.6+ */
- background-image: url("images/file-priority-high.png"), -ms-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* IE10 */
- background-image: url("images/file-priority-high.png"), -o-linear-gradient(top, #d7d7ff, #f5f5ff);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-
-/****
-*****
-***** MAIN WINDOW FOOTER
-*****
-****/
-div.torrent_footer {
- height: 22px;
- border-top: 1px solid #555;
- position: relative;
- width: 100%;
- z-index: 3;
- background-color: #cccccc;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#ddd), to(#bbb));
- background-image: -webkit-linear-gradient(top, #ddd, #bbb);
- background-image: -moz-linear-gradient(top, #ddd, #bbb);
- background-image: -ms-linear-gradient(top, #ddd, #bbb);
- background-image: -o-linear-gradient(top, #ddd, #bbb);
- background-image: linear-gradient(top, #ddd, #bbb);
-}
-div.torrent_footer > div {
- position: relative;
- float: left;
- margin: 2px 4px;
- width: 18px;
- height: 12px;
- padding: 2px 8px;
- float: left;
- border: 1px solid #888;
- -moz-user-select: none;
- -webkit-user-select: none;
-}
-div.torrent_footer #settings_menu {
- display: none;
-}
-div.torrent_footer #prefs-button {
- -moz-border-radius: 5px;
- border-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/wrench.png");
- /* fallback */
- background-image: url("images/wrench.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/wrench.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/wrench.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/wrench.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/wrench.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #prefs-button:active, div.torrent_footer #prefs-button.selected {
- background-color: #e6e6ff;
- background-image: url("images/wrench.png");
- /* fallback */
- background-image: url("images/wrench.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/wrench.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/wrench.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/wrench.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/wrench.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #turtle-button {
- -moz-border-radius: 5px;
- border-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/turtle.png");
- /* fallback */
- background-image: url("images/turtle.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/turtle.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/turtle.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/turtle.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/turtle.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #turtle-button:active, div.torrent_footer #turtle-button.selected {
- background-color: #e6e6ff;
- background-image: url("images/turtle.png");
- /* fallback */
- background-image: url("images/turtle.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/turtle.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/turtle.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/turtle.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/turtle.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #turtle-button:active, div.torrent_footer #turtle-button.selected {
- background-color: #e6e6ff;
- background-image: url("images/blue-turtle.png");
- /* fallback */
- background-image: url("images/blue-turtle.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/blue-turtle.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/blue-turtle.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/blue-turtle.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/blue-turtle.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #compact-button {
- -moz-border-radius: 5px;
- border-radius: 5px;
- background-color: #dddddd;
- background-image: url("images/compact.png");
- /* fallback */
- background-image: url("images/compact.png"), -webkit-gradient(linear, left top, left bottom, from(white), to(#BBB));
- /* Saf4+, Chrome */
- background-image: url("images/compact.png"), -webkit-linear-gradient(top, white, #BBB);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/compact.png"), -moz-linear-gradient(top, white, #BBB);
- /* FF3.6+ */
- background-image: url("images/compact.png"), -ms-linear-gradient(top, white, #BBB);
- /* IE10 */
- background-image: url("images/compact.png"), -o-linear-gradient(top, white, #BBB);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-div.torrent_footer #compact-button:active, div.torrent_footer #compact-button.selected {
- background-color: #e6e6ff;
- background-image: url("images/compact.png");
- /* fallback */
- background-image: url("images/compact.png"), -webkit-gradient(linear, left top, left bottom, from(#cdcdff), to(white));
- /* Saf4+, Chrome */
- background-image: url("images/compact.png"), -webkit-linear-gradient(top, #cdcdff, white);
- /* Chrome 10+, Saf5.1+ */
- background-image: url("images/compact.png"), -moz-linear-gradient(top, #cdcdff, white);
- /* FF3.6+ */
- background-image: url("images/compact.png"), -ms-linear-gradient(top, #cdcdff, white);
- /* IE10 */
- background-image: url("images/compact.png"), -o-linear-gradient(top, #cdcdff, white);
- /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-
-/****
-*****
-***** DIALOGS
-*****
-****/
-div#dialog_message.dialog_message {
- width: 280px;
- margin: 10px auto 25px;
- font-size: 13px;
- line-height: 14px;
- word-wrap: break-word;
- overflow: hidden;
- padding-bottom: 0;
-}
-
-div#upload_container div.dialog_window div.dialog_message label {
- margin-top: 15px;
- display: block;
-}
-div#upload_container div.dialog_window div.dialog_message input {
- margin: 3px auto;
- display: block;
-}
-div#upload_container div.dialog_window div.dialog_message input[type=checkbox] {
- margin: 15px 3px 0 0;
- display: inline;
- width: auto;
-}
-div#upload_container div.dialog_window div.dialog_message #auto_start_label {
- display: inline;
-}
-
-h2.dialog_heading {
- text-align: center;
- width: 300px;
- margin: 0 auto;
- font-size: 17px;
-}
-
-div.dialog_container a {
- color: white;
- padding: 7px 0;
- background: #222;
- text-decoration: none;
- border: 2px solid white;
- margin: 5px 5px 0;
- font-weight: bold;
- -webkit-border-radius: 16px;
- display: inline-block;
- width: 90px;
- font-size: 12px;
- text-align: center;
-}
-
-#dialog_container div.dialog_window img {
- margin: 5px auto 12px;
-}
-
-.landscape div.dialog_container a#dialog_cancel_button {
- left: 155px;
-}
-.landscape div.dialog_container a#dialog_confirm_button {
- right: 110px;
-}
-.landscape div.dialog_container img {
- float: left !important;
- margin: 0 0 0 50px;
-}
-.landscape h2#dialog_heading.dialog_heading {
- margin: 5px auto 0;
- margin-left: 150px;
- text-align: left;
-}
-.landscape div#dialog_message.dialog_message {
- width: 300px;
- margin: 10px 0 20px 150px;
- text-align: left;
-}
-
-.ui-menu-item {
- text-align: left;
- white-space: nowrap;
-}
-
-#torrent_context_menu {
- font-size: 1em;
- z-index: 3;
-}
-
-iframe#torrent_upload_frame {
- display: block;
- /* Don't change this : safari forms won't target hidden frames (they open a new window) */
- position: absolute;
- top: -1000px;
- left: -1000px;
- width: 0px;
- height: 0px;
- border: none;
- padding: 0;
- margin: 0;
-}
-
-/*# sourceMappingURL=mobile.css.map */
diff --git a/web/style/transmission/mobile.scss b/web/style/transmission/mobile.scss
deleted file mode 100644
index 944e205f5..000000000
--- a/web/style/transmission/mobile.scss
+++ /dev/null
@@ -1,838 +0,0 @@
-@mixin verticalGradient($topColor, $bottomColor) {
- background-color: mix($topColor, $bottomColor);
- background-image: -webkit-gradient(linear, left top, left bottom, from($topColor), to($bottomColor));
- background-image: -webkit-linear-gradient(top, $topColor, $bottomColor);
- background-image: -moz-linear-gradient(top, $topColor, $bottomColor);
- background-image: -ms-linear-gradient(top, $topColor, $bottomColor);
- background-image: -o-linear-gradient(top, $topColor, $bottomColor);
- background-image: linear-gradient(top, $topColor, $bottomColor);
-}
-
-@mixin imageOnVerticalGradient($src, $topColor, $bottomColor) {
- background-color: mix($topColor, $bottomColor);
- background-image: url($src); /* fallback */
- background-image: url($src), -webkit-gradient(linear, left top, left bottom, from($topColor), to($bottomColor)); /* Saf4+, Chrome */
- background-image: url($src), -webkit-linear-gradient(top, $topColor, $bottomColor); /* Chrome 10+, Saf5.1+ */
- background-image: url($src), -moz-linear-gradient(top, $topColor, $bottomColor); /* FF3.6+ */
- background-image: url($src), -ms-linear-gradient(top, $topColor, $bottomColor); /* IE10 */
- background-image: url($src), -o-linear-gradient(top, $topColor, $bottomColor); /* Opera 11.10+ */
- background-position: center;
- background-repeat: no-repeat;
-}
-
-@mixin buttonImage($image-url, $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom) {
- @include imageOnVerticalGradient($image-url, $idle-color-top, $idle-color-bottom);
- &:active, &.selected {
- @include imageOnVerticalGradient($image-url, $active-color-top, $active-color-bottom);
- }
-}
-
-$nonselected-gradient-top: white;
-$nonselected-gradient-bottom: #BBB;
-$selection-color: #cdcdff;
-$selected-gradient-top: $selection-color;
-$selected-gradient-bottom: white;
-
-@mixin button {
- cursor: pointer;
- -moz-user-select: none;
- -webkit-user-select: none;
- display: inline-block;
- border-style: solid;
- border-color: #aaa;
- border-width: 1px;
- padding: 3px;
-}
-
-@mixin roundedBox($radius) {
- -moz-border-radius: $radius;
- border-radius: $radius;
-}
-
-@mixin leftRoundedBox($radius) {
- -moz-border-radius-topleft: $radius;
- -moz-border-radius-bottomleft: $radius;
- border-top-left-radius: $radius;
- border-bottom-left-radius: $radius;
-}
-@mixin rightRoundedBox($radius) {
- -moz-border-radius-topright: $radius;
- -moz-border-radius-bottomright: $radius;
- border-top-right-radius: $radius;
- border-bottom-right-radius: $radius;
-}
-
-@mixin roundedButton($radius) {
- @include button;
- @include roundedBox($radius);
-}
-
-/*--------------------------------------
- *
- * G L O B A L
- *
- *--------------------------------------*/
-
-html {
- margin: 0;
- padding: 0;
-}
-
-body {
- font: 11px Helvetica, Arial, sans-serif;
- background: #FFF;
- text-align: center;
- margin: 0;
- padding: 0;
- width: 100%;
- overflow-x: hidden;
- img { border: none; }
- a { outline: 0; }
- -webkit-text-size-adjust: none;
-
- div#torrent_container { min-height: 328px; }
- div.dialog_container { min-height: 326px; }
- div#torrent_inspector { min-height: 329px; }
- &.landscape div#torrent_container { min-height: 147px; }
- &.landscape div#dialog_container,
- &.landscape div#torrent_inspector { min-height: 143px; }
-}
-
-body.inspector_showing #torrent_filter_bar, body.inspector_showing #torrent_container,
-body.dialog_showing #torrent_filter_bar, body.dialog_showing #torrent_container, body.dialog_showing #torrent_inspector,
-body.prefs_showing #torrent_inspector, body.prefs_showing #torrent_filter_bar, body.prefs_showing #torrent_container,
-body.open_showing #torrent_filter_bar, body.open_showing #torrent_container {
- display: none !important;
-}
-
-/***
-****
-**** TOOLBAR
-****
-***/
-
-$toolbar-gradient-top: #ddd;
-$toolbar-gradient-bottom: #bbb;
-$toolbar-height: 39px;
-
-div#toolbar
-{
- width: 100%;
- height: $toolbar-height;
- margin: 0px;
- padding: 2px;
- border-bottom: 1px solid #AAA;
- @include verticalGradient($toolbar-gradient-top, $toolbar-gradient-bottom);
-
- $idle-color-top: $nonselected-gradient-top;
- $idle-color-bottom: $nonselected-gradient-bottom;
- $active-color-top: $selected-gradient-top;
- $active-color-bottom: $selected-gradient-bottom;
-
- > * {
- @include button;
- margin-top: 5px;
- width: 34px;
- height: 34px;
- float: left;
- border: none;
- padding: 0px 3px;
- background-position: center center;
- background-repeat: no-repeat;
- }
-
- >div.toolbar-separator {
- height: 25px;
- margin-top: 8px;
- margin-bottom: 8px;
- border-left: 1px solid #aaa;
- width: 3px;
- }
-
- > div#toolbar-open {
- background-image: url('images/toolbar-folder.png');
- }
- > div#toolbar-remove {
- background-image: url('images/toolbar-close.png');
- }
- > div#toolbar-start {
- background-image: url('images/toolbar-start.png');
- }
- > div#toolbar-pause {
- background-image: url('images/toolbar-pause.png');
- }
- > div#toolbar-start-all {
- background-image: url('images/toolbar-start-all.png');
- }
- > div#toolbar-pause-all {
- background-image: url('images/toolbar-pause-all.png');
- }
-
- > div#toolbar-inspector {
- background-image: url('images/toolbar-info.png');
- float: right;
- }
-
- > *.disabled {
- opacity: 0.25;
- }
-}
-
-/***
-****
-**** STATUSBAR
-****
-***/
-
-$statusbar-gradient-top: #ddd;
-$statusbar-gradient-bottom: #bbb;
-$statusbar-height: 24px;
-
-#statusbar
-{
- height: $statusbar-height;
- width: 100%;
- border-bottom: 1px solid #AAA;
- overflow: hidden;
- position: relative;
- @include verticalGradient($statusbar-gradient-top, $statusbar-gradient-bottom);
-
- #filter
- {
- float: left;
- margin-left: 5px;
-
- input#torrent_search {
- display: none;
- }
-
- #filter-count { margin-left: 8px; }
- }
-
- #speed-info
- {
- float: right;
- margin-top: 5px;
- margin-right: 10px;
-
- * {
- display: inline-block;
- }
-
- #speed-up-icon {
- margin-left: 8px;
- width: 8px;
- height: 8px;
- background: url('images/arrow-up.png') bottom no-repeat;
- }
-
- #speed-dn-icon {
- width: 8px;
- height: 8px;
- background: url('images/arrow-down.png') bottom no-repeat;
- }
-
- #speed-up-container, #speed-dn-container {
- display: inline;
- }
- }
-}
-
-/***
-****
-**** TORRENT CONTAINER
-****
-***/
-
-ul.torrent_list
-{
- width: 100%;
- margin: 0;
- padding: 0;
- text-align: left;
- cursor: pointer;
-
- li.torrent
- {
- border-bottom: 1px solid #ccc;
- padding: 4px 30px 5px 14px;
- color: #666;
- background-color: white;
-
- &.compact { padding: 4px; }
- &.even { background-color: #F7F7F7; }
- &.selected { background-color: $selection-color; }
- &.compact { div.torrent_name { color: black; } }
-
- // start-stop button
- a {
- display: none;
- }
-
- div.torrent_name
- {
- font-size: 1.3em;
- font-weight: bold;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- color: #222;
- margin-top: 2px;
- margin-bottom: 2px;
-
- &.compact { font-size: 1.0em; font-weight: normal; }
- &.paused { font-weight: normal; color: #777; }
- }
-
- div.torrent_progress_details,
- div.torrent_peer_details {
- clear: left;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- div.torrent_progress_details.error,
- div.torrent_peer_details.error {
- color: #F00;
- }
-
- &.selected div.torrent_progress_details.error,
- &.selected div.torrent_peer_details.error {
- color: #FFF;
- }
- }
-
- /**
- * Progressbar
- *
- * Each progressbar has three elemens: a parent container and two children,
- * complete and incomplete.
- *
- * The only thing needed to set the progressbar percentage is to set
- * the complete child's width as a percentage. This is because incomplete
- * is pinned to the full width and height of the parent, and complete
- * is pinned to the left side of the parent and has a higher z-index.
- *
- * The progressbar has different colors depending on its state, so there
- * are five 'decorator' classNames: paused, queued, magnet, leeching, seeding.
- */
- div.torrent_progress_bar_container
- {
- height: 10px;
- position: relative;
-
- &.compact {
- width: 50px;
- position: absolute;
- right: 10px;
- margin-top: 2px;
- /*float: right;*/
- }
- &.full {
- margin-top: 2px;
- margin-bottom: 5px;
- }
- }
- div.torrent_peer_details.compact
- {
- margin-top: 2px;
- margin-right: 65px; /* leave room on the right for the progressbar */
- float: right; /* pins it next to progressbar & forces torrent_name to ellipsize when it bumps up against this div */
- }
- div.torrent_progress_bar
- {
- height: 100%;
- position: absolute;
- top: 0px;
- left: 0px;
- background-image: url('images/progress.png');
- background-repeat: repeat-x;
- border: 1px solid #888;
-
- &.complete { z-index: 2; }
- &.complete.paused { background-position: left -30px; border-color: #989898; }
- &.complete.magnet { background-position: left -20px; border-color: #CFCFCF; }
- &.complete.leeching { background-position: left 0px; border-color: #3D9DEA; }
- &.complete.leeching.queued { background-position: left -70px; border-color: #889CA5; }
- &.complete.seeding { background-position: left -40px; border-color: #269E30; }
- &.complete.seeding.queued { background-position: left -60px; border-color: #8A998D; }
- &.incomplete { z-index: 1; width: 100%; }
- &.incomplete.paused { background-position: left -20px; border-color: #CFCFCF; }
- &.incomplete.magnet { background-position: left -50px; border-color: #D47778; }
- &.incomplete.leeching { background-position: left -20px; border-color: #CFCFCF; }
- &.incomplete.leeching.queued { background-position: left -80px; border-color: #C4C4C4; }
- &.incomplete.seeding { background-position: left -10px; border-color: #29AD35; }
- }
-}
-
-/***
-****
-**** PREFERENCES
-****
-***/
-
-#prefs-dialog.ui-tabs .ui-tabs-panel {
- padding: 0px;
- -moz-user-select: none;
- -webkit-user-select: none;
-}
-
-.prefs-section
-{
- margin: 10px;
- text-align: left;
-
- > * {
- padding-top: 8px;
- padding-left: 8px;
- }
-
- .title {
- font-weight: bold;
- font-size: larger;
- padding-left: 0px;
- }
-
- .row {
- .key {
- float: left;
- padding-top: 3px;
- > * { margin-left: 0px; }
- }
- .value {
- margin-left: 150px;
- > * { width: 100%; }
- }
- }
-
- .checkbox-row {
- > input { margin: 0px; }
- > label { margin-left: 5px; }
- }
-
- #alternative-speed-limits-title {
- padding-left: 18px;
- background: transparent url('images/blue-turtle.png') no-repeat;
- }
-}
-
-/***
-****
-**** TORRENT INSPECTOR
-****
-***/
-
-div#torrent_inspector
-{
- overflow: auto;
- text-align: left;
- padding: 15px;
- top: 0;
- position: relative;
- width: 100%;
- z-index: 2;
-
- $idle-color-top: $nonselected-gradient-top;
- $idle-color-bottom: $nonselected-gradient-bottom;
- $active-color-top: $selected-gradient-top;
- $active-color-bottom: $selected-gradient-bottom;
-
-
- #inspector-tabs-wrapper
- {
- width: 100%;
- overflow: hidden;
- text-align: center;
-
- #inspector-tabs
- {
- $border-radius: 5px;
-
- display: inline-block;
-
- > * {
- @include button;
- width: 30px;
- height: 20px;
- }
-
- > #inspector-tab-info {
- @include leftRoundedBox($border-radius);
- @include buttonImage('images/inspector-info.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- border-left-width: 1px;
- }
-
- > #inspector-tab-peers {
- @include buttonImage('images/inspector-peers.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-
- > #inspector-tab-trackers {
- @include buttonImage('images/inspector-trackers.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-
- > #inspector-tab-files {
- @include rightRoundedBox($border-radius);
- @include buttonImage('images/inspector-files.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
- }
- }
-
- #inspector_header
- {
- margin-top: 8px;
-
- #torrent_inspector_name
- {
- font-weight: bold;
- font-size: large;
- }
- }
-
- ul.tier_list
- {
- margin: 2px 0 8px 0;
- width: 100%;
- padding-left: 0px;
- text-align: left;
- display: block;
- cursor: default;
- list-style-type: none;
- list-style: none;
- list-style-image: none;
- clear: both;
-
- li {
- overflow: hidden;
- }
- .tracker_activity {
- float: left;
- color: #666;
- width: 200px;
- display: table;
- margin-top: 1px;
- }
- .tracker_activity div {
- padding: 2px;
- }
- table {
- float: right;
- color: #666;
- }
- th {
- text-align: right;
- }
- }
-
- li.inspector_tracker_entry {
- padding: 3px 0 3px 2px;
- display: block;
-
- &.odd {
- background-color: #EEEEEE;
- }
- }
-
- div.tracker_host {
- font-size: 1.2em;
- font-weight: bold;
- color: #222;
- }
-
- /* Files Inspector Tab */
- #inspector_file_list {
- padding: 0 0 0 0;
- margin: 0 0 0 0;
- text-align: left;
- cursor: default;
- overflow: hidden;
- }
- #inspector_file_list {
- border-top: 1px solid #888;
- width: 100%;
- margin: 6px 0 0 0;
- padding-top: 6px;
- padding-bottom: 10px;
- text-align: left;
- display: block;
- cursor: default;
- list-style-type: none;
- list-style: none;
- list-style-image: none;
- clear: both;
- }
- li.inspector_torrent_file_list_entry {
- padding: 3px 0 3px 2px;
- display: block;
- &.skip { color: #666; }
- &.even { background-color: #F7F7F7; }
- }
-
- div.inspector_torrent_file_list_entry_name {
- font-size: 1.2em;
- color: black;
- display: inline;
- margin-left: 0px;
- }
- li.inspector_torrent_file_list_entry.skip>.inspector_torrent_file_list_entry_name {
- color: #999;
- }
- div.inspector_torrent_file_list_entry_progress {
- color: #999;
- margin-left: 20px;
- }
-
- ul.single_file li.inspector_torrent_file_list_entry>.file_wanted_control,
- li.inspector_torrent_file_list_entry.complete>.file_wanted_control {
- cursor: default;
- }
-}
-
-/* Peers Inspector Tab */
-#inspector_peers_list {
- padding: 0 0 0 0;
- margin: 0 0 0 0;
- text-align: left;
- cursor: default;
- overflow: hidden;
-
- > div.inspector_group {
- padding-bottom: 0;
- margin-bottom: 0;
- }
-}
-
-table.peer_list {
- width: 100%;
- border-collapse: collapse;
- text-align: left;
- cursor: default;
- clear: both;
- table-layout: fixed;
-
- .encryptedCol { width: 16px; }
- .upCol { width: 70px; }
- .downCol { width: 70px; }
- .percentCol { width: 30px; padding-right: 5px; text-align: right; }
- .statusCol { width: 40px; padding-right: 5px; }
- .addressCol { width: 180px; }
- .clientCol { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
-}
-
-tr.inspector_peer_entry
-{
- div.encrypted-peer-cell
- {
- width: 16px;
- height: 16px;
- background: transparent url('images/lock_icon.png') no-repeat;
- }
-
- &.odd
- {
- background-color: #EEEEEE;
- }
-}
-
-/***
-**** File Priority Buttons
-***/
-
-div.file-priority-radiobox
-{
- $border-radius: 5px;
-
- display: inline;
- float: right;
- margin: 4px;
- margin-top: 2px;
-
- > * {
- @include button;
- width: 20px;
- height: 12px;
- }
-
- // We have row after row of these buttons, so the flashy colors used in the inspector tabs look harsh here.
- // Keep the same basic color theme, but look less harsh, by cutting the gradient's color range.
- $idle-color-top: mix( $nonselected-gradient-top, $nonselected-gradient-bottom, 80% );
- $idle-color-bottom: mix( $nonselected-gradient-top, $nonselected-gradient-bottom, 20% );
- $active-color-top: mix( $selected-gradient-top, $selected-gradient-bottom, 80% );
- $active-color-bottom: mix( $selected-gradient-top, $selected-gradient-bottom, 20% );
-
- > div.low {
- @include leftRoundedBox($border-radius);
- @include buttonImage('images/file-priority-low.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- border-right-width: 0px;
- }
-
- > div.normal {
- @include buttonImage('images/file-priority-normal.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-
- > div.high {
- @include rightRoundedBox($border-radius);
- @include buttonImage('images/file-priority-high.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- border-left-width: 0px;
- }
-}
-
-
-/****
-*****
-***** MAIN WINDOW FOOTER
-*****
-****/
-
-div.torrent_footer
-{
- height: 22px;
- border-top: 1px solid #555;
- position: relative;
- width: 100%;
- z-index: 3;
-
- @include verticalGradient($statusbar-gradient-top, $statusbar-gradient-bottom);
-
- > div {
- position: relative;
- float: left;
- margin: 2px 4px;
- width: 18px;
- height: 12px;
- padding: 2px 8px;
- float: left;
- border: 1px solid #888;
- -moz-user-select: none;
- -webkit-user-select: none;
- }
-
- $idle-color-top: $nonselected-gradient-top;
- $idle-color-bottom: $nonselected-gradient-bottom;
- $active-color-top: $selected-gradient-top;
- $active-color-bottom: $selected-gradient-bottom;
-
- #settings_menu {
- display: none;
- }
-
- #prefs-button {
- @include roundedBox(5px);
- @include buttonImage('images/wrench.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-
- #turtle-button {
- @include roundedBox(5px);
- @include buttonImage('images/turtle.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- &:active, &.selected {
- @include imageOnVerticalGradient('images/blue-turtle.png', $active-color-top, $active-color-bottom);
- }
- }
-
- #compact-button {
- @include roundedBox(5px);
- @include buttonImage('images/compact.png', $idle-color-top, $idle-color-bottom, $active-color-top, $active-color-bottom);
- }
-}
-
-/****
-*****
-***** DIALOGS
-*****
-****/
-
-div#dialog_message.dialog_message {
- width: 280px;
- margin: 10px auto 25px;
- font-size: 13px;
- line-height: 14px;
- word-wrap: break-word;
- overflow: hidden;
- padding-bottom: 0;
-}
-
-div#upload_container div.dialog_window div.dialog_message {
- label {
- margin-top: 15px;
- display: block;
- }
- input {
- margin: 3px auto;
- display: block;
- }
- input[type=checkbox] {
- margin: 15px 3px 0 0;
- display: inline;
- width: auto;
- }
- #auto_start_label {
- display: inline;
- }
-}
-
-h2.dialog_heading {
- text-align: center;
- width: 300px;
- margin: 0 auto;
- font-size: 17px;
-}
-
-div.dialog_container a {
- color: white;
- padding: 7px 0;
- background: #222;
- text-decoration: none;
- border: 2px solid white;
- margin: 5px 5px 0;
- font-weight: bold;
- -webkit-border-radius: 16px;
- display: inline-block;
- width: 90px;
- font-size: 12px;
- text-align: center;
-}
-
-#dialog_container div.dialog_window img {
- margin: 5px auto 12px;
-}
-
-.landscape {
- div.dialog_container {
- a#dialog_cancel_button { left: 155px; }
- a#dialog_confirm_button { right: 110px; }
- img { float: left !important; margin: 0 0 0 50px; }
- }
- h2#dialog_heading.dialog_heading {
- margin: 5px auto 0;
- margin-left: 150px;
- text-align: left;
- }
- div#dialog_message.dialog_message {
- width: 300px;
- margin: 10px 0 20px 150px;
- text-align: left;
- }
-}
-
-
-.ui-menu-item {
- text-align: left;
- white-space: nowrap;
-}
-
-#torrent_context_menu {
- font-size: 1em;
- z-index: 3;
-}
-
-iframe#torrent_upload_frame {
- display: block; /* Don't change this : safari forms won't target hidden frames (they open a new window) */
- position: absolute;
- top: -1000px;
- left: -1000px;
- width: 0px;
- height: 0px;
- border: none;
- padding: 0;
- margin: 0;
-}
diff --git a/web/stylelint.config.js b/web/stylelint.config.js
new file mode 100644
index 000000000..38b85cdc3
--- /dev/null
+++ b/web/stylelint.config.js
@@ -0,0 +1,49 @@
+
+module.exports = {
+ "extends": [
+ "stylelint-config-sass-guidelines",
+ "stylelint-config-prettier"
+ ],
+ "plugins": [
+ "stylelint-config-primer/plugins/no-undefined-vars",
+ "stylelint-config-primer/plugins/no-unused-vars"
+ ],
+ "rules": {
+ "block-no-empty": true,
+ "color-no-invalid-hex": true,
+ "comment-no-empty": true,
+ "declaration-block-no-duplicate-properties": true,
+ "declaration-block-no-shorthand-property-overrides": true,
+ "font-family-no-duplicate-names": true,
+ "function-calc-no-invalid": true,
+ "function-calc-no-unspaced-operator": true,
+ "function-linear-gradient-no-nonstandard-direction": true,
+ "max-nesting-depth": null,
+ "media-feature-name-no-unknown": true,
+ "no-duplicate-at-import-rules": true,
+ "no-duplicate-selectors": null,
+ "no-empty-source": true,
+ "no-extra-semicolons": true,
+ "no-invalid-double-slash-comments": true,
+ "primer/no-undefined-vars": true,
+ "primer/no-unused-vars": true,
+ "property-no-unknown": true,
+ "scss/at-rule-no-unknown": true,
+ "selector-attribute-quotes": null,
+ "selector-max-compound-selectors": null,
+ "selector-max-id": null,
+ "selector-no-qualifying-type": [
+ true,
+ {
+ "ignore": [
+ "attribute"
+ ]
+ }
+ ],
+ "selector-pseudo-class-no-unknown": true,
+ "selector-pseudo-element-no-unknown": true,
+ "selector-type-no-unknown": true,
+ "string-no-newline": true,
+ "unit-no-unknown": true,
+ }
+};
diff --git a/web/webpack.config.js b/web/webpack.config.js
new file mode 100644
index 000000000..a6739da7d
--- /dev/null
+++ b/web/webpack.config.js
@@ -0,0 +1,71 @@
+const path = require('path');
+
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
+const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
+const TerserPlugin = require('terser-webpack-plugin');
+const webpack = require('webpack');
+
+const mode = process.env.WEBPACK_MODE || 'production';
+
+module.exports = {
+ devtool: 'source-map',
+ entry: './src/main.js',
+ mode,
+ module: {
+ rules: [
+ {
+ test: /\.s(a|c)ss$/,
+ use: [
+ 'style-loader', // create 'style' nodes from JS strings
+ 'css-loader', // translate css into commonjs
+ 'sass-loader', // compile sass into css
+ ],
+ },
+ {
+ test: /\.css$/i,
+ use: [ 'style-loader', 'css-loader' ],
+ },
+ {
+ test: /\.(png|jpe?g|)$/i,
+ use: [
+ 'url-loader',
+ ],
+ },
+ {
+ test: /\.svg$/i,
+ use: [
+ 'url-loader',
+ 'svgo-loader'
+ ],
+ },
+ ],
+ },
+ optimization: {
+ minimizer: [
+ new TerserPlugin(),
+ new OptimizeCSSAssetsPlugin({
+ cssProcessorPluginOptions: {
+ preset: ['default', { discardComments: { removeAll: true } }],
+ }
+ })
+ ],
+ },
+ output: {
+ filename: 'transmission-app.js' ,
+ path: path.resolve(__dirname, 'public_html'),
+ sourceMapFilename: 'transmission-app.js.map'
+ },
+ plugins: [
+ new MiniCssExtractPlugin({
+ chunkFilename: '[id].css',
+ filename: '[name].css'
+ }),
+ new webpack.optimize.LimitChunkCountPlugin({
+ maxChunks: 1,
+ }),
+ ],
+ resolve: {
+ extensions: ['.js', '.scss']
+ },
+};
+
diff --git a/web/yarn.lock b/web/yarn.lock
index c50aa6d96..3486c42db 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -9,19 +9,19 @@
dependencies:
"@babel/highlight" "^7.10.4"
-"@babel/core@^7.11.6":
- version "7.11.6"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651"
- integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==
+"@babel/core@>=7.9.0", "@babel/core@^7.11.6":
+ version "7.12.3"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8"
+ integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==
dependencies:
"@babel/code-frame" "^7.10.4"
- "@babel/generator" "^7.11.6"
- "@babel/helper-module-transforms" "^7.11.0"
- "@babel/helpers" "^7.10.4"
- "@babel/parser" "^7.11.5"
+ "@babel/generator" "^7.12.1"
+ "@babel/helper-module-transforms" "^7.12.1"
+ "@babel/helpers" "^7.12.1"
+ "@babel/parser" "^7.12.3"
"@babel/template" "^7.10.4"
- "@babel/traverse" "^7.11.5"
- "@babel/types" "^7.11.5"
+ "@babel/traverse" "^7.12.1"
+ "@babel/types" "^7.12.1"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.1"
@@ -32,33 +32,32 @@
source-map "^0.5.0"
"@babel/eslint-parser@^7.11.5":
- version "7.11.5"
- resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.11.5.tgz#398192b8d1cd3678efb709f5ab09d9aa2a2218fd"
- integrity sha512-DZ3maD3ciwRg1pOzEpJ1outlV1DA/A8XHDQoyL69fC3RIJMlMq1UPudgfRkW0YFqmQPR6OPvu8chaT7Yq2Mm8A==
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.12.1.tgz#b3ae38e6174d2d0d2d00d2dcd919b4086b6bb8f0"
+ integrity sha512-cc7WQHnHQY3++/bghgbDtPx+5bf6xTsokyGzV6Qzh65NLz/unv+mPQuACkQ9GFhIhcTFv6yqwNaEcfX7EkOEsg==
dependencies:
eslint-scope "5.1.0"
eslint-visitor-keys "^1.3.0"
semver "^6.3.0"
-"@babel/generator@^7.11.5", "@babel/generator@^7.11.6":
- version "7.11.6"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620"
- integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==
+"@babel/generator@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.1.tgz#0d70be32bdaa03d7c51c8597dda76e0df1f15468"
+ integrity sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==
dependencies:
- "@babel/types" "^7.11.5"
+ "@babel/types" "^7.12.1"
jsesc "^2.5.1"
source-map "^0.5.0"
-"@babel/helper-create-class-features-plugin@^7.10.4":
- version "7.10.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d"
- integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==
+"@babel/helper-create-class-features-plugin@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e"
+ integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==
dependencies:
"@babel/helper-function-name" "^7.10.4"
- "@babel/helper-member-expression-to-functions" "^7.10.5"
+ "@babel/helper-member-expression-to-functions" "^7.12.1"
"@babel/helper-optimise-call-expression" "^7.10.4"
- "@babel/helper-plugin-utils" "^7.10.4"
- "@babel/helper-replace-supers" "^7.10.4"
+ "@babel/helper-replace-supers" "^7.12.1"
"@babel/helper-split-export-declaration" "^7.10.4"
"@babel/helper-function-name@^7.10.4":
@@ -77,31 +76,33 @@
dependencies:
"@babel/types" "^7.10.4"
-"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5":
- version "7.11.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df"
- integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==
+"@babel/helper-member-expression-to-functions@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c"
+ integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==
dependencies:
- "@babel/types" "^7.11.0"
+ "@babel/types" "^7.12.1"
-"@babel/helper-module-imports@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
- integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
+"@babel/helper-module-imports@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz#1644c01591a15a2f084dd6d092d9430eb1d1216c"
+ integrity sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==
dependencies:
- "@babel/types" "^7.10.4"
+ "@babel/types" "^7.12.1"
-"@babel/helper-module-transforms@^7.11.0":
- version "7.11.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359"
- integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==
+"@babel/helper-module-transforms@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c"
+ integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==
dependencies:
- "@babel/helper-module-imports" "^7.10.4"
- "@babel/helper-replace-supers" "^7.10.4"
- "@babel/helper-simple-access" "^7.10.4"
+ "@babel/helper-module-imports" "^7.12.1"
+ "@babel/helper-replace-supers" "^7.12.1"
+ "@babel/helper-simple-access" "^7.12.1"
"@babel/helper-split-export-declaration" "^7.11.0"
+ "@babel/helper-validator-identifier" "^7.10.4"
"@babel/template" "^7.10.4"
- "@babel/types" "^7.11.0"
+ "@babel/traverse" "^7.12.1"
+ "@babel/types" "^7.12.1"
lodash "^4.17.19"
"@babel/helper-optimise-call-expression@^7.10.4":
@@ -116,23 +117,22 @@
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
-"@babel/helper-replace-supers@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf"
- integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==
+"@babel/helper-replace-supers@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9"
+ integrity sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==
dependencies:
- "@babel/helper-member-expression-to-functions" "^7.10.4"
+ "@babel/helper-member-expression-to-functions" "^7.12.1"
"@babel/helper-optimise-call-expression" "^7.10.4"
- "@babel/traverse" "^7.10.4"
- "@babel/types" "^7.10.4"
+ "@babel/traverse" "^7.12.1"
+ "@babel/types" "^7.12.1"
-"@babel/helper-simple-access@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
- integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==
+"@babel/helper-simple-access@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136"
+ integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==
dependencies:
- "@babel/template" "^7.10.4"
- "@babel/types" "^7.10.4"
+ "@babel/types" "^7.12.1"
"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0":
version "7.11.0"
@@ -146,14 +146,14 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
-"@babel/helpers@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044"
- integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==
+"@babel/helpers@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.1.tgz#8a8261c1d438ec18cb890434df4ec768734c1e79"
+ integrity sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==
dependencies:
"@babel/template" "^7.10.4"
- "@babel/traverse" "^7.10.4"
- "@babel/types" "^7.10.4"
+ "@babel/traverse" "^7.12.1"
+ "@babel/types" "^7.12.1"
"@babel/highlight@^7.10.4":
version "7.10.4"
@@ -164,17 +164,17 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.10.4", "@babel/parser@^7.11.5":
- version "7.11.5"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
- integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
+"@babel/parser@^7.10.4", "@babel/parser@^7.12.1", "@babel/parser@^7.12.3", "@babel/parser@^7.7.0":
+ version "7.12.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd"
+ integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==
"@babel/plugin-proposal-class-properties@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807"
- integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de"
+ integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.10.4"
+ "@babel/helper-create-class-features-plugin" "^7.12.1"
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/template@^7.10.4":
@@ -186,25 +186,25 @@
"@babel/parser" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5":
- version "7.11.5"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3"
- integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==
+"@babel/traverse@^7.12.1", "@babel/traverse@^7.7.0":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e"
+ integrity sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==
dependencies:
"@babel/code-frame" "^7.10.4"
- "@babel/generator" "^7.11.5"
+ "@babel/generator" "^7.12.1"
"@babel/helper-function-name" "^7.10.4"
"@babel/helper-split-export-declaration" "^7.11.0"
- "@babel/parser" "^7.11.5"
- "@babel/types" "^7.11.5"
+ "@babel/parser" "^7.12.1"
+ "@babel/types" "^7.12.1"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.19"
-"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.11.5":
- version "7.11.5"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d"
- integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==
+"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.7.0":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae"
+ integrity sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==
dependencies:
"@babel/helper-validator-identifier" "^7.10.4"
lodash "^4.17.19"
@@ -226,36 +226,364 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
-"@types/color-name@^1.1.1":
+"@mrmlnc/readdir-enhanced@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+ integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+ dependencies:
+ call-me-maybe "^1.0.1"
+ glob-to-regexp "^0.3.0"
+
+"@nodelib/fs.scandir@2.1.3":
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
+ integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.3"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
+ integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
+
+"@nodelib/fs.stat@^1.1.2":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
+ integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
+ integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.3"
+ fastq "^1.6.0"
+
+"@npmcli/move-file@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464"
+ integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==
+ dependencies:
+ mkdirp "^1.0.4"
+
+"@sindresorhus/is@^0.7.0":
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+ integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==
+
+"@stylelint/postcss-css-in-js@^0.37.2":
+ version "0.37.2"
+ resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2"
+ integrity sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==
+ dependencies:
+ "@babel/core" ">=7.9.0"
+
+"@stylelint/postcss-markdown@^0.36.1":
+ version "0.36.1"
+ resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz#829b87e6c0f108014533d9d7b987dc9efb6632e8"
+ integrity sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==
+ dependencies:
+ remark "^12.0.0"
+ unist-util-find-all-after "^3.0.1"
+
+"@types/glob@^7.1.1":
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
+ integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6":
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0"
+ integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==
+
+"@types/minimatch@*":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+
+"@types/minimist@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
+ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
+
+"@types/node@*":
+ version "14.14.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.2.tgz#d25295f9e4ca5989a2c610754dc02a9721235eeb"
+ integrity sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg==
+
+"@types/normalize-package-data@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
+ integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/q@^1.5.1":
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24"
+ integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==
+
+"@types/unist@^2.0.0", "@types/unist@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
+ integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==
+
+"@webassemblyjs/ast@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
+ integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
+ dependencies:
+ "@webassemblyjs/helper-module-context" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/wast-parser" "1.9.0"
+
+"@webassemblyjs/floating-point-hex-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
+ integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
+
+"@webassemblyjs/helper-api-error@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
+ integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
+
+"@webassemblyjs/helper-buffer@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
+ integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
+
+"@webassemblyjs/helper-code-frame@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
+ integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
+ dependencies:
+ "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/helper-fsm@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
+ integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
+
+"@webassemblyjs/helper-module-context@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
+ integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+
+"@webassemblyjs/helper-wasm-bytecode@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
+ integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
+
+"@webassemblyjs/helper-wasm-section@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
+ integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+
+"@webassemblyjs/ieee754@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
+ integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
+ integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
+ integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
+
+"@webassemblyjs/wasm-edit@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
+ integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/helper-wasm-section" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+ "@webassemblyjs/wasm-opt" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+ "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/wasm-gen@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
+ integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/ieee754" "1.9.0"
+ "@webassemblyjs/leb128" "1.9.0"
+ "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wasm-opt@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
+ integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+
+"@webassemblyjs/wasm-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
+ integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-api-error" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/ieee754" "1.9.0"
+ "@webassemblyjs/leb128" "1.9.0"
+ "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wast-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
+ integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/floating-point-hex-parser" "1.9.0"
+ "@webassemblyjs/helper-api-error" "1.9.0"
+ "@webassemblyjs/helper-code-frame" "1.9.0"
+ "@webassemblyjs/helper-fsm" "1.9.0"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/wast-printer@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
+ integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/wast-parser" "1.9.0"
+ "@xtuc/long" "4.2.2"
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+JSONStream@^0.8.4:
+ version "0.8.4"
+ resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.8.4.tgz#91657dfe6ff857483066132b4618b62e8f4887bd"
+ integrity sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=
+ dependencies:
+ jsonparse "0.0.5"
+ through ">=2.2.7 <3"
+
+abbrev@1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
- integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
acorn-jsx@^5.2.0:
version "5.3.1"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
-acorn@^7.4.0:
- version "7.4.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c"
- integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==
+acorn-walk@^7.1.1:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+ integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
-ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4:
- version "6.12.5"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da"
- integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==
+acorn@^6.4.1:
+ version "6.4.2"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
+ integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
+
+acorn@^7.1.1, acorn@^7.4.0:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+aggregate-error@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+ integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+ dependencies:
+ clean-stack "^2.0.0"
+ indent-string "^4.0.0"
+
+ajv-errors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+ integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
+alphanum-sort@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+ integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+ integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
+
ansi-colors@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
ansi-regex@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
@@ -266,6 +594,11 @@ ansi-regex@^5.0.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -273,14 +606,54 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
-ansi-styles@^4.1.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
- integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
- "@types/color-name" "^1.1.1"
color-convert "^2.0.1"
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+anymatch@^3.1.1, anymatch@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
+ integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+aproba@^1.0.3, aproba@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+arch@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf"
+ integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==
+
+archive-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70"
+ integrity sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=
+ dependencies:
+ file-type "^4.2.0"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@@ -288,16 +661,334 @@ argparse@^1.0.7:
dependencies:
sprintf-js "~1.0.2"
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-differ@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
+ integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=
+
+array-find-index@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+ integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-union@^1.0.1, array-union@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+ integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+arrify@^1.0.0, arrify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+ integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
+
+asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assert@^1.1.1:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
+ integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
+ dependencies:
+ object-assign "^4.1.1"
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
astral-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+async-each@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+ integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+
+async-foreach@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
+ integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+autoprefixer@^9.8.6:
+ version "9.8.6"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
+ integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==
+ dependencies:
+ browserslist "^4.12.0"
+ caniuse-lite "^1.0.30001109"
+ colorette "^1.2.1"
+ normalize-range "^0.1.2"
+ num2fraction "^1.2.2"
+ postcss "^7.0.32"
+ postcss-value-parser "^4.1.0"
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428"
+ integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==
+
+babel-eslint@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
+ integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/parser" "^7.7.0"
+ "@babel/traverse" "^7.7.0"
+ "@babel/types" "^7.7.0"
+ eslint-visitor-keys "^1.0.0"
+ resolve "^1.12.0"
+
+bail@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
+ integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
+
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+base64-js@^1.0.2:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
+ integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bfj@^6.1.1:
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f"
+ integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==
+ dependencies:
+ bluebird "^3.5.5"
+ check-types "^8.0.3"
+ hoopy "^0.1.4"
+ tryer "^1.0.1"
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+bin-build@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861"
+ integrity sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==
+ dependencies:
+ decompress "^4.0.0"
+ download "^6.2.2"
+ execa "^0.7.0"
+ p-map-series "^1.0.0"
+ tempfile "^2.0.0"
+
+bin-check@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49"
+ integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==
+ dependencies:
+ execa "^0.7.0"
+ executable "^4.1.0"
+
+bin-version-check@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71"
+ integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==
+ dependencies:
+ bin-version "^3.0.0"
+ semver "^5.6.0"
+ semver-truncate "^1.1.2"
+
+bin-version@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839"
+ integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==
+ dependencies:
+ execa "^1.0.0"
+ find-versions "^3.0.0"
+
+bin-wrapper@^4.0.0, bin-wrapper@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605"
+ integrity sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==
+ dependencies:
+ bin-check "^4.1.0"
+ bin-version-check "^4.0.0"
+ download "^7.1.0"
+ import-lazy "^3.1.0"
+ os-filter-obj "^2.0.0"
+ pify "^4.0.1"
+
+binary-extensions@^1.0.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+ integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+binary-extensions@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
+ integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
+
+bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+bl@^1.0.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
+ integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==
+ dependencies:
+ readable-stream "^2.3.5"
+ safe-buffer "^5.1.1"
+
+block-stream@*:
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+ integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=
+ dependencies:
+ inherits "~2.0.0"
+
+bluebird@^3.5.5:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0:
+ version "4.11.9"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
+ integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==
+
+bn.js@^5.1.1:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b"
+ integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==
+
+body-parser@1.19.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ bytes "3.1.0"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "~1.1.2"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ on-finished "~2.3.0"
+ qs "6.7.0"
+ raw-body "2.4.0"
+ type-is "~1.6.17"
+
+boolbase@^1.0.0, boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -306,12 +997,345 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
+braces@^2.3.1, braces@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.12.0:
+ version "4.14.5"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015"
+ integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==
+ dependencies:
+ caniuse-lite "^1.0.30001135"
+ electron-to-chromium "^1.3.571"
+ escalade "^3.1.0"
+ node-releases "^1.1.61"
+
+buffer-alloc-unsafe@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+ integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+ integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+ dependencies:
+ buffer-alloc-unsafe "^1.1.0"
+ buffer-fill "^1.0.0"
+
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
+
+buffer-fill@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+ integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer@^4.3.0:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
+ integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+buffer@^5.2.1:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
+ integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+ integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+cacache@^12.0.2:
+ version "12.0.4"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
+ integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
+ dependencies:
+ bluebird "^3.5.5"
+ chownr "^1.1.1"
+ figgy-pudding "^3.5.1"
+ glob "^7.1.4"
+ graceful-fs "^4.1.15"
+ infer-owner "^1.0.3"
+ lru-cache "^5.1.1"
+ mississippi "^3.0.0"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ promise-inflight "^1.0.1"
+ rimraf "^2.6.3"
+ ssri "^6.0.1"
+ unique-filename "^1.1.1"
+ y18n "^4.0.0"
+
+cacache@^15.0.5:
+ version "15.0.5"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0"
+ integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==
+ dependencies:
+ "@npmcli/move-file" "^1.0.1"
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ glob "^7.1.4"
+ infer-owner "^1.0.4"
+ lru-cache "^6.0.0"
+ minipass "^3.1.1"
+ minipass-collect "^1.0.2"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.2"
+ mkdirp "^1.0.3"
+ p-map "^4.0.0"
+ promise-inflight "^1.0.1"
+ rimraf "^3.0.2"
+ ssri "^8.0.0"
+ tar "^6.0.2"
+ unique-filename "^1.1.1"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+cacheable-request@^2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
+ integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=
+ dependencies:
+ clone-response "1.0.2"
+ get-stream "3.0.0"
+ http-cache-semantics "3.8.1"
+ keyv "3.0.0"
+ lowercase-keys "1.0.0"
+ normalize-url "2.0.1"
+ responselike "1.0.2"
+
+call-me-maybe@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+ integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
+
+caller-callsite@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+ integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+ dependencies:
+ callsites "^2.0.0"
+
+caller-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+ integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+ dependencies:
+ caller-callsite "^2.0.0"
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+ integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
+
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-chalk@^2.0.0:
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+ integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
+ dependencies:
+ camelcase "^2.0.0"
+ map-obj "^1.0.0"
+
+camelcase-keys@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
+ integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
+ dependencies:
+ camelcase "^5.3.1"
+ map-obj "^4.0.0"
+ quick-lru "^4.0.1"
+
+camelcase@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+ integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
+
+camelcase@^5.0.0, camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.1.0.tgz#27dc176173725fb0adf8a48b647f4d7871944d78"
+ integrity sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==
+
+caniuse-api@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+ integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-lite "^1.0.0"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000887, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135:
+ version "1.0.30001150"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001150.tgz#6d0d829da654b0b233576de00335586bc2004df1"
+ integrity sha512-kiNKvihW0m36UhAFnl7bOAv0i1K1f6wpfVtTF5O5O82XzgtBnb05V0XeV3oZ968vfg2sRNChsHw8ASH2hDfoYQ==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+caw@^2.0.0, caw@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95"
+ integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==
+ dependencies:
+ get-proxy "^2.0.0"
+ isurl "^1.0.0-alpha5"
+ tunnel-agent "^0.6.0"
+ url-to-options "^1.0.1"
+
+ccount@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17"
+ integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==
+
+chalk@^1.0.0, chalk@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -320,7 +1344,7 @@ chalk@^2.0.0:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
-chalk@^4.0.0:
+chalk@^4.0.0, chalk@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
@@ -328,7 +1352,177 @@ chalk@^4.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-color-convert@^1.9.0:
+character-entities-html4@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125"
+ integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==
+
+character-entities-legacy@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
+ integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
+
+character-entities@^1.0.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
+ integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
+
+character-reference-invalid@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
+ integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
+
+check-types@^8.0.3:
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
+ integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
+
+"chokidar@>=2.0.0 <4.0.0", chokidar@^3.4.1:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b"
+ integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.5.0"
+ optionalDependencies:
+ fsevents "~2.1.2"
+
+chokidar@^2.1.8:
+ version "2.1.8"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+ integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.1"
+ braces "^2.3.2"
+ glob-parent "^3.1.0"
+ inherits "^2.0.3"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ normalize-path "^3.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.2.1"
+ upath "^1.1.1"
+ optionalDependencies:
+ fsevents "^1.2.7"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chrome-trace-event@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
+ integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
+ dependencies:
+ tslib "^1.9.0"
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+clean-regexp@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7"
+ integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc=
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+clean-stack@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+ integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+cliui@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
+ integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
+ dependencies:
+ string-width "^2.1.1"
+ strip-ansi "^4.0.0"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+clone-regexp@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f"
+ integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==
+ dependencies:
+ is-regexp "^2.0.0"
+
+clone-response@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+coa@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
+ integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
+ dependencies:
+ "@types/q" "^1.5.1"
+ chalk "^2.4.1"
+ q "^1.1.2"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collapse-white-space@^1.0.2:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287"
+ integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0, color-convert@^1.9.1:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
@@ -347,16 +1541,109 @@ color-name@1.1.3:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
-color-name@~1.1.4:
+color-name@^1.0.0, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+color-string@^1.5.4:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6"
+ integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color@^3.0.0:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e"
+ integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==
+ dependencies:
+ color-convert "^1.9.1"
+ color-string "^1.5.4"
+
+colorette@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
+ integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^2.18.0, commander@^2.20.0, commander@^2.8.1:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+concat-stream@^1.5.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+config-chain@^1.1.11:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
+ integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
+ dependencies:
+ ini "^1.3.4"
+ proto-list "~1.2.1"
+
+console-browserify@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
+ integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+console-stream@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44"
+ integrity sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+ integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
+
+content-disposition@0.5.3, content-disposition@^0.5.2:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
convert-source-map@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
@@ -364,6 +1651,118 @@ convert-source-map@^1.7.0:
dependencies:
safe-buffer "~5.1.1"
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+copy-concurrently@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+ integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
+ dependencies:
+ aproba "^1.1.1"
+ fs-write-stream-atomic "^1.0.8"
+ iferr "^0.1.5"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cosmiconfig@^5.0.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+ integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+ dependencies:
+ import-fresh "^2.0.0"
+ is-directory "^0.3.1"
+ js-yaml "^3.13.1"
+ parse-json "^4.0.0"
+
+cosmiconfig@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
+ integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-spawn@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
+ integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI=
+ dependencies:
+ lru-cache "^4.0.1"
+ which "^1.2.9"
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -373,18 +1772,398 @@ cross-spawn@^7.0.2:
shebang-command "^2.0.0"
which "^2.0.1"
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
- integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
dependencies:
- ms "^2.1.1"
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+css-color-names@0.0.4, css-color-names@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+ integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-declaration-sorter@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
+ integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
+ dependencies:
+ postcss "^7.0.1"
+ timsort "^0.3.0"
+
+css-loader@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e"
+ integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==
+ dependencies:
+ camelcase "^6.0.0"
+ cssesc "^3.0.0"
+ icss-utils "^4.1.1"
+ loader-utils "^2.0.0"
+ postcss "^7.0.32"
+ postcss-modules-extract-imports "^2.0.0"
+ postcss-modules-local-by-default "^3.0.3"
+ postcss-modules-scope "^2.2.0"
+ postcss-modules-values "^3.0.0"
+ postcss-value-parser "^4.1.0"
+ schema-utils "^2.7.1"
+ semver "^7.3.2"
+
+css-rule-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/css-rule-stream/-/css-rule-stream-1.1.0.tgz#3786e7198983d965a26e31957e09078cbb7705a2"
+ integrity sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=
+ dependencies:
+ css-tokenize "^1.0.1"
+ duplexer2 "0.0.2"
+ ldjson-stream "^1.2.1"
+ through2 "^0.6.3"
+
+css-select-base-adapter@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
+ integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
+
+css-select@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
+ integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^3.2.1"
+ domutils "^1.7.0"
+ nth-check "^1.0.2"
+
+css-tokenize@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/css-tokenize/-/css-tokenize-1.0.1.tgz#4625cb1eda21c143858b7f81d6803c1d26fc14be"
+ integrity sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^1.0.33"
+
+css-tree@1.0.0-alpha.37:
+ version "1.0.0-alpha.37"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
+ integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
+ dependencies:
+ mdn-data "2.0.4"
+ source-map "^0.6.1"
+
+css-tree@1.0.0-alpha.39:
+ version "1.0.0-alpha.39"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb"
+ integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==
+ dependencies:
+ mdn-data "2.0.6"
+ source-map "^0.6.1"
+
+css-what@^3.2.1:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4"
+ integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+cssnano-preset-default@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
+ integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==
+ dependencies:
+ css-declaration-sorter "^4.0.1"
+ cssnano-util-raw-cache "^4.0.1"
+ postcss "^7.0.0"
+ postcss-calc "^7.0.1"
+ postcss-colormin "^4.0.3"
+ postcss-convert-values "^4.0.1"
+ postcss-discard-comments "^4.0.2"
+ postcss-discard-duplicates "^4.0.2"
+ postcss-discard-empty "^4.0.1"
+ postcss-discard-overridden "^4.0.1"
+ postcss-merge-longhand "^4.0.11"
+ postcss-merge-rules "^4.0.3"
+ postcss-minify-font-values "^4.0.2"
+ postcss-minify-gradients "^4.0.2"
+ postcss-minify-params "^4.0.2"
+ postcss-minify-selectors "^4.0.2"
+ postcss-normalize-charset "^4.0.1"
+ postcss-normalize-display-values "^4.0.2"
+ postcss-normalize-positions "^4.0.2"
+ postcss-normalize-repeat-style "^4.0.2"
+ postcss-normalize-string "^4.0.2"
+ postcss-normalize-timing-functions "^4.0.2"
+ postcss-normalize-unicode "^4.0.1"
+ postcss-normalize-url "^4.0.1"
+ postcss-normalize-whitespace "^4.0.2"
+ postcss-ordered-values "^4.1.2"
+ postcss-reduce-initial "^4.0.3"
+ postcss-reduce-transforms "^4.0.2"
+ postcss-svgo "^4.0.2"
+ postcss-unique-selectors "^4.0.1"
+
+cssnano-util-get-arguments@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
+ integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
+
+cssnano-util-get-match@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
+ integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
+
+cssnano-util-raw-cache@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
+ integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
+ dependencies:
+ postcss "^7.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
+ integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
+
+cssnano@^4.1.10:
+ version "4.1.10"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
+ integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==
+ dependencies:
+ cosmiconfig "^5.0.0"
+ cssnano-preset-default "^4.0.7"
+ is-resolvable "^1.0.0"
+ postcss "^7.0.0"
+
+csso@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903"
+ integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==
+ dependencies:
+ css-tree "1.0.0-alpha.39"
+
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+ integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
+ dependencies:
+ array-find-index "^1.0.1"
+
+cwebp-bin@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cwebp-bin/-/cwebp-bin-5.1.0.tgz#d5bea87c127358558e7bf7a90a6d440d42dcb074"
+ integrity sha512-BsPKStaNr98zfxwejWWLIGELbPERULJoD2v5ijvpeutSAGsegX7gmABgnkRK7MUucCPROXXfaPqkLAwI509JzA==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.1"
+ logalot "^2.1.0"
+
+cyclist@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
+ integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
+ integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
+ dependencies:
+ ms "2.1.2"
+
+decamelize-keys@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
+ integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=
+ dependencies:
+ decamelize "^1.1.0"
+ map-obj "^1.0.0"
+
+decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
+ integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
+ dependencies:
+ file-type "^5.2.0"
+ is-stream "^1.1.0"
+ tar-stream "^1.5.2"
+
+decompress-tarbz2@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
+ integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
+ dependencies:
+ decompress-tar "^4.1.0"
+ file-type "^6.1.0"
+ is-stream "^1.1.0"
+ seek-bzip "^1.0.5"
+ unbzip2-stream "^1.0.9"
+
+decompress-targz@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
+ integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
+ dependencies:
+ decompress-tar "^4.1.1"
+ file-type "^5.2.0"
+ is-stream "^1.1.0"
+
+decompress-unzip@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
+ integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
+ dependencies:
+ file-type "^3.8.0"
+ get-stream "^2.2.0"
+ pify "^2.3.0"
+ yauzl "^2.4.2"
+
+decompress@^4.0.0, decompress@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118"
+ integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==
+ dependencies:
+ decompress-tar "^4.0.0"
+ decompress-tarbz2 "^4.0.0"
+ decompress-targz "^4.0.0"
+ decompress-unzip "^4.0.1"
+ graceful-fs "^4.1.10"
+ make-dir "^1.0.0"
+ pify "^2.3.0"
+ strip-dirs "^2.0.0"
deep-is@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+des.js@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-file@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
+ integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dir-glob@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
+ integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
+ dependencies:
+ path-type "^3.0.0"
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
@@ -392,11 +2171,202 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
+doiuse@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/doiuse/-/doiuse-4.2.0.tgz#115aa619b8093fbf6e2eb86c7826be6533e8a16f"
+ integrity sha512-FMptmRKtlEwlcP9KUQ1Vw4pdlcUchl5cWBZEfgZGDPO0WhiJ8sJf2UeuYO8FXlNmK45s3OyQvzJ7GIWzmDYEdQ==
+ dependencies:
+ browserslist "^4.1.1"
+ caniuse-lite "^1.0.30000887"
+ css-rule-stream "^1.1.0"
+ duplexer2 "0.0.2"
+ jsonfilter "^1.1.2"
+ ldjson-stream "^1.2.1"
+ multimatch "^2.0.0"
+ postcss "^7.0.4"
+ source-map "^0.7.3"
+ through2 "^2.0.3"
+ yargs "^12.0.2"
+
+dom-serializer@0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+ integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+
+domelementtype@1, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971"
+ integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==
+
+domhandler@^2.3.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+ dependencies:
+ domelementtype "1"
+
+domutils@^1.5.1, domutils@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-prop@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+ integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
+ dependencies:
+ is-obj "^2.0.0"
+
+download@^6.2.2:
+ version "6.2.5"
+ resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714"
+ integrity sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==
+ dependencies:
+ caw "^2.0.0"
+ content-disposition "^0.5.2"
+ decompress "^4.0.0"
+ ext-name "^5.0.0"
+ file-type "5.2.0"
+ filenamify "^2.0.0"
+ get-stream "^3.0.0"
+ got "^7.0.0"
+ make-dir "^1.0.0"
+ p-event "^1.0.0"
+ pify "^3.0.0"
+
+download@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233"
+ integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==
+ dependencies:
+ archive-type "^4.0.0"
+ caw "^2.0.1"
+ content-disposition "^0.5.2"
+ decompress "^4.2.0"
+ ext-name "^5.0.0"
+ file-type "^8.1.0"
+ filenamify "^2.0.0"
+ get-stream "^3.0.0"
+ got "^8.3.1"
+ make-dir "^1.2.0"
+ p-event "^2.1.0"
+ pify "^3.0.0"
+
+duplexer2@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+ integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=
+ dependencies:
+ readable-stream "~1.1.9"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+duplexer@^0.1.1, duplexer@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
+ integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+ integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+ejs@^2.6.1:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
+ integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
+
+electron-to-chromium@^1.3.571:
+ version "1.3.582"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz#1adfac5affce84d85b3d7b3dfbc4ade293a6ffc4"
+ integrity sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==
+
+elliptic@^6.5.3:
+ version "6.5.3"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
+ integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
emoji-regex@^7.0.1:
version "7.0.3"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emojis-list@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^4.1.1, enhanced-resolve@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126"
+ integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.5.0"
+ tapable "^1.0.0"
+
enquirer@^2.3.5:
version "2.3.6"
resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
@@ -404,11 +2374,121 @@ enquirer@^2.3.5:
dependencies:
ansi-colors "^4.1.1"
-escape-string-regexp@^1.0.5:
+entities@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
+ integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
+
+errno@^0.1.3, errno@~0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.14.2, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2:
+ version "1.17.7"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c"
+ integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==
+ dependencies:
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+ is-callable "^1.2.2"
+ is-regex "^1.1.1"
+ object-inspect "^1.8.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.1"
+ string.prototype.trimend "^1.0.1"
+ string.prototype.trimstart "^1.0.1"
+
+es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1:
+ version "1.18.0-next.1"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68"
+ integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==
+ dependencies:
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+ is-callable "^1.2.2"
+ is-negative-zero "^2.0.0"
+ is-regex "^1.1.1"
+ object-inspect "^1.8.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.1"
+ string.prototype.trimend "^1.0.1"
+ string.prototype.trimstart "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+escalade@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+eslint-ast-utils@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586"
+ integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==
+ dependencies:
+ lodash.get "^4.4.2"
+ lodash.zip "^4.2.0"
+
+eslint-plugin-sonarjs@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.5.0.tgz#ce17b2daba65a874c2862213a9e38e8986ad7d7d"
+ integrity sha512-XW5MnzlRjhXpIdbULC/qAdJYHWw3rRLws/DyawdlPU/IdVr9AmRK1r2LaCvabwKOAW2XYYSo3kDX58E4MrB7PQ==
+
+eslint-plugin-unicorn@^23.0.0:
+ version "23.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-23.0.0.tgz#b2820212874735f9d91ecc8678b263ecfa6cf5f6"
+ integrity sha512-Vabo3cjl6cjyhcf+76CdQEY6suOFzK0Xh3xo0uL9VDYrDJP5+B6PjV0tHTYm82WZmFWniugFJM3ywHSNYTi/ZQ==
+ dependencies:
+ ci-info "^2.0.0"
+ clean-regexp "^1.0.0"
+ eslint-ast-utils "^1.1.0"
+ eslint-template-visitor "^2.2.1"
+ eslint-utils "^2.1.0"
+ import-modules "^2.0.0"
+ lodash "^4.17.20"
+ pluralize "^8.0.0"
+ read-pkg-up "^7.0.1"
+ regexp-tree "^0.1.21"
+ reserved-words "^0.1.2"
+ safe-regex "^2.1.1"
+ semver "^7.3.2"
+
eslint-scope@5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5"
@@ -417,7 +2497,15 @@ eslint-scope@5.1.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
-eslint-scope@^5.1.0:
+eslint-scope@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+ integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -425,6 +2513,16 @@ eslint-scope@^5.1.0:
esrecurse "^4.3.0"
estraverse "^4.1.1"
+eslint-template-visitor@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.2.1.tgz#2dccb1ab28fa7429e56ba6dd0144def2d89bc2d6"
+ integrity sha512-q3SxoBXz0XjPGkUpwGVAwIwIPIxzCAJX1uwfVc8tW3v7u/zS7WXNH3I2Mu2MDz2NgSITAyKLRaQFPHu/iyKxDQ==
+ dependencies:
+ babel-eslint "^10.1.0"
+ eslint-visitor-keys "^1.3.0"
+ esquery "^1.3.1"
+ multimap "^1.1.0"
+
eslint-utils@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
@@ -432,15 +2530,20 @@ eslint-utils@^2.1.0:
dependencies:
eslint-visitor-keys "^1.1.0"
-eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
+eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
-eslint@^7.9.0:
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337"
- integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==
+eslint-visitor-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
+ integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
+
+eslint@^7.11.0:
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.11.0.tgz#aaf2d23a0b5f1d652a08edacea0c19f7fadc0b3b"
+ integrity sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==
dependencies:
"@babel/code-frame" "^7.0.0"
"@eslint/eslintrc" "^0.1.3"
@@ -450,9 +2553,9 @@ eslint@^7.9.0:
debug "^4.0.1"
doctrine "^3.0.0"
enquirer "^2.3.5"
- eslint-scope "^5.1.0"
+ eslint-scope "^5.1.1"
eslint-utils "^2.1.0"
- eslint-visitor-keys "^1.3.0"
+ eslint-visitor-keys "^2.0.0"
espree "^7.3.0"
esquery "^1.2.0"
esutils "^2.0.2"
@@ -494,7 +2597,7 @@ esprima@^4.0.0:
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-esquery@^1.2.0:
+esquery@^1.2.0, esquery@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
@@ -523,11 +2626,232 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+events@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379"
+ integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exec-buffer@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b"
+ integrity sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==
+ dependencies:
+ execa "^0.7.0"
+ p-finally "^1.0.0"
+ pify "^3.0.0"
+ rimraf "^2.5.4"
+ tempfile "^2.0.0"
+
+execa@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
+ integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^4.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execall@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45"
+ integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==
+ dependencies:
+ clone-regexp "^2.1.0"
+
+executable@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c"
+ integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==
+ dependencies:
+ pify "^2.2.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+expand-tilde@^2.0.0, expand-tilde@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
+ integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
+ dependencies:
+ homedir-polyfill "^1.0.1"
+
+express@^4.16.3:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ accepts "~1.3.7"
+ array-flatten "1.1.1"
+ body-parser "1.19.0"
+ content-disposition "0.5.3"
+ content-type "~1.0.4"
+ cookie "0.4.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "~1.1.2"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "~1.1.2"
+ fresh "0.5.2"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.5"
+ qs "6.7.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.1.2"
+ send "0.17.1"
+ serve-static "1.14.1"
+ setprototypeof "1.1.1"
+ statuses "~1.5.0"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+ext-list@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37"
+ integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==
+ dependencies:
+ mime-db "^1.28.0"
+
+ext-name@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6"
+ integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==
+ dependencies:
+ ext-list "^2.0.0"
+ sort-keys-length "^1.0.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@^3.0.0, extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
fast-deep-equal@^3.1.1:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+fast-glob@^2.2.6:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
+ integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
+ dependencies:
+ "@mrmlnc/readdir-enhanced" "^2.2.1"
+ "@nodelib/fs.stat" "^1.1.2"
+ glob-parent "^3.1.0"
+ is-glob "^4.0.0"
+ merge2 "^1.2.3"
+ micromatch "^3.1.10"
+
+fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3"
+ integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.0"
+ merge2 "^1.3.0"
+ micromatch "^4.0.2"
+ picomatch "^2.2.1"
+
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -538,6 +2862,38 @@ fast-levenshtein@^2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+fastest-levenshtein@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
+ integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
+
+fastq@^1.6.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481"
+ integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==
+ dependencies:
+ reusify "^1.0.4"
+
+fd-slicer@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+ integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
+ dependencies:
+ pend "~1.2.0"
+
+figgy-pudding@^3.5.1:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
+ integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
+
+figures@^1.3.5:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+ integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
file-entry-cache@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
@@ -545,6 +2901,161 @@ file-entry-cache@^5.0.1:
dependencies:
flat-cache "^2.0.1"
+file-loader@^6.1.0:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa"
+ integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+
+file-type@5.2.0, file-type@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
+ integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
+
+file-type@^10.4.0:
+ version "10.11.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890"
+ integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==
+
+file-type@^12.0.0:
+ version "12.4.2"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-12.4.2.tgz#a344ea5664a1d01447ee7fb1b635f72feb6169d9"
+ integrity sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==
+
+file-type@^3.8.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
+ integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
+
+file-type@^4.2.0, file-type@^4.3.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5"
+ integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU=
+
+file-type@^6.1.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
+ integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
+
+file-type@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c"
+ integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+filename-reserved-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
+ integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik=
+
+filenamify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9"
+ integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==
+ dependencies:
+ filename-reserved-regex "^2.0.0"
+ strip-outer "^1.0.0"
+ trim-repeated "^1.0.0"
+
+filesize@^3.6.1:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
+ integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ statuses "~1.5.0"
+ unpipe "~1.0.0"
+
+find-cache-dir@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
+ integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^2.0.0"
+ pkg-dir "^3.0.0"
+
+find-cache-dir@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
+ integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-versions@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e"
+ integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==
+ dependencies:
+ semver-regex "^2.0.0"
+
+findup-sync@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
+ integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
+ dependencies:
+ detect-file "^1.0.0"
+ is-glob "^4.0.0"
+ micromatch "^3.0.4"
+ resolve-dir "^1.0.1"
+
flat-cache@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
@@ -559,29 +3070,234 @@ flatted@^2.0.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
+flush-write-stream@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
+ integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.3.6"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+ integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+from2@^2.1.0, from2@^2.1.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+ integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
+fs-minipass@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
+fs-write-stream-atomic@^1.0.8:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+ integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
+ dependencies:
+ graceful-fs "^4.1.2"
+ iferr "^0.1.5"
+ imurmurhash "^0.1.4"
+ readable-stream "1 || 2"
+
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+fsevents@^1.2.7:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
+ integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.12.1"
+
+fsevents@~2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+fstream@^1.0.0, fstream@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
+ integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ inherits "~2.0.0"
+ mkdirp ">=0.5 0"
+ rimraf "2"
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+gaze@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
+ integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
+ dependencies:
+ globule "^1.0.0"
+
gensync@^1.0.0-beta.1:
version "1.0.0-beta.1"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
-glob-parent@^5.0.0:
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+
+get-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-proxy@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93"
+ integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==
+ dependencies:
+ npm-conf "^1.1.0"
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+ integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
+
+get-stdin@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
+ integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
+
+get-stream@3.0.0, get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+
+get-stream@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
+ integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
+ dependencies:
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.0"
+
+get-stream@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+gifsicle@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-4.0.1.tgz#30e1e61e3ee4884ef702641b2e98a15c2127b2e2"
+ integrity sha512-A/kiCLfDdV+ERV/UB+2O41mifd+RxH8jlRG8DMxZO84Bma/Fw0htqZ+hY2iaalLRNyUu7tYZQslqUBJxBggxbg==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.0"
+ execa "^1.0.0"
+ logalot "^2.0.0"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
dependencies:
is-glob "^4.0.1"
-glob@^7.1.3:
+glob-to-regexp@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+ integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -593,6 +3309,42 @@ glob@^7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
+global-modules@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
+ integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
+ dependencies:
+ global-prefix "^1.0.1"
+ is-windows "^1.0.1"
+ resolve-dir "^1.0.0"
+
+global-modules@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
+ integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
+ dependencies:
+ global-prefix "^3.0.0"
+
+global-prefix@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
+ integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
+ dependencies:
+ expand-tilde "^2.0.2"
+ homedir-polyfill "^1.0.1"
+ ini "^1.3.4"
+ is-windows "^1.0.1"
+ which "^1.2.14"
+
+global-prefix@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
+ integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
+ dependencies:
+ ini "^1.3.5"
+ kind-of "^6.0.2"
+ which "^1.3.1"
+
globals@^11.1.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@@ -605,6 +3357,148 @@ globals@^12.1.0:
dependencies:
type-fest "^0.8.1"
+globby@^10.0.0:
+ version "10.0.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
+ integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
+ dependencies:
+ "@types/glob" "^7.1.1"
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.0.3"
+ glob "^7.1.3"
+ ignore "^5.1.1"
+ merge2 "^1.2.3"
+ slash "^3.0.0"
+
+globby@^11.0.1:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
+ integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.1.1"
+ ignore "^5.1.4"
+ merge2 "^1.3.0"
+ slash "^3.0.0"
+
+globby@^9.2.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d"
+ integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==
+ dependencies:
+ "@types/glob" "^7.1.1"
+ array-union "^1.0.2"
+ dir-glob "^2.2.2"
+ fast-glob "^2.2.6"
+ glob "^7.1.3"
+ ignore "^4.0.3"
+ pify "^4.0.1"
+ slash "^2.0.0"
+
+globjoin@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
+ integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=
+
+globule@^1.0.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4"
+ integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==
+ dependencies:
+ glob "~7.1.1"
+ lodash "~4.17.10"
+ minimatch "~3.0.2"
+
+gonzales-pe@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3"
+ integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==
+ dependencies:
+ minimist "^1.2.5"
+
+got@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+ integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+ dependencies:
+ decompress-response "^3.2.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ is-plain-obj "^1.1.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ isurl "^1.0.0-alpha5"
+ lowercase-keys "^1.0.0"
+ p-cancelable "^0.3.0"
+ p-timeout "^1.1.1"
+ safe-buffer "^5.0.1"
+ timed-out "^4.0.0"
+ url-parse-lax "^1.0.0"
+ url-to-options "^1.0.1"
+
+got@^8.3.1:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937"
+ integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==
+ dependencies:
+ "@sindresorhus/is" "^0.7.0"
+ cacheable-request "^2.1.1"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ into-stream "^3.1.0"
+ is-retry-allowed "^1.1.0"
+ isurl "^1.0.0-alpha5"
+ lowercase-keys "^1.0.0"
+ mimic-response "^1.0.0"
+ p-cancelable "^0.4.0"
+ p-timeout "^2.0.1"
+ pify "^3.0.0"
+ safe-buffer "^5.1.1"
+ timed-out "^4.0.1"
+ url-parse-lax "^3.0.0"
+ url-to-options "^1.0.1"
+
+graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.2:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+ integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+
+gzip-size@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
+ integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
+ dependencies:
+ duplexer "^0.1.1"
+ pify "^4.0.1"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+hard-rejection@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
+ integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -615,11 +3509,314 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-ignore@^4.0.6:
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-symbols@^1.0.0, has-symbols@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
+ integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.0, has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hex-color-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+ integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+homedir-polyfill@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
+ integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
+ dependencies:
+ parse-passwd "^1.0.0"
+
+hoopy@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
+ integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
+
+hosted-git-info@^2.1.4:
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
+ integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
+
+hsl-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+ integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+ integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-comment-regex@^1.1.0, html-comment-regex@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
+ integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
+
+html-tags@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
+ integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
+
+htmlparser2@^3.10.0:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+ dependencies:
+ domelementtype "^1.3.1"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^3.1.1"
+
+http-cache-semantics@3.8.1:
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+ integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+ integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+icss-utils@^4.0.0, icss-utils@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
+ integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
+ dependencies:
+ postcss "^7.0.14"
+
+ieee754@^1.1.4:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
+ integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
+
+iferr@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+ integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
+
+ignore@^4.0.3, ignore@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8:
+ version "5.1.8"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+ integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+imagemin-gifsicle@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-6.0.1.tgz#6abad4e95566d52e5a104aba1c24b4f3b48581b3"
+ integrity sha512-kuu47c6iKDQ6R9J10xCwL0lgs0+sMz3LRHqRcJ2CRBWdcNmo3T5hUaM8hSZfksptZXJLGKk8heSAvwtSdB1Fng==
+ dependencies:
+ exec-buffer "^3.0.0"
+ gifsicle "^4.0.0"
+ is-gif "^3.0.0"
+
+imagemin-mozjpeg@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.0.tgz#d2ca4e8c982c7c6eda55069af89dee4c1cebcdfd"
+ integrity sha512-+EciPiIjCb8JWjQNr1q8sYWYf7GDCNDxPYnkD11TNIjjWNzaV+oTg4DpOPQjl5ZX/KRCPMEgS79zLYAQzLitIA==
+ dependencies:
+ execa "^1.0.0"
+ is-jpg "^2.0.0"
+ mozjpeg "^6.0.0"
+
+imagemin-optipng@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-7.1.0.tgz#2225c82c35e5c29b7fa98d4f9ecee1161a68e888"
+ integrity sha512-JNORTZ6j6untH7e5gF4aWdhDCxe3ODsSLKs/f7Grewy3ebZpl1ZsU+VUTPY4rzeHgaFA8GSWOoA8V2M3OixWZQ==
+ dependencies:
+ exec-buffer "^3.0.0"
+ is-png "^2.0.0"
+ optipng-bin "^6.0.0"
+
+imagemin-pngquant@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-8.0.0.tgz#bf7a41d850c6998f2475c54058ab1db9c516385d"
+ integrity sha512-PVq0diOxO+Zyq/zlMCz2Pfu6mVLHgiT1GpW702OwVlnej+NhS6ZQegYi3OFEDW8d7GxouyR5e8R+t53SMciOeg==
+ dependencies:
+ execa "^1.0.0"
+ is-png "^2.0.0"
+ is-stream "^2.0.0"
+ ow "^0.13.2"
+ pngquant-bin "^5.0.0"
+
+imagemin-svgo@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-7.1.0.tgz#528a42fd3d55eff5d4af8fd1113f25fb61ad6d9a"
+ integrity sha512-0JlIZNWP0Luasn1HT82uB9nU9aa+vUj6kpT+MjPW11LbprXC+iC4HDwn1r4Q2/91qj4iy9tRZNsFySMlEpLdpg==
+ dependencies:
+ is-svg "^4.2.1"
+ svgo "^1.3.2"
+
+imagemin-webp@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/imagemin-webp/-/imagemin-webp-5.1.0.tgz#ddb1307ad97aff97293c5a600e384e40c07f68a7"
+ integrity sha512-BsPTpobgbDPFBBsI3UflnU/cpIVa15qInEDBcYBw16qI/6XiB4vDF/dGp9l4aM3pfFDDYqR0mANMcKpBD7wbCw==
+ dependencies:
+ cwebp-bin "^5.0.0"
+ exec-buffer "^3.0.0"
+ is-cwebp-readable "^2.0.1"
+
+imagemin@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-7.0.1.tgz#f6441ca647197632e23db7d971fffbd530c87dbf"
+ integrity sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==
+ dependencies:
+ file-type "^12.0.0"
+ globby "^10.0.0"
+ graceful-fs "^4.2.2"
+ junk "^3.1.0"
+ make-dir "^3.0.0"
+ p-pipe "^3.0.0"
+ replace-ext "^1.0.0"
+
+img-optimize-loader@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/img-optimize-loader/-/img-optimize-loader-1.0.7.tgz#696aae41b1e4c6cebdf704889bbbfe9cdde2a22b"
+ integrity sha512-87Rb9tU+BM9hyL4P1u9vARlWvZdxskFa2s95AwhbTR4sRp4V+dv0C4e+4WD9uXFwuXpfAOFi5ePIq7kM4HnxRg==
+ dependencies:
+ imagemin "^7.0.1"
+ loader-utils "^2.0.0"
+ mime-types "^2.1.27"
+ schema-utils "^2.7.0"
+ optionalDependencies:
+ imagemin-gifsicle "^6.0.1"
+ imagemin-mozjpeg "^8.0.0"
+ imagemin-optipng "^7.1.0"
+ imagemin-pngquant "^8.0.0"
+ imagemin-svgo "^7.0.0"
+ imagemin-webp "^5.1.0"
+
+import-fresh@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+ integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
+ dependencies:
+ caller-path "^2.0.0"
+ resolve-from "^3.0.0"
+
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
@@ -628,11 +3825,61 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
parent-module "^1.0.0"
resolve-from "^4.0.0"
+import-lazy@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc"
+ integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==
+
+import-lazy@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
+ integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
+
+import-local@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
+ integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
+ dependencies:
+ pkg-dir "^3.0.0"
+ resolve-cwd "^2.0.0"
+
+import-modules@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.0.0.tgz#9c1e13b4e7a15682f70a6e3fa29534e4540cfc5d"
+ integrity sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==
+
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+in-publish@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c"
+ integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+ integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
+ dependencies:
+ repeating "^2.0.0"
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+ integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
+
+infer-owner@^1.0.3, infer-owner@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+ integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -641,33 +3888,459 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2:
+inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-is-extglob@^2.1.1:
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+ integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+ini@^1.3.4, ini@^1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+ integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
+
+interpret@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+ integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
+into-stream@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
+ integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=
+ dependencies:
+ from2 "^2.1.1"
+ p-is-promise "^1.1.0"
+
+invert-kv@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
+ integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-absolute-url@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+ integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-alphabetical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
+ integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
+
+is-alphanumeric@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4"
+ integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=
+
+is-alphanumerical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
+ integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
+ dependencies:
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+ integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"
+ integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
+
+is-callable@^1.1.4, is-callable@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9"
+ integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==
+
+is-color-stop@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+ integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
+ dependencies:
+ css-color-names "^0.0.4"
+ hex-color-regex "^1.1.0"
+ hsl-regex "^1.0.0"
+ hsla-regex "^1.0.0"
+ rgb-regex "^1.0.1"
+ rgba-regex "^1.0.0"
+
+is-core-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d"
+ integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==
+ dependencies:
+ has "^1.0.3"
+
+is-cwebp-readable@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-cwebp-readable/-/is-cwebp-readable-2.0.1.tgz#afb93b0c0abd0a25101016ae33aea8aedf926d26"
+ integrity sha1-r7k7DAq9CiUQEBauM66ort+SbSY=
+ dependencies:
+ file-type "^4.3.0"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
+ integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
+
+is-decimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
+ integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+ integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
-is-glob@^4.0.0, is-glob@^4.0.1:
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-gif@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-3.0.0.tgz#c4be60b26a301d695bb833b20d9b5d66c6cf83b1"
+ integrity sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==
+ dependencies:
+ file-type "^10.4.0"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
dependencies:
is-extglob "^2.1.1"
+is-hexadecimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
+ integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
+
+is-jpg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97"
+ integrity sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=
+
+is-natural-number@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
+ integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
+
+is-negative-zero@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461"
+ integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+ integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
+ integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA=
+
+is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-obj@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-png@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d"
+ integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==
+
+is-regex@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9"
+ integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==
+ dependencies:
+ has-symbols "^1.0.1"
+
+is-regexp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d"
+ integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==
+
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+ integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
+is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-stream@^1.0.0, is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
+ integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
+
+is-svg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
+ integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==
+ dependencies:
+ html-comment-regex "^1.1.0"
+
+is-svg@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-4.2.1.tgz#095b496e345fec9211c2a7d5d021003e040d6f81"
+ integrity sha512-PHx3ANecKsKNl5y5+Jvt53Y4J7MfMpbNZkv384QNiswMKAWIbvcqbPz+sYbFKJI8Xv3be01GSFniPmoaP+Ai5A==
+ dependencies:
+ html-comment-regex "^1.1.2"
+
+is-symbol@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
+ integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
+ dependencies:
+ has-symbols "^1.0.1"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-whitespace-character@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7"
+ integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==
+
+is-windows@^1.0.1, is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-word-character@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230"
+ integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==
+
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+ integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+jest-worker@^26.5.0:
+ version "26.5.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.5.0.tgz#87deee86dbbc5f98d9919e0dadf2c40e3152fa30"
+ integrity sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^7.0.0"
+
+js-base64@^2.1.8:
+ version "2.6.4"
+ resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
+ integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
+
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -681,21 +4354,58 @@ js-yaml@^3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
jsesc@^2.5.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+ integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
json5@^2.1.2:
version "2.1.3"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
@@ -703,6 +4413,100 @@ json5@^2.1.2:
dependencies:
minimist "^1.2.5"
+jsonfilter@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/jsonfilter/-/jsonfilter-1.1.2.tgz#21ef7cedc75193813c75932e96a98be205ba5a11"
+ integrity sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=
+ dependencies:
+ JSONStream "^0.8.4"
+ minimist "^1.1.0"
+ stream-combiner "^0.2.1"
+ through2 "^0.6.3"
+
+jsonparse@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64"
+ integrity sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+junk@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
+ integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==
+
+keyv@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
+ integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==
+ dependencies:
+ json-buffer "3.0.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klona@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
+ integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
+
+known-css-properties@^0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.19.0.tgz#5d92b7fa16c72d971bda9b7fe295bdf61836ee5b"
+ integrity sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==
+
+last-call-webpack-plugin@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555"
+ integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==
+ dependencies:
+ lodash "^4.17.5"
+ webpack-sources "^1.1.0"
+
+lcid@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
+ integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
+ dependencies:
+ invert-kv "^2.0.0"
+
+ldjson-stream@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ldjson-stream/-/ldjson-stream-1.2.1.tgz#91beceda5ac4ed2b17e649fb777e7abfa0189c2b"
+ integrity sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=
+ dependencies:
+ split2 "^0.2.1"
+ through2 "^0.6.1"
+
levn@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
@@ -711,47 +4515,928 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
-lodash@^4.17.14, lodash@^4.17.19:
+lines-and-columns@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+ integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+load-json-file@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
+ integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^4.0.0"
+ pify "^3.0.0"
+ strip-bom "^3.0.0"
+
+loader-runner@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
+ integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
+
+loader-utils@^1.0.3, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+ integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^1.0.1"
+
+loader-utils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
+ integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^2.1.2"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+lodash.get@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+ integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
+
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+ integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
+lodash.zip@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020"
+ integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=
+
+lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10:
version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
-minimatch@^3.0.4:
+log-symbols@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
+ dependencies:
+ chalk "^4.0.0"
+
+logalot@^2.0.0, logalot@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552"
+ integrity sha1-X46MkNME7fElMJUaVVSruMXj9VI=
+ dependencies:
+ figures "^1.3.5"
+ squeak "^1.0.0"
+
+longest-streak@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
+ integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
+
+longest@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+ integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=
+
+loud-rejection@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+ integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
+ dependencies:
+ currently-unhandled "^0.4.1"
+ signal-exit "^3.0.0"
+
+lowercase-keys@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+ integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=
+
+lowercase-keys@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lpad-align@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e"
+ integrity sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=
+ dependencies:
+ get-stdin "^4.0.1"
+ indent-string "^2.1.0"
+ longest "^1.0.0"
+ meow "^3.3.0"
+
+lru-cache@^4.0.1:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+make-dir@^1.0.0, make-dir@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
+ dependencies:
+ pify "^3.0.0"
+
+make-dir@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+ integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+ dependencies:
+ pify "^4.0.1"
+ semver "^5.6.0"
+
+make-dir@^3.0.0, make-dir@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+map-age-cleaner@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
+ integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
+ dependencies:
+ p-defer "^1.0.0"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+ integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
+
+map-obj@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5"
+ integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+markdown-escapes@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535"
+ integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
+
+markdown-table@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b"
+ integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==
+ dependencies:
+ repeat-string "^1.0.0"
+
+mathml-tag-names@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
+ integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+mdast-util-compact@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz#cabc69a2f43103628326f35b1acf735d55c99490"
+ integrity sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==
+ dependencies:
+ unist-util-visit "^2.0.0"
+
+mdn-data@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
+ integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+
+mdn-data@2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978"
+ integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+mem@^4.0.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
+ integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
+ dependencies:
+ map-age-cleaner "^0.1.1"
+ mimic-fn "^2.0.0"
+ p-is-promise "^2.0.0"
+
+memory-fs@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+memory-fs@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
+ integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
+
+meow@^3.3.0, meow@^3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+ integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
+ dependencies:
+ camelcase-keys "^2.0.0"
+ decamelize "^1.1.2"
+ loud-rejection "^1.0.0"
+ map-obj "^1.0.1"
+ minimist "^1.1.3"
+ normalize-package-data "^2.3.4"
+ object-assign "^4.0.1"
+ read-pkg-up "^1.0.1"
+ redent "^1.0.0"
+ trim-newlines "^1.0.0"
+
+meow@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306"
+ integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==
+ dependencies:
+ "@types/minimist" "^1.2.0"
+ camelcase-keys "^6.2.2"
+ decamelize-keys "^1.1.0"
+ hard-rejection "^2.1.0"
+ minimist-options "4.1.0"
+ normalize-package-data "^2.5.0"
+ read-pkg-up "^7.0.1"
+ redent "^3.0.0"
+ trim-newlines "^3.0.0"
+ type-fest "^0.13.1"
+ yargs-parser "^18.1.3"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.2.3, merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+micromatch@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
+ integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.0.5"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.44.0:
+ version "1.44.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
+ integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
+
+mime-db@^1.28.0:
+ version "1.45.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea"
+ integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==
+
+mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24:
+ version "2.1.27"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
+ integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
+ dependencies:
+ mime-db "1.44.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-response@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+min-indent@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+ integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
+mini-css-extract-plugin@^0.11.3:
+ version "0.11.3"
+ resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6"
+ integrity sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==
+ dependencies:
+ loader-utils "^1.1.0"
+ normalize-url "1.9.1"
+ schema-utils "^1.0.0"
+ webpack-sources "^1.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@^3.0.0, minimatch@^3.0.4, minimatch@~3.0.2:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
dependencies:
brace-expansion "^1.1.7"
-minimist@^1.2.5:
+minimist-options@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
+ integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
+ dependencies:
+ arrify "^1.0.1"
+ is-plain-obj "^1.1.0"
+ kind-of "^6.0.3"
+
+minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
-mkdirp@^0.5.1:
+minipass-collect@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+ integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-flush@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+ integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
+ integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass@^3.0.0, minipass@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
+ integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
+ dependencies:
+ yallist "^4.0.0"
+
+minizlib@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
+mississippi@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
+ integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
+ dependencies:
+ concat-stream "^1.5.0"
+ duplexify "^3.4.2"
+ end-of-stream "^1.1.0"
+ flush-write-stream "^1.0.0"
+ from2 "^2.1.0"
+ parallel-transform "^1.1.0"
+ pump "^3.0.0"
+ pumpify "^1.3.3"
+ stream-each "^1.1.0"
+ through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
dependencies:
minimist "^1.2.5"
-ms@^2.1.1:
+mkdirp@^1.0.3, mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+move-concurrently@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+ integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
+ dependencies:
+ aproba "^1.1.1"
+ copy-concurrently "^1.0.0"
+ fs-write-stream-atomic "^1.0.8"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.3"
+
+mozjpeg@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-6.0.1.tgz#56969dddb5741ef2bcb1af066cae21e61a91a27b"
+ integrity sha512-9Z59pJMi8ni+IUvSH5xQwK5tNLw7p3dwDNCZ3o1xE+of3G5Hc/yOz6Ue/YuLiBXU3ZB5oaHPURyPdqfBX/QYJA==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.0"
+ logalot "^2.1.0"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+multimap@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8"
+ integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==
+
+multimatch@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
+ integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=
+ dependencies:
+ array-differ "^1.0.0"
+ array-union "^1.0.1"
+ arrify "^1.0.0"
+ minimatch "^3.0.0"
+
+nan@^2.12.1, nan@^2.13.2:
+ version "2.14.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
+ integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-once@^1.3.0:
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-gyp@^3.8.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
+ integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
+ dependencies:
+ fstream "^1.0.0"
+ glob "^7.0.3"
+ graceful-fs "^4.1.2"
+ mkdirp "^0.5.0"
+ nopt "2 || 3"
+ npmlog "0 || 1 || 2 || 3 || 4"
+ osenv "0"
+ request "^2.87.0"
+ rimraf "2"
+ semver "~5.3.0"
+ tar "^2.0.0"
+ which "1"
+
+node-libs-browser@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
+ integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^3.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.1"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.11.0"
+ vm-browserify "^1.0.1"
+
+node-releases@^1.1.61:
+ version "1.1.64"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.64.tgz#71b4ae988e9b1dd7c1ffce58dd9e561752dfebc5"
+ integrity sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg==
+
+node-sass@^4.14.1:
+ version "4.14.1"
+ resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5"
+ integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==
+ dependencies:
+ async-foreach "^0.1.3"
+ chalk "^1.1.1"
+ cross-spawn "^3.0.0"
+ gaze "^1.0.0"
+ get-stdin "^4.0.1"
+ glob "^7.0.3"
+ in-publish "^2.0.0"
+ lodash "^4.17.15"
+ meow "^3.7.0"
+ mkdirp "^0.5.1"
+ nan "^2.13.2"
+ node-gyp "^3.8.0"
+ npmlog "^4.0.0"
+ request "^2.88.0"
+ sass-graph "2.2.5"
+ stdout-stream "^1.4.0"
+ "true-case-path" "^1.0.2"
+
+"nopt@2 || 3":
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
+ dependencies:
+ abbrev "1"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-range@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+ integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
+
+normalize-selector@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03"
+ integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=
+
+normalize-url@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+ integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=
+ dependencies:
+ object-assign "^4.0.1"
+ prepend-http "^1.0.0"
+ query-string "^4.1.0"
+ sort-keys "^1.0.0"
+
+normalize-url@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
+ integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==
+ dependencies:
+ prepend-http "^2.0.0"
+ query-string "^5.0.1"
+ sort-keys "^2.0.0"
+
+normalize-url@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
+ integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
+
+npm-conf@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
+ integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
+ dependencies:
+ config-chain "^1.1.11"
+ pify "^3.0.0"
+
+npm-run-all@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
+ integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ chalk "^2.4.1"
+ cross-spawn "^6.0.5"
+ memorystream "^0.3.1"
+ minimatch "^3.0.4"
+ pidtree "^0.3.0"
+ read-pkg "^3.0.0"
+ shell-quote "^1.6.1"
+ string.prototype.padend "^3.0.0"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
+ dependencies:
+ path-key "^2.0.0"
+
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+nth-check@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+ integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+ dependencies:
+ boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+ integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
+ integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
+
+object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd"
+ integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.0"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649"
+ integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+object.values@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
+ integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
+opener@^1.5.1:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
+ integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
+
+optimize-css-assets-webpack-plugin@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90"
+ integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==
+ dependencies:
+ cssnano "^4.1.10"
+ last-call-webpack-plugin "^3.0.0"
+
optionator@^0.9.1:
version "0.9.1"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
@@ -764,6 +5449,190 @@ optionator@^0.9.1:
type-check "^0.4.0"
word-wrap "^1.2.3"
+optipng-bin@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-6.0.0.tgz#376120fa79d5e71eee2f524176efdd3a5eabd316"
+ integrity sha512-95bB4y8IaTsa/8x6QH4bLUuyvyOoGBCLDA7wOgDL8UFqJpSUh1Hob8JRJhit+wC1ZLN3tQ7mFt7KuBj0x8F2Wg==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.0"
+ logalot "^2.0.0"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+ integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
+
+os-filter-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16"
+ integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==
+ dependencies:
+ arch "^2.1.0"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-locale@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
+ integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
+ dependencies:
+ execa "^1.0.0"
+ lcid "^2.0.0"
+ mem "^4.0.0"
+
+os-tmpdir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+osenv@0:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+ow@^0.13.2:
+ version "0.13.2"
+ resolved "https://registry.yarnpkg.com/ow/-/ow-0.13.2.tgz#375e76d3d3f928a8dfcf0cd0b9c921cb62e469a0"
+ integrity sha512-9wvr+q+ZTDRvXDjL6eDOdFe5WUl/wa5sntf9kAolxqSpkBqaIObwLgFCGXSJASFw+YciXnOVtDWpxXa9cqV94A==
+ dependencies:
+ type-fest "^0.5.1"
+
+p-cancelable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+ integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
+ integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==
+
+p-defer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
+ integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
+
+p-event@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085"
+ integrity sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=
+ dependencies:
+ p-timeout "^1.1.1"
+
+p-event@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6"
+ integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==
+ dependencies:
+ p-timeout "^2.0.1"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-is-promise@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+ integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=
+
+p-is-promise@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
+ integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
+
+p-limit@^2.0.0, p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe"
+ integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-map-series@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca"
+ integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=
+ dependencies:
+ p-reduce "^1.0.0"
+
+p-map@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+ integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
+p-pipe@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e"
+ integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==
+
+p-reduce@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
+ integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=
+
+p-timeout@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+ integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
+ dependencies:
+ p-finally "^1.0.0"
+
+p-timeout@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
+ integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+pako@~1.0.5:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+ integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
+parallel-transform@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
+ integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
+ dependencies:
+ cyclist "^1.0.1"
+ inherits "^2.0.3"
+ readable-stream "^2.1.5"
+
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -771,11 +5640,106 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
+ integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==
+ dependencies:
+ character-entities "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ character-reference-invalid "^1.0.0"
+ is-alphanumerical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-hexadecimal "^1.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+parse-json@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+ integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
+ dependencies:
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+
+parse-json@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646"
+ integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+parse-passwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+ integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-browserify@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
+ integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+ integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+path-key@^2.0.0, path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
@@ -786,43 +5750,1066 @@ path-parse@^1.0.6:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+path-type@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+ integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
+ dependencies:
+ pify "^3.0.0"
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pbkdf2@^3.0.3:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94"
+ integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+ integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+
+pidtree@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a"
+ integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==
+
+pify@^2.0.0, pify@^2.2.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+ integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+pkg-dir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+ integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
+ dependencies:
+ find-up "^3.0.0"
+
+pkg-dir@^4.1.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+pluralize@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
+ integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
+
+pngquant-bin@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-5.0.2.tgz#6f34f3e89c9722a72bbc509062b40f1b17cda460"
+ integrity sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.1"
+ execa "^0.10.0"
+ logalot "^2.0.0"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postcss-calc@^7.0.1:
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e"
+ integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==
+ dependencies:
+ postcss "^7.0.27"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.0.2"
+
+postcss-colormin@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
+ integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
+ dependencies:
+ browserslist "^4.0.0"
+ color "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-convert-values@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
+ integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-discard-comments@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
+ integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-duplicates@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
+ integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-empty@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
+ integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-overridden@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
+ integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-html@^0.36.0:
+ version "0.36.0"
+ resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204"
+ integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==
+ dependencies:
+ htmlparser2 "^3.10.0"
+
+postcss-less@^3.1.4:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad"
+ integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==
+ dependencies:
+ postcss "^7.0.14"
+
+postcss-media-query-parser@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
+ integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=
+
+postcss-merge-longhand@^4.0.11:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
+ integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
+ dependencies:
+ css-color-names "0.0.4"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ stylehacks "^4.0.0"
+
+postcss-merge-rules@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
+ integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ cssnano-util-same-parent "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+ vendors "^1.0.0"
+
+postcss-minify-font-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
+ integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
+ integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ is-color-stop "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-params@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
+ integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ browserslist "^4.0.0"
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ uniqs "^2.0.0"
+
+postcss-minify-selectors@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
+ integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+postcss-modules-extract-imports@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
+ integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
+ dependencies:
+ postcss "^7.0.5"
+
+postcss-modules-local-by-default@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0"
+ integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==
+ dependencies:
+ icss-utils "^4.1.1"
+ postcss "^7.0.32"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.1.0"
+
+postcss-modules-scope@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
+ integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
+ dependencies:
+ postcss "^7.0.6"
+ postcss-selector-parser "^6.0.0"
+
+postcss-modules-values@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
+ integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==
+ dependencies:
+ icss-utils "^4.0.0"
+ postcss "^7.0.6"
+
+postcss-normalize-charset@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
+ integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-normalize-display-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
+ integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-positions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
+ integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-repeat-style@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
+ integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-string@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
+ integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
+ dependencies:
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-timing-functions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
+ integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-unicode@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
+ integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-url@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
+ integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
+ dependencies:
+ is-absolute-url "^2.0.0"
+ normalize-url "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-whitespace@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
+ integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-ordered-values@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
+ integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-reduce-initial@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
+ integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+
+postcss-reduce-transforms@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
+ integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-resolve-nested-selector@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e"
+ integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=
+
+postcss-safe-parser@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96"
+ integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==
+ dependencies:
+ postcss "^7.0.26"
+
+postcss-sass@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3"
+ integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==
+ dependencies:
+ gonzales-pe "^4.3.0"
+ postcss "^7.0.21"
+
+postcss-scss@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383"
+ integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==
+ dependencies:
+ postcss "^7.0.6"
+
+postcss-selector-parser@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270"
+ integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==
+ dependencies:
+ dot-prop "^5.2.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3"
+ integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==
+ dependencies:
+ cssesc "^3.0.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+ util-deprecate "^1.0.2"
+
+postcss-sorting@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-4.1.0.tgz#a107f0bf3852977fa64e4442bc340c88d5aacdb3"
+ integrity sha512-r4T2oQd1giURJdHQ/RMb72dKZCuLOdWx2B/XhXN1Y1ZdnwXsKH896Qz6vD4tFy9xSjpKNYhlZoJmWyhH/7JUQw==
+ dependencies:
+ lodash "^4.17.4"
+ postcss "^7.0.0"
+
+postcss-sorting@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-5.0.1.tgz#10d5d0059eea8334dacc820c0121864035bc3f11"
+ integrity sha512-Y9fUFkIhfrm6i0Ta3n+89j56EFqaNRdUKqXyRp6kvTcSXnmgEjaVowCXH+JBe9+YKWqd4nc28r2sgwnzJalccA==
+ dependencies:
+ lodash "^4.17.14"
+ postcss "^7.0.17"
+
+postcss-svgo@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
+ integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==
+ dependencies:
+ is-svg "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ svgo "^1.0.0"
+
+postcss-syntax@^0.36.2:
+ version "0.36.2"
+ resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c"
+ integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==
+
+postcss-unique-selectors@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
+ integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ postcss "^7.0.0"
+ uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
+ integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
+
+postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+ integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
+
+postcss@^6.0.1:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.4, postcss@^7.0.5, postcss@^7.0.6:
+ version "7.0.35"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
+ integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+prepend-http@^1.0.0, prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
prettier@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5"
integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
progress@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-punycode@^2.1.0:
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+ integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+ integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
+
+proxy-addr@~2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
+ integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
+ dependencies:
+ forwarded "~0.1.2"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+ safe-buffer "^5.1.2"
+
+pump@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+ integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pumpify@^1.3.3:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+ integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
+ dependencies:
+ duplexify "^3.6.0"
+ inherits "^2.0.3"
+ pump "^2.0.0"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+ integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
+
+punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+q@^1.1.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+ integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+query-string@^4.1.0:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+ integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s=
+ dependencies:
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+ integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+quick-lru@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
+ integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg-up@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
+ integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+ dependencies:
+ find-up "^4.1.0"
+ read-pkg "^5.2.0"
+ type-fest "^0.8.1"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+read-pkg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+ integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=
+ dependencies:
+ load-json-file "^4.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^3.0.0"
+
+read-pkg@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+ integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+ dependencies:
+ "@types/normalize-package-data" "^2.4.0"
+ normalize-package-data "^2.5.0"
+ parse-json "^5.0.0"
+ type-fest "^0.6.0"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+"readable-stream@>=1.0.33-1 <1.1.0-0":
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^1.0.33, readable-stream@~1.1.9:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^3.1.1, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+readdirp@~3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
+ integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
+ dependencies:
+ picomatch "^2.2.1"
+
+redent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+ integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
+ dependencies:
+ indent-string "^2.1.0"
+ strip-indent "^1.0.1"
+
+redent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+ integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
+ dependencies:
+ indent-string "^4.0.0"
+ strip-indent "^3.0.0"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp-tree@^0.1.21, regexp-tree@~0.1.1:
+ version "0.1.21"
+ resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.21.tgz#55e2246b7f7d36f1b461490942fa780299c400d7"
+ integrity sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw==
+
+regexp.prototype.flags@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75"
+ integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+
regexpp@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
+remark-parse@^8.0.0:
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1"
+ integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==
+ dependencies:
+ ccount "^1.0.0"
+ collapse-white-space "^1.0.2"
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ is-word-character "^1.0.0"
+ markdown-escapes "^1.0.0"
+ parse-entities "^2.0.0"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ trim "0.0.1"
+ trim-trailing-lines "^1.0.0"
+ unherit "^1.0.4"
+ unist-util-remove-position "^2.0.0"
+ vfile-location "^3.0.0"
+ xtend "^4.0.1"
+
+remark-stringify@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.1.1.tgz#e2a9dc7a7bf44e46a155ec78996db896780d8ce5"
+ integrity sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==
+ dependencies:
+ ccount "^1.0.0"
+ is-alphanumeric "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ longest-streak "^2.0.1"
+ markdown-escapes "^1.0.0"
+ markdown-table "^2.0.0"
+ mdast-util-compact "^2.0.0"
+ parse-entities "^2.0.0"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ stringify-entities "^3.0.0"
+ unherit "^1.0.4"
+ xtend "^4.0.1"
+
+remark@^12.0.0:
+ version "12.0.1"
+ resolved "https://registry.yarnpkg.com/remark/-/remark-12.0.1.tgz#f1ddf68db7be71ca2bad0a33cd3678b86b9c709f"
+ integrity sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==
+ dependencies:
+ remark-parse "^8.0.0"
+ remark-stringify "^8.0.0"
+ unified "^9.0.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+repeat-element@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+ integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
+
+repeat-string@^1.0.0, repeat-string@^1.5.4, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+replace-ext@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
+ integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
+
+replace-ext@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a"
+ integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==
+
+request@^2.87.0, request@^2.88.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+reserved-words@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1"
+ integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=
+
+resolve-cwd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+ integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
+ dependencies:
+ resolve-from "^3.0.0"
+
+resolve-dir@^1.0.0, resolve-dir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
+ integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
+ dependencies:
+ expand-tilde "^2.0.0"
+ global-modules "^1.0.0"
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+ integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-resolve@^1.3.2:
- version "1.17.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
- integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130"
+ integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==
dependencies:
+ is-core-module "^2.0.0"
path-parse "^1.0.6"
+responselike@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rgb-regex@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+ integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+ integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
+rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
rimraf@2.6.3:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
@@ -830,26 +6817,252 @@ rimraf@2.6.3:
dependencies:
glob "^7.1.3"
-safe-buffer@~5.1.1:
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+run-parallel@^1.1.9:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
+ integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+ integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
+ dependencies:
+ aproba "^1.1.1"
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-semver@^5.4.1:
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+safe-regex@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2"
+ integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==
+ dependencies:
+ regexp-tree "~0.1.1"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sass-graph@2.2.5:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8"
+ integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==
+ dependencies:
+ glob "^7.0.0"
+ lodash "^4.0.0"
+ scss-tokenizer "^0.2.3"
+ yargs "^13.3.2"
+
+sass-loader@^10.0.2:
+ version "10.0.3"
+ resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.0.3.tgz#9e2f1bfdd6355f2adde4e4835d838b020bf800b0"
+ integrity sha512-W4+FV5oUdYy0PnC11ZoPrcAexODgDCa3ngxoy5X5qBhZYoPz9FPjb6Oox8Aa0ZYEyx34k8AQfOVuvqefOSAAUQ==
+ dependencies:
+ klona "^2.0.4"
+ loader-utils "^2.0.0"
+ neo-async "^2.6.2"
+ schema-utils "^3.0.0"
+ semver "^7.3.2"
+
+sass@^1.26.11:
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.27.0.tgz#0657ff674206b95ec20dc638a93e179c78f6ada2"
+ integrity sha512-0gcrER56OkzotK/GGwgg4fPrKuiFlPNitO7eUJ18Bs+/NBlofJfMxmxqpqJxjae9vu0Wq8TZzrSyxZal00WDig==
+ dependencies:
+ chokidar ">=2.0.0 <4.0.0"
+
+sax@~1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+schema-utils@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+ integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+ dependencies:
+ ajv "^6.1.0"
+ ajv-errors "^1.0.0"
+ ajv-keywords "^3.1.0"
+
+schema-utils@^2.7.0, schema-utils@^2.7.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
+ integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
+ dependencies:
+ "@types/json-schema" "^7.0.5"
+ ajv "^6.12.4"
+ ajv-keywords "^3.5.2"
+
+schema-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef"
+ integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==
+ dependencies:
+ "@types/json-schema" "^7.0.6"
+ ajv "^6.12.5"
+ ajv-keywords "^3.5.2"
+
+scss-tokenizer@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
+ integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE=
+ dependencies:
+ js-base64 "^2.1.8"
+ source-map "^0.4.2"
+
+seek-bzip@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4"
+ integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==
+ dependencies:
+ commander "^2.8.1"
+
+semver-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
+ integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
+
+semver-truncate@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8"
+ integrity sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=
+ dependencies:
+ semver "^5.3.0"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-semver@^6.3.0:
+semver@^6.0.0, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-semver@^7.2.1:
+semver@^7.2.1, semver@^7.3.2:
version "7.3.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+semver@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+ integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ debug "2.6.9"
+ depd "~1.1.2"
+ destroy "~1.0.4"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "~1.7.2"
+ mime "1.6.0"
+ ms "2.1.1"
+ on-finished "~2.3.0"
+ range-parser "~1.2.1"
+ statuses "~1.5.0"
+
+serialize-javascript@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+ integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
+ dependencies:
+ randombytes "^2.1.0"
+
+serialize-javascript@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
+ integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -857,11 +7070,43 @@ shebang-command@^2.0.0:
dependencies:
shebang-regex "^3.0.0"
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
shebang-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+shell-quote@^1.6.1:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
+ integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
+ dependencies:
+ is-arrayish "^0.3.1"
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
slice-ansi@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
@@ -871,17 +7116,298 @@ slice-ansi@^2.1.0:
astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0"
-source-map@^0.5.0:
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+sort-keys-length@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188"
+ integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=
+ dependencies:
+ sort-keys "^1.0.0"
+
+sort-keys@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+ integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+sort-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+ integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+source-list-map@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+ integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@~0.5.12, source-map-support@~0.5.19:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+ integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
+
+source-map@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+ integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@^0.5.0, source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.7.3, source-map@~0.7.2:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce"
+ integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==
+
+specificity@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
+ integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+split2@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/split2/-/split2-0.2.1.tgz#02ddac9adc03ec0bb78c1282ec079ca6e85ae900"
+ integrity sha1-At2smtwD7Au3jBKC7Aecpuha6QA=
+ dependencies:
+ through2 "~0.6.1"
+
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-string-width@^3.0.0:
+squeak@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3"
+ integrity sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=
+ dependencies:
+ chalk "^1.0.0"
+ console-stream "^0.1.1"
+ lpad-align "^1.0.1"
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+ssri@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
+ integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
+ dependencies:
+ figgy-pudding "^3.5.1"
+
+ssri@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808"
+ integrity sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==
+ dependencies:
+ minipass "^3.1.1"
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+state-toggle@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe"
+ integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stdout-stream@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
+ integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
+ dependencies:
+ readable-stream "^2.0.1"
+
+stream-browserify@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
+ integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-combiner@^0.2.1:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858"
+ integrity sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=
+ dependencies:
+ duplexer "~0.1.1"
+ through "~2.3.4"
+
+stream-each@^1.1.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
+ integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
+ integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
@@ -890,7 +7416,93 @@ string-width@^3.0.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
-strip-ansi@^5.1.0:
+string-width@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+ integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.matchall@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-3.0.2.tgz#c1fdb23f90058e929a69cfa2e8b12300daefe030"
+ integrity sha512-hsRe42jQ8+OJej2GVjhnSVodQ3NQgHV0FDD6dW7ZTM22J4uIbuYiAADCCc1tfyN7ocEl/KUUbudM36E2tZcF8w==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.14.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ regexp.prototype.flags "^1.2.0"
+
+string.prototype.padend@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz#dc08f57a8010dc5c153550318f67e13adbb72ac3"
+ integrity sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+
+string.prototype.trimend@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46"
+ integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.1"
+
+string.prototype.trimstart@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7"
+ integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.1"
+
+string_decoder@^1.0.0, string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+stringify-entities@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903"
+ integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==
+ dependencies:
+ character-entities-html4 "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ xtend "^4.0.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
@@ -904,25 +7516,275 @@ strip-ansi@^6.0.0:
dependencies:
ansi-regex "^5.0.0"
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+
+strip-dirs@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
+ integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
+ dependencies:
+ is-natural-number "^4.0.1"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+ integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+
+strip-indent@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+ integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
+ dependencies:
+ get-stdin "^4.0.1"
+
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
+
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-supports-color@^5.3.0:
+strip-outer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
+ integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==
+ dependencies:
+ escape-string-regexp "^1.0.2"
+
+style-loader@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e"
+ integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^2.7.0"
+
+style-search@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
+ integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=
+
+stylehacks@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
+ integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+stylelint-config-prettier@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz#da9de33da4c56893cbe7e26df239a7374045e14e"
+ integrity sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==
+
+stylelint-config-primer@^9.2.1:
+ version "9.2.1"
+ resolved "https://registry.yarnpkg.com/stylelint-config-primer/-/stylelint-config-primer-9.2.1.tgz#7c5cf38be1ca7b34c886582b6362b46a2c2f4e80"
+ integrity sha512-4tpNgAZosmONtVmWKwufdiagEsR2He4j17tn0MtX9NdtSWKfeANrJsUeEFr2WDJR+YuAOSVwytQIP55u5reSEw==
+ dependencies:
+ anymatch "^3.1.1"
+ globby "^9.2.0"
+ postcss-value-parser "^4.0.2"
+ string.prototype.matchall "^3.0.1"
+ stylelint-no-unsupported-browser-features "^1.0.0"
+ stylelint-order "^2.0.0"
+ stylelint-scss "^3.10.0"
+ tap-map "^1.0.0"
+
+stylelint-config-recommended@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657"
+ integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==
+
+stylelint-config-sass-guidelines@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-7.1.0.tgz#7838fe04eee649a2444b568a32c904a26b5d6c1e"
+ integrity sha512-WvC9nRdlYknftPcUaJCajrPYKg6d2CKffrr7BPPkN/i/Mt8Qsm1hNQ9lqC1sKoCIKdH051SCEZi10qwFLgDbbg==
+ dependencies:
+ stylelint-order "^4.0.0"
+ stylelint-scss "^3.18.0"
+
+stylelint-config-standard@^20.0.0:
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz#06135090c9e064befee3d594289f50e295b5e20d"
+ integrity sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==
+ dependencies:
+ stylelint-config-recommended "^3.0.0"
+
+stylelint-no-unsupported-browser-features@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-1.0.1.tgz#06377e0e2e8db777af4944a50d63d43171d5aec1"
+ integrity sha512-6uaoXV/WA5BLKo9bbjERFE3oAOA0UY4FgGDaQWarV9x3qrDLS2o2SJqk0TaxwAIAgROwj9RhbQ2FF1QKRzZBNw==
+ dependencies:
+ doiuse "^4.0.0"
+ lodash "^4.17.4"
+ postcss "^6.0.1"
+ stylelint ">=5.0.0"
+
+stylelint-order@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-2.2.1.tgz#cd2d4a0d81d91c705f1d275a58487e5ad5aa5828"
+ integrity sha512-019KBV9j8qp1MfBjJuotse6MgaZqGVtXMc91GU9MsS9Feb+jYUvUU3Z8XiClqPdqJZQ0ryXQJGg3U3PcEjXwfg==
+ dependencies:
+ lodash "^4.17.10"
+ postcss "^7.0.2"
+ postcss-sorting "^4.1.0"
+
+stylelint-order@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-4.1.0.tgz#692d05b7d0c235ac66fcf5ea1d9e5f08a76747f6"
+ integrity sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw==
+ dependencies:
+ lodash "^4.17.15"
+ postcss "^7.0.31"
+ postcss-sorting "^5.0.1"
+
+stylelint-scss@^3.10.0, stylelint-scss@^3.18.0:
+ version "3.18.0"
+ resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.18.0.tgz#8f06371c223909bf3f62e839548af1badeed31e9"
+ integrity sha512-LD7+hv/6/ApNGt7+nR/50ft7cezKP2HM5rI8avIdGaUWre3xlHfV4jKO/DRZhscfuN+Ewy9FMhcTq0CcS0C/SA==
+ dependencies:
+ lodash "^4.17.15"
+ postcss-media-query-parser "^0.2.3"
+ postcss-resolve-nested-selector "^0.1.1"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.1.0"
+
+stylelint@>=5.0.0, stylelint@^13.7.1:
+ version "13.7.2"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.7.2.tgz#6f3c58eea4077680ed0ceb0d064b22b100970486"
+ integrity sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==
+ dependencies:
+ "@stylelint/postcss-css-in-js" "^0.37.2"
+ "@stylelint/postcss-markdown" "^0.36.1"
+ autoprefixer "^9.8.6"
+ balanced-match "^1.0.0"
+ chalk "^4.1.0"
+ cosmiconfig "^7.0.0"
+ debug "^4.1.1"
+ execall "^2.0.0"
+ fast-glob "^3.2.4"
+ fastest-levenshtein "^1.0.12"
+ file-entry-cache "^5.0.1"
+ get-stdin "^8.0.0"
+ global-modules "^2.0.0"
+ globby "^11.0.1"
+ globjoin "^0.1.4"
+ html-tags "^3.1.0"
+ ignore "^5.1.8"
+ import-lazy "^4.0.0"
+ imurmurhash "^0.1.4"
+ known-css-properties "^0.19.0"
+ lodash "^4.17.20"
+ log-symbols "^4.0.0"
+ mathml-tag-names "^2.1.3"
+ meow "^7.1.1"
+ micromatch "^4.0.2"
+ normalize-selector "^0.2.0"
+ postcss "^7.0.32"
+ postcss-html "^0.36.0"
+ postcss-less "^3.1.4"
+ postcss-media-query-parser "^0.2.3"
+ postcss-resolve-nested-selector "^0.1.1"
+ postcss-safe-parser "^4.0.2"
+ postcss-sass "^0.4.4"
+ postcss-scss "^2.1.1"
+ postcss-selector-parser "^6.0.2"
+ postcss-syntax "^0.36.2"
+ postcss-value-parser "^4.1.0"
+ resolve-from "^5.0.0"
+ slash "^3.0.0"
+ specificity "^0.4.1"
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ style-search "^0.1.0"
+ sugarss "^2.0.0"
+ svg-tags "^1.0.0"
+ table "^6.0.1"
+ v8-compile-cache "^2.1.1"
+ write-file-atomic "^3.0.3"
+
+sugarss@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d"
+ integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==
+ dependencies:
+ postcss "^7.0.2"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0, supports-color@^5.4.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
-supports-color@^7.1.0:
+supports-color@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.0.0, supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
+svg-tags@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
+ integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
+
+svgo-loader@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/svgo-loader/-/svgo-loader-2.2.1.tgz#ca1c9ad22e120bb45a5250233737da4d85521704"
+ integrity sha512-9dyz/h6ae04pAVRz7QY8bLXtMbwA19NPpCPfCixgW0qXNDCOlHbDRqvtT5/2gzRxfuibWCUP6ZBQmZWF9rjWhQ==
+ dependencies:
+ js-yaml "^3.13.1"
+ loader-utils "^1.0.3"
+
+svgo@^1.0.0, svgo@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
+ integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
+ dependencies:
+ chalk "^2.4.1"
+ coa "^2.0.2"
+ css-select "^2.0.0"
+ css-select-base-adapter "^0.1.1"
+ css-tree "1.0.0-alpha.37"
+ csso "^4.0.2"
+ js-yaml "^3.13.1"
+ mkdirp "~0.5.1"
+ object.values "^1.1.0"
+ sax "~1.2.4"
+ stable "^0.1.8"
+ unquote "~1.1.1"
+ util.promisify "~1.0.0"
+
table@^5.2.3:
version "5.4.6"
resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
@@ -933,16 +7795,290 @@ table@^5.2.3:
slice-ansi "^2.1.0"
string-width "^3.0.0"
+table@^6.0.1:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.0.3.tgz#e5b8a834e37e27ad06de2e0fda42b55cfd8a0123"
+ integrity sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==
+ dependencies:
+ ajv "^6.12.4"
+ lodash "^4.17.20"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.0"
+
+tap-map@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/tap-map/-/tap-map-1.0.0.tgz#757826531c07819d256b0091ebe37e1e7d09eb94"
+ integrity sha512-qYUKYf/zPDpj9xL8eb3mBcGN+8qHcW4Yvem02SapcBZAw9PQHHrozIu+bma3o5MdDbcmgKK88hv5rCTGR8RZfA==
+
+tapable@^1.0.0, tapable@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+ integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+
+tar-stream@^1.5.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
+ integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
+ dependencies:
+ bl "^1.0.0"
+ buffer-alloc "^1.2.0"
+ end-of-stream "^1.0.0"
+ fs-constants "^1.0.0"
+ readable-stream "^2.3.0"
+ to-buffer "^1.1.1"
+ xtend "^4.0.0"
+
+tar@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
+ integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==
+ dependencies:
+ block-stream "*"
+ fstream "^1.0.12"
+ inherits "2"
+
+tar@^6.0.2:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f"
+ integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^3.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+temp-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
+ integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=
+
+tempfile@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265"
+ integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU=
+ dependencies:
+ temp-dir "^1.0.0"
+ uuid "^3.0.1"
+
+terser-webpack-plugin@^1.4.3:
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b"
+ integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==
+ dependencies:
+ cacache "^12.0.2"
+ find-cache-dir "^2.1.0"
+ is-wsl "^1.1.0"
+ schema-utils "^1.0.0"
+ serialize-javascript "^4.0.0"
+ source-map "^0.6.1"
+ terser "^4.1.2"
+ webpack-sources "^1.4.0"
+ worker-farm "^1.7.0"
+
+terser-webpack-plugin@^4.2.2:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a"
+ integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==
+ dependencies:
+ cacache "^15.0.5"
+ find-cache-dir "^3.3.1"
+ jest-worker "^26.5.0"
+ p-limit "^3.0.2"
+ schema-utils "^3.0.0"
+ serialize-javascript "^5.0.1"
+ source-map "^0.6.1"
+ terser "^5.3.4"
+ webpack-sources "^1.4.3"
+
+terser@^4.1.2:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+ integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.12"
+
+terser@^5.3.4:
+ version "5.3.7"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.7.tgz#798a4ae2e7ff67050c3e99fcc4e00725827d97e2"
+ integrity sha512-lJbKdfxWvjpV330U4PBZStCT9h3N9A4zZVA5Y4k9sCWXknrpdyxi1oMsRKLmQ/YDMDxSBKIh88v0SkdhdqX06w==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.7.2"
+ source-map-support "~0.5.19"
+
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+through2@^0.6.1, through2@^0.6.3, through2@~0.6.1:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
+ integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=
+ dependencies:
+ readable-stream ">=1.0.33-1 <1.1.0-0"
+ xtend ">=4.0.0 <4.1.0-0"
+
+through2@^2.0.0, through2@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+"through@>=2.2.7 <3", through@^2.3.8, through@~2.3.4:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+timers-browserify@^2.0.4:
+ version "2.0.11"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
+ integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==
+ dependencies:
+ setimmediate "^1.0.4"
+
+timsort@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+ integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+ integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
+
+to-buffer@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
+ integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
+
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+trim-newlines@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+ integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
+
+trim-newlines@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30"
+ integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==
+
+trim-repeated@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
+ integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE=
+ dependencies:
+ escape-string-regexp "^1.0.2"
+
+trim-trailing-lines@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94"
+ integrity sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==
+
+trim@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
+ integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
+
+trough@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
+ integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==
+
+"true-case-path@^1.0.2":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
+ integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==
+ dependencies:
+ glob "^7.1.2"
+
+tryer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
+ integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
+
+tslib@^1.9.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+ integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -950,11 +8086,174 @@ type-check@^0.4.0, type-check@~0.4.0:
dependencies:
prelude-ls "^1.2.1"
+type-fest@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
+ integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
+
+type-fest@^0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2"
+ integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==
+
+type-fest@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+ integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
type-fest@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+unbzip2-stream@^1.0.9:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
+ integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==
+ dependencies:
+ buffer "^5.2.1"
+ through "^2.3.8"
+
+unherit@^1.0.4:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"
+ integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==
+ dependencies:
+ inherits "^2.0.0"
+ xtend "^4.0.0"
+
+unified@^9.0.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8"
+ integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==
+ dependencies:
+ bail "^1.0.0"
+ extend "^3.0.0"
+ is-buffer "^2.0.0"
+ is-plain-obj "^2.0.0"
+ trough "^1.0.0"
+ vfile "^4.0.0"
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+uniq@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+ integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+
+uniqs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+ integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+
+unique-filename@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+ integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+ integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+ dependencies:
+ imurmurhash "^0.1.4"
+
+unist-util-find-all-after@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz#95cc62f48812d879b4685a0512bf1b838da50e9a"
+ integrity sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==
+ dependencies:
+ unist-util-is "^4.0.0"
+
+unist-util-is@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de"
+ integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==
+
+unist-util-remove-position@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc"
+ integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==
+ dependencies:
+ unist-util-visit "^2.0.0"
+
+unist-util-stringify-position@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da"
+ integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==
+ dependencies:
+ "@types/unist" "^2.0.2"
+
+unist-util-visit-parents@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6"
+ integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^4.0.0"
+
+unist-util-visit@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c"
+ integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^4.0.0"
+ unist-util-visit-parents "^3.0.0"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unquote@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+ integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+ integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
uri-js@^4.2.2:
version "4.4.0"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602"
@@ -962,11 +8261,255 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
-v8-compile-cache@^2.0.3:
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-loader@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2"
+ integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==
+ dependencies:
+ loader-utils "^2.0.0"
+ mime-types "^2.1.27"
+ schema-utils "^3.0.0"
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
+ integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.2"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.0"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
+ integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
+ dependencies:
+ inherits "2.0.3"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@^3.0.1, uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745"
integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+vendors@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
+ integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+vfile-location@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.1.0.tgz#81cd8a04b0ac935185f4fce16f270503fc2f692f"
+ integrity sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g==
+
+vfile-message@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
+ integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-stringify-position "^2.0.0"
+
+vfile@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.0.tgz#26c78ac92eb70816b01d4565e003b7e65a2a0e01"
+ integrity sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ is-buffer "^2.0.0"
+ replace-ext "1.0.0"
+ unist-util-stringify-position "^2.0.0"
+ vfile-message "^2.0.0"
+
+vm-browserify@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+ integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
+
+watchpack-chokidar2@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
+ integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==
+ dependencies:
+ chokidar "^2.1.8"
+
+watchpack@^1.7.4:
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b"
+ integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+ optionalDependencies:
+ chokidar "^3.4.1"
+ watchpack-chokidar2 "^2.0.0"
+
+webpack-bundle-analyzer@^3.9.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c"
+ integrity sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==
+ dependencies:
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
+ bfj "^6.1.1"
+ chalk "^2.4.1"
+ commander "^2.18.0"
+ ejs "^2.6.1"
+ express "^4.16.3"
+ filesize "^3.6.1"
+ gzip-size "^5.0.0"
+ lodash "^4.17.19"
+ mkdirp "^0.5.1"
+ opener "^1.5.1"
+ ws "^6.0.0"
+
+webpack-cli@^3.3.12:
+ version "3.3.12"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a"
+ integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==
+ dependencies:
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ enhanced-resolve "^4.1.1"
+ findup-sync "^3.0.0"
+ global-modules "^2.0.0"
+ import-local "^2.0.0"
+ interpret "^1.4.0"
+ loader-utils "^1.4.0"
+ supports-color "^6.1.0"
+ v8-compile-cache "^2.1.1"
+ yargs "^13.3.2"
+
+webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+ integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack@^4.44.2:
+ version "4.44.2"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72"
+ integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-module-context" "1.9.0"
+ "@webassemblyjs/wasm-edit" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+ acorn "^6.4.1"
+ ajv "^6.10.2"
+ ajv-keywords "^3.4.1"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^4.3.0"
+ eslint-scope "^4.0.3"
+ json-parse-better-errors "^1.0.2"
+ loader-runner "^2.4.0"
+ loader-utils "^1.2.3"
+ memory-fs "^0.4.1"
+ micromatch "^3.1.10"
+ mkdirp "^0.5.3"
+ neo-async "^2.6.1"
+ node-libs-browser "^2.2.1"
+ schema-utils "^1.0.0"
+ tapable "^1.1.3"
+ terser-webpack-plugin "^1.4.3"
+ watchpack "^1.7.4"
+ webpack-sources "^1.4.1"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
which@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
@@ -974,19 +8517,163 @@ which@^2.0.1:
dependencies:
isexe "^2.0.0"
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
word-wrap@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+worker-farm@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
+ integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
+ dependencies:
+ errno "~0.1.7"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+write-file-atomic@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+ integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+ dependencies:
+ imurmurhash "^0.1.4"
+ is-typedarray "^1.0.0"
+ signal-exit "^3.0.2"
+ typedarray-to-buffer "^3.1.5"
+
write@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
dependencies:
mkdirp "^0.5.1"
+
+ws@^6.0.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
+ integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+ integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
+ integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
+
+yargs-parser@^11.1.1:
+ version "11.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
+ integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^18.1.3:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs@^12.0.2:
+ version "12.0.5"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
+ integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==
+ dependencies:
+ cliui "^4.0.0"
+ decamelize "^1.2.0"
+ find-up "^3.0.0"
+ get-caller-file "^1.0.1"
+ os-locale "^3.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1 || ^4.0.0"
+ yargs-parser "^11.1.1"
+
+yargs@^13.3.2:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^3.0.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^13.1.2"
+
+yauzl@^2.4.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+ integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.1.0"