From 517f355e3092241c73348995f818169019690291 Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Sat, 7 Sep 2024 16:00:58 +0200 Subject: [PATCH 01/14] [Addon] Fix check failure with Mozilla Firefox addon --- web-extension/extension/src/firefox/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-extension/extension/src/firefox/manifest.json b/web-extension/extension/src/firefox/manifest.json index 769104cb..daba21b2 100644 --- a/web-extension/extension/src/firefox/manifest.json +++ b/web-extension/extension/src/firefox/manifest.json @@ -18,7 +18,7 @@ "browser_specific_settings": { "gecko": { "id": "DownRightNow@example.org", - "strict_min_version": "57.0" + "strict_min_version": "58.0" } }, "default_locale": "en", From 9b6ae97a036f1e9e5a777d9d7e7df1027dcf5cad Mon Sep 17 00:00:00 2001 From: AHOHNMYC <24810600+AHOHNMYC@users.noreply.github.com> Date: Sun, 21 Jan 2024 15:47:07 +0300 Subject: [PATCH 02/14] [WebExtension] Open link in new window --- web-extension/extension/src/base/options.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-extension/extension/src/base/options.html b/web-extension/extension/src/base/options.html index ac01c7db..90b964ee 100644 --- a/web-extension/extension/src/base/options.html +++ b/web-extension/extension/src/base/options.html @@ -54,7 +54,7 @@

Go to link below to install the application for your operating system.

- Visit ArrowDL website + Visit ArrowDL website

From fd13c6af2a4124f153f28abe7a2668300ba96879 Mon Sep 17 00:00:00 2001 From: FadeMind Date: Sat, 7 Sep 2024 16:31:11 +0200 Subject: [PATCH 03/14] [Blog] Fix url to website --- README.md | 6 +++--- installer/windows/NSIS/setup.nsi | 2 +- src/version.h | 2 +- web-extension/extension/src/base/options.html | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e1812a44..4d7fd343 100644 --- a/README.md +++ b/README.md @@ -59,12 +59,12 @@ It aims to work with latest versions of Mozilla Firefox (powered by *WebExtensio -More screenshots on the [Gallery](https://www.arrow-dl.com/ArrowDL/category/screenshots.html "Go to Screenshots page") page. +More screenshots on the [Gallery](https://www.arrow-dl.com/screenshots/ "Go to Screenshots page") page. ## Installation -Go to [Download](https://www.arrow-dl.com/ArrowDL/category/download.html) page to install the application for your operating system. +Go to [Download](https://www.arrow-dl.com/download/) page to install the application for your operating system. Rem: *Native-Client* is an alternative to *ArrowDL*. Click [here](NativeClient.md "NativeClient.md") for more information. @@ -75,7 +75,7 @@ choco install arrowdl ## Usage -Go to [Tutorial](https://www.arrow-dl.com/ArrowDL/category/tutorial.html) page. +Go to [Tutorial](https://www.arrow-dl.com/tutorial/) page. ## Under the hood diff --git a/installer/windows/NSIS/setup.nsi b/installer/windows/NSIS/setup.nsi index 428d63e5..ec430aa5 100644 --- a/installer/windows/NSIS/setup.nsi +++ b/installer/windows/NSIS/setup.nsi @@ -29,7 +29,7 @@ !define PRODUCT_VERSION ${VERSION} !define PRODUCT_GROUP "Sebastien Vavassori" !define PRODUCT_PUBLISHER "Sebastien Vavassori" -!define PRODUCT_WEB_SITE "https://www.arrow-dl.com/ArrowDL" +!define PRODUCT_WEB_SITE "https://www.arrow-dl.com/" ; Adds info to the installer VIProductVersion "${PRODUCT_VERSION}.000" diff --git a/src/version.h b/src/version.h index 71a0cd49..d69506cb 100644 --- a/src/version.h +++ b/src/version.h @@ -38,7 +38,7 @@ const QString STR_APPLICATION_VERSION{APP_VERSION}; const QString STR_APPLICATION_DATE{"2020"}; const QString STR_APPLICATION_AUTHOR{"Sébastien Vavassori"}; const QString STR_APPLICATION_WEBSITE{"https://github.com/setvisible/ArrowDL"}; -const QString STR_TUTORIAL_WEBSITE{"https://www.arrow-dl.com/ArrowDL/category/tutorial.html"}; +const QString STR_TUTORIAL_WEBSITE{"https://www.arrow-dl.com/tutorial/"}; const QString STR_GITHUB_OWNER{"setvisible"}; const QString STR_GITHUB_REPO{"ArrowDL"}; diff --git a/web-extension/extension/src/base/options.html b/web-extension/extension/src/base/options.html index 90b964ee..7eb5dcff 100644 --- a/web-extension/extension/src/base/options.html +++ b/web-extension/extension/src/base/options.html @@ -54,7 +54,7 @@

Go to link below to install the application for your operating system.

- Visit ArrowDL website + Visit ArrowDL website

From 61bbe4028a16bfba3231c421197d65175d614359 Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Sun, 10 Nov 2024 13:26:02 +0100 Subject: [PATCH 04/14] [Core] Update jQuery 1.3.2 to 3.7.1 --- test/manual-test/webengine/jquery.min.js | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/test/manual-test/webengine/jquery.min.js b/test/manual-test/webengine/jquery.min.js index a0fb8836..7f37b5d9 100644 --- a/test/manual-test/webengine/jquery.min.js +++ b/test/manual-test/webengine/jquery.min.js @@ -1,19 +1,2 @@ -/* - * jQuery JavaScript Library v1.3.2 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) - * Revision: 6246 - */ -(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); -/* - * Sizzle CSS Selector Engine - v0.9.3 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0 Date: Mon, 11 Nov 2024 12:35:09 +0100 Subject: [PATCH 05/14] [Core] Fix duplicate warnings in data driven tests --- .../abstractsettings/tst_abstractsettings.cpp | 6 +- test/core/fileutils/tst_fileutils.cpp | 50 +++---- test/core/format/tst_format.cpp | 130 +++++++++--------- test/core/mask/tst_mask.cpp | 26 ++-- test/core/regex/tst_regex.cpp | 30 ++-- test/core/resourceitem/tst_resourceitem.cpp | 8 +- test/core/stream/tst_stream.cpp | 70 +++++----- .../tst_torrentbasecontext.cpp | 22 +-- test/core/updatechecker/tst_updatechecker.cpp | 62 ++++----- test/widgets/pathwidget/CMakeLists.txt | 4 + test/widgets/textedit/tst_textedit.cpp | 22 +-- 11 files changed, 216 insertions(+), 214 deletions(-) diff --git a/test/core/abstractsettings/tst_abstractsettings.cpp b/test/core/abstractsettings/tst_abstractsettings.cpp index 3fd82e1c..81365f1f 100644 --- a/test/core/abstractsettings/tst_abstractsettings.cpp +++ b/test/core/abstractsettings/tst_abstractsettings.cpp @@ -55,9 +55,9 @@ void tst_AbstractSettings::addSettingWithString_data() QTest::addColumn("input"); QTest::addColumn("expected"); - QTest::newRow("simple") << "Color" << "red" << "blue" << "blue"; - QTest::newRow("simple") << "-" << "red" << "" << ""; - QTest::newRow("simple") << "..." << "red" << "10" << "10"; + QTest::newRow("trivial") << "Color" << "red" << "blue" << "blue"; + QTest::newRow("key -") << "-" << "red" << "" << ""; + QTest::newRow("key .") << "..." << "red" << "10" << "10"; QTest::newRow("simple") << "integer" << "red" << "10" << "10"; QTest::newRow("empty") << "Color" << "red" << "" << ""; diff --git a/test/core/fileutils/tst_fileutils.cpp b/test/core/fileutils/tst_fileutils.cpp index 5db6bf35..9068928d 100644 --- a/test/core/fileutils/tst_fileutils.cpp +++ b/test/core/fileutils/tst_fileutils.cpp @@ -45,11 +45,11 @@ void tst_FileUtils::validateFileName_data() QTest::newRow("empty 2") << true << QString() << QString(); QTest::newRow("empty 4") << true << "" << ""; - QTest::newRow("reserved dir+name 1") << true << "CON" << "file"; - QTest::newRow("reserved dir+name 2") << true << "/CON" << "/file"; - QTest::newRow("reserved dir+name 3") << true << "\\CON" << "\\file"; - QTest::newRow("reserved dir+name 4") << true << "/some/path/CON" << "/some/path/file"; - QTest::newRow("reserved dir+name 5") << true << "\\some/path\\CON" << "\\some/path\\file"; + QTest::newRow("reserved dir+name 10") << true << "CON" << "file"; + QTest::newRow("reserved dir+name 11") << true << "/CON" << "/file"; + QTest::newRow("reserved dir+name 12") << true << "\\CON" << "\\file"; + QTest::newRow("reserved dir+name 13") << true << "/some/path/CON" << "/some/path/file"; + QTest::newRow("reserved dir+name 14") << true << "\\some/path\\CON" << "\\some/path\\file"; QTest::newRow("reserved dir+name+ext 1") << true << "CON.txt" << "file.txt"; QTest::newRow("reserved dir+name+ext 2") << true << "/CON.txt" << "/file.txt"; @@ -157,8 +157,8 @@ void tst_FileUtils::validateFileName_data() QTest::newRow("end char 3") << false << "my file ." << "my file ._"; // Unicode UTF chars - QTest::newRow("allowed utf char") << false << "لة الش.txt" << "لة الش.txt"; - QTest::newRow("allowed utf char") << false << "番剧.txt" << "番剧.txt"; + QTest::newRow("allowed utf char 1") << false << "لة الش.txt" << "لة الش.txt"; + QTest::newRow("allowed utf char 2") << false << "番剧.txt" << "番剧.txt"; } void tst_FileUtils::validateFileName() @@ -178,36 +178,36 @@ void tst_FileUtils::cleanFileName_data() QTest::addColumn("expected"); QTest::newRow("empty") << "" << ""; - QTest::newRow("simple") << "a" << "A"; - QTest::newRow("simple") << "A" << "A"; + QTest::newRow("lowercase") << "a" << "A"; + QTest::newRow("uppercase") << "A" << "A"; - QTest::newRow("") << "A - B" << "A - B"; + QTest::newRow("-") << "A - B" << "A - B"; QTest::newRow("dot") << "A • B" << "A - B"; - QTest::newRow("") << "Rénet Schlüß" << "Rénet Schlüß"; + QTest::newRow("accent") << "Rénet Schlüß" << "Rénet Schlüß"; QTest::newRow("dash") << "Quikelol #lol" << "Quikelol #lol"; - QTest::newRow("unuseful text") << "Live '01 (Official Video)" << "Live '01"; - QTest::newRow("unuseful text") << "(Official Video) Live '01" << "Live '01"; - QTest::newRow("unuseful text") << "Live (Official Video) '01" << "Live '01"; - QTest::newRow("unuseful text") << "Live (Official Visualizer) '01" << "Live '01"; - QTest::newRow("unuseful text") << "Live ((Official Visualizer)) '01" << "Live '01"; - QTest::newRow("unuseful text") << "Live (Radio Edit) '01" << "Live '01"; + QTest::newRow("useless text 1") << "Live '01 (Official Video)" << "Live '01"; + QTest::newRow("useless text 2") << "(Official Video) Live '01" << "Live '01"; + QTest::newRow("useless text 3") << "Live (Official Video) '01" << "Live '01"; + QTest::newRow("useless text 4") << "Live (Official Visualizer) '01" << "Live '01"; + QTest::newRow("useless text 5") << "Live ((Official Visualizer)) '01" << "Live '01"; + QTest::newRow("useless text 6") << "Live (Radio Edit) '01" << "Live '01"; // BUGFIX with "Construction" that becomes "filestruction" // https://www.youtube.com/watch?v=lSQ7pWUo3g4 QTest::newRow("_Con_struction") << "Construction" << "Construction"; - QTest::newRow("capitalized") << "ALICE AND BOB" << "Alice And Bob"; - QTest::newRow("capitalized") << "ALICE and BOB" << "Alice And Bob"; - QTest::newRow("capitalized") << "alice and bob" << "Alice And Bob"; - QTest::newRow("capitalized") << "alice,and-bob" << "Alice,And-Bob"; - QTest::newRow("capitalized") << "'alice'" << "'Alice'"; - QTest::newRow("capitalized") << "\"alice\"" << "'Alice'"; + QTest::newRow("capitalized 1") << "ALICE AND BOB" << "Alice And Bob"; + QTest::newRow("capitalized 2") << "ALICE and BOB" << "Alice And Bob"; + QTest::newRow("capitalized 3") << "alice and bob" << "Alice And Bob"; + QTest::newRow("capitalized 4") << "alice,and-bob" << "Alice,And-Bob"; + QTest::newRow("capitalized 5") << "'alice'" << "'Alice'"; + QTest::newRow("capitalized 6") << "\"alice\"" << "'Alice'"; // Unicode UTF chars - QTest::newRow("utf") << "لة الش" << "لة الش"; - QTest::newRow("utf") << "番剧" << "番剧"; + QTest::newRow("utf 1") << "لة الش" << "لة الش"; + QTest::newRow("utf 2") << "番剧" << "番剧"; } void tst_FileUtils::cleanFileName() diff --git a/test/core/format/tst_format.cpp b/test/core/format/tst_format.cpp index 9a9758fa..0d0f2d81 100644 --- a/test/core/format/tst_format.cpp +++ b/test/core/format/tst_format.cpp @@ -66,17 +66,17 @@ void tst_Format::timeToString_data() QTest::addColumn("time"); QTest::addColumn("expected"); - QTest::newRow("invalid time") << QTime() << "--:--"; - QTest::newRow("invalid time") << QTime(0, 0, 60, 0) << "--:--"; - QTest::newRow("invalid time") << QTime(1236, 0) << "--:--"; + QTest::newRow("invalid time 1") << QTime() << "--:--"; + QTest::newRow("invalid time 2") << QTime(0, 0, 60, 0) << "--:--"; + QTest::newRow("invalid time 3") << QTime(1236, 0) << "--:--"; QTest::newRow("0 sec") << QTime(0, 0, 0, 0) << "00:01"; - QTest::newRow("0 sec") << QTime(0, 0, 0, 500) << "00:01"; - QTest::newRow("0 sec") << QTime(0, 0, 0, 999) << "00:01"; + QTest::newRow("0.5 sec") << QTime(0, 0, 0, 500) << "00:01"; + QTest::newRow("0.999 sec") << QTime(0, 0, 0, 999) << "00:01"; QTest::newRow("1 sec") << QTime(0, 0, 1, 0) << "00:01"; - QTest::newRow("1 sec") << QTime(0, 0, 1, 500) << "00:01"; - QTest::newRow("1 sec") << QTime(0, 0, 1, 999) << "00:01"; - QTest::newRow("60 sec") << QTime(0, 0, 59, 999) << "00:59"; + QTest::newRow("1.5 sec") << QTime(0, 0, 1, 500) << "00:01"; + QTest::newRow("1.999 sec") << QTime(0, 0, 1, 999) << "00:01"; + QTest::newRow("59.99 sec") << QTime(0, 0, 59, 999) << "00:59"; QTest::newRow("60 sec") << QTime(0, 1, 0, 0) << "01:00"; QTest::newRow("1 day") << QTime(23, 59, 59, 999) << "23:59:59"; } @@ -96,19 +96,19 @@ void tst_Format::timeToString_seconds_data() QTest::addColumn("seconds"); QTest::addColumn("expected"); - QTest::newRow("invalid time") << qint64(-1) << "--:--"; - QTest::newRow("invalid time") << qint64(0) << "00:01"; - QTest::newRow("invalid time") << qint64(1) << "00:01"; - QTest::newRow("invalid time") << qint64(2) << "00:02"; + QTest::newRow("invalid time 1") << qint64(-1) << "--:--"; + QTest::newRow("invalid time 2") << qint64(0) << "00:01"; + QTest::newRow("invalid time 3") << qint64(1) << "00:01"; + QTest::newRow("invalid time 4") << qint64(2) << "00:02"; - QTest::newRow("60 sec") << qint64(59) << "00:59"; + QTest::newRow("59 sec") << qint64(59) << "00:59"; QTest::newRow("60 sec") << qint64(60) << "01:00"; - QTest::newRow("60 sec") << qint64(3599) << "59:59"; - QTest::newRow("60 sec") << qint64(3600) << "01:00:00"; + QTest::newRow("59 min 59 sec") << qint64(3599) << "59:59"; + QTest::newRow("1 hour") << qint64(3600) << "01:00:00"; QTest::newRow("1 day") << qint64(24*60*60 - 1) << "23:59:59"; - QTest::newRow("more than 1 day") << qint64(24*60*60) << QString::fromUtf8("\xE2\x88\x9E"); - QTest::newRow("more than 1 day") << qint64(24*60*60 + 1) << QString::fromUtf8("\xE2\x88\x9E"); + QTest::newRow("more than 1 day (1)") << qint64(24*60*60) << QString::fromUtf8("\xE2\x88\x9E"); + QTest::newRow("more than 1 day (2)") << qint64(24*60*60 + 1) << QString::fromUtf8("\xE2\x88\x9E"); } void tst_Format::timeToString_seconds() @@ -146,7 +146,7 @@ void tst_Format::fileSizeToString_data() QTest::newRow("1234567890123456 bytes") << BigInteger(1234567890123456) << "1122.833 TB"; QTest::newRow("MAX") << BigInteger(SIZE_MAX) << "Unknown"; - QTest::newRow("negative") << BigInteger(-1) << "Unknown"; + QTest::newRow("negative (2)") << BigInteger(-1) << "Unknown"; QTest::newRow("MIN") << BigInteger(-SIZE_MAX) << "1 byte"; } @@ -218,8 +218,8 @@ void tst_Format::currentSpeedToString_data() QTest::newRow("1234567890123456 bytes") << 1234567890123456.0 << "1122.83 TB/s"; QTest::newRow("INFINITY") << qInf() << "-"; - QTest::newRow("NaN") << qQNaN() << "-"; - QTest::newRow("NaN") << qSNaN() << "-"; + QTest::newRow("NaN quiet") << qQNaN() << "-"; + QTest::newRow("NaN signalling") << qSNaN() << "-"; } void tst_Format::currentSpeedToString() @@ -238,21 +238,21 @@ void tst_Format::parsePercentDecimal_data() QTest::addColumn("expected"); /* Invalid */ - QTest::newRow("invalid") << "" << -1.0; - QTest::newRow("invalid") << QString() << -1.0; + QTest::newRow("null") << QString() << -1.0; + QTest::newRow("empty") << "" << -1.0; QTest::newRow("invalid") << "azerty" << -1.0; - QTest::newRow("invalid") << "NaN" << -1.0; + QTest::newRow("nan") << "NaN" << -1.0; QTest::newRow("negative") << "-1.0%" << -1.0; /* Valid */ - QTest::newRow("zero") << "0%" << 0.0; - QTest::newRow("zero") << "0.0%" << 0.0; - QTest::newRow("zero") << "0.0 %" << 0.0; - QTest::newRow("zero") << "0.0 %" << 0.0; + QTest::newRow("zero 1") << "0%" << 0.0; + QTest::newRow("zero 2") << "0.0%" << 0.0; + QTest::newRow("zero 3") << "0.0 %" << 0.0; + QTest::newRow("zero 4") << "0.0 %" << 0.0; QTest::newRow("8.2") << "8.2%" << 8.2; - QTest::newRow("100.0") << "100.0%" << 100.0; - QTest::newRow("100.0") << "1325.6654%" << 1325.6654; + QTest::newRow("100%") << "100.0%" << 100.0; + QTest::newRow("more than 100%") << "1325.6654%" << 1325.6654; } void tst_Format::parsePercentDecimal() @@ -271,25 +271,25 @@ void tst_Format::parseBytes_data() QTest::addColumn("expected"); /* Invalid */ - QTest::newRow("invalid") << "" << BigInteger(-1); - QTest::newRow("invalid") << QString() << BigInteger(-1); + QTest::newRow("null") << QString() << BigInteger(-1); + QTest::newRow("empty") << "" << BigInteger(-1); QTest::newRow("invalid") << "azerty" << BigInteger(-1); - QTest::newRow("invalid") << "NaN" << BigInteger(-1); + QTest::newRow("nan") << "NaN" << BigInteger(-1); - QTest::newRow("unitless") << "0" << BigInteger(-1); - QTest::newRow("unitless") << "0.0" << BigInteger(-1); + QTest::newRow("unitless 1") << "0" << BigInteger(-1); + QTest::newRow("unitless 2") << "0.0" << BigInteger(-1); - QTest::newRow("unknown") << "-" << BigInteger(-1); - QTest::newRow("unknown") << "-.-" << BigInteger(-1); - QTest::newRow("unknown") << "--.--" << BigInteger(-1); - QTest::newRow("unknown") << "..." << BigInteger(-1); - QTest::newRow("unknown") << "?" << BigInteger(-1); + QTest::newRow("unknown 1") << "-" << BigInteger(-1); + QTest::newRow("unknown 2") << "-.-" << BigInteger(-1); + QTest::newRow("unknown 3") << "--.--" << BigInteger(-1); + QTest::newRow("unknown 4") << "..." << BigInteger(-1); + QTest::newRow("unknown 5") << "?" << BigInteger(-1); /* Valid */ - QTest::newRow("zero") << "0 KiB" << BigInteger(0); - QTest::newRow("zero") << "0.0KiB" << BigInteger(0); + QTest::newRow("zero 1") << "0 KiB" << BigInteger(0); + QTest::newRow("zero 2") << "0.0KiB" << BigInteger(0); - QTest::newRow("1 byte") << "1 B" << BigInteger(1); + QTest::newRow("1 B") << "1 B" << BigInteger(1); QTest::newRow("1 byte") << "1 byte" << BigInteger(1); QTest::newRow("2 bytes") << "2 bytes" << BigInteger(2); @@ -301,24 +301,24 @@ void tst_Format::parseBytes_data() QTest::newRow("1 MiB") << "1 MiB" << BigInteger(1024*1024); QTest::newRow("1 GiB") << "1 GiB" << BigInteger(1024*1024*1024); - QTest::newRow("167.85MiB") << "167.85MiB" << BigInteger(176003481); - QTest::newRow("167.85MiB") << "167.85 MiB" << BigInteger(176003481); - QTest::newRow("167.85MiB") << "167.85 MiB" << BigInteger(176003481); - QTest::newRow("167.85MiB") << "167.85\tMiB" << BigInteger(176003481); + QTest::newRow("167.85MiB 1") << "167.85MiB" << BigInteger(176003481); + QTest::newRow("167.85MiB 2") << "167.85 MiB" << BigInteger(176003481); + QTest::newRow("167.85MiB 3") << "167.85 MiB" << BigInteger(176003481); + QTest::newRow("167.85MiB 4") << "167.85\tMiB" << BigInteger(176003481); - QTest::newRow("2.95GiB") << "2.95GiB" << BigInteger(3167538380); - QTest::newRow("2.95GiB") << "2.95 GiB" << BigInteger(3167538380); - QTest::newRow("2.95GiB") << "2.95 GiB" << BigInteger(3167538380); - QTest::newRow("2.95GiB") << "2.95\tGiB" << BigInteger(3167538380); + QTest::newRow("2.95GiB 1") << "2.95GiB" << BigInteger(3167538380); + QTest::newRow("2.95GiB 2") << "2.95 GiB" << BigInteger(3167538380); + QTest::newRow("2.95GiB 3") << "2.95 GiB" << BigInteger(3167538380); + QTest::newRow("2.95GiB 4") << "2.95\tGiB" << BigInteger(3167538380); - QTest::newRow("1.02TiB") << "1.02TiB" << BigInteger(1121501860331); - QTest::newRow("1.02TiB") << "1.02 TiB" << BigInteger(1121501860331); - QTest::newRow("1.02TiB") << "1.02 TiB" << BigInteger(1121501860331); - QTest::newRow("1.02TiB") << "1.02\tTiB" << BigInteger(1121501860331); + QTest::newRow("1.02TiB 1") << "1.02TiB" << BigInteger(1121501860331); + QTest::newRow("1.02TiB 2") << "1.02 TiB" << BigInteger(1121501860331); + QTest::newRow("1.02TiB 3") << "1.02 TiB" << BigInteger(1121501860331); + QTest::newRow("1.02TiB 4") << "1.02\tTiB" << BigInteger(1121501860331); - QTest::newRow("estim") << "~55.43MiB" << BigInteger(58122567); - QTest::newRow("estim") << "~55.43 MiB" << BigInteger(58122567); - QTest::newRow("estim") << " ~ 55.43 MiB" << BigInteger(58122567); + QTest::newRow("estimated 1") << "~55.43MiB" << BigInteger(58122567); + QTest::newRow("estimated 2") << "~55.43 MiB" << BigInteger(58122567); + QTest::newRow("estimated 3") << " ~ 55.43 MiB" << BigInteger(58122567); QTest::newRow("bigger than integer 32-bit range") << "999.99GiB" << BigInteger(1073731086581); @@ -340,10 +340,10 @@ void tst_Format::wrapText_data() QTest::addColumn("length"); QTest::addColumn("expected"); - QTest::newRow("empty") << QString() << 0 << QString(); - QTest::newRow("dots") << "aa.aaaa.a." << 0 << "aa. aaaa. a."; - QTest::newRow("dots") << "magnet:aa.aaaa.a" << 0 << "magnet: aa. aaaa. a"; - QTest::newRow("dots") << "ftp://aa/aaaa/a.aa" << 6 << "ftp:// aa/aaaa/ a.aa"; + QTest::newRow("null") << QString() << 0 << QString(); + QTest::newRow("space") << "aa.aaaa.a." << 0 << "aa. aaaa. a."; + QTest::newRow("space 2") << "magnet:aa.aaaa.a" << 0 << "magnet: aa. aaaa. a"; + QTest::newRow("space 3") << "ftp://aa/aaaa/a.aa" << 6 << "ftp:// aa/aaaa/ a.aa"; } void tst_Format::wrapText() @@ -362,8 +362,8 @@ void tst_Format::boolToHtml_data() QTest::addColumn("input"); QTest::addColumn("expected"); - QTest::newRow("") << false << "False"; - QTest::newRow("") << true << "True"; + QTest::newRow("false") << false << "False"; + QTest::newRow("true") << true << "True"; } /*! @@ -384,8 +384,8 @@ void tst_Format::markDownToHtml_data() QTest::addColumn("input"); QTest::addColumn("expected"); - QTest::newRow("") << QString() << QString(); - QTest::newRow("") << "\n" << "
\n"; + QTest::newRow("null") << QString() << QString(); + QTest::newRow("newline") << "\n" << "
\n"; } void tst_Format::markDownToHtml() diff --git a/test/core/mask/tst_mask.cpp b/test/core/mask/tst_mask.cpp index 5e4a0b00..8adb11d6 100644 --- a/test/core/mask/tst_mask.cpp +++ b/test/core/mask/tst_mask.cpp @@ -72,10 +72,10 @@ void tst_Mask::fromUserInput_data() /* End of line */ QUrl expectedEOL("https://www.example.org/image.jpg"); - QTest::newRow("EOL") << "https://www.example.org/image.jpg\n" << expectedEOL; - QTest::newRow("EOL") << "https://www.example.org/image.jpg\r" << expectedEOL; - QTest::newRow("EOL") << "https://www.example.org/image.jpg\r\n" << expectedEOL; - QTest::newRow("EOL") << "https://www.example.org/image.jpg%0A%0D%0D" << expectedEOL; + QTest::newRow("EOL N") << "https://www.example.org/image.jpg\n" << expectedEOL; + QTest::newRow("EOL R") << "https://www.example.org/image.jpg\r" << expectedEOL; + QTest::newRow("EOL RN") << "https://www.example.org/image.jpg\r\n" << expectedEOL; + QTest::newRow("EOL %") << "https://www.example.org/image.jpg%0A%0D%0D" << expectedEOL; } void tst_Mask::fromUserInput() @@ -142,8 +142,8 @@ void tst_Mask::interpret_data() /* Composites */ QTest::newRow("composite") << url << "*name*.*ext*" << "myimage.tar.gz"; - QTest::newRow("file separator /") << url << "*url*/*subdirs*/*name*.*ext*" << "www.myweb.com/images/01/myimage.tar.gz"; - QTest::newRow("file separator \\") << url << "*url*\\*subdirs*\\*name*.*ext*" << "www.myweb.com/images/01/myimage.tar.gz"; + QTest::newRow("file separator slash") << url << "*url*/*subdirs*/*name*.*ext*" << "www.myweb.com/images/01/myimage.tar.gz"; + QTest::newRow("file separator backslash") << url << "*url*\\*subdirs*\\*name*.*ext*" << "www.myweb.com/images/01/myimage.tar.gz"; /* Limit cases */ QTest::newRow("no file") << "https://www.myweb.com/images/" << mask << "www.myweb.com/images"; @@ -155,10 +155,10 @@ void tst_Mask::interpret_data() QTest::newRow("no basename") << "https://www.myweb.com/.image" << mask << "www.myweb.com/.image"; /* Bad masks */ - QTest::newRow("trailing . and /") << url << "///*name*..//./." << "myimage.tar"; - QTest::newRow("trailing . and /") << url << "///*ext*..//./." << "gz"; - QTest::newRow("duplicate /") << url << "*url*/////*name*" << "www.myweb.com/myimage.tar"; - QTest::newRow("duplicate /") << url << "*url*/////*ext*" << "www.myweb.com/gz"; + QTest::newRow("name with trailing . and slash") << url << "///*name*..//./." << "myimage.tar"; + QTest::newRow("extension with trailing . and slash") << url << "///*ext*..//./." << "gz"; + QTest::newRow("name with duplicate slash") << url << "*url*/////*name*" << "www.myweb.com/myimage.tar"; + QTest::newRow("extension with duplicate slash") << url << "*url*/////*ext*" << "www.myweb.com/gz"; } void tst_Mask::interpret() @@ -217,15 +217,15 @@ void tst_Mask::interpretForbidden_data() << "http://www.example.org/%3F/question_mark_%3F.jpg" << QString() << mask << "www.example.org/_/question_mark__.jpg"; - QTest::newRow("'?' is a query here") + QTest::newRow("'?' is a query here 1") << "http://www.example.org/archive.tar.gz?id=1345&lang=eng" << QString() << mask << "www.example.org/archive.tar.gz"; - QTest::newRow("'?' is a query here") + QTest::newRow("'?' is a query here 2") << "http://www.example.org/faq.html?#fragment" << QString() << mask << "www.example.org/faq.html"; - QTest::newRow("'?' is a query here") + QTest::newRow("'?' is a query here 3") << "http://www.example.org/faq.html?" << QString() << mask << "www.example.org/faq.html"; diff --git a/test/core/regex/tst_regex.cpp b/test/core/regex/tst_regex.cpp index ac52ec93..3ce359b7 100644 --- a/test/core/regex/tst_regex.cpp +++ b/test/core/regex/tst_regex.cpp @@ -40,25 +40,25 @@ void tst_Regex::getCaptures_data() QTest::newRow("empty") << "" << QStringList{}; - QTest::newRow("simple") << "[01:03]" << QStringList{"[01:03]"}; - QTest::newRow("simple") << "(01:03)" << QStringList{"(01:03)"}; - QTest::newRow("simple") << "[01 03]" << QStringList{"[01 03]"}; - QTest::newRow("simple") << "(01 03)" << QStringList{"(01 03)"}; - QTest::newRow("simple") << "[01-03]" << QStringList{"[01-03]"}; - QTest::newRow("simple") << "(01-03)" << QStringList{"(01-03)"}; + QTest::newRow("simple [:]") << "[01:03]" << QStringList{"[01:03]"}; + QTest::newRow("simple (:)") << "(01:03)" << QStringList{"(01:03)"}; + QTest::newRow("simple [ ]") << "[01 03]" << QStringList{"[01 03]"}; + QTest::newRow("simple ( )") << "(01 03)" << QStringList{"(01 03)"}; + QTest::newRow("simple [-]") << "[01-03]" << QStringList{"[01-03]"}; + QTest::newRow("simple (-)") << "(01-03)" << QStringList{"(01-03)"}; - QTest::newRow("multiple") << "[01:03](10 20)" << QStringList{"[01:03]", "(10 20)"}; - QTest::newRow("multiple") << "da/[01:03]/da/(10 20)/da" << QStringList{"[01:03]", "(10 20)"}; + QTest::newRow("multiple 1") << "[01:03](10 20)" << QStringList{"[01:03]", "(10 20)"}; + QTest::newRow("multiple 2") << "da/[01:03]/da/(10 20)/da" << QStringList{"[01:03]", "(10 20)"}; - QTest::newRow("embedded") << "[[01:03]/(10 20)]" << QStringList{"[01:03]", "(10 20)"}; - QTest::newRow("embedded") << "([01:03]/(10 20))" << QStringList{"[01:03]", "(10 20)"}; + QTest::newRow("embedded []") << "[[01:03]/(10 20)]" << QStringList{"[01:03]", "(10 20)"}; + QTest::newRow("embedded ()") << "([01:03]/(10 20))" << QStringList{"[01:03]", "(10 20)"}; QTest::newRow("invalid") << "01:03" << QStringList{}; - QTest::newRow("invalid") << "[01:03" << QStringList{}; - QTest::newRow("invalid") << "[123]" << QStringList{}; - QTest::newRow("invalid") << "[01:02:03]" << QStringList{}; - QTest::newRow("invalid") << "[01:02 03]" << QStringList{}; - QTest::newRow("invalid") << "[01 02 03]" << QStringList{}; + QTest::newRow("invalid [") << "[01:03" << QStringList{}; + QTest::newRow("invalid []") << "[123]" << QStringList{}; + QTest::newRow("invalid [::]") << "[01:02:03]" << QStringList{}; + QTest::newRow("invalid [: ]") << "[01:02 03]" << QStringList{}; + QTest::newRow("invalid [ ]") << "[01 02 03]" << QStringList{}; QTest::newRow("weird but valid") << "[01:03)" << QStringList{"[01:03)"}; } diff --git a/test/core/resourceitem/tst_resourceitem.cpp b/test/core/resourceitem/tst_resourceitem.cpp index 9144a569..6b3ac2b2 100644 --- a/test/core/resourceitem/tst_resourceitem.cpp +++ b/test/core/resourceitem/tst_resourceitem.cpp @@ -47,28 +47,28 @@ void tst_ResourceItem::localFileUrl_data() << "" << QUrl("file:///home/me/documents/myimage.tar.gz"); - QTest::newRow("windows file system") + QTest::newRow("windows file system 1") << "https://www.myweb.com/images/01/myimage.tar.gz" << "C:/Temp" << "*name*.*ext*" << "" << QUrl("file:///C:/Temp/myimage.tar.gz"); - QTest::newRow("windows file system") + QTest::newRow("windows file system 2") << "https://www.myweb.com/images/01/myimage.tar.gz" << "C:/Temp" << "*url*\\*subdirs*\\*name*.*ext*" << "" << QUrl("file:///C:/Temp/www.myweb.com/images/01/myimage.tar.gz"); - QTest::newRow("windows custom filename") + QTest::newRow("windows custom filename 1") << "https://www.myweb.com/images/01/myimage.tar.gz" << "C:/Temp" << "*name*.*ext*" << "A NEW FILE NAME" << QUrl("file:///C:/Temp/A NEW FILE NAME.gz"); - QTest::newRow("windows custom filename") + QTest::newRow("windows custom filename 2") << "https://www.myweb.com/images/01/myimage.tar.gz" << "C:/Temp" << "*url*\\*subdirs*\\*name*.*ext*" diff --git a/test/core/stream/tst_stream.cpp b/test/core/stream/tst_stream.cpp index 1f177eb4..36469c30 100644 --- a/test/core/stream/tst_stream.cpp +++ b/test/core/stream/tst_stream.cpp @@ -883,15 +883,15 @@ void tst_Stream::fileBaseName_data() QTest::newRow("null") << QString() << QString(); QTest::newRow("empty") << "" << QString(); - QTest::newRow("separator") << "Live 10/02/2018" << "Live 10-02-2018"; - QTest::newRow("separator") << "here\\we\\come" << "Here-we-come"; + QTest::newRow("slash") << "Live 10/02/2018" << "Live 10-02-2018"; + QTest::newRow("backslash") << "here\\we\\come" << "Here-we-come"; QTest::newRow("tab") << "\t here\twe\tcome \t" << "Here We Come"; QTest::newRow("minus") << "- \x2D — \u2212 \u2014" << "- - - - -"; QTest::newRow("brackets") << "Windsor ['98]" << "Windsor ['98]"; - QTest::newRow("brackets") << "Windsor ('98)" << "Windsor ('98)"; + QTest::newRow("parenthesis") << "Windsor ('98)" << "Windsor ('98)"; QTest::newRow("@") << "Live @ Windsor" << "Live @ Windsor"; QTest::newRow("extra _") << "_*_Cambridge_*_" << "-Cambridge-"; @@ -906,12 +906,12 @@ void tst_Stream::fileBaseName_data() // https://www.youtube.com/watch?v=lSQ7pWUo3g4 QTest::newRow("_Con_struction") << "Construction" << "Construction"; - QTest::newRow("unuseful text") << "Live '01 (Official Video)" << "Live '01"; - QTest::newRow("unuseful text") << "(Official Video) Live '01" << "Live '01"; - QTest::newRow("unuseful text") << "Live (Official Video) '01" << "Live '01"; - QTest::newRow("unuseful text") << "Live (Official Visualizer) '01" << "Live '01"; - QTest::newRow("unuseful text") << "Live ((Official Visualizer)) '01" << "Live '01"; - QTest::newRow("unuseful text") << "Live (Radio Edit) '01" << "Live '01"; + QTest::newRow("useless text 1") << "Live '01 (Official Video)" << "Live '01"; + QTest::newRow("useless text 2") << "(Official Video) Live '01" << "Live '01"; + QTest::newRow("useless text 3") << "Live (Official Video) '01" << "Live '01"; + QTest::newRow("useless text 4") << "Live (Official Visualizer) '01" << "Live '01"; + QTest::newRow("useless text 5") << "Live ((Official Visualizer)) '01" << "Live '01"; + QTest::newRow("useless text 6") << "Live (Radio Edit) '01" << "Live '01"; // BUGFIX with "Construction" that becomes "filestruction" // https://www.youtube.com/watch?v=lSQ7pWUo3g4 @@ -943,20 +943,20 @@ void tst_Stream::guestimateFullSize_data() QTest::newRow("empty") << "" << BigInteger(-1); QTest::newRow("default") << "244+140" << BigInteger(294311 + 280597); - QTest::newRow("audio") << "18" << BigInteger(1552999); - QTest::newRow("audio") << "43" << BigInteger(2875968); - QTest::newRow("audio") << "140" << BigInteger(280597); + QTest::newRow("audio 1") << "18" << BigInteger(1552999); + QTest::newRow("audio 2") << "43" << BigInteger(2875968); + QTest::newRow("audio 3") << "140" << BigInteger(280597); - QTest::newRow("audio+video") << "160+140" << BigInteger(63901 + 280597); - QTest::newRow("audio+video") << "278+140" << BigInteger(53464 + 280597); + QTest::newRow("audio+video 1") << "160+140" << BigInteger(63901 + 280597); + QTest::newRow("audio+video 2") << "278+140" << BigInteger(53464 + 280597); /* * Invalid formats * In yt-dlp, video ID must be the first ID. * But we accept them as valid here. */ - QTest::newRow("audio+video") << "140+160" << BigInteger(280597 + 63901); - QTest::newRow("audio+video") << "140+278" << BigInteger(280597 + 53464); + QTest::newRow("audio+video 3") << "140+160" << BigInteger(280597 + 63901); + QTest::newRow("audio+video 4") << "140+278" << BigInteger(280597 + 53464); } void tst_Stream::guestimateFullSize() @@ -981,20 +981,20 @@ void tst_Stream::fileExtension_data() QTest::newRow("empty") << "" << "webm"; QTest::newRow("default") << "244+140" << "webm"; - QTest::newRow("audio") << "18" << "mp4"; - QTest::newRow("audio") << "43" << "webm"; - QTest::newRow("audio") << "140" << "m4a"; + QTest::newRow("audio 1") << "18" << "mp4"; + QTest::newRow("audio 2") << "43" << "webm"; + QTest::newRow("audio 3") << "140" << "m4a"; - QTest::newRow("audio+video") << "160+140" << "mp4"; - QTest::newRow("audio+video") << "278+140" << "webm"; + QTest::newRow("audio+video 1") << "160+140" << "mp4"; + QTest::newRow("audio+video 2") << "278+140" << "webm"; /* * Invalid formats * In yt-dlp, video ID must be the first ID. * But we accept them as valid here. */ - QTest::newRow("audio+video") << "140+160" << "mp4"; - QTest::newRow("audio+video") << "140+278" << "webm"; + QTest::newRow("audio+video 3") << "140+160" << "mp4"; + QTest::newRow("audio+video 4") << "140+278" << "webm"; } void tst_Stream::fileExtension() @@ -1058,23 +1058,23 @@ void tst_Stream::matchesHost_data() QTest::newRow("null") << QString() << QStringList() << false; QTest::newRow("empty") << "" << QStringList() << false; - QTest::newRow("simple") << "www.absnews.com" << QStringList( {"absnews:videos"} ) << false; - QTest::newRow("simple") << "www.absnews.com" << QStringList( {"absnews.com"} ) << true; - QTest::newRow("simple") << "videos.absnews.com" << QStringList( {"absnews:videos"} ) << true; - QTest::newRow("simple") << "videos.absnews.com" << QStringList( {"absnews.com:videos"} ) << true; - QTest::newRow("simple") << "videos.www.absnews.com" << QStringList( {"absnews:videos"} ) << true; - QTest::newRow("simple") << "player.videos.absnews.com" << QStringList( {"absnews:videos:player"} ) << true; + QTest::newRow("simple 1") << "www.absnews.com" << QStringList( {"absnews:videos"} ) << false; + QTest::newRow("simple 2") << "www.absnews.com" << QStringList( {"absnews.com"} ) << true; + QTest::newRow("simple 3") << "videos.absnews.com" << QStringList( {"absnews:videos"} ) << true; + QTest::newRow("simple 4") << "videos.absnews.com" << QStringList( {"absnews.com:videos"} ) << true; + QTest::newRow("simple 5") << "videos.www.absnews.com" << QStringList( {"absnews:videos"} ) << true; + QTest::newRow("simple 6") << "player.videos.absnews.com" << QStringList( {"absnews:videos:player"} ) << true; QTest::newRow("simple list") << "www.youtube.com" << QStringList( {"youtube", "youtube.com"} ) << true; QTest::newRow("case sensitive") << "www.bild.de" << QStringList( {"Bild"} ) << true; - QTest::newRow("contains") << "www.absnews.com" << QStringList( {"abs"} ) << false; - QTest::newRow("contains") << "www.absnews.com" << QStringList( {"news"} ) << false; - QTest::newRow("contains") << "www.absnews.com" << QStringList( {"news.com"} ) << false; + QTest::newRow("contains 1") << "www.absnews.com" << QStringList( {"abs"} ) << false; + QTest::newRow("contains 2") << "www.absnews.com" << QStringList( {"news"} ) << false; + QTest::newRow("contains 3") << "www.absnews.com" << QStringList( {"news.com"} ) << false; - QTest::newRow("no match") << "www.aol-videos.com" << QStringList( {"aol.com"} ) << false; - QTest::newRow("no match") << "www.aol-videos.com" << QStringList( {"aol"} ) << false; - QTest::newRow("no match") << "www.bildung.de" << QStringList( {"Bild"} ) << false; + QTest::newRow("no match 1") << "www.aol-videos.com" << QStringList( {"aol.com"} ) << false; + QTest::newRow("no match 2") << "www.aol-videos.com" << QStringList( {"aol"} ) << false; + QTest::newRow("no match 3") << "www.bildung.de" << QStringList( {"Bild"} ) << false; QTest::newRow("no match list") << "www.youtube.de" << QStringList( {"youtu.be", "youtube.com", "youtube:video"} ) << false; // colon symbol ':' -> With 'abcnews:video', the hostname must contains 'abcnews' and also 'video' diff --git a/test/core/torrentbasecontext/tst_torrentbasecontext.cpp b/test/core/torrentbasecontext/tst_torrentbasecontext.cpp index 4da9a908..ff0ff884 100644 --- a/test/core/torrentbasecontext/tst_torrentbasecontext.cpp +++ b/test/core/torrentbasecontext/tst_torrentbasecontext.cpp @@ -38,18 +38,18 @@ void tst_TorrentBaseContext::computePriority_data() QTest::newRow("unique item") << 0 << 1 << static_cast(TorrentFileInfo::Normal); - QTest::newRow("2 items") << 0 << 2 << static_cast(TorrentFileInfo::Normal); - QTest::newRow("2 items") << 1 << 2 << static_cast(TorrentFileInfo::Normal); + QTest::newRow("2 items (item 0)") << 0 << 2 << static_cast(TorrentFileInfo::Normal); + QTest::newRow("2 items (item 1)") << 1 << 2 << static_cast(TorrentFileInfo::Normal); - QTest::newRow("9 items") << 0 << 9 << static_cast(TorrentFileInfo::High); - QTest::newRow("9 items") << 1 << 9 << static_cast(TorrentFileInfo::High); - QTest::newRow("9 items") << 2 << 9 << static_cast(TorrentFileInfo::High); - QTest::newRow("9 items") << 3 << 9 << static_cast(TorrentFileInfo::Normal); - QTest::newRow("9 items") << 4 << 9 << static_cast(TorrentFileInfo::Normal); - QTest::newRow("9 items") << 5 << 9 << static_cast(TorrentFileInfo::Normal); - QTest::newRow("9 items") << 6 << 9 << static_cast(TorrentFileInfo::Low); - QTest::newRow("9 items") << 7 << 9 << static_cast(TorrentFileInfo::Low); - QTest::newRow("9 items") << 8 << 9 << static_cast(TorrentFileInfo::Low); + QTest::newRow("9 items (item 0)") << 0 << 9 << static_cast(TorrentFileInfo::High); + QTest::newRow("9 items (item 1)") << 1 << 9 << static_cast(TorrentFileInfo::High); + QTest::newRow("9 items (item 2)") << 2 << 9 << static_cast(TorrentFileInfo::High); + QTest::newRow("9 items (item 3)") << 3 << 9 << static_cast(TorrentFileInfo::Normal); + QTest::newRow("9 items (item 4)") << 4 << 9 << static_cast(TorrentFileInfo::Normal); + QTest::newRow("9 items (item 5)") << 5 << 9 << static_cast(TorrentFileInfo::Normal); + QTest::newRow("9 items (item 6)") << 6 << 9 << static_cast(TorrentFileInfo::Low); + QTest::newRow("9 items (item 7)") << 7 << 9 << static_cast(TorrentFileInfo::Low); + QTest::newRow("9 items (item 8)") << 8 << 9 << static_cast(TorrentFileInfo::Low); } void tst_TorrentBaseContext::computePriority() diff --git a/test/core/updatechecker/tst_updatechecker.cpp b/test/core/updatechecker/tst_updatechecker.cpp index e083d782..c492a350 100644 --- a/test/core/updatechecker/tst_updatechecker.cpp +++ b/test/core/updatechecker/tst_updatechecker.cpp @@ -38,23 +38,22 @@ void tst_UpdateChecker::cleanTag_data() QTest::addColumn("expected"); QTest::addColumn("input"); - QTest::newRow("null") << QString() << QString(); QTest::newRow("null") << "" << QString(); - QTest::newRow("null") << "" << ""; + QTest::newRow("empty") << "" << ""; QTest::newRow("equal") << "2.5.0" << "2.5.0"; - QTest::newRow("equal") << "2.5.0" << " 2.5.0 "; - - QTest::newRow("dot") << "2.5.0" << "...2.5.0..."; - QTest::newRow("dot") << "2.5.0" << "...2., ,5..Aaa..0"; - QTest::newRow("dot") << "2.5.0.1254" << "version 2.5.0 build 1254"; - - QTest::newRow("prefix") << "2.5.0" << "v2.5.0"; - QTest::newRow("prefix") << "2.5.0" << "v_2.5.0"; - QTest::newRow("prefix") << "2.5.0" << "v.2.5.0"; - QTest::newRow("prefix") << "2.5.0" << "v 2.5.0"; - QTest::newRow("prefix") << "2.5.0" << "version 2.5.0"; - QTest::newRow("prefix") << "2.5.0" << " version 2.5.0 bis "; + QTest::newRow("equal untrimmed") << "2.5.0" << " 2.5.0 "; + + QTest::newRow("dot before") << "2.5.0" << "...2.5.0..."; + QTest::newRow("dot inside") << "2.5.0" << "...2., ,5..Aaa..0"; + QTest::newRow("dot verbose") << "2.5.0.1254" << "version 2.5.0 build 1254"; + + QTest::newRow("prefix v") << "2.5.0" << "v2.5.0"; + QTest::newRow("prefix v_") << "2.5.0" << "v_2.5.0"; + QTest::newRow("prefix v.") << "2.5.0" << "v.2.5.0"; + QTest::newRow("prefix v+space") << "2.5.0" << "v 2.5.0"; + QTest::newRow("prefix version") << "2.5.0" << "version 2.5.0"; + QTest::newRow("prefix untrimmed") << "2.5.0" << " version 2.5.0 bis "; } void tst_UpdateChecker::cleanTag() @@ -73,37 +72,36 @@ void tst_UpdateChecker::isVersionGreaterThan_data() QTest::addColumn("s1"); QTest::addColumn("s2"); - QTest::newRow("null") << false << QString() << QString(); QTest::newRow("null") << false << "" << QString(); - QTest::newRow("null") << false << "" << ""; + QTest::newRow("empty") << false << "" << ""; QTest::newRow("equal") << false << "2.5.0" << "2.5.0"; QTest::newRow("number") << false << "2.5.0" << "2.5.1"; - QTest::newRow("number") << true << "2.5.1" << "2.5.0"; + QTest::newRow("number inversed") << true << "2.5.1" << "2.5.0"; // Sort versions with different length: // "2" < "2.0" < "2.4" <"2.4.0" - QTest::newRow("different length") << true << "2.0" << "2"; - QTest::newRow("different length") << true << "2.4" << "2.0"; - QTest::newRow("different length") << true << "2.4.0" << "2.4"; - QTest::newRow("different length") << true << "2.5" << "2.4.9"; + QTest::newRow("different length 1 vs 0") << true << "2.0" << "2"; + QTest::newRow("different length 1 vs 1") << true << "2.4" << "2.0"; + QTest::newRow("different length 3 vs 2") << true << "2.4.0" << "2.4"; + QTest::newRow("different length 2 vs 3") << true << "2.5" << "2.4.9"; // Bugfix QCollator when no ICU is available QTest::newRow("QCollator 100 > 99") << true << "2.5.100" << "2.5.99"; QTest::newRow("QCollator 99 > 10 ") << true << "2.5.99" << "2.5.10"; QTest::newRow("QCollator 099 > 10 ") << true << "2.5.099" << "2.5.10"; - QTest::newRow("prefix") << true << "2.5.1" << "v2.5.0"; - QTest::newRow("prefix") << true << "2.5.1" << "v_2.5.0"; - QTest::newRow("prefix") << true << "2.5.1" << "v.2.5.0"; - QTest::newRow("prefix") << true << "2.5.1" << "v 2.5.0"; - QTest::newRow("prefix") << true << "2.5.1" << "version 2.5.0"; - - QTest::newRow("prefix") << true << "v2.5.1" << "2.5.0"; - QTest::newRow("prefix") << true << "v_2.5.1" << "2.5.0"; - QTest::newRow("prefix") << true << "v.2.5.1" << "2.5.0"; - QTest::newRow("prefix") << true << "v 2.5.1" << "2.5.0"; - QTest::newRow("prefix") << true << "version 2.5.1" << "2.5.0"; + QTest::newRow("prefix v") << true << "2.5.1" << "v2.5.0"; + QTest::newRow("prefix v_") << true << "2.5.1" << "v_2.5.0"; + QTest::newRow("prefix v.") << true << "2.5.1" << "v.2.5.0"; + QTest::newRow("prefix v+space") << true << "2.5.1" << "v 2.5.0"; + QTest::newRow("prefix version") << true << "2.5.1" << "version 2.5.0"; + + QTest::newRow("prefix 2 v") << true << "v2.5.1" << "2.5.0"; + QTest::newRow("prefix 2 v_") << true << "v_2.5.1" << "2.5.0"; + QTest::newRow("prefix 2 v.") << true << "v.2.5.1" << "2.5.0"; + QTest::newRow("prefix 2 v+space") << true << "v 2.5.1" << "2.5.0"; + QTest::newRow("prefix 2 version") << true << "version 2.5.1" << "2.5.0"; } void tst_UpdateChecker::isVersionGreaterThan() diff --git a/test/widgets/pathwidget/CMakeLists.txt b/test/widgets/pathwidget/CMakeLists.txt index d13e72c2..5c942002 100644 --- a/test/widgets/pathwidget/CMakeLists.txt +++ b/test/widgets/pathwidget/CMakeLists.txt @@ -15,6 +15,10 @@ set(MY_TEST_SOURCES ${CMAKE_SOURCE_DIR}/src/widgets/pathwidget.cpp ) +qt_add_resources(MY_TEST_SOURCES + ${CMAKE_SOURCE_DIR}/src/resources.qrc +) + add_executable(${MY_TEST_TARGET} WIN32 ${CMAKE_CURRENT_SOURCE_DIR}/tst_pathwidget.cpp ${MY_TEST_SOURCES} diff --git a/test/widgets/textedit/tst_textedit.cpp b/test/widgets/textedit/tst_textedit.cpp index eaa0c28a..0f6f3203 100644 --- a/test/widgets/textedit/tst_textedit.cpp +++ b/test/widgets/textedit/tst_textedit.cpp @@ -35,20 +35,20 @@ void tst_TextEdit::fragmentToPaste_data() QTest::addColumn("input"); QTest::addColumn("expected"); - QTest::newRow("simple") << "" << ""; - QTest::newRow("simple") << "Hello World" << "Hello World"; + QTest::newRow("empty") << "" << ""; + QTest::newRow("trivial") << "Hello World" << "Hello World"; - QTest::newRow("multiple line RN") << "\r\nHello World" << ""; - QTest::newRow("multiple line RN") << "Hello\r\n World" << "Hello"; - QTest::newRow("multiple line RN") << "Hello World\r\n" << "Hello World"; + QTest::newRow("multiple line RN 1") << "\r\nHello World" << ""; + QTest::newRow("multiple line RN 2") << "Hello\r\n World" << "Hello"; + QTest::newRow("multiple line RN 3") << "Hello World\r\n" << "Hello World"; - QTest::newRow("multiple line R") << "\rHello World" << ""; - QTest::newRow("multiple line R") << "Hello\r World" << "Hello"; - QTest::newRow("multiple line R") << "Hello World\r" << "Hello World"; + QTest::newRow("multiple line R 1") << "\rHello World" << ""; + QTest::newRow("multiple line R 2") << "Hello\r World" << "Hello"; + QTest::newRow("multiple line R 3") << "Hello World\r" << "Hello World"; - QTest::newRow("multiple line N") << "\nHello World" << ""; - QTest::newRow("multiple line N") << "Hello\n World" << "Hello"; - QTest::newRow("multiple line N") << "Hello World\n" << "Hello World"; + QTest::newRow("multiple line N 1") << "\nHello World" << ""; + QTest::newRow("multiple line N 2") << "Hello\n World" << "Hello"; + QTest::newRow("multiple line N 3") << "Hello World\n" << "Hello World"; } void tst_TextEdit::fragmentToPaste() From 5bcc76de9d81f2b306f9bcc8251c7ccefb94c8c1 Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Mon, 11 Nov 2024 12:35:46 +0100 Subject: [PATCH 06/14] [Core] Fix debug warnings in data driven tests --- src/core/stream.cpp | 10 +++++----- src/core/torrentcontext_p.cpp | 8 ++++---- test/core/downloadmanager/tst_downloadmanager.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/core/stream.cpp b/src/core/stream.cpp index ad383464..d4437686 100644 --- a/src/core/stream.cpp +++ b/src/core/stream.cpp @@ -951,11 +951,11 @@ StreamObject StreamAssetDownloader::parseDumpItemStdOut(const QByteArray &bytes) QJsonDocument loadDoc(QJsonDocument::fromJson(bytes, &ok)); if (ok.error != QJsonParseError::NoError) { - qDebug() << Q_FUNC_INFO; - qDebug() << "! Error JSON:" << QJsonParseError::ParseError(ok.error); - qDebug() << " at position" << ok.offset; - qDebug() << bytes.mid(ok.offset - 20, ok.offset + 20); - qDebug() << QString("%0^").arg(QString().fill(' ', 20)); + // qDebug() << Q_FUNC_INFO; + // qDebug() << "! Error JSON:" << QJsonParseError::ParseError(ok.error); + // qDebug() << " at position" << ok.offset; + // qDebug() << bytes.mid(ok.offset - 20, ok.offset + 20); + // qDebug() << QString("%0^").arg(QString().fill(' ', 20)); obj.setError(StreamObject::ErrorJsonFormat); return obj; diff --git a/src/core/torrentcontext_p.cpp b/src/core/torrentcontext_p.cpp index 648ef0b7..5235cf8d 100644 --- a/src/core/torrentcontext_p.cpp +++ b/src/core/torrentcontext_p.cpp @@ -1172,10 +1172,10 @@ TorrentInitialMetaInfo WorkerThread::dump(const QString &filename) const lt::error_code error_code; const lt::torrent_info torrent_info(filename.toStdString(), error_code); if (error_code) { - qWarning() << "failed to decode file '" - << filename - << "' due to" - << QString::fromStdString(error_code.message()); + // qWarning() << "failed to decode file '" + // << filename + // << "' due to" + // << QString::fromStdString(error_code.message()); return {}; } auto ptr_torrent_info= std::make_shared(torrent_info); diff --git a/test/core/downloadmanager/tst_downloadmanager.cpp b/test/core/downloadmanager/tst_downloadmanager.cpp index d468d5bc..a20b0a8e 100644 --- a/test/core/downloadmanager/tst_downloadmanager.cpp +++ b/test/core/downloadmanager/tst_downloadmanager.cpp @@ -64,7 +64,7 @@ DownloadItem *tst_DownloadManager::createDummyJob( const QString url, const QString mask) { Q_ASSERT(m_tempDir.isValid()); - qDebug() << "Directory for tests: " << m_tempDir.path(); + // qDebug() << "Directory for tests: " << m_tempDir.path(); ResourceItem* resource = new ResourceItem(); resource->setUrl(url); resource->setDestination(m_tempDir.path()); From 093e1a783f7b7fd0781838c002fa19b534c409d2 Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Mon, 11 Nov 2024 12:36:42 +0100 Subject: [PATCH 07/14] [Core] Remove redundant test --- test/core/stream/tst_stream.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/core/stream/tst_stream.cpp b/test/core/stream/tst_stream.cpp index 36469c30..16397575 100644 --- a/test/core/stream/tst_stream.cpp +++ b/test/core/stream/tst_stream.cpp @@ -902,10 +902,6 @@ void tst_Stream::fileBaseName_data() << "\"Bohemian Rhapsody\" Steve Vai & Malmsteen & Zakk Wylde & Nuno@Atlantic City (11/30/18)" << "'Bohemian Rhapsody' Steve Vai & Malmsteen & Zakk Wylde & Nuno@Atlantic City (11-30-18)" ; - // BUGFIX with "Construction" that becomes "filestruction" - // https://www.youtube.com/watch?v=lSQ7pWUo3g4 - QTest::newRow("_Con_struction") << "Construction" << "Construction"; - QTest::newRow("useless text 1") << "Live '01 (Official Video)" << "Live '01"; QTest::newRow("useless text 2") << "(Official Video) Live '01" << "Live '01"; QTest::newRow("useless text 3") << "Live (Official Video) '01" << "Live '01"; From a8b30bc5463e2f58a7a5104fa461912b1a60e033 Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Mon, 11 Nov 2024 12:37:27 +0100 Subject: [PATCH 08/14] [Core] Fix url to website --- test/core/downloadmanager/tst_downloadmanager.cpp | 2 +- test/core/mask/tst_mask.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/core/downloadmanager/tst_downloadmanager.cpp b/test/core/downloadmanager/tst_downloadmanager.cpp index a20b0a8e..4c473938 100644 --- a/test/core/downloadmanager/tst_downloadmanager.cpp +++ b/test/core/downloadmanager/tst_downloadmanager.cpp @@ -84,7 +84,7 @@ void tst_DownloadManager::appendJobPaused() QSignalSpy spyJobFinished(target.data(), SIGNAL(jobFinished(IDownloadItem*))); /* The most permanent url in the whole universe */ - // QString address = "https://www.arrow-dl.com/styles.css"; // css not png + // QString address = "https://www.arrow-dl.com/favicon.ico"; // ico, not png /// \todo fix IDownloadItem::NetworkError with "3xx Unknown redirect error" with SSL url diff --git a/test/core/mask/tst_mask.cpp b/test/core/mask/tst_mask.cpp index 8adb11d6..c95a8795 100644 --- a/test/core/mask/tst_mask.cpp +++ b/test/core/mask/tst_mask.cpp @@ -35,11 +35,11 @@ private slots: void interpret_data(); void interpret(); - void interpretEscaped(); void interpretEscaped_data(); + void interpretEscaped(); - void interpretForbidden(); void interpretForbidden_data(); + void interpretForbidden(); }; From f3c93cc96530c67945726aece48e7025edfab3d0 Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Mon, 11 Nov 2024 13:13:41 +0100 Subject: [PATCH 09/14] [i18n] Fix translations --- src/locale/arrowdl_ar_EG.ts | 2 +- src/locale/arrowdl_de_DE.ts | 4 ++-- src/locale/arrowdl_en_US.ts | 2 +- src/locale/arrowdl_es_BO.ts | 2 +- src/locale/arrowdl_es_ES.ts | 2 +- src/locale/arrowdl_es_US.ts | 2 +- src/locale/arrowdl_fr_FR.ts | 2 +- src/locale/arrowdl_hu_HU.ts | 10 +++++----- src/locale/arrowdl_it_IT.ts | 4 ++-- src/locale/arrowdl_ja_JP.ts | 2 +- src/locale/arrowdl_ko_KR.ts | 2 +- src/locale/arrowdl_nl_NL.ts | 2 +- src/locale/arrowdl_pl_PL.ts | 2 +- src/locale/arrowdl_pt_BR.ts | 2 +- src/locale/arrowdl_pt_PT.ts | 2 +- src/locale/arrowdl_ru_RU.ts | 4 ++-- src/locale/arrowdl_vi_VN.ts | 2 +- src/locale/arrowdl_zh_CN.ts | 2 +- src/locale/arrowdl_zh_TW.ts | 2 +- 19 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/locale/arrowdl_ar_EG.ts b/src/locale/arrowdl_ar_EG.ts index d26fc052..64e53714 100644 --- a/src/locale/arrowdl_ar_EG.ts +++ b/src/locale/arrowdl_ar_EG.ts @@ -925,7 +925,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error diff --git a/src/locale/arrowdl_de_DE.ts b/src/locale/arrowdl_de_DE.ts index 5a2d9e17..1a911bc8 100644 --- a/src/locale/arrowdl_de_DE.ts +++ b/src/locale/arrowdl_de_DE.ts @@ -925,8 +925,8 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error - + 5xx Unknown server error + 5xx Unbekannter Serverfehler diff --git a/src/locale/arrowdl_en_US.ts b/src/locale/arrowdl_en_US.ts index 8ca7bc71..e614dda5 100644 --- a/src/locale/arrowdl_en_US.ts +++ b/src/locale/arrowdl_en_US.ts @@ -927,7 +927,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error diff --git a/src/locale/arrowdl_es_BO.ts b/src/locale/arrowdl_es_BO.ts index a5bb2a94..c59d6124 100644 --- a/src/locale/arrowdl_es_BO.ts +++ b/src/locale/arrowdl_es_BO.ts @@ -925,7 +925,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error diff --git a/src/locale/arrowdl_es_ES.ts b/src/locale/arrowdl_es_ES.ts index 232250fd..148b499a 100644 --- a/src/locale/arrowdl_es_ES.ts +++ b/src/locale/arrowdl_es_ES.ts @@ -925,7 +925,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error diff --git a/src/locale/arrowdl_es_US.ts b/src/locale/arrowdl_es_US.ts index f052b7c1..7acf58d2 100644 --- a/src/locale/arrowdl_es_US.ts +++ b/src/locale/arrowdl_es_US.ts @@ -925,7 +925,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error diff --git a/src/locale/arrowdl_fr_FR.ts b/src/locale/arrowdl_fr_FR.ts index 2f977dea..f2a794bc 100644 --- a/src/locale/arrowdl_fr_FR.ts +++ b/src/locale/arrowdl_fr_FR.ts @@ -927,7 +927,7 @@ Utiliser les délimiteurs de grappe, pour télécharger plusieurs fichiers en m - 5xx Unknown serveur error + 5xx Unknown server error 5xx Erreur de serveur inconnue diff --git a/src/locale/arrowdl_hu_HU.ts b/src/locale/arrowdl_hu_HU.ts index 66e1dc26..76d5a48e 100644 --- a/src/locale/arrowdl_hu_HU.ts +++ b/src/locale/arrowdl_hu_HU.ts @@ -926,7 +926,7 @@ A kötegleírók használatával több fájlt is letölthetsz egyszerre. - 5xx Unknown serveur error + 5xx Unknown server error 5xx Ismeretlen szerverhiba @@ -2250,12 +2250,12 @@ Néhány példa az alábbiakban látható. Kattints a példa beillesztéséhez.< Concurrent fragments: - + Aktuális letöltések 20 - + 20 @@ -2860,12 +2860,12 @@ Néhány példa az alábbiakban látható. Kattints a példa beillesztéséhez.< Bootstrap Icons (default) - + Bootstrap ikonok (alapértelmezett) FontAwesome Flat Design - + FontAwesome Flat Design diff --git a/src/locale/arrowdl_it_IT.ts b/src/locale/arrowdl_it_IT.ts index 4e64c254..99802896 100644 --- a/src/locale/arrowdl_it_IT.ts +++ b/src/locale/arrowdl_it_IT.ts @@ -928,8 +928,8 @@ L'applicazione non verrà scaricata con socket protetti (HTTPS, FTPS). - 5xx Unknown serveur error - 500 errore server sconosciuto + 5xx Unknown server error + 5xx errore server sconosciuto diff --git a/src/locale/arrowdl_ja_JP.ts b/src/locale/arrowdl_ja_JP.ts index e9c78ce2..bd3343d4 100644 --- a/src/locale/arrowdl_ja_JP.ts +++ b/src/locale/arrowdl_ja_JP.ts @@ -925,7 +925,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error diff --git a/src/locale/arrowdl_ko_KR.ts b/src/locale/arrowdl_ko_KR.ts index cc654a81..1350ac2a 100644 --- a/src/locale/arrowdl_ko_KR.ts +++ b/src/locale/arrowdl_ko_KR.ts @@ -925,7 +925,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error diff --git a/src/locale/arrowdl_nl_NL.ts b/src/locale/arrowdl_nl_NL.ts index 17a1db4a..b4d33949 100644 --- a/src/locale/arrowdl_nl_NL.ts +++ b/src/locale/arrowdl_nl_NL.ts @@ -926,7 +926,7 @@ Je kunt evt. de reeksomschrijvingen gebruiken om meerdere bestanden tegelijk te - 5xx Unknown serveur error + 5xx Unknown server error 5xx: onbekende serverfout diff --git a/src/locale/arrowdl_pl_PL.ts b/src/locale/arrowdl_pl_PL.ts index 88fad6a3..7c5f56a8 100644 --- a/src/locale/arrowdl_pl_PL.ts +++ b/src/locale/arrowdl_pl_PL.ts @@ -925,7 +925,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error diff --git a/src/locale/arrowdl_pt_BR.ts b/src/locale/arrowdl_pt_BR.ts index 21e07375..f14d7f31 100644 --- a/src/locale/arrowdl_pt_BR.ts +++ b/src/locale/arrowdl_pt_BR.ts @@ -926,7 +926,7 @@ Você também pode usar indicadores de lote para baixar vários arquivos de uma - 5xx Unknown serveur error + 5xx Unknown server error 5xx Erro de servidor desconhecido diff --git a/src/locale/arrowdl_pt_PT.ts b/src/locale/arrowdl_pt_PT.ts index 8aace67f..9087070d 100644 --- a/src/locale/arrowdl_pt_PT.ts +++ b/src/locale/arrowdl_pt_PT.ts @@ -925,7 +925,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error diff --git a/src/locale/arrowdl_ru_RU.ts b/src/locale/arrowdl_ru_RU.ts index ac7ec1ae..0aa5735b 100644 --- a/src/locale/arrowdl_ru_RU.ts +++ b/src/locale/arrowdl_ru_RU.ts @@ -925,8 +925,8 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error - 5xx Unknown server error + 5xx Unknown server error + diff --git a/src/locale/arrowdl_vi_VN.ts b/src/locale/arrowdl_vi_VN.ts index d6cb18fc..3c1df9e5 100644 --- a/src/locale/arrowdl_vi_VN.ts +++ b/src/locale/arrowdl_vi_VN.ts @@ -925,7 +925,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error diff --git a/src/locale/arrowdl_zh_CN.ts b/src/locale/arrowdl_zh_CN.ts index 19143dbc..7d1c6783 100644 --- a/src/locale/arrowdl_zh_CN.ts +++ b/src/locale/arrowdl_zh_CN.ts @@ -926,7 +926,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error 5xx 未知服务器错误 diff --git a/src/locale/arrowdl_zh_TW.ts b/src/locale/arrowdl_zh_TW.ts index aeb69b24..d66258ba 100644 --- a/src/locale/arrowdl_zh_TW.ts +++ b/src/locale/arrowdl_zh_TW.ts @@ -926,7 +926,7 @@ You can also use batch descriptors to download multiple files at one time. - 5xx Unknown serveur error + 5xx Unknown server error 5xx 未知伺服器錯誤 From 3e12e368fe02def1c38633c36baedc373dfce748 Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Mon, 11 Nov 2024 10:32:44 +0100 Subject: [PATCH 10/14] [Build] Update github workflow dependencies to use Node.js version 20 (LTS) --- .github/workflows/deployment.yml | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index 33e0c696..54762630 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -26,7 +26,7 @@ env: LibtorrentRasterbar_BUILD_DIR: ${{github.workspace}}/00/build/libtorrent-rasterbar LibtorrentRasterbar_INSTALL_DIR: ${{github.workspace}}/00/install/libtorrent-rasterbar # ^^ - # HACK cache@v3: using '/00/' instead of '/../': Relative pathing '.' and '..' is not allowed. + # HACK actions/cache@v3: using '/00/' instead of '/../': Relative pathing '.' and '..' is not allowed. LibtorrentRasterbar_VERSION_FILE: ${{github.workspace}}/3rd/libtorrent-rasterbar/include/libtorrent/version.hpp Application_VERSION_FILE: ${{github.workspace}}/version Changelog_FILE_NAME: ${{github.workspace}}/00/GIT-CHANGELOG.txt @@ -42,7 +42,7 @@ jobs: environment: production steps: - name: Check out repository code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Create WebBrowser Addons id: webaddons @@ -69,13 +69,13 @@ jobs: print(f"Addon_Web_Extension_Firefox={ artifact_firefox }", file=f) - name: Upload Chromium Addon - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: artifact_chromium path: ${{ steps.webaddons.outputs.Addon_Web_Extension_Chromium }} - name: Upload Firefox Addon - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: artifact_firefox path: ${{ steps.webaddons.outputs.Addon_Web_Extension_Firefox }} @@ -115,7 +115,7 @@ jobs: steps: - name: Check out repository code - uses: actions/checkout@v3 + uses: actions/checkout@v4 # - name: Clean Environment # shell: python # otherwise Windows uses Powershell, Linux uses bash @@ -224,7 +224,7 @@ jobs: echo "LibtorrentRasterbar_VERSION: '${{env.LibtorrentRasterbar_VERSION}}'" - name: Cache Libtorrent Static Libraries - uses: actions/cache@v3 + uses: actions/cache@v4 id: cache-libtorrent env: LibtorrentRasterbar_VERSION: ${{ steps.getversion.outputs.LibtorrentRasterbar_VERSION }} @@ -236,7 +236,7 @@ jobs: ${{env.LibtorrentRasterbar_INSTALL_DIR}} - name: Install Boost - uses: MarkusJx/install-boost@v2.4.3 + uses: MarkusJx/install-boost@v2.4.5 id: install-boost with: boost_version: ${{env.BOOST_VERSION}} @@ -260,7 +260,7 @@ jobs: ls -al - name: Install Qt - uses: jurplel/install-qt-action@v3 + uses: jurplel/install-qt-action@v4 # Rem: Once installed, ${{env.Qt6_DIR}} is set. # https://ddalcino.github.io/aqt-list-server/ with: @@ -473,7 +473,7 @@ jobs: - name: Upload Linux Portable if: ${{ matrix.os == 'ubuntu-latest' }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 env: TARBALL_NAME: "${{ steps.getversion.outputs.Application_Linux_NAME }}.tar.gz" with: @@ -501,7 +501,7 @@ jobs: - name: Upload Windows MingGW x64 Portable if: ${{ matrix.os == 'windows-latest' }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 env: ZIP_NAME: "${{ steps.getversion.outputs.Application_Windows_MinGW_x64_NAME }}.zip" with: @@ -510,7 +510,7 @@ jobs: - name: Create NSIS installer if: ${{ matrix.os == 'windows-latest' }} - uses: joncloud/makensis-action@v3.7 + uses: joncloud/makensis-action@v4.1 env: Application_VERSION: ${{ steps.getversion.outputs.Application_VERSION }} with: @@ -534,7 +534,7 @@ jobs: - name: Upload Windows 64 Installer if: ${{ matrix.os == 'windows-latest' }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: artifact_windows_64_installer path: "${{env.Project_RELEASE_DIR}}/ArrowDL_x64_Setup.exe" @@ -555,35 +555,35 @@ jobs: - name: Download Chromium Addon continue-on-error: true - uses: actions/download-artifact@v4.1.7 + uses: actions/download-artifact@v4 with: name: artifact_chromium path: "${{env.Project_RELEASE_DIR}}" - name: Download Firefox Addon continue-on-error: true - uses: actions/download-artifact@v4.1.7 + uses: actions/download-artifact@v4 with: name: artifact_firefox path: "${{env.Project_RELEASE_DIR}}" - name: Download Linux Portable continue-on-error: true - uses: actions/download-artifact@v4.1.7 + uses: actions/download-artifact@v4 with: name: artifact_linux_portable path: "${{env.Project_RELEASE_DIR}}" - name: Download Windows MinGW 64 Portable continue-on-error: true - uses: actions/download-artifact@v4.1.7 + uses: actions/download-artifact@v4 with: name: artifact_windows_mingw_64_portable path: "${{env.Project_RELEASE_DIR}}" - name: Download Windows 64 Installer continue-on-error: true - uses: actions/download-artifact@v4.1.7 + uses: actions/download-artifact@v4 with: name: artifact_windows_64_installer path: "${{env.Project_RELEASE_DIR}}" @@ -614,7 +614,7 @@ jobs: my_file.write("\r\n") - name: Publish - uses: softprops/action-gh-release@v0.1.15 + uses: softprops/action-gh-release@v2 #if: startsWith(github.ref, 'refs/tags/') # Limit releases to pushes to tags env: BRANCH_OR_TAG_NAME: ${{ github.head_ref || github.ref_name }} From 40c24c2c5bea710f564431c0d3a5782fb5430f8d Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Mon, 11 Nov 2024 12:42:56 +0100 Subject: [PATCH 11/14] [Build] Remove 'master' deployment (redundant with tag version) --- .github/workflows/deployment.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index 54762630..6791f2ea 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -7,7 +7,6 @@ on: tags: - "v*" branches: - - "master" - "develop" - "github-actions" - "gha-*" From dc817d78b2468fab5a5f09292d985fc405aae462 Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Mon, 11 Nov 2024 15:29:12 +0100 Subject: [PATCH 12/14] [Build] Remove Qt files listing step because the step is too expensive --- .github/workflows/deployment.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index 6791f2ea..da3121cc 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -272,14 +272,15 @@ jobs: tools: ${{matrix.qt_tools}} cache: true - - name: List files in Qt (if Debug Logging is enabled) - if: runner.debug == '1' - shell: bash - run: cd "${{env.Qt6_DIR}}/../../" && ls -alR - # env.Qt6_DIR - # "/home/runner/work/ArrowDL/qt/Qt/6.3.1/gcc_64" - # "D:\a\ArrowDL\qt\Qt\6.3.1\mingw_64" - + # Rem: this step was commented because it's too expensive: + # - name: List files in Qt (if Debug Logging is enabled) + # if: runner.debug == '1' + # shell: bash + # run: cd "${{env.Qt6_DIR}}/../../" && ls -alR + # # env.Qt6_DIR + # # "/home/runner/work/ArrowDL/qt/Qt/6.3.1/gcc_64" + # # "D:\a\ArrowDL\qt\Qt\6.3.1\mingw_64" + # - name: Find OpenSSL in Qt6 # The thing is that "env.Qt6_DIR" is defined only at runtime, *after* install-qt-action has run. id: qt6openssl From 155817e8009c069c956956178649e594b8fe35af Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Mon, 11 Nov 2024 15:22:07 +0100 Subject: [PATCH 13/14] [Build] Fix 'install-qt-action@v4' new variables and options (openssl, xcb) --- .github/workflows/deployment.yml | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index da3121cc..6633fef4 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -91,7 +91,8 @@ jobs: qt_host: 'linux' qt_target: 'desktop' qt_arch: 'gcc_64' - qt_tools: '' # To build OpenSSLv3: 'tools_opensslv3_src' + qt_tools: '' + qt_modules: '' Qt6_CUSTOM_INSTALL_PATH: "/home/runner/work/ArrowDL/qt/" DIRECTIVE_CMAKE_GENERATOR: '' INSTALL_BOOST_PLATFORM_VERSION: '18.04' # 18.04, 20.04 Rem: Ubuntu 20.04 doesn't have Boost 1.77.0 @@ -102,6 +103,7 @@ jobs: qt_target: 'desktop' qt_arch: 'win64_mingw' qt_tools: 'tools_opensslv3_x64' + qt_modules: '' Qt6_CUSTOM_INSTALL_PATH: "D:\\a\\ArrowDL\\qt\\" DIRECTIVE_CMAKE_GENERATOR: '-G "MinGW Makefiles"' INSTALL_BOOST_PLATFORM_VERSION: '2019' # 2019, 2022 @@ -260,7 +262,7 @@ jobs: - name: Install Qt uses: jurplel/install-qt-action@v4 - # Rem: Once installed, ${{env.Qt6_DIR}} is set. + # Rem: Once installed, ${{env.QT_ROOT_DIR}} is set. # https://ddalcino.github.io/aqt-list-server/ with: aqtversion: '==3.1.*' @@ -270,19 +272,21 @@ jobs: target: ${{matrix.qt_target}} arch: ${{matrix.qt_arch}} tools: ${{matrix.qt_tools}} + modules: ${{matrix.qt_modules}} cache: true + add-tools-to-path: false # WIP migration v3 to v4 # Rem: this step was commented because it's too expensive: # - name: List files in Qt (if Debug Logging is enabled) # if: runner.debug == '1' # shell: bash - # run: cd "${{env.Qt6_DIR}}/../../" && ls -alR - # # env.Qt6_DIR + # run: cd "${{env.QT_ROOT_DIR}}/../../" && ls -alR + # # env.QT_ROOT_DIR # # "/home/runner/work/ArrowDL/qt/Qt/6.3.1/gcc_64" # # "D:\a\ArrowDL\qt\Qt\6.3.1\mingw_64" # - name: Find OpenSSL in Qt6 - # The thing is that "env.Qt6_DIR" is defined only at runtime, *after* install-qt-action has run. + # The thing is that "env.QT_ROOT_DIR" is defined only at runtime, *after* install-qt-action has run. id: qt6openssl shell: python # 2 versions present in Ubuntu: @@ -292,14 +296,14 @@ jobs: # # * Qt6 version (3.0.12) # To build it: - # openssl_dir = os.path.normpath(os.path.join(r"${{env.Qt6_DIR}}", "..", "..", "Tools", "OpenSSLv3", "src")) + # openssl_dir = os.path.normpath(os.path.join(r"${{env.QT_ROOT_DIR}}", "..", "..", "Tools", "OpenSSLv3", "src")) # cd "${{openssl_dir}}" # ./config # make # make test # sudo make install_sw # Then: - # openssl_dir = os.path.normpath(os.path.join(r"${{env.Qt6_DIR}}", "..", "..", "Tools", "OpenSSLv3", "src")) + # openssl_dir = os.path.normpath(os.path.join(r"${{env.QT_ROOT_DIR}}", "..", "..", "Tools", "OpenSSLv3", "src")) # openssl_lib_eay = os.path.normpath(os.path.join(openssl_dir, "lib", "libcrypto.a")) # openssl_ssl_eay = os.path.normpath(os.path.join(openssl_dir, "lib", "libssl.a")) # @@ -311,7 +315,7 @@ jobs: # ssleay32 -> libssl if "${{ matrix.os }}" == "windows-latest": - openssl_dir = os.path.normpath(os.path.join(r"${{env.Qt6_DIR}}", "..", "..", "Tools", "OpenSSLv3", "Win_x64")) + openssl_dir = os.path.normpath(os.path.join(r"${{env.QT_ROOT_DIR}}", "..", "..", "Tools", "OpenSSLv3", "Win_x64")) openssl_lib_eay = os.path.normpath(os.path.join(openssl_dir, "lib", "libcrypto.lib")) openssl_ssl_eay = os.path.normpath(os.path.join(openssl_dir, "lib", "libssl.lib")) @@ -338,7 +342,7 @@ jobs: if: ${{ steps.cache-libtorrent.outputs.cache-hit != 'true' }} env: Boost_ROOT: ${{ steps.install-boost.outputs.Boost_ROOT }} - Qt6_Dir2: ${{env.Qt6_DIR}} + Qt6_Dir2: ${{env.QT_ROOT_DIR}} DIRECTIVE_CMAKE_GENERATOR: ${{matrix.DIRECTIVE_CMAKE_GENERATOR}} BUILD_TESTS: "OFF" # OFF because they take 10+ minutes to build and 776.74 sec to run tests on Ubuntu DEPRECATED_FUNCTIONS: "OFF" # OFF to remove deprecated functions @@ -387,7 +391,7 @@ jobs: - name: Configure Project env: Boost_ROOT: ${{ steps.install-boost.outputs.Boost_ROOT }} - Qt6_Dir2: ${{env.Qt6_DIR}} + Qt6_Dir2: ${{env.QT_ROOT_DIR}} OpenSSL_ROOT_DIR: ${{ steps.qt6openssl.outputs.OpenSSL_ROOT_DIR }} DIRECTIVE_CMAKE_GENERATOR: ${{matrix.DIRECTIVE_CMAKE_GENERATOR}} working-directory: "${{env.Project_BUILD_DIR}}" From b505b3e814e1c559aa792086ee3c8d8af07f1326 Mon Sep 17 00:00:00 2001 From: "SetVisible(0!=1)" Date: Sun, 10 Nov 2024 13:45:18 +0100 Subject: [PATCH 14/14] Update version --- version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version b/version index 4d54dadd..c4e41f94 100644 --- a/version +++ b/version @@ -1 +1 @@ -4.0.2 +4.0.3