0;l++){u=[],f=a[l];for(h=0;h۱۰۰هزار","10k unit":"۱۰هزار واحد",Follow:"دنبال کردن","Follow %{screen_name}":"دنبال کردن %{screen_name}",K:"هزار",M:"میلیون",Tweet:"توییت","Tweet %{hashtag}":"توییت کردن %{hashtag}","Tweet to %{name}":"به %{name} توییت کنید"},fi:{"%{followers_count} followers":"%{followers_count} seuraajaa","100K+":"100 000+","10k unit":"10 000 yksikköä",Follow:"Seuraa","Follow %{screen_name}":"Seuraa käyttäjää %{screen_name}",K:"tuhatta",M:"milj.",Tweet:"Twiittaa","Tweet %{hashtag}":"Twiittaa %{hashtag}","Tweet to %{name}":"Twiittaa käyttäjälle %{name}"},fil:{"%{followers_count} followers":"%{followers_count} mga tagasunod","10k unit":"10k yunit",Follow:"Sundan","Follow %{screen_name}":"Sundan si %{screen_name}",Tweet:"I-tweet","Tweet %{hashtag}":"I-tweet ang %{hashtag}","Tweet to %{name}":"Mag-Tweet kay %{name}"},fr:{"%{followers_count} followers":"%{followers_count} abonnés","10k unit":"unité de 10k",Follow:"Suivre","Follow %{screen_name}":"Suivre %{screen_name}",Tweet:"Tweeter","Tweet %{hashtag}":"Tweeter %{hashtag}","Tweet to %{name}":"Tweeter à %{name}"},he:{"%{followers_count} followers":"%{followers_count} עוקבים","100K+":"מאות אלפים","10k unit":"עשרות אלפים",Follow:"מעקב","Follow %{screen_name}":"לעקוב אחר %{screen_name}",K:"אלף",M:"מיליון",Tweet:"ציוץ","Tweet %{hashtag}":"צייצו %{hashtag}","Tweet to %{name}":"ציוץ אל %{name}"},hi:{"%{followers_count} followers":"%{followers_count} फ़ॉलोअर्स","100K+":"1 लाख+","10k unit":"10 हजार इकाईयां",Follow:"फ़ॉलो","Follow %{screen_name}":"%{screen_name} को फ़ॉलो करें",K:"हजार",M:"मिलियन",Tweet:"ट्वीट","Tweet %{hashtag}":"ट्वीट %{hashtag}","Tweet to %{name}":"%{name} को ट्वीट करें"},hu:{"%{followers_count} followers":"%{followers_count} követő","100K+":"100E+","10k unit":"10E+",Follow:"Követés","Follow %{screen_name}":"%{screen_name} követése",K:"E","Tweet %{hashtag}":"%{hashtag} tweetelése","Tweet to %{name}":"Tweet küldése neki: %{name}"},id:{"%{followers_count} followers":"%{followers_count} pengikut","100K+":"100 ribu+","10k unit":"10 ribu unit",Follow:"Ikuti","Follow %{screen_name}":"Ikuti %{screen_name}",K:" ribu",M:" juta","Tweet to %{name}":"Tweet ke %{name}"},it:{"%{followers_count} followers":"%{followers_count} follower","10k unit":"10k unità",Follow:"Segui","Follow %{screen_name}":"Segui %{screen_name}","Tweet %{hashtag}":"Twitta %{hashtag}","Tweet to %{name}":"Twitta a %{name}"},ja:{"%{followers_count} followers":"%{followers_count}人のフォロワー","100K+":"100K以上","10k unit":"万",Follow:"フォローする","Follow %{screen_name}":"%{screen_name}さんをフォロー",Tweet:"ツイート","Tweet %{hashtag}":"%{hashtag} をツイートする","Tweet to %{name}":"%{name}さんへツイートする"},ko:{"%{followers_count} followers":"%{followers_count}명의 팔로워","100K+":"100만 이상","10k unit":"만 단위",Follow:"팔로우","Follow %{screen_name}":"%{screen_name} 님 팔로우하기",K:"천",M:"백만",Tweet:"트윗","Tweet %{hashtag}":"%{hashtag} 관련 트윗하기","Tweet to %{name}":"%{name}님에게 트윗하기"},msa:{"%{followers_count} followers":"%{followers_count} pengikut","100K+":"100 ribu+","10k unit":"10 ribu unit",Follow:"Ikut","Follow %{screen_name}":"Ikut %{screen_name}",K:"ribu",M:"juta","Tweet to %{name}":"Tweet kepada %{name}"},nl:{"%{followers_count} followers":"%{followers_count} volgers","100K+":"100k+","10k unit":"10k-eenheid",Follow:"Volgen","Follow %{screen_name}":"%{screen_name} volgen",K:"k",M:" mln.",Tweet:"Tweeten","Tweet %{hashtag}":"%{hashtag} tweeten","Tweet to %{name}":"Tweeten naar %{name}"},no:{"%{followers_count} followers":"%{followers_count} følgere","100K+":"100 K+","10k unit":"10-K-enhet",Follow:"Følg","Follow %{screen_name}":"Følg %{screen_name}","Tweet to %{name}":"Send en tweet til %{name}"},pl:{"%{followers_count} followers":"%{followers_count} obserwujących","100K+":"100 tys.+","10k unit":"10 tys.",Follow:"Obserwuj","Follow %{screen_name}":"Obserwuj %{screen_name}",K:"tys.",M:"mln",Tweet:"Tweetnij","Tweet %{hashtag}":"Tweetnij %{hashtag}","Tweet to %{name}":"Tweetnij do %{name}"},pt:{"%{followers_count} followers":"%{followers_count} seguidores","100K+":"+100 mil","10k unit":"10 mil unidades",Follow:"Seguir","Follow %{screen_name}":"Seguir %{screen_name}",K:"Mil",Tweet:"Tweetar","Tweet %{hashtag}":"Tweetar %{hashtag}","Tweet to %{name}":"Tweetar para %{name}"},ru:{"%{followers_count} followers":"Читатели: %{followers_count} ","100K+":"100 тыс.+","10k unit":"блок 10k",Follow:"Читать","Follow %{screen_name}":"Читать %{screen_name}",K:"тыс.",M:"млн.",Tweet:"Твитнуть","Tweet %{hashtag}":"Твитнуть %{hashtag}","Tweet to %{name}":"Твитнуть %{name}"},sv:{"%{followers_count} followers":"%{followers_count} följare","10k unit":"10k",Follow:"Följ","Follow %{screen_name}":"Följ %{screen_name}",Tweet:"Tweeta","Tweet %{hashtag}":"Tweeta %{hashtag}","Tweet to %{name}":"Tweeta till %{name}"},th:{"%{followers_count} followers":"%{followers_count} ผู้ติดตาม","100K+":"100พัน+","10k unit":"หน่วย 10พัน",Follow:"ติดตาม","Follow %{screen_name}":"ติดตาม %{screen_name}",K:"พัน",M:"ล้าน",Tweet:"ทวีต","Tweet %{hashtag}":"ทวีต %{hashtag}","Tweet to %{name}":"ทวีตถึง %{name}"},tr:{"%{followers_count} followers":"%{followers_count} takipçi","100K+":"+100 bin","10k unit":"10 bin birim",Follow:"Takip et","Follow %{screen_name}":"Takip et: %{screen_name}",K:"bin",M:"milyon",Tweet:"Tweetle","Tweet %{hashtag}":"Tweetle: %{hashtag}","Tweet to %{name}":"Tweetle: %{name}"},ur:{"%{followers_count} followers":"%{followers_count} فالورز","100K+":"ایک لاکھ سے زیادہ","10k unit":"دس ہزار یونٹ",Follow:"فالو کریں","Follow %{screen_name}":"%{screen_name} کو فالو کریں",K:"ہزار",M:"ملین",Tweet:"ٹویٹ کریں","Tweet %{hashtag}":"%{hashtag} ٹویٹ کریں","Tweet to %{name}":"%{name} کو ٹویٹ کریں"},"zh-cn":{"%{followers_count} followers":"%{followers_count} 关注者","100K+":"10万+","10k unit":"1万单元",Follow:"关注","Follow %{screen_name}":"关注 %{screen_name}",K:"千",M:"百万",Tweet:"发推","Tweet %{hashtag}":"以 %{hashtag} 发推","Tweet to %{name}":"发推给 %{name}"},"zh-tw":{"%{followers_count} followers":"%{followers_count} 位跟隨者","100K+":"超過十萬","10k unit":"1萬 單位",Follow:"跟隨","Follow %{screen_name}":"跟隨 %{screen_name}",K:"千",M:"百萬",Tweet:"推文","Tweet %{hashtag}":"推文%{hashtag}","Tweet to %{name}":"推文給%{name}"}};a.aug(g.prototype,{setLanguage:function(e){var t;e||(e=this.params().lang||this.dataAttr("lang")||b(this.srcEl)),e=e&&e.toLowerCase();if(!e)return this.lang="en";if(m[e])return this.lang=e;t=e.replace(/[\-_].*/,"");if(m[t])return this.lang=t;this.lang="en"},_:function(e,t){var n=this.lang;t=t||{};if(!n||!m.hasOwnProperty(n))n=this.lang="en";return e=m[n]&&m[n][e]||e,this.ringo(e,t,/%\{([\w_]+)\}/g)},ringo:function(e,t,n){return n=n||/\{\{([\w_]+)\}\}/g,e.replace(n,function(e,n){return t[n]!==undefined?t[n]:e})},add:function(e){h.list.push(this),h.byId[this.id]=e},create:function(e,t,n){var i=this,o;return n[v]=!0,o=r(a.aug({id:this.id,src:e,"class":this.classAttr.join(" ")},n),t,this.targetEl&&this.targetEl.ownerDocument),this.srcEl?this.layout(function(){return i.srcEl.parentNode.replaceChild(o,i.srcEl),o}):this.targetEl?this.layout(function(){return i.targetEl.appendChild(o),o}):s.reject("Did not append widget")},params:function(){var e,t;return this.srcOb?t=this.srcOb:(e=this.srcEl&&this.srcEl.href&&this.srcEl.href.split("?")[1],t=e?o.decode(e):{}),this.params=function(){return t},t},dataAttr:function(e){return this.srcEl&&this.srcEl.getAttribute("data-"+e)},attr:function(e){return this.srcEl&&this.srcEl.getAttribute(e)},layout:function(e){return d.enqueue(e)},styles:{base:[["font","normal normal normal 11px/18px 'Helvetica Neue', Arial, sans-serif"],["margin","0"],["padding","0"],["whiteSpace","nowrap"]],button:[["fontWeight","bold"],["textShadow","0 1px 0 rgba(255,255,255,.5)"]],large:[["fontSize","13px"],["lineHeight","26px"]],vbubble:[["fontSize","16px"]]},width:function(){throw new Error(name+" not implemented")},height:function(){return this.size=="m"?20:28},minWidth:function(){},maxWidth:function(){},minHeight:function(){},maxHeight:function(){},dimensions:function(){function e(e){switch(typeof e){case"string":return e;case"undefined":return;default:return e+"px"}}var t={width:this.width(),height:this.height()};return this.minWidth()&&(t["min-width"]=this.minWidth()),this.maxWidth()&&(t["max-width"]=this.maxWidth()),this.minHeight()&&(t["min-height"]=this.minHeight()),this.maxHeight()&&(t["max-height"]=this.maxHeight()),a.forIn(t,function(n,r){t[n]=e(r)}),t},generateId:function(){return this.srcEl&&this.srcEl.id||"twitter-widget-"+l++}}),g.afterLoad=function(e){p.push(e)},g.doLayout=function(){d.exec()},g.doLayoutAsync=function(){d.delayedExec()},g.init=function(e){c=e},g.find=function(e){return e&&h.byId[e]?h.byId[e].element:null},g.embed=function(e){function o(e){var t=e.element&&e.element()||e;if(e!==document.body)return t}var n=c.widgets,r=[],i=[];u.isArray(e)||(e=[e||document]),a.forEach(e,function(e){a.forIn(n,function(n,i){var s,o;n.match(/\./)?(s=n.split("."),o=t.all(s[1],e,s[0])):o=e.getElementsByTagName(n),a.forEach(o,function(e){if(e.getAttribute(v))return;e.setAttribute(v,"true"),r.push(new i(e))})})}),g.doLayout(),a.forEach(r,function(e){var t;h.byId[e.id]=e,h.list.push(e),t=e.render(c),e.rendered&&(t=e.rendered()),i.push(t),t.then(function(e){var t=o(e);t&&twttr.events.trigger("rendered",{target:t})})}),s.every.apply(null,i).then(function(e){var t=a.map(Array.prototype.slice.call(e),o);t=a.filter(t,function(t){return t}),t.length&&twttr.events.trigger("loaded",{widgets:t})}),g.doLayoutAsync(),y()},window.setInterval(function(){g.doLayout()},500),e(g)})});
+provide("tfw/widget/intent",function(e){using("tfw/widget/base","util/util","util/querystring","util/uri","util/promise",function(t,n,r,i,s){function p(e){var t=Math.round(c/2-a/2),n=0;l>f&&(n=Math.round(l/2-f/2)),window.open(e,undefined,[u,"width="+a,"height="+f,"left="+t,"top="+n].join(","))}function d(e,t){using("tfw/hub/client",function(n){n.openIntent(e,t)})}function v(e){var t="original_referer="+location.href;return[e,t].join(e.indexOf("?")==-1?"?":"&")}function m(e){var t,r,i,s;e=e||window.event,t=e.target||e.srcElement;if(e.altKey||e.metaKey||e.shiftKey)return;while(t){if(~n.indexOf(["A","AREA"],t.nodeName))break;t=t.parentNode}t&&t.href&&(r=t.href.match(o),r&&(s=v(t.href),s=s.replace(/^http[:]/,"https:"),s=s.replace(/^\/\//,"https://"),g(s,t),e.returnValue=!1,e.preventDefault&&e.preventDefault()))}function g(e,t){if(twttr.events.hub&&t){var n=new y(h.generateId(),t);h.add(n),d(e,t),twttr.events.trigger("click",{target:t,region:"intent",type:"click",data:{}})}else p(e)}function y(e,t){this.id=e,this.element=this.srcEl=t}function b(e){this.srcEl=[],this.element=e}var o=/twitter\.com(\:\d{2,4})?\/intent\/(\w+)/,u="scrollbars=yes,resizable=yes,toolbar=no,location=yes",a=550,f=520,l=screen.height,c=screen.width,h;b.prototype=new t,n.aug(b.prototype,{render:function(e){return h=this,window.__twitterIntentHandler||(document.addEventListener?document.addEventListener("click",m,!1):document.attachEvent&&document.attachEvent("onclick",m),window.__twitterIntentHandler=!0),s.fulfill(document.body)}}),b.open=g,e(b)})});
+provide("dom/classname",function(e){function t(e){return new RegExp("\\b"+e+"\\b","g")}function n(e,n){if(e.classList){e.classList.add(n);return}t(n).test(e.className)||(e.className+=" "+n)}function r(e,n){if(e.classList){e.classList.remove(n);return}e.className=e.className.replace(t(n)," ")}function i(e,t,i){return e.classList&&e.classList.toggle?e.classList.toggle(t,i):(i?n(e,t):r(e,t),i)}function s(e,i,s){if(e.classList&&o(e,i)){r(e,i),n(e,s);return}e.className=e.className.replace(t(i),s)}function o(e,n){return e.classList?e.classList.contains(n):t(n).test(e.className)}e({add:n,remove:r,replace:s,toggle:i,present:o})});
+provide("util/throttle",function(e){function t(e,t,n){function o(){var n=+(new Date);window.clearTimeout(s);if(n-i>t){i=n,e.call(r);return}s=window.setTimeout(o,t)}var r=n||this,i=0,s;return o}e(t)});
+provide("util/css",function(e){using("util/util",function(t){e({sanitize:function(e,n,r){var i=/^[\w ,%\/"'\-_#]+$/,s=e&&t.map(e.split(";"),function(e){return t.map(e.split(":").slice(0,2),function(e){return t.trim(e)})}),o=0,u,a=[],f=r?"!important":"";n=n||/^(font|text\-|letter\-|color|line\-)[\w\-]*$/;for(;s&&(u=s[o]);o++)u[0].match(n)&&u[1].match(i)&&a.push(u.join(":")+f);return a.join(";")}})})});
+provide("tfw/util/params",function(e){using("util/querystring","util/twitter",function(t,n){e(function(e,r){return function(i){var s,o="data-tw-params",u,a=i.innerHTML;if(!i)return;if(!n.isTwitterURL(i.href))return;if(i.getAttribute(o))return;i.setAttribute(o,!0);if(typeof r=="function"){s=r.call(this,i);for(u in s)s.hasOwnProperty(u)&&(e[u]=s[u])}i.href=t.url(i.href,e)}})})});
+provide("util/params",function(e){using("util/querystring",function(t){var n=function(e){var n=e.search.substr(1);return t.decode(n)},r=function(e){var n=e.href,r=n.indexOf("#"),i=r<0?"":n.substring(r+1);return t.decode(i)},i=function(e){var t={},i=n(e),s=r(e);for(var o in i)i.hasOwnProperty(o)&&(t[o]=i[o]);for(var o in s)s.hasOwnProperty(o)&&(t[o]=s[o]);return t};e({combined:i,fromQuery:n,fromFragment:r})})});
+provide("tfw/util/env",function(e){using("util/params",function(t){function r(){var e=36e5,r=t.combined(document.location)._;return n!==undefined?n:(n=!1,r&&/^\d+$/.test(r)&&(n=+(new Date)-parseInt(r)=r;return t[e]=i,i}var t={force_new_cookie:100,rufous_pixel:100,decider_fixture:12.34};e({isAvailable:n})});
+provide("dom/cookie",function(e){using("util/util",function(t){e(function(e,n,r){var i=t.aug({},r);if(arguments.length>1&&String(n)!=="[object Object]"){if(n===null||n===undefined)i.expires=-1;if(typeof i.expires=="number"){var s=i.expires,o=new Date((new Date).getTime()+s*60*1e3);i.expires=o}return n=String(n),document.cookie=[encodeURIComponent(e),"=",i.raw?n:encodeURIComponent(n),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}i=n||{};var u,a=i.raw?function(e){return e}:decodeURIComponent;return(u=(new RegExp("(?:^|; )"+encodeURIComponent(e)+"=([^;]*)")).exec(document.cookie))?a(u[1]):null})})});
+provide("util/donottrack",function(e){using("dom/cookie",function(t){e(function(e,n){var r=/\.(gov|mil)(:\d+)?$/i,i=/https?:\/\/([^\/]+).*/i;return e=e||document.referrer,e=i.test(e)&&i.exec(e)[1],n=n||document.location.host,t("dnt")?!0:r.test(n)?!0:e&&r.test(e)?!0:document.navigator?document.navigator["doNotTrack"]==1:navigator?navigator["doNotTrack"]==1||navigator["msDoNotTrack"]==1:!1})})});
+provide("tfw/util/guest_cookie",function(e){using("dom/cookie","util/donottrack","util/decider",function(t,n,r){function s(){var e=t(i)||!1;if(!e)return;e.match(/^v3\:/)||o()}function o(){t(i)&&t(i,null,{domain:".twitter.com",path:"/"})}function u(){n()&&o()}var i="pid";e({set:u,destroy:o,forceNewCookie:s,guest_id_cookie:i})})});
+provide("sandbox/baseframe",function(e){using("util/domready","util/env","util/iframe","util/promise","util/util",function(t,n,r,i,s){function u(e,t,n,o){var u;this.readyPromise=new i(s.bind(function(e){this.resolver=e},this)),this.attrs=e||{},this.styles=t||{},this.appender=n||function(e){document.body.appendChild(e)},this.layout=o||function(e){return new i(function(t){return t.fulfill(e())})},this.frame=u=r(this.attrs,this.styles),u.onreadystatechange=u.onload=this.getCallback(this.onLoad),this.layout(s.bind(function(){this.appender(u)},this))}var o=0;window.twttr=window.twttr||{},window.twttr.sandbox=window.twttr.sandbox||{},u.prototype.getCallback=function(e){var t=this,n=!1;return function(){n||(n=!0,e.call(t))}},u.prototype.registerCallback=function(e){var t="cb"+o++;return window.twttr.sandbox[t]=e,t},u.prototype.onLoad=function(){try{this.document=this.frame.contentWindow.document}catch(e){this.setDocDomain();return}this.writeStandardsDoc(),this.resolver.fulfill(this)},u.prototype.ready=function(){return this.readyPromise},u.prototype.setDocDomain=function(){var e=r(this.attrs,this.styles),t=this.registerCallback(this.getCallback(this.onLoad));e.src=["javascript:",'document.write("");',"try { window.parent.document; }","catch (e) {",'document.domain="'+document.domain+'";',"}",'window.parent.twttr.sandbox["'+t+'"]();'].join(""),this.layout(s.bind(function(){this.frame.parentNode.removeChild(this.frame),this.frame=null,this.appender?this.appender(e):document.body.appendChild(e),this.frame=e},this))},u.prototype.writeStandardsDoc=function(){if(!n.anyIE()||n.cspEnabled())return;var e=["","","","","try { window.parent.document; }",'catch (e) {document.domain="'+document.domain+'";}',"","","",""].join("");this.document.write(e),this.document.close()},e(u)})});
+provide("sandbox/minimal",function(e){using("sandbox/baseframe","util/env","util/promise","util/util",function(t,n,r,i){function s(e,t){if(!e)return;this._frame=e,this._win=e.contentWindow,this._doc=this._win.document,this._body=this._doc.body,this._head=this._body.parentNode.children[0],this.layout=t}i.aug(s.prototype,{createElement:function(e){return this._doc.createElement(e)},createDocumentFragment:function(){return this._doc.createDocumentFragment()},appendChild:function(e){return this.layout(i.bind(function(){return this._body.appendChild(e)},this))},setBaseTarget:function(e){var t=this._doc.createElement("base");return t.target=e,this.layout(i.bind(function(){return this._head.appendChild(t)},this))},setTitle:function(e){if(!e)return;this._frame.title=e},element:function(){return this._frame},document:function(){return this._doc}}),s.createSandbox=function(e,n,r,i){var o=new t(e,n,r,i);return o.ready().then(function(e){return new s(e.frame,e.layout)})},e(s)})});
+provide("tfw/util/tracking",function(e){using("dom/cookie","dom/delegate","sandbox/minimal","util/donottrack","util/promise","tfw/util/guest_cookie","tfw/util/env","util/iframe","util/util","$xd/json2.js",function(t,n,r,i,s,o,u,a,f){function S(){return b?b:b=r.createSandbox({id:"rufous-sandbox"},{display:"none"}).then(f.bind(function(e){y=e,d=H(),v=B();while(m[0])A.apply(this,m.shift());return g?O():[d,v]},this))}function x(e,t,n,r){var i=!f.isObject(e),s=t?!f.isObject(t):!1,o,u;if(i||s)return;o=_(e),u=D(t,!!n,!!r),L(o,u,!0)}function T(e,n,r,s){var a=c[n],l,h,p=o.guest_id_cookie;if(!a)return;e=e||{},s=!!s,r=!!r,h=e.original_redirect_referrer||document.referrer,s=s||i(h),l=f.aug({},e),r||(k(l,"referrer",h),k(l,"widget",+u.isDynamicWidget()),k(l,"hask",+!!t("k")),k(l,"li",+!!t("twid")),k(l,p,t(p)||"")),s&&(k(l,"dnt",1),F(l)),j(a+"?"+P(l))}function N(e,t,n,r,i){var s=C(e.target||e.srcElement);s.action=i||"click",x(s,t,n,r)}function C(e,t){var n;return t=t||{},!e||e.nodeType!==1?t:((n=e.getAttribute("data-scribe"))&&f.forEach(n.split(" "),function(e){var n=f.trim(e).split(":"),r=n[0],i=n[1];r&&i&&!t[r]&&(t[r]=i)}),C(e.parentNode,t))}function k(e,t,n){var r=l+t;if(!e)return;return e[r]=n,e}function L(e,t,n){var r,i,s,o,u=w+"?";if(!f.isObject(e)||!f.isObject(t))return;s=f.aug({},t,{event_namespace:e}),n?(u+=P({l:I(s)}),j(u)):(r=d.firstChild,r.value=+r.value||+s.dnt,o=I(s),i=y.createElement("input"),i.type="hidden",i.name="l",i.value=o,d.appendChild(i))}function A(e,t,n,r){var i=!f.isObject(e),s=t?!f.isObject(t):!1,o,u;if(i||s)return;if(!y||!d){m.push([e,t,n,r]);return}o=_(e),u=D(t,!!n,!!r),L(o,u)}function O(){if(!d)return g=!0,b||s.reject();if(d.children.length<=2)return s.reject();var e=s.every(y.appendChild(d),y.appendChild(v)).then(function(e){var t=e[0],r=e[1];return n.on(r,"load",function(){window.setTimeout(M(t,r),0)}),t.submit(),e});return d=H(),v=B(),e}function M(e,t){return function(){var n=e.parentNode;if(!n)return;n.removeChild(e),n.removeChild(t)}}function _(e){return f.aug({client:"tfw"},e||{})}function D(e,t,n){var r={_category_:"tfw_client_event"},s,o;return t=!!t,n=!!n,s=f.aug(r,e||{}),o=s.widget_origin||document.referrer,s.format_version=1,s.dnt=n=n||i(o),s.triggered_on=s.triggered_on||+(new Date),t||(s.widget_origin=o),n&&F(s),s}function P(e){var t=[],n,r,i;for(n in e)e.hasOwnProperty(n)&&(r=encodeURIComponent(n),i=encodeURIComponent(e[n]),i=i.replace(/'/g,"%27"),t.push(r+"="+i));return t.join("&")}function H(){var e=y.createElement("form"),t=y.createElement("input"),n=y.createElement("input");return p++,e.action=w,e.method="POST",e.target="rufous-frame-"+p,e.id="rufous-form-"+p,t.type="hidden",t.name="dnt",t.value=0,n.type="hidden",n.name="tfw_redirect",n.value=E,e.appendChild(t),e.appendChild(n),e}function B(){var e="rufous-frame-"+p;return a({id:e,name:e,width:0,height:0,border:0},{display:"none"},y.document())}function j(e){var t=new Image;t.src=e}function F(e){f.forIn(e,function(t){~f.indexOf(h,t)&&delete e[t]})}function I(e){var t=Array.prototype.toJSON,n;return delete Array.prototype.toJSON,n=JSON.stringify(e),t&&(Array.prototype.toJSON=t),n}var l="twttr_",c={tweetbutton:"//p.twitter.com/t.gif",followbutton:"//p.twitter.com/f.gif",tweetembed:"//p.twitter.com/e.gif"},h=["hask","li","logged_in","pid","user_id",o.guest_id_cookie,l+"hask",l+"li",l+o.guest_id_cookie],p=0,d,v,m=[],g,y,b,w="https://twitter.com/i/jot",E="https://platform.twitter.com/jot.html";o.forceNewCookie(),e({enqueue:A,flush:O,initPostLogging:S,scribeInteraction:N,extractTermsFromDOM:C,addPixel:x,addLegacyPixel:T,addVar:k})})});
+provide("tfw/util/data",function(e){using("util/logger","util/util","util/querystring",function(t,n,r){function c(e){return function(n){n.error?e.error&&e.error(n):n.headers&&n.headers.status!=200?(e.error&&e.error(n),t.warn(n.headers.message)):e.success&&e.success(n),e.complete&&e.complete(n),h(e)}}function h(e){var t=e.script;t&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),e.script=undefined,t=undefined),e.callbackName&&twttr.tfw.callbacks[e.callbackName]&&delete twttr.tfw.callbacks[e.callbackName]}function p(e){var t={};return e.success&&n.isType("function",e.success)&&(t.success=e.success),e.error&&n.isType("function",e.error)&&(t.error=e.error),e.complete&&n.isType("function",e.complete)&&(t.complete=e.complete),t}window.twttr=window.twttr||{},twttr.tfw=twttr.tfw||{},twttr.tfw.callbacks=twttr.tfw.callbacks||{};var i="twttr.tfw.callbacks",s=twttr.tfw.callbacks,o="cb",u=0,a=!1,f={},l={tweets:"https://syndication.twitter.com/tweets.json",timeline:"https://cdn.syndication.twimg.com/widgets/timelines/",timelinePoll:"https://syndication.twitter.com/widgets/timelines/paged/",timelinePreview:"https://syndication.twitter.com/widgets/timelines/preview/"};twttr.widgets&&twttr.widgets.endpoints&&n.aug(l,twttr.widgets.endpoints),f.jsonp=function(e,t,n){var f=n||o+u,l=i+"."+f,h=document.createElement("script"),p={callback:l,suppress_response_codes:!0};s[f]=c(t);if(a||!/^https?\:$/.test(window.location.protocol))e=e.replace(/^\/\//,"https://");h.src=r.url(e,p),h.async="async",document.body.appendChild(h),t.script=h,t.callbackName=f,n||u++},f.config=function(e){if(e.forceSSL===!0||e.forceSSL===!1)a=e.forceSSL},f.tweets=function(e){var t=arguments[0],n=p(t),i={ids:e.ids.join(","),lang:e.lang},s=r.url(l.tweets,i);this.jsonp(s,n)},f.timeline=function(e){var t=arguments[0],i=p(t),s,o=9e5,u=Math.floor(+(new Date)/o),a={lang:e.lang,t:u,domain:window.location.host,dnt:e.dnt,override_type:e.overrideType,override_id:e.overrideId,override_name:e.overrideName,override_owner_id:e.overrideOwnerId,override_owner_name:e.overrideOwnerName,with_replies:e.withReplies};n.compact(a),s=r.url(l.timeline+e.id,a),this.jsonp(s,i,"tl_"+e.id+"_"+e.instanceId)},f.timelinePoll=function(e){var t=arguments[0],i=p(t),s={lang:e.lang,since_id:e.sinceId,max_id:e.maxId,min_position:e.minPosition,max_position:e.maxPosition,domain:window.location.host,dnt:e.dnt,override_type:e.overrideType,override_id:e.overrideId,override_name:e.overrideName,override_owner_id:e.overrideOwnerId,override_owner_name:e.overrideOwnerName,with_replies:e.withReplies},o;n.compact(s),o=r.url(l.timelinePoll+e.id,s),this.jsonp(o,i,"tlPoll_"+e.id+"_"+e.instanceId+"_"+(e.sinceId||e.maxId||e.maxPosition||e.minPosition))},f.timelinePreview=function(e){var t=arguments[0],n=p(t),i=e.params,s=r.url(l.timelinePreview,i);this.jsonp(s,n)},e(f)})});
+provide("anim/transition",function(e){function t(e,t){var n;return t=t||window,n=t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.msRequestAnimationFrame||t.oRequestAnimationFrame||function(n){t.setTimeout(function(){e(+(new Date))},1e3/60)},n(e)}function n(e,t){return Math.sin(Math.PI/2*t)*e}function r(e,n,r,i,s){function a(){var u=+(new Date),f=u-o,l=Math.min(f/r,1),c=i?i(n,l):n*l;e(c);if(l==1)return;t(a,s)}var o=+(new Date),u;t(a)}e({animate:r,requestAnimationFrame:t,easeOut:n})});
+provide("util/datetime",function(e){using("util/util",function(t){function h(e){return e<10?"0"+e:e}function p(e){function i(e,n){return t&&t[e]&&(e=t[e]),e.replace(/%\{([\w_]+)\}/g,function(e,t){return n[t]!==undefined?n[t]:e})}var t=e&&e.phrases,n=e&&e.months||s,r=e&&e.formats||o;this.timeAgo=function(e){var t=p.parseDate(e),s=+(new Date),o=s-t,h;return t?isNaN(o)||o1?i("seconds"):i("second")})})):o1?i("minutes"):i("minute")})})):o1?i("hours"):i("hour")})})):o%{abbr}';p.parseDate=function(e){var o=e||"",u=o.toString(),a,f;return a=function(){var e;if(i.test(u))return parseInt(u,10);if(e=u.match(r))return Date.UTC(e[7],t.indexOf(s,e[1]),e[2],e[3],e[4],e[5]);if(e=u.match(n))return Date.UTC(e[1],e[2]-1,e[3],e[4],e[5],e[6])}(),a?(f=new Date(a),!isNaN(f.getTime())&&f):!1},e(p)})});
+provide("sandbox/frame",function(e){using("sandbox/baseframe","sandbox/minimal","util/env","util/promise","util/util",function(t,n,r,i,s){function h(){var e,t;a={};if(f)return;e=document.body.offsetHeight,t=document.body.offsetWidth;if(e==c&&t==l)return;s.forEach(u,function(e){e.dispatchFrameResize(l,c)}),c=e,l=t}function p(e){var t;return e.id?e.id:(t=e.getAttribute("data-twttr-id"))?t:(t="twttr-sandbox-"+o++,e.setAttribute("data-twttr-id",t),t)}function d(e,t){n.apply(this,[e,t]),this._resizeHandlers=[],u.push(this),this._win.addEventListener?this._win.addEventListener("resize",s.bind(function(){this.dispatchFrameResize()},this),!0):this._win.attachEvent("onresize",s.bind(function(){this.dispatchFrameResize(this._win.event)},this))}var o=0,u=[],a={},f,l=0,c=0;window.addEventListener?window.addEventListener("resize",h,!0):document.body.attachEvent("onresize",function(){h(window.event)}),d.prototype=new n,s.aug(d.prototype,{dispatchFrameResize:function(){var e=this._frame.parentNode,t=p(e),n=a[t];f=!0;if(!this._resizeHandlers.length)return;n||(n=a[t]={w:this._frame.offsetWidth,h:this._frame.offsetHeight});if(this._frameWidth==n.w&&this._frameHeight==n.h)return;this._frameWidth=n.w,this._frameHeight=n.h,s.forEach(this._resizeHandlers,function(e){e(n.w,n.h)}),window.setTimeout(function(){a={}},50)},appendStyleSheet:function(e){var t=this._doc.createElement("link");return t.type="text/css",t.rel="stylesheet",t.href=e,this.layout(s.bind(function(){return this._head.appendChild(t)},this))},appendCss:function(e){var t;return r.cspEnabled()?i.reject("CSP enabled; cannot embed inline styles."):(t=this._doc.createElement("style"),t.type="text/css",t.styleSheet?t.styleSheet.cssText=e:t.appendChild(this._doc.createTextNode(e)),this.layout(s.bind(function(){return this._head.appendChild(t)},this)))},style:function(e){return this.layout(s.bind(function(){s.forIn(e,s.bind(function(e,t){this._frame.style[e]=t},this))},this))},onresize:function(e){this._resizeHandlers.push(e)},width:function(e){return e!==undefined&&(this._frame.width=e),this._frame.offsetWidth},height:function(e){return e!==undefined&&(this._frame.height=e),this._frame.offsetHeight}}),d.createSandbox=function(e,n,r,i){var s=new t(e,n,r,i);return s.ready().then(function(e){return new d(e.frame,e.layout)})},e(d)})});
+provide("tfw/util/assets",function(e){using("util/env",function(t){function r(e,r){var i=n[e],s;return t.retina()?s="2x":t.ie6()||t.ie7()?s="gif":s="default",r&&(s+=".rtl"),i[s]}var n={"embed/timeline.css":{"default":"embed/timeline.037a0cac0aa5abbe2c1b5c5cd368d398.default.css","2x":"embed/timeline.037a0cac0aa5abbe2c1b5c5cd368d398.2x.css",gif:"embed/timeline.037a0cac0aa5abbe2c1b5c5cd368d398.gif.css","default.rtl":"embed/timeline.037a0cac0aa5abbe2c1b5c5cd368d398.default.rtl.css","2x.rtl":"embed/timeline.037a0cac0aa5abbe2c1b5c5cd368d398.2x.rtl.css","gif.rtl":"embed/timeline.037a0cac0aa5abbe2c1b5c5cd368d398.gif.rtl.css"}};e(r)})});
+provide("tfw/widget/syndicatedbase",function(e){using("tfw/widget/base","tfw/widget/intent","tfw/util/assets","tfw/util/globals","tfw/util/tracking","dom/classname","dom/get","dom/delegate","sandbox/frame","util/env","util/promise","util/twitter","util/util",function(t,n,r,i,s,o,u,a,f,l,c,h,p){function S(){y=x.VALID_COLOR.test(i.val("widgets:link-color"))&&RegExp.$1,w=x.VALID_COLOR.test(i.val("widgets:border-color"))&&RegExp.$1,b=i.val("widgets:theme")}function x(e){if(!e)return;var n;this.readyPromise=new c(p.bind(function(e){this.readyResolver=e},this)),this.renderedPromise=new c(p.bind(function(e){this.renderResolver=e},this)),t.apply(this,[e]),n=this.params(),this.targetEl=this.srcEl&&this.srcEl.parentNode||n.targetEl||document.body,this.predefinedWidth=x.VALID_UNIT.test(n.width||this.attr("width"))&&RegExp.$1,this.layout(p.bind(function(){return this.containerWidth=this.targetEl&&this.targetEl.offsetWidth},this)).then(p.bind(function(e){var t=this.predefinedWidth||e||this.dimensions.DEFAULT_WIDTH;this.height=x.VALID_UNIT.test(n.height||this.attr("height"))&&RegExp.$1,this.width=Math.max(this.dimensions.MIN_WIDTH,Math.min(t,this.dimensions.DEFAULT_WIDTH))},this)),x.VALID_COLOR.test(n.linkColor||this.dataAttr("link-color"))?this.linkColor=RegExp.$1:this.linkColor=y,x.VALID_COLOR.test(n.borderColor||this.dataAttr("border-color"))?this.borderColor=RegExp.$1:this.borderColor=w,this.theme=n.theme||this.attr("data-theme")||b,this.theme=/(dark|light)/.test(this.theme)?this.theme:"",this.classAttr.push(l.touch()?"is-touch":"not-touch"),l.ie9()&&this.classAttr.push("ie9"),f.createSandbox({"class":this.renderedClassNames,id:this.id},{width:"1px",height:"0px",border:"none",position:"absolute",visibility:"hidden"},p.bind(function(e){this.srcEl?this.targetEl.insertBefore(e,this.srcEl):this.targetEl.appendChild(e)},this),this.layout).then(p.bind(function(e){this.setupSandbox(e)},this))}var d=[".customisable",".customisable:link",".customisable:visited",".customisable:hover",".customisable:focus",".customisable:active",".customisable-highlight:hover",".customisable-highlight:focus","a:hover .customisable-highlight","a:focus .customisable-highlight"],v=["a:hover .ic-mask","a:focus .ic-mask"],m=[".customisable-border"],g=[".timeline-header h1.summary",".timeline-header h1.summary a:link",".timeline-header h1.summary a:visited"],y,b,w,E={TWEET:0,RETWEET:10};x.prototype=new t,p.aug(x.prototype,{setupSandbox:function(e){this.sandbox=e,c.some(e.appendCss("body{display:none}"),e.setBaseTarget("_blank"),e.appendStyleSheet(twttr.widgets.config.assetUrl()+"/"+r("embed/timeline.css"))).then(p.bind(function(){this.readyResolver.fulfill(e)},this))},ready:function(){return this.readyPromise},rendered:function(){return this.renderedPromise},contentWidth:function(e){var t=this.dimensions,n=this.fullBleedPhoto?0:this.chromeless&&this.narrow?t.NARROW_MEDIA_PADDING_CL:this.chromeless?t.WIDE_MEDIA_PADDING_CL:this.narrow?t.NARROW_MEDIA_PADDING:t.WIDE_MEDIA_PADDING;return(e||this.width)-n},addSiteStyles:function(){var e=p.bind(function(e){return(this.theme=="dark"?".thm-dark ":"")+e},this),t=[];this.headingStyle&&t.push(p.map(g,e).join(",")+"{"+this.headingStyle+"}"),this.linkColor&&(t.push(p.map(d,e).join(",")+"{color:"+this.linkColor+"}"),t.push(p.map(v,e).join(",")+"{background-color:"+this.linkColor+"}")),this.borderColor&&t.push(p.map(m,e).concat(this.theme=="dark"?[".thm-dark.customisable-border"]:[]).join(",")+"{border-color:"+this.borderColor+"}");if(!t.length)return;return this.sandbox.appendCss(t.join(""))},setNarrow:function(){var e=this.narrow;return this.narrow=this.width0&&(e.width=i.width),i.height>0&&(e.height=i.height)}),n=i.height>n?i.height:n},this)),n}}),x.VALID_UNIT=/^([0-9]+)( ?px)?$/,x.VALID_COLOR=/^(#(?:[0-9a-f]{3}|[0-9a-f]{6}))$/i,x.retinize=function(e){if(!l.retina())return;p.forEach(e.getElementsByTagName("IMG"),function(e){var t=e.getAttribute("data-src-2x");t&&(e.src=t)})},x.scaleDimensions=function(e,t,n,r){return t>e&&t>r&&(e*=r/t,t=r),e>n&&(t*=n/e,e=n,t>r&&(e*=r/t,t=r)),{width:Math.ceil(e),height:Math.ceil(t)}},S(),e(x)})});
+provide("tfw/widget/timeline",function(e){using("tfw/widget/base","tfw/widget/syndicatedbase","util/datetime","util/promise","anim/transition","tfw/util/article","tfw/util/data","tfw/util/tracking","tfw/util/params","util/css","util/env","util/throttle","util/twitter","util/querystring","util/typevalidator","util/util","dom/delegate","dom/classname","dom/get",function(t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b){function I(e){if(!e)return;var t,r,i,s,o,u,a,f;n.apply(this,[e]),t=this.params(),r=(t.chrome||this.dataAttr("chrome")||"").split(" "),this.preview=t.previewParams,this.widgetId=t.widgetId||this.dataAttr("widget-id"),this.instanceId=++F,this.cursors={maxPosition:0,minPosition:0},(s=t.screenName||this.dataAttr("screen-name"))||(o=t.userId||this.dataAttr("user-id"))?this.override={overrideType:"user",overrideId:o,overrideName:s,withReplies:v.asBoolean(t.showReplies||this.dataAttr("show-replies"))?"true":"false"}:(s=t.favoritesScreenName||this.dataAttr("favorites-screen-name"))||(o=t.favoritesUserId||this.dataAttr("favorites-user-id"))?this.override={overrideType:"favorites",overrideId:o,overrideName:s}:((s=t.listOwnerScreenName||this.dataAttr("list-owner-screen-name"))||(o=t.listOwnerId||this.dataAttr("list-owner-id")))&&((u=t.listId||this.dataAttr("list-id"))||(a=t.listSlug||this.dataAttr("list-slug")))?this.override={overrideType:"list",overrideOwnerId:o,overrideOwnerName:s,overrideId:u,overrideName:a}:(f=t.customTimelineId||this.dataAttr("custom-timeline-id"))?this.override={overrideType:"custom",overrideId:f}:this.override={},this.tweetLimit=v.asInt(t.tweetLimit||this.dataAttr("tweet-limit")),this.staticTimeline=this.tweetLimit>0,r.length&&(i=~m.indexOf(r,"none"),this.chromeless=i||~m.indexOf(r,"transparent"),this.headerless=i||~m.indexOf(r,"noheader"),this.footerless=i||~m.indexOf(r,"nofooter"),this.borderless=i||~m.indexOf(r,"noborders"),this.noscrollbar=~m.indexOf(r,"noscrollbar")),this.headingStyle=l.sanitize(t.headingStyle||this.dataAttr("heading-style"),undefined,!0),this.classAttr.push("twitter-timeline-rendered"),this.ariaPolite=t.ariaPolite||this.dataAttr("aria-polite")}var w="1.0",E={CLIENT_SIDE_USER:0,CLIENT_SIDE_APP:2},S="timeline",x="new-tweets-bar",T="timeline-header",N="timeline-footer",C="stream",k="h-feed",L="tweet",A="expanded",O="detail-expander",M="expand",_="permalink",D="twitter-follow-button",P="no-more-pane",H="pending-scroll-in",B="pending-new-tweet",j="pending-new-tweet-display",F=0;I.prototype=new n,m.aug(I.prototype,{renderedClassNames:"twitter-timeline twitter-timeline-rendered",dimensions:{DEFAULT_HEIGHT:"600",DEFAULT_WIDTH:"520",NARROW_WIDTH:"320",MIN_WIDTH:"180",MIN_HEIGHT:"200",WIDE_MEDIA_PADDING:81,NARROW_MEDIA_PADDING:16,WIDE_MEDIA_PADDING_CL:60,NARROW_MEDIA_PADDING_CL:12},create:function(e){var r=this.sandbox.createElement("div"),i,s,o,u=[],f;r.innerHTML=e.body,i=r.children[0]||!1;if(!i)return;return this.reconfigure(e.config),this.discardStaticOverflow(i),this.sandbox.setTitle(i.getAttribute("data-iframe-title")||"Timeline"),n.retinize(i),this.constrainMedia(i),this.searchQuery=i.getAttribute("data-search-query"),this.profileId=i.getAttribute("data-profile-id"),this.timelineType=i.getAttribute("data-timeline-type"),f=this.getTweetDetails(r),m.forIn(f,function(e){u.push(e)}),o=this.baseScribeData(),o.item_ids=u,o.item_details=f,this.timelineType&&a.enqueue({page:this.timelineType+"_timeline",component:"timeline",element:"initial",action:u.length?"results":"no_results"},o,!0,this.dnt),a.enqueue({page:"timeline",component:"timeline",element:"initial",action:u.length?"results":"no_results"},o,!0,this.dnt),a.flush(),this.ariaPolite=="assertive"&&(s=b.one(x,i,"DIV"),s.setAttribute("aria-polite","assertive")),i.id=this.id,i.className+=" "+this.classAttr.join(" "),i.lang=this.lang,this.augmentWidgets(i),this.ready().then(m.bind(function(e){e.appendChild(i).then(m.bind(function(){this.renderResolver.fulfill(this.sandbox)},this)),e.style({cssText:"",border:"none",maxWidth:"100%",minWidth:this.dimensions.MIN_WIDTH+"px"}),this.layout(m.bind(function(){this.srcEl&&this.srcEl.parentNode&&this.srcEl.parentNode.removeChild(this.srcEl),this.predefinedWidth=this.width,this.predefinedHeight=this.height,this.width=e.width(this.width),this.height=e.height(this.height)},this)).then(m.bind(function(){this.width0&&e.insertNewTweets(t)})},loadMore:function(){var e=this,t=b.all(L,this.element,"LI").pop(),n=t&&t.getAttribute("data-tweet-id");this.requestTweets(n,!1,function(t){var r=b.one(P,e.element,"P"),i=t.childNodes[0];r.style.cssText="",i&&i.getAttribute("data-tweet-id")==n&&t.removeChild(i);if(t.childNodes.length>0){e.appendTweets(t);return}y.add(e.element,"no-more"),r.focus()})},forceLoad:function(){var e=this,t=!!b.all(k,this.element,"OL").length;this.requestTweets(1,!0,function(n){n.childNodes.length&&(e[t?"insertNewTweets":"appendTweets"](n),y.add(e.element,"has-tweets"))})},schedulePolling:function(e){var t=this;if(this.pollInterval===null)return;e=twttr.widgets.poll||e||this.pollInterval||1e4,e>-1&&window.setTimeout(function(){this.isUpdating||t.update(),t.schedulePolling()},e)},updateCursors:function(e,t){(t||{}).initial?(this.cursors.maxPosition=e.maxPosition,this.cursors.minPosition=e.minPosition):(t||{}).newer?this.cursors.maxPosition=e.maxPosition||this.cursors.maxPosition:this.cursors.minPosition=e.minPosition||this.cursors.minPosition},requestTweets:function(e,t,r){var i=this,s={id:this.widgetId,instanceId:this.instanceId,screenName:this.widgetScreenName,userId:this.widgetUserId,withReplies:this.widgetShowReplies,dnt:this.dnt,lang:this.lang};t&&this.cursors.maxPosition?s.minPosition=this.cursors.maxPosition:!t&&this.cursors.minPosition?s.maxPosition=this.cursors.minPosition:t?s.sinceId=e:s.maxId=e,s.complete=function(){this.isUpdating=!1},s.error=function(e){if(e&&e.headers){if(e.headers.status=="404"){i.pollInterval=null;return}if(e.headers.status=="503"){i.pollInterval*=1.5;return}}},s.success=function(e){var s=i.sandbox.createDocumentFragment(),o=i.sandbox.createElement("div"),u,f=[],l,c;i.updateCursors(e.headers,{newer:t}),e&&e.headers&&e.headers.xPolling&&/\d+/.test(e.headers.xPolling)&&(i.pollInterval=e.headers.xPolling*1e3);if(e&&e.body!==undefined){o.innerHTML=e.body;if(o.children[0]&&o.children[0].tagName!="LI")return;l=i.getTweetDetails(o);for(c in l)l.hasOwnProperty(c)&&f.push(c);f.length&&(u=i.baseScribeData(),u.item_ids=f,u.item_details=l,u.event_initiator=t?E.CLIENT_SIDE_APP:E.CLIENT_SIDE_USER,this.timelineType&&a.enqueue({page:this.timelineType+"_timeline",component:"timeline",element:"initial",action:f.length?"results":"no_results"},u,!0,this.dnt),a.enqueue({page:"timeline",component:"timeline",element:t?"newer":"older",action:"results"},u,!0,i.dnt),a.flush()),n.retinize(o),i.constrainMedia(o);while(o.children[0])s.appendChild(o.children[0]);r(s)}},u.timelinePoll(m.aug(s,this.override))},insertNewTweets:function(e){var t=this,n=b.one(C,this.element,"DIV"),r=b.one(k,n,"OL"),i=r.offsetHeight,o;r.insertBefore(e,r.firstChild),o=r.offsetHeight-i;if(n.scrollTop>40||this.mouseIsOver()){n.scrollTop=n.scrollTop+o,this.updateTimeStamps(),this.showNewTweetNotifier();return}y.remove(this.element,H),r.style.cssText="margin-top: -"+o+"px",window.setTimeout(function(){n.scrollTop=0,y.add(t.element,H),c.cssTransitions()?r.style.cssText="":s.animate(function(e){ee&&(r=t.children[n-1]);n--)t.removeChild(r)},showNewTweetNotifier:function(){var e=this,t=b.one(x,this.element,"DIV"),n=t.children[0];t.style.cssText="",t.removeChild(n),t.appendChild(n),y.add(this.element,j),window.setTimeout(function(){y.add(e.element,B)},10),this.newNoticeDisplayTime=+(new Date),window.setTimeout(function(){e.hideNewTweetNotifier()},5e3)},hideNewTweetNotifier:function(e){var t=this;if(!e&&this.mouseOverNotifier)return;y.remove(this.element,B),window.setTimeout(function(){y.remove(t.element,j)},500)},augmentWidgets:function(e){var t=b.one(D,e,"A");if(!t)return;t.setAttribute("data-related",this.related),t.setAttribute("data-partner",this.partner),t.setAttribute("data-dnt",this.dnt),t.setAttribute("data-search-query",this.searchQuery),t.setAttribute("data-profile-id",this.profileId),this.width<250&&t.setAttribute("data-show-screen-name","false"),twttr.widgets.load(t.parentNode)},discardStaticOverflow:function(e){var t=b.one(k,e,"OL"),n;if(this.staticTimeline){this.height=0;while(n=t.children[this.tweetLimit])t.removeChild(n)}},hideStreamScrollBar:function(){var e=b.one(C,this.element,"DIV"),t=b.one(k,this.element,"OL"),n;e.style.width="",n=this.element.offsetWidth-t.offsetWidth,n>0&&(e.style.width=this.element.offsetWidth+n+"px")},readTranslations:function(){var e=this.element,t="data-dt-";this.datetime=new r(m.compact({phrases:{now:e.getAttribute(t+"now"),s:e.getAttribute(t+"s"),m:e.getAttribute(t+"m"),h:e.getAttribute(t+"h"),second:e.getAttribute(t+"second"),seconds:e.getAttribute(t+"seconds"),minute:e.getAttribute(t+"minute"),minutes:e.getAttribute(t+"minutes"),hour:e.getAttribute(t+"hour"),hours:e.getAttribute(t+"hours")},months:e.getAttribute(t+"months").split("|"),formats:{abbr:e.getAttribute(t+"abbr"),shortdate:e.getAttribute(t+"short"),longdate:e.getAttribute(t+"long")}}))},updateTimeStamps:function(){var e=b.all(_,this.element,"A"),t,n,r=0,i,s;for(;t=e[r];r++){i=t.getAttribute("data-datetime"),s=i&&this.datetime.timeAgo(i,this.i18n),n=t.getElementsByTagName("TIME")[0];if(!s)continue;if(n&&n.innerHTML){n.innerHTML=s;continue}t.innerHTML=s}},mouseIsOver:function(){return this.mouseOver},addUrlParams:function(e){var t=this,n={tw_w:this.widgetId,related:this.related,partner:this.partner,query:this.searchQuery,profile_id:this.profileId,original_referer:o.url(),tw_p:"embeddedtimeline"};return this.addUrlParams=f(n,function(e){var n=b.ancestor("."+L,e,t.element);return n&&{tw_i:n.getAttribute("data-tweet-id")}}),this.addUrlParams(e)},showNSFW:function(e){var t=b.one("nsfw",e,"DIV"),r,i,s=0,o,u,a,f;if(!t)return;i=n.scaleDimensions(t.getAttribute("data-width"),t.getAttribute("data-height"),this.contentWidth(),t.getAttribute("data-height")),r=!!(u=t.getAttribute("data-player")),r?a=this.sandbox.createElement("iframe"):(a=this.sandbox.createElement("img"),u=t.getAttribute(c.retina()?"data-image-2x":"data-image"),a.alt=t.getAttribute("data-alt"),f=this.sandbox.createElement("a"),f.href=t.getAttribute("data-href"),f.appendChild(a)),a.title=t.getAttribute("data-title"),a.src=u,a.width=i.width,a.height=i.height,o=b.ancestor("."+O,t,e),s=i.height-t.offsetHeight,t.parentNode.replaceChild(r?a:f,t),o.style.cssText="height:"+(o.offsetHeight+s)+"px"},toggleExpando:function(e){var r=b.one(O,e,"DIV"),i=r&&r.children[0],s=i&&i.getAttribute("data-expanded-media"),o,u=0,a=b.one(M,e,"A"),f=a&&a.getElementsByTagName("B")[0],l=f&&(f.innerText||f.textContent),c;if(!f)return;this.layout(function(){f.innerHTML=a.getAttribute("data-toggled-text"),a.setAttribute("data-toggled-text",l)});if(y.present(e,A)){this.layout(function(){y.remove(e,A)});if(!r){t.doLayout();return}this.layout(function(){r.style.cssText="",i.innerHTML=""}),t.doLayout();return}s&&(o=this.sandbox.createElement("DIV"),o.innerHTML=s,n.retinize(o),u=this.constrainMedia(o),this.layout(function(){i.appendChild(o)})),r&&this.layout(function(){c=Math.max(i.offsetHeight,u),r.style.cssText="height:"+c+"px"}),this.layout(function(){y.add(e,A)}),t.doLayout()},recalculateStreamHeight:function(e){var t=b.one(T,this.element,"DIV"),n=b.one(N,this.element,"DIV"),r=b.one(C,this.element,"DIV");this.layout(m.bind(function(){var i=t.offsetHeight+(n?n.offsetHeight:0),s=e||this.sandbox.height();r.style.cssText="height:"+(s-i-2)+"px",this.noscrollbar&&this.hideStreamScrollBar()},this))},handleResize:function(e,n){var r=Math.min(this.dimensions.DEFAULT_WIDTH,Math.max(this.dimensions.MIN_WIDTH,Math.min(this.predefinedWidth||this.dimensions.DEFAULT_WIDTH,e)));if(r==this.width&&n==this.height)return;this.width=r,this.height=n,this.setNarrow(),this.constrainMedia(this.element,this.contentWidth(r)),this.staticTimeline?this.layout(m.bind(function(){this.height=this.element.offsetHeight,this.sandbox.height(this.height)},this)):this.recalculateStreamHeight(n),t.doLayoutAsync()}}),e(I)})});
+provide("tfw/widget/embed",function(e){using("tfw/widget/base","tfw/widget/syndicatedbase","util/datetime","tfw/util/params","dom/classname","dom/get","util/env","util/promise","util/util","util/throttle","util/twitter","tfw/util/article","tfw/util/data","tfw/util/tracking",function(t,n,r,i,s,o,u,a,f,l,c,h,p,d){function w(e,t,n,r){var i=o.one("subject",e,"BLOCKQUOTE"),s=o.one("reply",e,"BLOCKQUOTE"),u=i&&i.getAttribute("data-tweet-id"),a=s&&s.getAttribute("data-tweet-id"),l={},c={};if(!u)return;l[u]={item_type:0},d.enqueue({page:"tweet",section:"subject",component:"tweet",action:"results"},f.aug({},t,{item_ids:[u],item_details:l}),!0,r);if(!a)return;c[a]={item_type:0},d.enqueue({page:"tweet",section:"conversation",component:"tweet",action:"results"},f.aug({},t,{item_ids:[a],item_details:c,associations:{4:{association_id:u,association_type:4}}}),!0,r)}function E(e,t,n){var r={};if(!e)return;r[e]={item_type:0},d.enqueue({page:"tweet",section:"subject",component:"rawembedcode",action:"no_results"},{client_version:v,widget_origin:h.url(),widget_frame:h.frameUrl(),message:t,item_ids:[e],item_details:r},!0,n)}function S(e,t,n,r){g[e]=g[e]||[],g[e].push({s:n,f:r,lang:t})}function x(){b.length&&twttr.widgets.load(b)}function T(e){if(!e)return;var t,r,i;n.apply(this,[e]),t=this.params(),r=this.srcEl&&this.srcEl.getElementsByTagName("A"),i=r&&r[r.length-1],this.hideThread=(t.conversation||this.dataAttr("conversation"))=="none"||~f.indexOf(this.classAttr,"tw-hide-thread"),this.hideCard=(t.cards||this.dataAttr("cards"))=="hidden"||~f.indexOf(this.classAttr,"tw-hide-media");if((t.align||this.attr("align"))=="left"||~f.indexOf(this.classAttr,"tw-align-left"))this.align="left";else if((t.align||this.attr("align"))=="right"||~f.indexOf(this.classAttr,"tw-align-right"))this.align="right";else if((t.align||this.attr("align"))=="center"||~f.indexOf(this.classAttr,"tw-align-center"))this.align="center",this.containerWidth>this.dimensions.MIN_WIDTH*(1/.7)&&this.width>this.containerWidth*.7&&(this.width=this.containerWidth*.7);this.narrow=t.narrow||this.width<=this.dimensions.NARROW_WIDTH,this.narrow&&this.classAttr.push("var-narrow"),this.tweetId=t.tweetId||i&&c.status(i.href)}var v="2.0",m="tweetembed",g={},y=[],b=[];T.prototype=new n,f.aug(T.prototype,{renderedClassNames:"twitter-tweet twitter-tweet-rendered",dimensions:{DEFAULT_HEIGHT:"0",DEFAULT_WIDTH:"500",NARROW_WIDTH:"350",MIN_WIDTH:"220",MIN_HEIGHT:"0",WIDE_MEDIA_PADDING:32,NARROW_MEDIA_PADDING:32},create:function(e){var t=this.sandbox.createElement("div"),r;t.innerHTML=e,r=t.children[0]||!1;if(!r)return;return this.theme=="dark"&&this.classAttr.push("thm-dark"),this.linkColor&&this.addSiteStyles(),s.present(r,"media-forward")&&(this.fullBleedPhoto=!0),this.augmentWidgets(r),n.retinize(r),r.id=this.id,r.className+=" "+this.classAttr.join(" "),r.lang=this.lang,this.sandbox.setTitle(r.getAttribute("data-iframe-title")||"Tweet"),this.sandbox.appendChild(r).then(f.bind(function(){this.renderResolver.fulfill(this.sandbox)},this)),this.sandbox.style({cssText:"",display:"block",maxWidth:"99%",minWidth:this.dimensions.MIN_WIDTH+"px",padding:"0",borderRadius:"5px",margin:"10px 0",border:"#ddd 1px solid",borderTopColor:"#eee",borderBottomColor:"#bbb",boxShadow:"0 1px 3px rgba(0,0,0,0.15)",position:"absolute",visibility:"hidden"}),this.layout(f.bind(function(){this.predefinedWidth=this.width,this.width=this.sandbox.width(this.width)},this),"Insert Sandbox"),this.setNarrow().then(f.bind(function(){this.constrainMedia(r,this.contentWidth(this.width))},this)),w(r,this.baseScribeData(),this.partner,this.dnt),r},render:function(e,n){var r="",i=this.tweetId,s,o;return i?(o=new a(function(e){s=e}),this.hideCard&&(r+="c"),this.hideThread&&(r+="t"),r&&(i+="-"+r),this.rendered().then(f.bind(function(e){this.srcEl&&this.srcEl.parentNode&&this.layout(f.bind(function(){this.srcEl&&this.srcEl.parentNode&&this.srcEl.parentNode.removeChild(this.srcEl)},this),"Remove Embed Code"),this.align=="center"?e.style({margin:"7px auto",cssFloat:"none"}):this.align&&(this.width==this.dimensions.DEFAULT_WIDTH&&(this.predefinedWidth=this.width=this.dimensions.NARROW_WIDTH),e.style({cssFloat:this.align})),this.layout(f.bind(function(){this.height=this.sandbox.height(this.element.offsetHeight)},this)).then(f.bind(function(){return t.doLayoutAsync(),this.layout(f.bind(function(){this.height=this.sandbox.height(this.element.offsetHeight)},this))},this)).then(f.bind(function(){e.onresize(f.bind(this.handleResize,this))},this)),e.style({position:"static",visibility:"visible"}),t.doLayoutAsync()},this)),S(i,this.lang,f.bind(function(n){this.ready().then(f.bind(function(){this.element=this.create(n),this.readTimestampTranslations(),this.updateTimeStamps(),this.bindIntentHandlers(),t.doLayoutAsync(),s.fulfill(this.sandbox.element())},this))},this),f.bind(function(){E(this.tweetId,this.partner,this.dnt),s.fulfill(this.srcEl)},this)),y.push(o),n&&o.then(n),o):a.fulfill(this.srcEl)},augmentWidgets:function(e){var t=o.one("twitter-follow-button",e,"A");if(!t)return;t.setAttribute("data-related",this.related),t.setAttribute("data-partner",this.partner),t.setAttribute("data-dnt",this.dnt),t.setAttribute("data-show-screen-name","false"),b.push(t.parentNode)},addUrlParams:function(e){var t=this,n={related:this.related,partner:this.partner,original_referer:h.url(),tw_p:m};return this.addUrlParams=i(n,function(e){var n=o.ancestor(".tweet",e,t.element);return{tw_i:n.getAttribute("data-tweet-id")}}),this.addUrlParams(e)},baseScribeData:function(){return{client_version:v,widget_origin:h.url(),widget_frame:h.frameUrl(),message:this.partner}},handleResize:function(e){var n=Math.min(this.dimensions.DEFAULT_WIDTH,Math.max(this.dimensions.MIN_WIDTH,Math.min(this.predefinedWidth||this.dimensions.DEFAULT_WIDTH,e)));if(n==this.width)return;this.width=n,this.setNarrow(),this.constrainMedia(this.element,this.contentWidth(n)),this.layout(f.bind(function(){this.height=this.element.offsetHeight,this.sandbox.height(this.height)},this),"Embed Resize"),t.doLayoutAsync()},readTimestampTranslations:function(){var e=this.element,t="data-dt-",n=e.getAttribute(t+"months")||"";this.datetime=new r(f.compact({phrases:{AM:e.getAttribute(t+"am"),PM:e.getAttribute(t+"pm")},months:n.split("|"),formats:{full:e.getAttribute(t+"full")}}))},updateTimeStamps:function(){var e=o.one("long-permalink",this.element,"A"),n=e.getAttribute("data-datetime"),r=n&&this.datetime.localTimeStamp(n),i=e.getElementsByTagName("TIME")[0];if(!r)return;this.layout(function(){if(i&&i.innerHTML){i.innerHTML=r;return}e.innerHTML=r},"Update Timestamp"),t.doLayoutAsync()}}),T.fetchAndRender=function(){var e=g,n=[],r,i;g={};if(e.keys)n=e.keys();else for(r in e)e.hasOwnProperty(r)&&n.push(r);if(!n.length)return;d.initPostLogging(),i=e[n[0]][0].lang,p.tweets({ids:n.sort(),lang:i,complete:function(n){f.forIn(n,function(t,n){var r=e[t];f.forEach(r,function(e){e.s&&e.s.call(this,n)}),delete e[t]}),t.doLayout(),f.forIn(e,function(e,t){f.forEach(t,function(t){t.f&&t.f.call(this,e)})}),t.doLayout()}}),a.every.apply(null,y).then(function(){x(),d.flush()})},t.afterLoad(T.fetchAndRender),e(T)})});
+provide("dom/textsize",function(e){function n(e,t,n){var r=[],i=0,s;for(;s=n[i];i++)r.push(s[0]),r.push(s[1]);return e+t+r.join(":")}function r(e){var t=e||"";return t.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()})}var t={};e(function(e,i,s){var o=document.createElement("span"),u={},a="",f,l=0,c=0,h=[];s=s||[],i=i||"",a=n(e,i,s);if(t[a])return t[a];o.className=i+" twitter-measurement";try{for(;f=s[l];l++)o.style[f[0]]=f[1]}catch(p){for(;f=s[c];c++)h.push(r(f[0])+":"+f[1]);o.setAttribute("style",h.join(";")+";")}return o.innerHTML=e,document.body.appendChild(o),u.width=o.clientWidth||o.offsetWidth,u.height=o.clientHeight||o.offsetHeight,document.body.removeChild(o),delete o,t[a]=u})});
+provide("tfw/widget/tweetbase",function(e){using("util/util","tfw/widget/base","util/querystring","util/twitter",function(t,n,r,i){function s(e){if(!e)return;var t;n.apply(this,[e]),t=this.params(),this.text=t.text||this.dataAttr("text"),this.text&&/\+/.test(this.text)&&!/ /.test(this.text)&&(this.text=this.text.replace(/\+/g," ")),this.align=t.align||this.dataAttr("align")||"",this.via=t.via||this.dataAttr("via"),this.placeid=t.placeid||this.dataAttr("placeid"),this.hashtags=t.hashtags||this.dataAttr("hashtags"),this.screen_name=i.screenName(t.screen_name||t.screenName||this.dataAttr("button-screen-name")),this.url=t.url||this.dataAttr("url")}s.prototype=new n,t.aug(s.prototype,{parameters:function(){var e={text:this.text,url:this.url,related:this.related,lang:this.lang,placeid:this.placeid,original_referer:location.href,id:this.id,screen_name:this.screen_name,hashtags:this.hashtags,partner:this.partner,dnt:this.dnt,_:+(new Date)};return t.compact(e),r.encode(e)}}),e(s)})});
+provide("tfw/widget/tweetbutton",function(e){using("tfw/widget/tweetbase","util/util","util/querystring","util/uri","util/twitter","dom/textsize",function(t,n,r,i,s,o){function l(e){t.apply(this,[e]);var r=this.params(),o=r.count||this.dataAttr("count"),l=r.size||this.dataAttr("size"),c=i.getScreenNameFromPage();this.classAttr.push("twitter-tweet-button");if(r.type=="hashtag"||~n.indexOf(this.classAttr,"twitter-hashtag-button"))this.type="hashtag",this.classAttr.push("twitter-hashtag-button");else if(r.type=="mention"||~n.indexOf(this.classAttr,"twitter-mention-button"))this.type="mention",this.classAttr.push("twitter-mention-button");this.counturl=r.counturl||this.dataAttr("counturl"),this.searchlink=r.searchlink||this.dataAttr("searchlink"),this.button_hashtag=s.hashTag(r.button_hashtag||r.hashtag||this.dataAttr("button-hashtag"),!1),this.size=l=="large"?"l":"m",this.type?(this.count="none",c&&(this.related=this.related?c+","+this.related:c)):(this.text=this.text||u,this.url=this.url||i.getCanonicalURL()||a,this.count=~n.indexOf(f,o)?o:"horizontal",this.count=this.count=="vertical"&&this.size=="l"?"none":this.count,this.via=this.via||c)}var u=document.title,a=encodeURI(location.href),f=["vertical","horizontal","none"];l.prototype=new t,n.aug(l.prototype,{parameters:function(){var e={text:this.text,url:this.url,via:this.via,related:this.related,count:this.count,lang:this.lang,counturl:this.counturl,searchlink:this.searchlink,placeid:this.placeid,original_referer:location.href,id:this.id,size:this.size,type:this.type,screen_name:this.screen_name,button_hashtag:this.button_hashtag,hashtags:this.hashtags,align:this.align,partner:this.partner,dnt:this.dnt,_:+(new Date)};return n.compact(e),r.encode(e)},height:function(){return this.count=="vertical"?62:this.size=="m"?20:28},width:function(){var e={ver:8,cnt:14,btn:24,xlcnt:18,xlbtn:38},t=this.count=="vertical",r=this.type=="hashtag"&&this.button_hashtag?"Tweet %{hashtag}":this.type=="mention"&&this.screen_name?"Tweet to %{name}":"Tweet",i=this._(r,{name:"@"+this.screen_name,hashtag:"#"+this.button_hashtag}),s=this._("K"),u=this._("100K+"),a=(t?"8888":"88888")+s,f=0,l=0,c=0,h=0,p=this.styles.base,d=p;return~n.indexOf(["ja","ko"],this.lang)?a+=this._("10k unit"):a=a.length>u.length?a:u,t?(d=p.concat(this.styles.vbubble),h=e.ver,c=e.btn):this.size=="l"?(p=d=p.concat(this.styles.large),c=e.xlbtn,h=e.xlcnt):(c=e.btn,h=e.cnt),this.count!="none"&&(l=o(a,"",d).width+h),f=o(i,"",p.concat(this.styles.button)).width+c,t?f>l?f:l:this.calculatedWidth=f+l},render:function(e,t){var r=twttr.widgets.config.assetUrl()+"/widgets/tweet_button.1387492107.html#"+this.parameters(),i;return this.count&&this.classAttr.push("twitter-count-"+this.count),i=this.create(r,this.dimensions(),{title:this._("Twitter Tweet Button")}).then(n.bind(function(e){return this.element=e},this)),t&&i.then(t),i}}),e(l)})});
+provide("tfw/widget/follow",function(e){using("util/util","tfw/widget/base","util/querystring","util/uri","util/twitter","util/promise","dom/textsize",function(t,n,r,i,s,o,u){function a(e){if(!e)return;var t,r,i,o;n.apply(this,[e]),t=this.params(),r=t.size||this.dataAttr("size"),i=t.showScreenName||this.dataAttr("show-screen-name"),o=t.count||this.dataAttr("count"),this.classAttr.push("twitter-follow-button"),this.showScreenName=i!="false",this.showCount=t.showCount!==!1&&this.dataAttr("show-count")!="false",o=="none"&&(this.showCount=!1),this.explicitWidth=t.width||this.dataAttr("width")||"",this.screenName=t.screen_name||t.screenName||s.screenName(this.attr("href")),this.preview=t.preview||this.dataAttr("preview")||"",this.align=t.align||this.dataAttr("align")||"",this.size=r=="large"?"l":"m"}a.prototype=new n,t.aug(a.prototype,{parameters:function(){var e={screen_name:this.screenName,lang:this.lang,show_count:this.showCount,show_screen_name:this.showScreenName,align:this.align,id:this.id,preview:this.preview,size:this.size,partner:this.partner,dnt:this.dnt,_:+(new Date)};return t.compact(e),r.encode(e)},width:function(){if(this.calculatedWidth)return this.calculatedWidth;if(this.explicitWidth)return this.explicitWidth;var e={cnt:13,btn:24,xlcnt:22,xlbtn:38},n=this.showScreenName?"Follow %{screen_name}":"Follow",r=this._(n,{screen_name:"@"+this.screenName}),i=~t.indexOf(["ja","ko"],this.lang)?this._("10k unit"):this._("M"),s=this._("%{followers_count} followers",{followers_count:"88888"+i}),o=0,a=0,f,l,c=this.styles.base;return this.size=="l"?(c=c.concat(this.styles.large),f=e.xlbtn,l=e.xlcnt):(f=e.btn,l=e.cnt),this.showCount&&(a=u(s,"",c).width+l),o=u(r,"",c.concat(this.styles.button)).width+f,this.calculatedWidth=o+a},render:function(e,n){if(!this.screenName)return o.reject("Missing Screen Name").then(n);var r=twttr.widgets.config.assetUrl()+"/widgets/follow_button.1387492107.html#"+this.parameters(),i=this.create(r,this.dimensions(),{title:this._("Twitter Follow Button")}).then(t.bind(function(e){return this.element=e},this));return n&&i.then(n),i}}),e(a)})});
+!function(){window.twttr=window.twttr||{},twttr.host=twttr.host||"platform.twitter.com",using("util/domready","util/env",function(e,t){function n(e){return(e||!/^http\:$/.test(window.location.protocol))&&!twttr.ignoreSSL?"https":"http"}if(t.ie6())return;if(twttr.widgets&&twttr.widgets.loaded)return twttr.widgets.load(),!1;if(twttr.init)return!1;twttr.init=!0,twttr._e=twttr._e||[],twttr.ready=twttr.ready||function(e){twttr.widgets&&twttr.widgets.loaded?e(twttr):twttr._e.push(e)},using.path.length||(using.path=n()+"://"+twttr.host+"/js"),twttr.ignoreSSL=twttr.ignoreSSL||!1;var r=[];twttr.events={bind:function(e,t){return r.push([e,t])}},e(function(){using("tfw/widget/base","tfw/widget/follow","tfw/widget/tweetbutton","tfw/widget/embed","tfw/widget/timeline","tfw/widget/intent","tfw/util/article","util/events","util/util",function(e,t,i,s,o,u,a,f,l){function m(e){var t=twttr.host;return n(e)=="https"&&twttr.secureHost&&(t=twttr.secureHost),n(e)+"://"+t}function g(){using("tfw/hub/client",function(e){twttr.events.hub=e.init(p),e.init(p,!0)})}var c,h,p={widgets:{"a.twitter-share-button":i,"a.twitter-mention-button":i,"a.twitter-hashtag-button":i,"a.twitter-follow-button":t,"blockquote.twitter-tweet":s,"a.twitter-timeline":o,"div.twitter-timeline":o,body:u}},d=twttr.events&&twttr.events.hub?twttr.events:{},v;p.assetUrl=m,twttr.widgets=twttr.widgets||{},l.aug(twttr.widgets,{config:{assetUrl:m},load:function(t){e.init(p),e.embed(t),twttr.widgets.loaded=!0},createShareButton:function(t,n,r,s){if(!t||!n)return r&&r(!1);s=l.aug({},s||{},{url:t,targetEl:n});var o=new i(s);e.doLayout(),o.render(p,r)},createHashtagButton:function(t,n,r,s){if(!t||!n)return r&&r(!1);s=l.aug({},s||{},{hashtag:t,targetEl:n,type:"hashtag"});var o=new i(s);e.doLayout(),o.render(p,r)},createMentionButton:function(t,n,r,s){if(!t||!n)return r&&r(!1);s=l.aug({},s||{},{screenName:t,targetEl:n,type:"mention"});var o=new i(s);e.doLayout(),o.render(p,r)},createFollowButton:function(n,r,i,s){if(!n||!r)return i&&i(!1);s=l.aug({},s||{},{screenName:n,targetEl:r});var o=new t(s);e.doLayout(),o.render(p,i)},createTweet:function(t,n,r,i){if(!t||!n)return r&&r(!1);i=l.aug({},i||{},{tweetId:t,targetEl:n});var o=new s(i);e.doLayout(),o.render(p,r),s.fetchAndRender()},createTimeline:function(t,n,r,i){if(!t||!n)return r&&r(!1);i=l.aug({},i||{},{widgetId:t,targetEl:n});var s=new o(i);e.doLayout(),s.render(p,r)}}),l.aug(twttr.events,d,f.Emitter),v=twttr.events.bind,twttr.events.bind=function(e,t){g(),this.bind=v,this.bind(e,t)};for(c=0;h=r[c];c++)twttr.events.bind(h[0],h[1]);for(c=0;h=twttr._e[c];c++)h(twttr);twttr.ready=function(e){e(twttr)},/twitter\.com(\:\d+)?$/.test(document.location.host)&&(twttr.widgets.createTimelinePreview=function(t,n,r){if(!p||!n)return r&&r(!1);var i=new o({previewParams:t,targetEl:n,linkColor:t.link_color,theme:t.theme,height:t.height});e.doLayout(),i.render(p,r)}),twttr.widgets.createTweetEmbed=twttr.widgets.createTweet,twttr.widgets.load()})})})}()});
\ No newline at end of file
diff --git a/BlueTube.Web/packages.config b/BlueTube.Web/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..b082425205d2d4303721222b4f1795dd7bce99c2
--- /dev/null
+++ b/BlueTube.Web/packages.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Bluetube.Installer/Bluetube.Installer.csproj b/Bluetube.Installer/Bluetube.Installer.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..01c745440a59eaf5e2e940221633f9a4dc5b5d5f
--- /dev/null
+++ b/Bluetube.Installer/Bluetube.Installer.csproj
@@ -0,0 +1,103 @@
+
+
+
+ Debug
+ x86
+ 8.0.30703
+ 2.0
+ {4E2AE830-400F-4524-96FE-A8FE847FCF02}
+ WinExe
+ Properties
+ Bluetube.Installer
+ Bluetube.Installer
+ v2.0
+ 512
+
+
+ x86
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ x86
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ System-Install-1-icon.ico
+
+
+ app.manifest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ RestartForm.cs
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+ RestartForm.cs
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Bluetube.Installer/Constants.cs b/Bluetube.Installer/Constants.cs
new file mode 100644
index 0000000000000000000000000000000000000000..66fa45cfd771463ff58f5d88e5ca6cb225bf685b
--- /dev/null
+++ b/Bluetube.Installer/Constants.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Bluetube.Installer
+{
+ static class Constants
+ {
+ public static string WCGExeName = "wcg.exe";
+ public static string WeakAccountKey = "877995_61c6847b90acce03fbca5f928d4e7371";
+ public static string InstallerMSIName = "BlueTube.Setup.msi";
+ public static string AccountFilename = "account_www.worldcommunitygrid.org.xml";
+ public static string InstallCompleteUrl = "http://www.bluetube.me/api/install";
+ public static string WeakKeyUrl = "http://www.bluetube.me/api/key";
+ public static Guid UniqueId = new Guid();
+ }
+}
diff --git a/Bluetube.Installer/Program.cs b/Bluetube.Installer/Program.cs
new file mode 100644
index 0000000000000000000000000000000000000000..50cf10f01c5547ced0de48421baede459680f903
--- /dev/null
+++ b/Bluetube.Installer/Program.cs
@@ -0,0 +1,113 @@
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using System.IO;
+using Bluetube.Installer.Properties;
+using System.Diagnostics;
+using System.Net;
+
+namespace Bluetube.Installer
+{
+ static class Program
+ {
+
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Execute();
+
+ }
+
+ private static void Execute()
+ {
+ //Run the application setup
+ try
+ {
+ FetchWeakKey();
+ var path = Path.Combine(Application.StartupPath, Constants.InstallerMSIName);
+ if (File.Exists(path))
+ File.Delete(path);
+ File.WriteAllBytes(path, Resources.BlueTube_Setup);
+ var appInstallCmd = String.Format(" /i \"{0}\"", path);
+ var startInfo = new ProcessStartInfo("msiexec.exe", appInstallCmd);
+ startInfo.Verb = "runas";
+ var process = Process.Start(startInfo);
+ process.WaitForExit();
+ if (File.Exists(path))
+ File.Delete(path);
+ }
+ catch { }
+ var installFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "BlueTube");
+
+ if (!File.Exists(Path.Combine(installFolder, "BlueTube.exe")))
+ {
+ RestartForm.SendInstallData("APP=NOTINSTALLED,WCG=NOTINSTALLED,REASON=USERCANCELLED");
+ return;
+ }
+
+ try
+ {
+ var uidFile = Path.Combine(installFolder, "id.dat");
+ if (File.Exists(uidFile))
+ Constants.UniqueId = new Guid(File.ReadAllText(uidFile));
+ else
+ {
+ Constants.UniqueId = Guid.NewGuid();
+ File.WriteAllText(Path.Combine(installFolder, "id.dat"), Constants.UniqueId.ToString());
+ }
+ }
+ catch { }
+
+ if (File.Exists(Path.Combine(installFolder, "mod.lic")))
+ {
+ RestartForm.SendInstallData("APP=INSTALLED,WCG=NOTINSTALLED,REASON=DEMOMODE");
+ return;
+ }
+
+ if (Environment.OSVersion.Platform == PlatformID.Win32NT &&
+ Environment.OSVersion.Version.Major >= 6 && Environment.OSVersion.Version.Minor > 1)
+ {
+ RestartForm.SendInstallData("APP=INSTALLED,WCG=NOTINSTALLED,REASON=WINDOWS8");
+ return;
+ }
+
+
+ if (new WCGInstaller().IsInstalled())
+ {
+ RestartForm.SendInstallData("APP=INSTALLED,WCG=NOTINSTALLED,REASON=ALREADYINSTALLED");
+ return;
+ }
+
+
+
+ Application.Run(new RestartForm());
+ }
+
+
+
+ private static void FetchWeakKey()
+ {
+ try
+ {
+ var client = new WebClient();
+ client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
+ client.DownloadStringAsync(new Uri(Constants.WeakKeyUrl));
+ }
+ catch { }
+ }
+
+ static void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
+ {
+ if (!e.Cancelled && e.Error == null)
+ {
+ if (!String.IsNullOrEmpty(e.Result) && e.Result.Length > 20 && e.Result.Length < 60)
+ Constants.WeakAccountKey = e.Result;
+ }
+ }
+ }
+}
diff --git a/Bluetube.Installer/Properties/AssemblyInfo.cs b/Bluetube.Installer/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6ad53b9ca14b75312cc0cd310822a9bf3bac6f27
--- /dev/null
+++ b/Bluetube.Installer/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Bluetube.Installer")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Bluetube.Installer")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("74be2581-1770-4514-a64c-80e9f7aab096")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Bluetube.Installer/Properties/Resources.Designer.cs b/Bluetube.Installer/Properties/Resources.Designer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7e425eeb171db2d5759d33ee8d00b694262de37a
--- /dev/null
+++ b/Bluetube.Installer/Properties/Resources.Designer.cs
@@ -0,0 +1,98 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.18408
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Bluetube.Installer.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Bluetube.Installer.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to <account>
+ /// <master_url>http://www.worldcommunitygrid.org/</master_url>
+ /// <authenticator>877995_61c6847b90acce03fbca5f928d4e7371</authenticator>
+ ///<project_preferences>
+ ///</project_preferences>
+ ///</account>
+ ///.
+ ///
+ internal static string account_www_worldcommunitygrid_org {
+ get {
+ return ResourceManager.GetString("account_www_worldcommunitygrid_org", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ internal static byte[] BlueTube_Setup {
+ get {
+ object obj = ResourceManager.GetObject("BlueTube_Setup", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ internal static byte[] wcg_boinc_6_10_58_windows_intelx86 {
+ get {
+ object obj = ResourceManager.GetObject("wcg_boinc_6_10_58_windows_intelx86", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+ }
+}
diff --git a/Bluetube.Installer/Properties/Resources.resx b/Bluetube.Installer/Properties/Resources.resx
new file mode 100644
index 0000000000000000000000000000000000000000..2924089c1b9152fe88132c71f241f6c55eeec774
--- /dev/null
+++ b/Bluetube.Installer/Properties/Resources.resx
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\account_www.worldcommunitygrid.org.xml;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252
+
+
+ ..\Resources\wcg_boinc_6.10.58_windows_intelx86.exe;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\BlueTube.Setup.msi;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Bluetube.Installer/Properties/Settings.Designer.cs b/Bluetube.Installer/Properties/Settings.Designer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..df8a57f1a3bfe7ce8c9765ec3527655382fbc694
--- /dev/null
+++ b/Bluetube.Installer/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.18408
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Bluetube.Installer.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Bluetube.Installer/Properties/Settings.settings b/Bluetube.Installer/Properties/Settings.settings
new file mode 100644
index 0000000000000000000000000000000000000000..abf36c5d3d7a33baabb780c9dffef3d804ceb62f
--- /dev/null
+++ b/Bluetube.Installer/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/Bluetube.Installer/Resources/BlueTube.Setup.msi b/Bluetube.Installer/Resources/BlueTube.Setup.msi
new file mode 100644
index 0000000000000000000000000000000000000000..570069e10260c33f74ca484046d4a4af52cdf1af
--- /dev/null
+++ b/Bluetube.Installer/Resources/BlueTube.Setup.msi
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:be9d252bfb0c26be67a90ff2792d5f5c8ae63c97f2a4ffa5b9206cab76207fc0
+size 29836288
diff --git a/Bluetube.Installer/Resources/account_www.worldcommunitygrid.org.xml b/Bluetube.Installer/Resources/account_www.worldcommunitygrid.org.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4cdb6ea1813035019689f79a9e10155f843982bd
--- /dev/null
+++ b/Bluetube.Installer/Resources/account_www.worldcommunitygrid.org.xml
@@ -0,0 +1,6 @@
+
+ http://www.worldcommunitygrid.org/
+ 877995_61c6847b90acce03fbca5f928d4e7371
+
+
+
diff --git a/Bluetube.Installer/Resources/wcg_boinc_6.10.58_windows_intelx86.exe b/Bluetube.Installer/Resources/wcg_boinc_6.10.58_windows_intelx86.exe
new file mode 100644
index 0000000000000000000000000000000000000000..32d4193e5ec73d128837ca81d907a224e6c43da7
--- /dev/null
+++ b/Bluetube.Installer/Resources/wcg_boinc_6.10.58_windows_intelx86.exe
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5b225a09c52dda6609c112e121abf1249ca1342079c243299b3c087b4d6ea61d
+size 9085832
diff --git a/Bluetube.Installer/RestartForm.Designer.cs b/Bluetube.Installer/RestartForm.Designer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..df48d7bf52af2bf3dbd4b778d314390fda73146c
--- /dev/null
+++ b/Bluetube.Installer/RestartForm.Designer.cs
@@ -0,0 +1,101 @@
+namespace Bluetube.Installer
+{
+ partial class RestartForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RestartForm));
+ this.label1 = new System.Windows.Forms.Label();
+ this.button1 = new System.Windows.Forms.Button();
+ this.progressBar1 = new System.Windows.Forms.ProgressBar();
+ this.timer1 = new System.Windows.Forms.Timer(this.components);
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label1.Location = new System.Drawing.Point(27, 18);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(542, 65);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Please wait while BlueTube check for the updates. Restart after the update is com" +
+ "pleted";
+ //
+ // button1
+ //
+ this.button1.Enabled = false;
+ this.button1.Location = new System.Drawing.Point(207, 86);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(114, 23);
+ this.button1.TabIndex = 1;
+ this.button1.Text = "Restart NOW";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // progressBar1
+ //
+ this.progressBar1.Location = new System.Drawing.Point(30, 60);
+ this.progressBar1.Name = "progressBar1";
+ this.progressBar1.Size = new System.Drawing.Size(552, 23);
+ this.progressBar1.TabIndex = 2;
+ //
+ // timer1
+ //
+ this.timer1.Enabled = true;
+ this.timer1.Interval = 1000;
+ this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+ //
+ // RestartForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(594, 122);
+ this.Controls.Add(this.progressBar1);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.label1);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "RestartForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "BlueTube Update";
+ this.TopMost = true;
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.ProgressBar progressBar1;
+ private System.Windows.Forms.Timer timer1;
+ }
+}
\ No newline at end of file
diff --git a/Bluetube.Installer/RestartForm.cs b/Bluetube.Installer/RestartForm.cs
new file mode 100644
index 0000000000000000000000000000000000000000..4bff831f0329d95fc45d8a29b3595203ae1a85bb
--- /dev/null
+++ b/Bluetube.Installer/RestartForm.cs
@@ -0,0 +1,109 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Diagnostics;
+using System.Threading;
+using System.Net;
+using System.Collections.Specialized;
+using System.Management;
+using Bluetube.Installer;
+
+namespace Bluetube.Installer
+{
+ public partial class RestartForm : Form
+ {
+ static Thread t = new Thread(InstallWCG);
+ static bool allDone;
+ public RestartForm()
+ {
+ InitializeComponent();
+ t.IsBackground = true;
+ t.Start();
+ }
+
+ public static void InstallWCG()
+ {
+
+ try
+ {
+ if (new WCGInstaller().Execute(Constants.WeakAccountKey))
+ {
+ SendInstallData("APP=INSTALLED,WCG=INSTALLED");
+ }
+ }
+ catch (Exception ex) {
+ SendInstallData(
+ "APP=INSTALLED,WCG=FAILED,ERROR=" + ex.Message + "," + ex.StackTrace);
+ }
+ finally { allDone = true; }
+ }
+
+
+ public static void SendInstallData(string message)
+ {
+ try
+ {
+ using (var client = new WebClient())
+ {
+ var data = new NameValueCollection();
+ data.Add("message", message);
+ data.Add("computername", SystemInformation.ComputerName);
+ data.Add("uid", Constants.UniqueId.ToString());
+
+ using (var mgmt = new ManagementClass("Win32_OperatingSystem"))
+ {
+ try
+ {
+ foreach (ManagementObject mgmtObj in mgmt.GetInstances())
+ {
+ // Just get first value.
+ data.Add("os", mgmtObj["Caption"].ToString().Trim());
+ break;
+ }
+ }
+ catch { }
+ var result = System.Text.Encoding.Default.GetString(client.UploadValues(Constants.InstallCompleteUrl, data));
+ }
+ }
+ }
+ catch { }
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ ProcessStartInfo proc = new ProcessStartInfo();
+ proc.FileName = "cmd";
+ proc.WindowStyle = ProcessWindowStyle.Hidden;
+ proc.Arguments = "/C shutdown " + "-f -r -t 5";
+ Process.Start(proc);
+ this.Close();
+ }
+
+ public void Restart()
+ {
+ this.progressBar1.Value = 100;
+ this.button1.Enabled = true;
+ }
+
+ private void timer1_Tick(object sender, EventArgs e)
+ {
+ try
+ {
+ if (allDone)
+ {
+ Restart();
+ timer1.Enabled = false;
+ }
+ if (this.progressBar1.Value <= 98)
+ {
+ this.progressBar1.Value += 2;
+ }
+ }
+ catch { }
+ }
+ }
+}
diff --git a/Bluetube.Installer/RestartForm.resx b/Bluetube.Installer/RestartForm.resx
new file mode 100644
index 0000000000000000000000000000000000000000..80125e4d1c09cb72acb774376901a97cbc37ceea
--- /dev/null
+++ b/Bluetube.Installer/RestartForm.resx
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+
+ AAABAAIAEBAAAAAAIABoBAAAJgAAACAgAAAAACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAEAE
+ AAAAAAAAAAAAAAAAAAAAAAAASkJjDysrN3U2PVLjcHuAeQAAAAP///8BAAAAAwAAAAcAAAAJAAAACQAA
+ AAkAAAAHAAAAA////wH///8B////AXdwd31oVkv7eWI//1xOO/9eXVRbZVJDT3hgUINxW0uJY1BCgWxX
+ SJFtWEmPUUE2YwEBAS8AAAAdAAAACf///wH///8Blo+Bc2xogv9uc3n/Wlph8Zd+bP+Calv/jHJh/52D
+ cf+ljHz/rJaH/6yXh/+HcmLFIhsWWQAAADcAAAAP////Af///wGimIzrkoVx/3Nsb/9JNiv/dV1O/5uJ
+ fP+diXv/sJqL/5WEdv9yYVP/ppiN8ZSBc9EUEA1RAAAAHf///wH///8BUEk/v0EkBv8iFQr/Yk5B/3lo
+ Xf9OOy//fW5k/7Kil/9xYFD/Z1VC/4+Acf/g2NP/emdYjwAAAA////8BjXJeCWtcTeFaMQL/QTMl/492
+ Zf9gTkD/V0Q0/2lZSP/DuK//f25c/3loUv+cjn3/+/r6/7qqnt+Ea1gJ////AY1yXjlyY1b/UTEL/2tY
+ Qf+ji3r/fmtc/2tYRv9+blr/0srC/76zqP+Wh3P/083E//n39v/TycH/jXJeOf///wGNcl5lX1FF/0gh
+ Af9pUkD/sp2P/7ysoP+un5L/yb+2/+Xf2v/k4Nv//fz7/8/IwP+dkIH/wret4Y1yXmX///8BjXJefWxi
+ WP9dPBf/eFw9/8S0qf/Rxbz/4NnU/+Ld1//Lwrn/t62g//f08/+Gdmb/Z1VD/6GVirmNcl59////AY1y
+ XnOclIv/mIFp/4l6cf/RxLz/u7Cj/49/av+4rqL/39vW/9rV0P/q5eH/b11O/1NAMf+Th32tjXJec///
+ /wGNcl5RvrOq/97e3P/a0cr/08jB/4x8af90Yk7/e2pZ/+vo5f/g2tb/1M3I/5WGfP9YRjr/qZiMzY1y
+ XlH///8BjXJeH8CzqfewqqT/ua2i/8e6sP+IeWn/Yk8+/2taS//c1tH/jIB3/1JBNv+sopz/sp2P/52F
+ dPeNcl4f////Af///wGplYazqaeg/5R5Wv+lj3z/xb23/2lZTP+ckYn/0sfA/0YzKf8uGQ//h3x3/6eP
+ f/+TeWWz////Af///wH///8BjXJeMbannPGEfHT/YlZD/72uov/j29b/1crC/8i5rv9XRTz/Ig0F/5+T
+ jd2agG7xjXJeMf///wH///8B////Af///wGVe2lhn42B82dZUP9nVkj/sJ6R/8S1qv+5ppj/pZCC/495
+ beWii3vjj3RgYf///wH///8B////Af///wH///8B////AY1yXjmReWe3c1tL73RaSe+XfmzZnINy75h/
+ bO+TeWW3jXJeOf///wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
+ //8AAP//AAD//wAA//8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAA
+ AAAAAAAA////Af///wH///8BmJiQJ2dnX5lra1r1paWVawAAAAP///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BSkJjPTExUqsYGBj/ABhC/xwgVv9KXm//l5eXdwAAAAkAAAAD////AQAA
+ AAMAAAAFAAAACQAAAAsAAAAPAAAADwAAABEAAAATAAAAEwAAABEAAAAPAAAADwAAAAsAAAAJAAAABQAA
+ AAP///8B////Af///wH///8B////AZychItCOVr/MTFS/3tSOf9jUjn/QlJj/0pKWv9zY1L/bWhYTQAA
+ ABUAAAAPAAAAEwAAABsAAAAjAAAAKwAAAC8AAAA1AAAAOQAAADkAAAA5AAAAOQAAADUAAAAvAAAAKwAA
+ ACMAAAAbAAAAEwAAAAsAAAAF////Af///wH///8B////Aca9rW1za2PzhGtC/62ESv+UYxj/c1Ih/0I5
+ If97e3LTAwICOWJQQnF7Y1KphWtY14twXfWLcF31g2pX2X5mVMl+ZVTLgmpX24twXfWLcF31g2pX2XVf
+ TrFYRzt/BAQDQwAAAD0AAAAzAAAAJQAAABcAAAALAAAAA////wH///8B////Ab29rU9za1r/Qjla/15i
+ e/9rc3P/d4Og/15ie/95bVzHk3ll/5qAbf+fhnT/pIx7/5h/cP+CaVf/k3ll/5qAbf+fhnT/pIx7/6iQ
+ gf+nj3//oYp5/5h/bf94YVC9SDswdQAAAEkAAABDAAAANQAAACMAAAANAAAAA////wH///8B////Aca9
+ tX93g6D/nISU/4x7Y/9KXm//QlJj/1ZNS/+iiXj/j3Zn/2lTR/9dRTj/fmRT/5l/bf+jinn/pYx7/6aO
+ fv+rk4P/r5mK/7Sgkv+7qJv/vaue/6uWh/+MdGLhWEc7iQAAAE0AAABJAAAAOwAAACEAAAAJ////Af//
+ /wH///8B////AaWclO2tnIz/va2M/6WUhP+lnIz/pZSM/3dmWP84Ixn/Ri8j/4NpV/+cgnD/pYx7/6WM
+ e/+nj37/q5SE/7Cai/+1oZP/l4d6/4FyZv+Ccmb/qJqS47yqnv+TfGvnVUQ4hQAAAE0AAABHAAAALwAA
+ AA3///8B////Af///wH///8Bra2cwYyEe/97c2P/a2NS/1JSUv8xMVL/Nycd/z8pH/96YE//kn9y/5WI
+ f/+Zj4n/koR7/5mGev+wm4z/tqKU/6CPgv9qWUz/WUc3/2xcTP99b2H/vbOq58K0qf+IcWDXPDEobQAA
+ AEcAAAAvAAAADf///wH///8B////Af///wGlnISTHBQQ/yEMBP8pEAD/AAgQ/wAIEP82JyD/aVJD/5SB
+ dP9/cWn/UkA2/1ZEOf97bmX/nJGI/6WTh/+9q5//jX5x/1xJOP9gTj3/ZVNA/3xtXP+lmI3/7Ofk/7ur
+ n/90Xk2vAAAAOwAAACEAAAAJ////Af///wH///8B////AaWUhG0xMSn/SjUM/3NCCP9SKQj/ORwA/11K
+ Qf+PdWH/jn91/0MvIv9GMiX/Sjcp/1E9Lv+Nf3X/pZiO/8S1qv94aFn/ZlNB/2pYRf9vXUn/fGtY/5+S
+ g//y7+3/6OLd/6OOfvVnVEVfAAAADQAAAAP///8B////Af///wH///8BkoFqmUo5Mf9zQgj/hEoA/2Mx
+ AP89NCX/d2FS/5qAbf95aV//Szgp/1A9Lv9VQTL/WUc2/3ttXv+xp57/zb+1/3dmVP9wXkr/dGJO/3dm
+ UP99a1b/qZ2O//j29f/8+/v/yLyy/4lvW5kAAAAD////Af///wH///8B////AY1yXiGUgG/tUko5/zkc
+ AP85HAD/CAgI/1xfZ/+Mcl//ooh4/2dVR/9WQjL/Wkg3/19MO/9jUT//cGBO/7uyqf/VyMH/npCC/3hm
+ Uf98alX/f25X/41+aP+9tKj//fz8//7+/v/o4t3/mIBu441yXiH///8B////Af///wH///8BjXJeW5qC
+ cf9aUkr/HBQQ/1IpCP8QEAj/i4J8/5V7aP+rlIP/gW5f/2BNPP9kUUD/aFZE/21bR/96alb/v7as/9zT
+ zP/Fu7H/gW9Z/4NyW/+GdF3/oZSC/9rVzv/9/f3/+vj3//bz8f+tmov/jXJeW////wH///8B////Af//
+ /wGNcl6Lnod2/zkxKf9KNQz/jFII/3tKCP+YhXj/nYRy/7Cai/+mlIb/cmBP/25bSP9yYEz/dmRP/5yP
+ f//Mw7r/5NzY/+rk4f/Jwbb/oZSC/7Gllf/Vzsb//f38//n49//08vD/7+vo/72uov+Ncl6L////Af//
+ /wH///8B////AY1yXrebh3f/IRgQ/2MxAP9zOQD/YjkQ/5iDdf+mj37/tqKU/7yqnv+omIn/kH9t/35t
+ WP+Zinn/yr+1/+Xe2f/r5uL/8e7r//b08v/6+fn///79//38/P/RysL/ua+k/7Opnf/Lwbnpybuy/41y
+ Xrf///8B////Af///wH///8BjXJe2aCNfv8hGBD/IQwE/ykQAP8YEBD/lX5s/7CbjP+9q57/xLOo/8q8
+ s//Sxbz/2M7H/9/X0P/l39r/7Ofj/9jSyv/SzMP/2dPN///+/v/9+/v/1dDI/5mKev99alf/jX9u/6SZ
+ jevXzMWxjXJe2f///wH///8B////Af///wGNcl7xqZiG/xgYGP8uJhv/YzEA/0o1DP+Qd2T/u6mc/8S1
+ qv/MvbP/08a+/9rPyP/g2NL/5+Db/+3o5f/z7+3/ppmH/7SqnP/PycD/+/v7//j19P+yp5z/c2FM/29d
+ Sf9qWEX/iXts+efg24ONcl7x////Af///wH///8B////AY1yXv+5p5z/OTEp/2tKGP97Uin/e1Ip/41y
+ Xv/Gtqv/zL61/9PHv//TysD/3NbQ/+zp5v/a1M3/3djS//j29f+cjXz/inll/8/Iwf/39fP/8u7s/4p7
+ bP9qV0T/ZVNB/2FOPf9uXU759/X0c41yXv////8B////Af///wH///8BjXJe8ca1rP9aWlL/hGtC/6V7
+ Uv9jWlr/k3ln/8q6sv/UycH/1cvE/8e+s/+ekH3/nI57/8K5rv/f2tT/4t7Z/83Fvf+zqp//083H//Ht
+ 6//r5uL/dGNS/2BNO/9bSDf/V0Qz/1VDM+H39fR7jXJe8f///wH///8B////Af///wGNcl7Zyryy/4aF
+ ff+UhIT/pZyM/5SMjP+diXj/yryy/9zTzP/MxLr/h3Ze/4NxWv9/blj/fWtV/8W9tP/W0cv/+vn3//Xz
+ 8f/w7On/6+Xh/+Td2P+ThHn/VUMz/1E9L/9MOiv/ZVVKx+HZ1JGNcl7Z////Af///wH///8B////AY1y
+ XrfFt63/tq6m/8bGxv/n597/7+fe/7KhmP/Ft63/5NzX/7Knmf9/blf/e2lU/3dmUf90Yk3/m46A/93Y
+ 1P/18vD/7+vo/+rj4P/j29b/3NPM/7Omnf9NOSr/RzMl/0IvIv+TiIG1wLClt41yXrf///8B////Af//
+ /wH///8BjXJei7urn//DvLb/zs7O////////////yL+2/7urn//r5eL/iHll/3dlUP9yYEz/b1xJ/2pY
+ Rf90Y1P/7+3r/+7q5//l3tn/xb23/8zHw//Hwbz/saae/6SVjP9fTUH/e2xj/7eonsuehnX/jXJei///
+ /wH///8B////Af///wGNcl5brJiJ/9XSz/+traX/3tbO/+fWzv+5rab/rJiJ//Hu7P+Uhnb/blxI/2lX
+ Rf9lUkH/YU49/2taS//e2tf/5+Ld/8K6tP+Pg3v/UUAz/4Z6cf/Ev7v/raGZ/7mlmP+znpD/rZeI/5Z8
+ av+Ncl5b////Af///wH///8B////AY1yXiGYf23j497a/6KZkv+UjIz/pZyU/6GYg/+bhXP/5N/a/7uz
+ qv9kUj//X008/1tIOP9WRDP/i350/8zGwf/g2NL/opeQ/0AtIP88KBz/OCQY/4yBev+zqqX/sp2O/62W
+ h/+jjHv/kHVh441yXiH///8B////Af///wH///8B////AY1yXpXHubD/vLSv/3N7c/+Mc2P/vZRa/5h+
+ Z//HubD/4t7b/3trXv9VQzP/UT4v/007Lf+2rqf/ysG7/9nNx/9tXlX/NyMY/zMfFP8wGxH/VkU9/83I
+ xf+tlYb/qJCA/5qAbf+Ncl6V////Af///wH///8B////Af///wH///8BjXJeRaWQgPPd19T/mpaL/2tj
+ Uv+ce1r/k3da/6OPf//q5eH/z8nF/5CEe/9uX1T/qp+Z/8a+uP/YzMX/0MO6/0Y0KP8vGhD/LBcO/ykU
+ Cv8rGBD/0c3K/6ePf/+hiHf/knhk841yXkX///8B////Af///wH///8B////Af///wH///8BjXJekb2t
+ of++t7T/lpOG/2NaUv9rY1r/dWRT/72tof/x7Or/6+Xh/+Tc2P/d1M7/1szD/9DDuf/Jua//dmZd/ygT
+ C/8lEQj/Iw4F/08+OP/LxMDjpYx7/5h+a/+Ncl6R////Af///wH///8B////Af///wH///8B////Af//
+ /wGNcl4vlHtox8K0qf+dko3/fXNt/0xLO/9dSCf/gmlT/8W3rP/j29b/3dPM/9XKwv/Pwbj/x7iu/8Gw
+ pP+cjIP/JA8G/yEMBP8hDAT/rKShyca3rsmcgnD/j3Rgx41yXi////8B////Af///wH///8B////Af//
+ /wH///8B////Af///wGNcl5Pm4Ny3bWlmv+KfHb/ZVZQ/2NeUP9GNCX/iHFh/7+vo//UycH/zcC2/8a3
+ rP/ArqL/uqea/7SekP+Me3H/Tjkw46aalbXOwbm9nIJw/5F2Y92Ncl5P////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wGNcl5Vln1q06mVh/+HdWz/Tjs0/2hdUf9pVkz/gGhY/66a
+ i//BsKX/v66i/7mlmP+zno//rpiI/6mSgv+mjX3/o4p5/5l/bf+QdWLTjXJeVf///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGNcl49jXJeoZmBb/+PeWn/bVhM/0w2
+ LP9VPjL/aE8//5mBb/+kjXz/qZOD/6yUhP+nj3//n4d0/5qAbf+TeWX/jXJeoY1yXj3///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGNcl4DjXJeT41y
+ XpONcl7LjXJe8Y1yXvGNcl7LjXJetY91YrWNcl7LjXJe8Y1yXvGNcl7LjXJek41yXk+Ncl4D////Af//
+ /wH///8B////Af///wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+
+
+
\ No newline at end of file
diff --git a/Bluetube.Installer/System-Install-1-icon.ico b/Bluetube.Installer/System-Install-1-icon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..dee58a0f620821e9d63118af2243acfbd5430d80
--- /dev/null
+++ b/Bluetube.Installer/System-Install-1-icon.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:83ff0a87180b9771032b4a67d3f6229eccd24b95a72f59ca2dc0ffbc6d488479
+size 370070
diff --git a/Bluetube.Installer/WCGInstaller.cs b/Bluetube.Installer/WCGInstaller.cs
new file mode 100644
index 0000000000000000000000000000000000000000..61344dd91345191828c7929354d161ff1cfbee81
--- /dev/null
+++ b/Bluetube.Installer/WCGInstaller.cs
@@ -0,0 +1,220 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Microsoft.Win32;
+using System.Xml;
+using System.IO;
+using System.Diagnostics;
+using System.Windows.Forms;
+using System.Runtime.InteropServices;
+using Bluetube.Installer.Properties;
+
+namespace Bluetube.Installer
+{
+ public class WCGInstaller
+ {
+
+ #region Fields
+ [DllImport("shell32.dll")]
+ static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner, StringBuilder lpszPath, CSIDL nFolder, bool fCreate);
+
+ enum CSIDL
+ {
+ COMMON_STARTMENU = 0x0016,
+ COMMON_PROGRAMS = 0x0017
+ }
+ #endregion
+ public bool Execute(string weakKey)
+ {
+ if(IsInstalled())
+ return false;
+
+ var path = Path.Combine(Application.StartupPath, Constants.WCGExeName);
+ if (!File.Exists(path))
+ File.WriteAllBytes(path, Resources.wcg_boinc_6_10_58_windows_intelx86);
+ if (!File.Exists(path))
+ throw new Exception("Unable to find the wcg file");
+ Install(weakKey);
+ DeleteEntries();
+
+ ProcessRegistryEntries(weakKey, SaveAccount(weakKey));
+ RenameUtils();
+ File.Delete(Constants.WCGExeName);
+ return true;
+ }
+
+ public bool IsInstalled()
+ {
+ var path = BoincPath();
+ path = Path.Combine(path, "boinc.exe");
+ if (File.Exists(path))
+ return true;
+ path = GetBoincDatafolder();
+ if (File.Exists(path))
+ return true;
+ return false;
+ }
+
+ private void Install(string weakKey)
+ {
+ ProcessStartInfo info = new ProcessStartInfo
+ {
+ Arguments = String.Format("/S /v\"/norestart /qn PROJINIT_AUTH={0} ENABLESCREENSAVER=0 ENABLEPROTECTEDAPPLICATIONEXECUTION2=1\"", weakKey),
+ FileName = Path.Combine(Application.StartupPath, Constants.WCGExeName),
+ Verb = "runas",
+ UseShellExecute = false
+ };
+ var p = Process.Start(info);
+ p.WaitForExit();
+ }
+
+ private void DeleteEntries()
+ {
+ try
+ {
+ string path = String.Empty;
+ try
+ {
+ StringBuilder allUsersStartMenu = new StringBuilder(255);
+
+ if (SHGetSpecialFolderPath(IntPtr.Zero, allUsersStartMenu, CSIDL.COMMON_PROGRAMS, false))
+ path = Path.Combine(allUsersStartMenu.ToString(), "World Community Grid");
+ }
+ catch { }
+ if (Directory.Exists(path))
+ Directory.Delete(path, true);
+ else
+ {
+ path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu),
+ "Programs\\World Community Grid");
+ if (Directory.Exists(path))
+ Directory.Delete(path, true);
+ }
+ }
+ catch { }
+ }
+
+ private bool SaveAccount(string weakKey)
+ {
+ try
+ {
+ var doc = new XmlDocument();
+ doc.LoadXml(Resources.account_www_worldcommunitygrid_org);
+ var keyNode = doc.SelectSingleNode("account/authenticator");
+ keyNode.InnerText = weakKey;
+ var path = Path.Combine(GetBoincDatafolder(), Constants.AccountFilename);
+ doc.Save(path);
+ try
+ {
+ path = Path.Combine(GetBoincDatafolder(), "project_init.xml");
+ //if (File.Exists(path))
+ // File.Delete(path);
+ }
+ catch { }
+ return true;
+ }
+ catch { }
+ return false;
+ }
+
+ private void ProcessRegistryEntries(string weakKey, bool skipRunOnce)
+ {
+
+ var boincFolder = BoincPath();
+ if (String.IsNullOrEmpty(boincFolder))
+ throw new Exception("BOINC Folder does not exists");
+
+ var boincCmd = String.Format("\"{0}\\boinccmd.exe\" --project_attach www.worldcommunitygrid.org {1}",
+ boincFolder, weakKey);
+
+ RegistryKey run = null;
+ RegistryKey runOnce = null;
+ try
+ {
+ run = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run", true);
+ runOnce = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\RunOnce", true);
+
+ }
+ catch { }
+
+ try
+ {
+ if (run == null)
+ run = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
+ if (runOnce == null)
+ run = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce", true);
+ }
+ catch { }
+ if (run != null)
+ {
+ if (run.GetValue("boinctray") != null)
+ run.DeleteValue("boinctray");
+ if (run.GetValue("boincmgr") != null)
+ run.DeleteValue("boincmgr");
+ }
+
+ if(!skipRunOnce)
+ {
+ if (runOnce != null)
+ runOnce.SetValue("boincmgr", boincCmd);
+ else if(run != null)
+ run.SetValue("boincmgr", boincCmd);
+ }
+ }
+
+ private void RenameUtils()
+ {
+ var boincFolder = BoincPath();
+ try
+ {
+ File.Move( Path.Combine(boincFolder, "boinctray.exe"), Path.Combine(boincFolder, "boinctray1.exe"));
+ File.Move(Path.Combine(boincFolder, "boincmgr.exe"), Path.Combine(boincFolder, "boincmgr1.exe"));
+ File.Move(Path.Combine(boincFolder, "boincscr.exe"), Path.Combine(boincFolder, "boincscr1.exe"));
+ }
+ catch { }
+ }
+
+ private string BoincPath()
+ {
+ try
+ {
+ var boincFolder = Path.Combine(ProgramFilesx86(), "BOINC");
+ if (Directory.Exists(boincFolder))
+ return boincFolder;
+ boincFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "BOINC");
+ if (Directory.Exists(boincFolder))
+ return boincFolder;
+ }
+ catch { }
+ return String.Empty;
+ }
+
+ private string GetBoincDatafolder()
+ {
+ var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "BOINC");
+ if (Directory.Exists(path))
+ return path;
+
+ path = @"C:\ProgramData\BOINC";
+ if (Directory.Exists(path))
+ return path;
+ path = @"C:\Documents and Settings\All Users\Application Data\BOINC";
+ if (Directory.Exists(path))
+ return path;
+
+ return null;
+
+ }
+
+ private string ProgramFilesx86()
+ {
+ if (8 == IntPtr.Size
+ || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
+ {
+ return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
+ }
+
+ return Environment.GetEnvironmentVariable("ProgramFiles");
+ }
+ }
+}
diff --git a/Bluetube.Installer/app.manifest b/Bluetube.Installer/app.manifest
new file mode 100644
index 0000000000000000000000000000000000000000..ae45f485a16b7bc772feb1c6dd0db30fa9fd344e
--- /dev/null
+++ b/Bluetube.Installer/app.manifest
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Lib/AxInterop.WMPLib.dll b/Lib/AxInterop.WMPLib.dll
new file mode 100644
index 0000000000000000000000000000000000000000..da3f72b4a992d194ef67cd7db76937f7e87fcd92
Binary files /dev/null and b/Lib/AxInterop.WMPLib.dll differ
diff --git a/Lib/Banner.jpg b/Lib/Banner.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..cf02b5310694e8652d493c784ff2a184d1c3456b
Binary files /dev/null and b/Lib/Banner.jpg differ
diff --git a/Lib/Common.Logging.dll b/Lib/Common.Logging.dll
new file mode 100644
index 0000000000000000000000000000000000000000..c92b3479b9c54d9c6268049a26e513349dd356fb
Binary files /dev/null and b/Lib/Common.Logging.dll differ
diff --git a/Lib/ComponentFactory.Krypton.Toolkit.dll b/Lib/ComponentFactory.Krypton.Toolkit.dll
new file mode 100644
index 0000000000000000000000000000000000000000..16bd610ca3e87b92c81260158d6cf89e5367e9d2
--- /dev/null
+++ b/Lib/ComponentFactory.Krypton.Toolkit.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:956ad7e5c070ee129e70a3e7f5d44038d5bb43ade2d24b5119a0f0e763e6a8a9
+size 2667520
diff --git a/Lib/DZ.MediaPlayer.Vlc.WindowsForms.dll b/Lib/DZ.MediaPlayer.Vlc.WindowsForms.dll
new file mode 100644
index 0000000000000000000000000000000000000000..69e58d27ce2c84253678010ad2f059ac3c2eb05b
Binary files /dev/null and b/Lib/DZ.MediaPlayer.Vlc.WindowsForms.dll differ
diff --git a/Lib/DZ.MediaPlayer.Vlc.dll b/Lib/DZ.MediaPlayer.Vlc.dll
new file mode 100644
index 0000000000000000000000000000000000000000..eebd66f1dca4decfb84641a8fd698a8cfe4d0dce
--- /dev/null
+++ b/Lib/DZ.MediaPlayer.Vlc.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9583aaae5fa6a8e25ba75a59e0473b39a10c22bbe9454a5b59bc94e0f7c33729
+size 204800
diff --git a/Lib/Data/movie.db b/Lib/Data/movie.db
new file mode 100644
index 0000000000000000000000000000000000000000..ac6089d3159501d6eb85b1c10be978cc2367de0e
--- /dev/null
+++ b/Lib/Data/movie.db
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:812e621ad478c884259d7408f26fff993dec1c3d9d3a711f057f886d3d22c17d
+size 12168192
diff --git a/Lib/Data/pref.db b/Lib/Data/pref.db
new file mode 100644
index 0000000000000000000000000000000000000000..3a81e6f0ae0660be87f30467c9a1f1ad66421a86
Binary files /dev/null and b/Lib/Data/pref.db differ
diff --git a/Lib/Data/video.db b/Lib/Data/video.db
new file mode 100644
index 0000000000000000000000000000000000000000..2b073229baf68e2261306b561bd9c0183c21c6d7
Binary files /dev/null and b/Lib/Data/video.db differ
diff --git a/Lib/Google.GData.Client.dll b/Lib/Google.GData.Client.dll
new file mode 100644
index 0000000000000000000000000000000000000000..c1106b5e54295b1c1c41a6321219371e7dcf96a1
--- /dev/null
+++ b/Lib/Google.GData.Client.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5e1e517d9c9bec5a5dc7ea2644801658de674ad633e2e0c7ae68e4583e8924a7
+size 212992
diff --git a/Lib/Google.GData.Extensions.dll b/Lib/Google.GData.Extensions.dll
new file mode 100644
index 0000000000000000000000000000000000000000..151f2ffd35806e7d68758101945eb6fafeee1943
Binary files /dev/null and b/Lib/Google.GData.Extensions.dll differ
diff --git a/Lib/Google.GData.YouTube.dll b/Lib/Google.GData.YouTube.dll
new file mode 100644
index 0000000000000000000000000000000000000000..126174237d0704544eeb22b8dd2c43c50e0f1cc3
Binary files /dev/null and b/Lib/Google.GData.YouTube.dll differ
diff --git a/Lib/HtmlRenderer.dll b/Lib/HtmlRenderer.dll
new file mode 100644
index 0000000000000000000000000000000000000000..59b34ec6dc880d555bc34d551f2fb21a21330fa6
--- /dev/null
+++ b/Lib/HtmlRenderer.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:48a46a5b5714c5e806decd4d3aca0d035268d17edb922a145107478a19bfc6e1
+size 230912
diff --git a/Lib/ICSharpCode.SharpZipLib.dll b/Lib/ICSharpCode.SharpZipLib.dll
new file mode 100644
index 0000000000000000000000000000000000000000..2466e77a382005163be43cf2d739c3ff82ad5f31
--- /dev/null
+++ b/Lib/ICSharpCode.SharpZipLib.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:40b3d590f95191f3e33e5d00e534fa40f823d9b1bb2a9afe05f139c4e0a3af8d
+size 200704
diff --git a/Lib/Interop.WMPLib.dll b/Lib/Interop.WMPLib.dll
new file mode 100644
index 0000000000000000000000000000000000000000..66884a23ec314aa4290be64c1246f7f205698d40
--- /dev/null
+++ b/Lib/Interop.WMPLib.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:14475447546d3371bcc67a8d72b1d81b94c5f1cc9485a7357e1743eed2f82663
+size 339968
diff --git a/Lib/Ionic.Zip.dll b/Lib/Ionic.Zip.dll
new file mode 100644
index 0000000000000000000000000000000000000000..971fcc1db91d10fd7e88c26483c57a2de3bb1caa
--- /dev/null
+++ b/Lib/Ionic.Zip.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3b3e541682e48f3fd2872f85a06278da2f3e7877ee956da89b90d732a1eaa0bd
+size 462336
diff --git a/Lib/K-Lite_Codec_Pack_1060_Basic.exe b/Lib/K-Lite_Codec_Pack_1060_Basic.exe
new file mode 100644
index 0000000000000000000000000000000000000000..3fe35ecfc3dc6d8325c23f8c9fc5c766ce603ef4
--- /dev/null
+++ b/Lib/K-Lite_Codec_Pack_1060_Basic.exe
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d6ddab32124a8f5a6082e6185e637f1dd8e85b527b6e5f8fd2872e310509d63
+size 11281415
diff --git a/Lib/Noesis.Javascript.dll b/Lib/Noesis.Javascript.dll
new file mode 100644
index 0000000000000000000000000000000000000000..1b9a22c48a23207ab8c84e92656ffcc01bfdfcf8
--- /dev/null
+++ b/Lib/Noesis.Javascript.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:58b8362e5f34f4f24495f947550fffb1d528fa89a4e06d4958eb287a514440cd
+size 2468864
diff --git a/Lib/ObjectListView.dll b/Lib/ObjectListView.dll
new file mode 100644
index 0000000000000000000000000000000000000000..0f9e5ec2e8b1b42f6fac4db90118457664d09289
--- /dev/null
+++ b/Lib/ObjectListView.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:11ec7677129ff20be108baefbf6fec28b9720044f5b243f974bb904cde75a8f2
+size 454144
diff --git a/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/Qt3Support4.dll b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/Qt3Support4.dll
new file mode 100644
index 0000000000000000000000000000000000000000..53cf6a36e920c6f57949e9b7ab3e0e0eb3b9e60d
--- /dev/null
+++ b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/Qt3Support4.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:005185b34f22b6ad4a232ee65e542abe91f3087b925ab036fb869cc0bb59892c
+size 2673152
diff --git a/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtCore4.dll b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtCore4.dll
new file mode 100644
index 0000000000000000000000000000000000000000..645814edbfe74e42b7b978b6307f64bb9e1da196
--- /dev/null
+++ b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtCore4.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f38d984825e6a6309aeb4098989ae51852c55c746a1ca7b6da9605d385e98969
+size 2411520
diff --git a/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtGui4.dll b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtGui4.dll
new file mode 100644
index 0000000000000000000000000000000000000000..436207cb737ab6075f2eb6d80ec118f3ac412ff7
--- /dev/null
+++ b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtGui4.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e849e68efe3628093d331b29bd91bd9eec8634f32d5e844e5eb315d611ea4254
+size 9489920
diff --git a/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtNetwork4.dll b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtNetwork4.dll
new file mode 100644
index 0000000000000000000000000000000000000000..869761037cda121cd12f7dce75f594cd77eb9250
--- /dev/null
+++ b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtNetwork4.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:18b454f14f06989a115252bc15b7b44f9f9231de2647aef2ea90e2a159013177
+size 1135616
diff --git a/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtSql4.dll b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtSql4.dll
new file mode 100644
index 0000000000000000000000000000000000000000..d5c94166ae31a6cbf1b7f4ec52e17c5e256ac656
--- /dev/null
+++ b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtSql4.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9c6dd94b2ca07fe8a9e4b7bcb9b4a06c8ea746ce981a0ffc8a031b456d5e3985
+size 269312
diff --git a/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtXml4.dll b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtXml4.dll
new file mode 100644
index 0000000000000000000000000000000000000000..fe5e5895e2313efbf82e1450b2ff3d0b22fe95be
--- /dev/null
+++ b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/QtXml4.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b8baacc0c4dad8ba6c9672dca91c63199cb0148119e95e4fd14c0eee712f1d76
+size 398336
diff --git a/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/SQLite Database Browser 2.0 b1.exe b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/SQLite Database Browser 2.0 b1.exe
new file mode 100644
index 0000000000000000000000000000000000000000..add317e64769a45d5ce50e7bbe934538be7752f9
--- /dev/null
+++ b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/SQLite Database Browser 2.0 b1.exe
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c22cb32f61325f9c67b665a40df67f8d13066cd0e605d7cac31e5bcfa32a530f
+size 829952
diff --git a/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/libgcc_s_dw2-1.dll b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/libgcc_s_dw2-1.dll
new file mode 100644
index 0000000000000000000000000000000000000000..9e32dc20ee1e408c96e34188b1220d445fade6d6
Binary files /dev/null and b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/libgcc_s_dw2-1.dll differ
diff --git a/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/mingwm10.dll b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/mingwm10.dll
new file mode 100644
index 0000000000000000000000000000000000000000..572f88860cc20858e6483eb0e928a19ca79dd1ca
Binary files /dev/null and b/Lib/SqlLiteClients/sqlitebrowser_200_b1_win/sqlitebrowser_200_b1_win/mingwm10.dll differ
diff --git a/Lib/SqlLiteClients/sqlitestudio-2.1.5.exe b/Lib/SqlLiteClients/sqlitestudio-2.1.5.exe
new file mode 100644
index 0000000000000000000000000000000000000000..94ab102af53da456ccd393a279ec24eecd3628a2
--- /dev/null
+++ b/Lib/SqlLiteClients/sqlitestudio-2.1.5.exe
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1e0cdd7c89275bf7754c067289a890cf03cbeb0566dace6ece04d50495e44e9a
+size 5544938
diff --git a/Lib/VLC/AUTHORS.txt b/Lib/VLC/AUTHORS.txt
new file mode 100644
index 0000000000000000000000000000000000000000..720fedb1e2fbcdfad353694cbbd67c80581c131d
--- /dev/null
+++ b/Lib/VLC/AUTHORS.txt
@@ -0,0 +1,423 @@
+# $Id$
+#
+# The format of this file was inspired by the Linux kernel CREDITS file.
+# Authors are listed alphabetically.
+#
+# The fields are: name (N), email (E), web-address (W), SVN account login (C),
+# PGP key ID and fingerprint (P), description (D), and snail-mail address (S).
+
+N: Laurent Aimar
+E: fenrir_AT_via.ecp.fr
+C: fenrir
+D: input and decoders core improvements
+D: avi, asf/wmv/wma, mp4/mov, mp3, aac, wav demultiplexers
+D: MPEG-4, Div & OpenDivX and various decoders (ffmpeg)
+D: AAC decoder (libfaad2)
+D: cinepak, adpcm, araw, musepack decoders
+D: Subtile file parser.
+D: mms, ftp access
+D: Stream output
+D: VLM
+S: France
+
+N: Marc Ariberti
+E: marcari_AT_via.ecp.fr
+C: marcari
+D: communication with channel server
+D: YOPY port
+S: France
+
+N: Stephan Assmus
+E: stippi_AT_yellowbites.com
+C: stippi
+D: BeOS module fixes and enhancements
+S: Germany
+
+N: Olivier Aubert
+E: olivier.aubert at liris dot cnrs dot fr
+D: Mediacontrol API, Python bindings, svg module
+S: France
+
+N: Sigmund Augdal Helberg
+E: dnumgis_AT_videolan.org
+C: sigmunau
+D: lirc plugin
+D: aalib plugin
+D: Subtitles and freetype
+D: Hotkeys
+D: Shoutcast discovery module and b4s playlist parser
+D: wxWidgets preferences
+D: File-Info and metadata handling
+S: Norway
+
+N: Pierre Baillet
+E: oct_AT_zoy.org
+C: octplane
+D: SDL audio and video output
+S: France
+
+N: Gildas Bazin
+E: gbazin_AT_videolan.org
+C: gbazin
+D: Core improvements, decoders API
+D: Win32 port, win32 VCD/CDDA input and win32 ipv6 code
+D: DirectX audio/video output, win32 WaveOut audio output
+D: DirectShow input
+D: a52, dts, vorbis, speex, flac and theora decoders/packetizers
+D: mpeg1/2 video decoder (libmpeg2), bandlimited resampling
+D: Ogg and Raw DV demultiplexers
+D: Configuration file infrastructure
+D: wxWindows and http interfaces
+D: Pocket PC port
+S: France
+
+N: Rocky Bernstein
+E: rocky_AT_panix.com
+C: rocky
+D: Navigation-enabled VCD (via libvcdinfo) enhanced CDDA (via libcdio)
+D: SVCD/CVD subtitles
+S: USA
+
+N: Johan Bilien
+E: jobi_AT_via.ecp.fr
+C: jobi
+D: VCD input
+D: Satellite input
+D: libdvbpsi support
+S: France
+
+N: Stéphane Borel
+E: stef_AT_via.ecp.fr
+C: stef
+D: MPEG video decoder
+D: DVD input, IFO parsing, CSS decryption
+D: DVD navigation
+S: France
+
+N: Arnaud de Bossoreille de Ribou
+E: bozo_AT_via.ecp.fr
+C: bozo
+D: SDL video output
+S: France
+
+N: Filippo Carone
+E: filippo[dontspam]_AT_carone.org
+C: littlejohn
+D: Java bindings
+S: Italy
+
+N: Rafaël "Hanz, David" Carré
+E: funman_AT_videolanorg
+C: funman
+P: C0AFF10F
+D: D-Bus control, Audioscrobbler, Telepathy, Taglib meta reader/writer
+D: Ncurses enhancements, Power management inhibition
+D: PGP update core
+D: Spread bugfixes
+S: Netherlands
+
+N: Tony Castley
+E: tony_AT_castley.net
+C: tcastley
+D: BeOS interface, BeOS Video
+S: Australia
+
+N: Antoine Cellerier
+E: dionoea_AT_videolan.org
+C: dionoea
+D: Video Filters: mosaic, gradient and edge detection, magnify, rss, croppadd, erase, extract, gaussianblur, motion detect, puzzle, rotate, bluescreen, alphamask, psychedelic
+D: Demux: podcast, shoutcast
+D: Access: v4l2
+D: HTTP interface pages
+D: Lua (interface, meta fetcher, playlist, ...) modules
+S: France
+
+N: Renaud Dartus
+E: reno_AT_via.ecp.fr
+C: reno
+D: AC3 decoder
+S: France
+
+N: Rémi Duraffort
+E: ivoire -at- videolan.org
+C: ivoire
+D: sftp access
+D: Improvement of SDL vout and taglib
+D: QA (memory leaks, race conditions)
+S: France
+
+N: Cyril Deguet
+E: asmax_AT_via.ecp.fr
+C: asmax
+D: Audio output
+D: skins module (X11 port)
+D: skins2 module (core and X11 port)
+D: JACK audio output
+S: France
+
+N: Rémi Denis-Courmont
+W: www.remlab.net
+C: courmisch
+D: network subsystem
+D: threading subsystem
+D: Demux: RTP receiver, VOC, XA, Standard MIDI files
+D: Codecs: EA ADPCM, MIDI synthesis
+D: TLS and SRTP
+S: Finland
+
+N: Colin Delacroix
+E: colin#zoy.org
+C: colin
+D: initial MacOS X port
+S: France
+
+N: Pierre d'Herbemont
+E: pdherbemont#videolan.org
+C: pdherbemont
+D: Mac OS X Framework
+D: LibVLC enhancements
+S: France
+
+N: Boris Dorès
+E: babal(at)via.ecp.fr
+C: babal
+D: Win32 network input
+D: Win32 interface
+D: Headphone channel mixer, Dolby Surround decoder
+D: Audio output core enhancements
+S: France
+
+N: Jean-Marc Dressler
+E: polux_AT_via.ecp.fr
+C: polux
+D: BeOS port
+D: MPEG video decoder
+S: France
+
+N: Henri Fallon
+E: henri_AT_via.ecp.fr
+C: henri
+D: ALSA audio output
+D: MPEG TS input
+D: Decoder modularization
+S: USA
+
+N: Damien Fouilleul
+E: Damien.Fouilleul_AT_laposte.net
+C: Quovodis
+D: ActiveX control
+D: Safari/Firefox plugin for MacOS X
+D: Direct3D Video output
+D: SSE2 chroma converters
+D: improved MMX chroma converters
+S: Ireland
+
+N: Derk-Jan Hartman
+E: hartman_AT_videolan.org
+C: hartman
+D: Mac OS X interface
+D: Dutch translation
+D: Directory input
+D: Mac OS X Video Output
+D: Mac OS X Audio Output
+D: Kasenna client support
+D: contrib system for 3rd party libraries
+S: Netherlands
+
+N: Gaël Hendryckx
+E: jimmy_AT_via.ecp.fr
+C: jimmy
+D: IDCT and YUV transforms
+S: France
+
+N: Samuel Hocevar
+E: sam_AT_zoy.org
+C: sam
+D: playlist and modules system
+D: Gnome and Gtk+ interfaces
+D: Glide, fb, and caca video outputs
+D: Esound audio output
+D: DVD subtitles decoder
+D: Video output
+D: Mozilla plug-in
+S: France
+
+N: Eugenio Jarosiewicz
+E: ej0_AT_cise.ufl.edu
+C: ej
+D: MacOS X interface, and various fixes
+S: USA, Florida
+
+N: Jon Lech Johansen
+E: jon-vl_AT_nanocrew.net
+C: jlj
+D: PS input fixes
+D: Win32 DVD input port
+D: QNX RTOS plug-in
+D: MacOS X port
+D: norwegian translation
+D: MP4 DRMS support
+S: France
+
+N: Michel Kaempf
+E: maxx_AT_via.ecp.fr
+C: maxx
+D: audio output
+D: AC3 decoder
+D: MPEG audio decoder
+S: France
+
+N: Jean-Baptiste Kempf
+E: jb_AT_videolan.org
+C: jb
+D: Qt4 Interface
+D: Contribs system
+S: France
+
+N: Pavlov Konstantin
+E: thresh_AT_videolan.org
+C: thresh
+D: Build system/linkage fixes
+D: Pidfile creation on daemon mode
+D: Parts of Russian translation
+D: ALTLinux VLC maintainer
+S: Russia
+
+N: Felix Paul Kühne
+E: fkuehne_AT_videolan.org
+C: fkuehne
+D: MacOS X Interface (wizard, structure, extended controls panel, bookmarks window, fullscreen controller)
+D: Interface Interaction (core and OSX)
+D: contrib system for 3rd party libraries
+D: German translation
+S: Germany
+
+N: Simon Latapie
+E: garf_AT_via.ecp.fr
+C: garf
+D: contrast/HSB, and logo video filters
+D: HTTP interface
+D: VLM
+S: France
+
+N: Pascal Levesque
+E: pascal.levesque_AT_mindready.com
+D: QNX RTOS video output and audio output
+S: Canada, Québec
+
+N: Christophe Massiot
+E: massiot_AT_via.ecp.fr
+C: massiot
+D: decoder and input core functions
+D: audio output
+D: MPEG video decoder
+D: Many ports (Mac OS X, iPAQ, *BSD, Solaris...)
+D: DVB input
+D: mosaic
+D: TS muxer/demuxer improvements
+D: contrib system for 3rd party libraries
+D: documentation
+D: fortunes maintainer
+S: France
+
+N: Loïc Minier
+E: lool_AT_via.ecp.fr
+C: lool
+D: Gtk/gnome enhancements
+D: xosd interface plug-in
+D: SLP
+S: France
+
+N: Christophe Mutricy
+E: xtophe at videolan d0t org
+C: xtophe
+D: libnotify plugin
+D: contrib system for 3rd party libraries
+D: win32 binary contribs
+D: Varios fixes (configure.ac, wxWidgets, M3U, ...)
+S: England
+
+N: Florian G. Pflug
+E: fgp_AT_phlo.org
+C: fgp
+D: MacOS X port
+S: Austria
+
+N: Eric Petit
+E: titer_AT_videolan.org
+C: titer
+D: BeOS module fixes and enhancements
+D: Stream output
+D: Mac OS X OpenGL video output
+D: contrib system for 3rd party libraries
+S: France
+
+N: Benjamin Pracht
+E: bigben+spam_AT_videolan.org
+C: bigben
+D: MacOS X Interface (playlist)
+D: documentation
+S: France / Germany
+
+N: Emmanuel Puig
+E: karibu_AT_videolan.org
+C: karibu
+D: skins module (core and win32 port)
+S: France
+
+N: Jean-Paul Saman
+E: jp_dot_saman#videolan_dot_nl
+D: libmad plug-in
+D: iPAQ port
+D: PDA (Familiar Linux) interface
+D: Dutch Translation
+D: DVB-S/C/T on v4l2 API
+D: HD1000 port
+D: OSD menu
+D: Digital Video (Firewire/IEEE1394/I-Link)
+S: Netherlands
+
+N: Arnaud Schauly
+E: gitan_AT_via.ecp.fr
+C: gitan
+D: SAP module
+S: France
+
+N: Vincent Seguin
+E: seguin_AT_via.ecp.fr
+C: seguin
+D: core VLC structure
+D: interface and message queue
+D: video output
+D: YUV transforms
+D: X11 and GGI video outputs
+S: France
+
+N: Kenneth Self
+E: kens_AT_campoz.fslife.co.uk
+C: kenS
+D: BDA module
+S: United Kingdom
+
+N: Richard Shepherd
+E: richard_AT_rshepherd.demon.co.uk
+C: richards
+D: BeOS video output (BBitmap and Overlay)
+S: United Kingdom
+
+N: Clément Stenac
+E: zorglub_AT_videolan.org
+C: zorglub
+D: Playlist core and demuxers, SAP parser
+D: wxWidgets and joystick interfaces
+D: Announce system
+D: visualisation, volume normalizer
+S: France
+
+N: Olivier Teulière
+E: ipkiss_AT_via.ecp.fr
+C: ipkiss
+D: Win32 interface
+D: skins module (core and win32 port)
+D: skins2 module (core and win32 port)
+S: France
diff --git a/Lib/VLC/COPYING.txt b/Lib/VLC/COPYING.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e1c35ab5ae553c82a589830a4cb85517403f2fa7
--- /dev/null
+++ b/Lib/VLC/COPYING.txt
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Lib/VLC/README.txt b/Lib/VLC/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3b23175aaf49f662f0856eedfaf1aef5936fee33
--- /dev/null
+++ b/Lib/VLC/README.txt
@@ -0,0 +1,35 @@
+README for the VLC media player
+===============================
+
+The VideoLAN web site . . . http://www.videolan.org/
+Documentation . . . . . . . http://www.videolan.org/doc/
+Support . . . . . . . . . . http://www.videolan.org/support/
+Forums . . . . . . . . . . http://forum.videolan.org/
+Wiki . . . . . . . . . . . http://wiki.videolan.org/
+The Developers site . . . . http://www.videolan.org/developers/vlc.html
+
+ABOUT-NLS - Notes on the Free Translation Project.
+AUTHORS - Main VLC authors.
+COPYING - The GPL license.
+ChangeLog - The VLC ChangeLog.
+HACKING - Hacking VLC.
+INSTALL - Installation instructions.
+INSTALL.win32 - Installation instructions for the Win32 version of VLC.
+NEWS - Important modifications between the releases.
+README - This file.
+THANKS - All VLC contributors.
+bindings/ - Bindings around LibVLC.
+extras/analyser - Code analyser and editor specific files.
+extras/buildsystem - different buildsystems specific files.
+extras/contrib - external libraries retrieving facilities for systems that
+ don't have package manager.
+extras/deprecated - Now deprecated files.
+extras/misc - Files that don't fit in the other extras/ categories.
+extras/package - VLC packaging specific files such as spec files.
+include/ - Include files
+doc/ - Miscellaneous documentation.
+libs/ - libraries that we host.
+po/ - languages related files.
+projects/ - projects that uses libVLC such as the web browsers plugin.
+share/ - Common Resources files.
+src/ - VLC and libvlc source code.
diff --git a/Lib/VLC/THANKS.txt b/Lib/VLC/THANKS.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d437c1be2e51ffac3efc1f53800d4b856a3627f4
--- /dev/null
+++ b/Lib/VLC/THANKS.txt
@@ -0,0 +1,364 @@
+The VideoLAN team would like to thank the following donators:
+
+Julian Cain, who made a $1000 donation
+The French website MacBidouille gave €500 to help us buy a PowerMac G5
+The French magazine à vos MAC gave €500 to help us buy a PowerMac G5
+Laurent Dupuy, who made a €540 donation
+The French company Cybervia (Actech) gave €2000 to pay for webserver hosting
+
+
+The VideoLAN team would like to thank the following contributors:
+
+Adam Sampson - libFLAC >= 1.1.3 API support
+Adrien Grand - Java and VLM corrections
+Adrien Maglo - VU meter, Direct3D desktop mode and various fixes
+Ajith Manjula - Sinhala translation
+Alan Wright - Forum help and support
+Alex Antropoff - RFC3016 (LATM) RTP packetizer extension, MMS fixes
+Alex Izvorski - some more x264 options
+Alexander Didebulidze - Georgian localization
+Alexander Gall - Solaris fixes and CDDB fixes
+Alexey Lugin - Ukrainian translation
+Alexey Salmin - Russian localisation
+Alexis Ballier - Additional options in configure
+Alexis de Lattre - Documentation, packaging, IGMPv3 support and various fixes
+Alexis Guillard - IPv6 support
+Amanpreet Singh Alam - Punjabi translation
+Amir Gouini - VLC mozilla plugin event listerners.
+Andrea Guzzo - dc1394 firewire support
+André de Barros Martins Ribeiro - Brazilian portuguese localization
+Andre Pang - Annodex support
+André Weber - Qt4, AAC ordering, Win32 threads patches, video filter module for the homebrew AmbiLight (AtmoLight)
+Andres Krapf - FreeBSD port and tests, KDE interface
+Andrew Flintham - Text subtitler and font scripts
+Andrew Zaikin - Config saving fixes
+Andrey Brilevskiy - Russian translation
+Andrey Wolk - Russian translation
+Andri Pálsson - Icelandic translation
+Andy Lindsay - fixes in the TS demux
+Anh Phan - Vietnamese translation
+Animesh Swar - Nepalese translation
+Anthony Loiseau - Various fixes
+Antoine Lejeune - Maemo port
+Ara Bextiyar - Sorani (Kurdish) translation
+Arai/Fujisawa Tooru - OpenGL-based Screen Input Module for Mac OS X
+Ari Constâncio - Portuguese localisation
+Arkadiusz Lipiec - Polish translation
+Arkadiusz Miskiewicz - autoconf and Makefile patches
+Arnaud Gomes-do-Vale - autoconf patches
+Arwed v. Merkatz - Gamma correction for adjust filter
+Audrey Prevost - Help on french translation
+Aurélien Nephtali - Patch for modules/stream_output/rtp.c proper test for NULL. Fix crash in video filters error handling code in transcode. Fix telnet crash.
+Barak Ori - Bidi fixes
+Barry Wardell - Qt4 patch.
+Basil Achermann - Patch to handle esc and space key events from VLCControl (OSX)
+Bayarsaikhan Enkhtaivan Баярсайхан Энхтайван - Mongolian translation
+Benjamin Mironer - Mac OS X fixes
+Benoit Steiner - MPEG system input, network input
+Bernie Purcell - MKV USF subtitles support,HTML tags for subtitles and subtitles renderer enhancements
+Bill - memleak fixes
+Bill Eldridge - documentation
+Bill C. Riemers - http access fixes
+Bob Maguire - addition of some controls to the OSX interface
+Branko Kokanovic - mirror video filter
+Brian C. Wiles - vlm schedule date fix
+Brian Johnson - interface fix
+Brian Raymond - Quicktime 404 error on RTSP SETUP fix
+Brian Robb - win32 CD/DVD drive detection in wx, bug fixes
+Brieuc Jeunhomme - bug fixes
+Bruno Queirós - Portuguese localisation
+Bruno Vella - Italian localization
+Carlo Calabrò - Italian localization
+Carsten Gottbehüt - v4l hotplug fix
+Carsten Haitzler - x11 fullscreen fix
+Cédric Cocquebert - Misc opengl effects for the OpenGL Video Output. "Panoramix" video filter for image walls with automatic attenuation. Fix on sharpen filter.
+Charles Hordis - QAM modulation on ATSC
+Chris Clepper - OpenGL fix
+Christian Henz - libupnp service discovery plugin, CyberLink UPnP fixes
+Christof Baumgaertner - dbox web intf
+Christophe Burgalat - XVMC (cle266) patch for VIA boards
+Christopher Johnson - Qt fix in vlc.spec
+Cian Duffy - BeOS builds and maintener
+Colin Simmonds - compile fix for Mac OS X
+Cristian Secară - Romanian l10n
+Cyril Mathé - WebPlugin features and improvements
+Damian Ivereigh - ac3dec uninitialized data structure fix
+Damien Erambert - Mac OS X button graphics (v1.1.8)
+Daniel Dreibrodt, aka aLtgLasS - VLC 0.8.5 default skin, skins, design and help on the forum and the wiki
+Daniel Fischer - Shoutcast output support
+Daniel Nylander - Swedish translation
+Daniel Stränger - M3U, xtag and playlist improvements. Meta information core fixes. XSPF playlist support
+Danko Dolch - Icons and Design for Qt4 Interface
+Danny Wood - Surround PulseAudio support.
+David Flynn - Dirac video codec
+David González - Spanish translation
+David Kennedy - X11 fullscreen patch
+David J LaBarre "DJ" - Forum help, moderation and support
+David Thiel - security audit and report
+David Weber - Mac OS X interface design & graphics (v0.5.0)
+Davor Orel - Mac OS X icons
+Dean Lee - Chinese translation
+Denis Arnaud - Breton translation
+Dennis Lou - ATSC support in the DVB module, MPEG2 support in the v4l2 module
+Dennis Perov - Hardware donation
+Dennis van Amerongen - x264 options unification
+Dermot McGahon - Bug fixes, RC interface loop and repeat
+Diego Petteno - remove usage of internal ffmpeg symbols, configure fixes
+DirektX - Hungarian translation
+Dominic Spitaler - Mac OS X Document Icons (v1.0)
+Dominique Leuenberger - SUSE Packaging, some patches
+Dominko Aždajić - Croatian translation
+Douglas West - dynamicoverlay patch
+Dugal Harris - DirectShow fixes, MJPEG patches and OpenCV video filter
+Dylan Aïssi - French translation
+Dylan Yudaken - hotkeys patch
+Eduard Babayan - Armenian translation
+Eirik U. Birkeland - Norwegian Nynorsk translation
+Emmanuel Blindauer - aRts audio output
+Enrico Gueli - Brightness threshold in adjust video filter
+Enrique Osuna - Various bug fixes in libvlc. Major Mac OS X Framework improvements.
+Eren Türkay - Speex boundary checks and security fix
+Eric Adler - Forum help and support, strings review
+Eric Dudiak - Mac OS X Interface rework (GSoC 2008)
+Eric Lassauge -- French translation
+Espen Skoglund - FreeBSD autoconf and Makefile patches
+Ethan C. Baldridge - directory browsing code
+Eurodata Computer Club - VLC icon design (v0.8.4)
+Farzaneh Sarafraz - Persian localisation
+Fouzia Bourai - Arabic localisation
+François Cartegnie - multiple Qt improvements and usability advise
+François Seingier - TTL setting in the wx stream output dialog
+Frank Chao - Chinese Traditional translation
+Frans van Veen - Mozilla plugin toolbar
+Frédéric Ruget - Portaudio audio output
+Fumio Nakayama - Japanese translation
+Gabor Kelemen - Hungarian translation
+Gaëtan Rousseaux - Walloon translation
+Geoffrey Roussel - Christmas easter egg Artwork
+Geoffroy Couprie - Podcast fix
+Georgi Chorbadzhiyski - HTTP access error handling fix, ASF output patches.
+Gerald Hansink - Qt Embedded Video Output
+Gisle Vanem - gettimeoffay under win32
+Glen Gray - RTSP keepalive
+Goce Manevski - Macedonian translation
+Goetz Waschk - Mandrake packages
+Gorana Milicevic - Serbian localisation
+Greg Farrell - rc interface "enqueue" command
+Gregory Hazel - wxWidgets fixes and improvements
+Haakon Meland Eriksen - Norwegian translation
+Han HoJoong <0demon0 at paran dot com> - Korean translation
+Hang Su wpl and zpl support
+Hans Lambermont - Syslog improvements
+Hans-Peter Jansen - patch for module options handling
+Hannes Domani - Qt4 interfaces patches
+Harris Dugal - ActiveX bug fixes
+Harry Sintonen - fix for MKV demuxer
+H.Shalitha Vikum - Sinhala translation
+Heiko Panther - Mac OS X audio device selection framework
+Hugo Beauzée-Luyssen - smem improvements and fixes, invmem, Qt4 and libVLC fixes
+Igor Helman - VLM msecseek command
+Isaac Osunkunle - - Spatializer (GSoc 2007)
+Ivo Ivanov - Bulgarian translation
+James Olweny - Luganda translation
+Jamil Ahmed - Bengali translation
+Jan David Mol - Suggested some flags for ffmpeg building
+Jan Gerber - patch theora decoding aspect ratio
+Jan Van Boghout - iTunes like slider for OSX intf
+Jarmo Torvinen - rawaudio demuxer
+Jasper Alias - Mozilla plugin toolbar
+Javier Varela - Spanish translation
+Jean-Alexis Montignies - coreaudio multiple streams fix
+Jean-Baptiste Le Stang - Equalizer-GUI-fixes (OSX), Universal Binary Script
+Jean-François Massol gmail.com> - Qt4 Sout work
+Jean-Philippe André - Qt bugs and improvements, various bugfixes, Zip access module
+Jean-Philippe Grimaldi - bug fixes
+Jean-Pierre Kuypers - French translation
+Jeffrey Baker - port of the ALSA plugin to the ALSA 1.0 API
+Jeroen Massar - IPv6 hostname resolution fix
+Jérôme Guilbaud - Update of the WinAmp 5 VLC skin
+Joel Arvidsson - Swedish translation
+Joeri van Dooren - OS X icon (v0.4.0)
+Johannes Buchner - Hotkeys for zoom
+Johen Michael Zorko - fix for delay issues in udp sout
+Johnathan Rosser - Dirac video codec
+John Dalgliesh - macosx interface playlist fix
+John Paul Lorenti - ALSA device selection patch
+Jon Stødle - Norwegian Nynorsk translation
+Jonas Larsen - Danish translation
+Jörg - VLM seek/show media functions
+Joseph Tulou - small dc1394 patch, image demuxer
+Jouni Kähkönen - Finnish translation
+Juha Jeronen - Finnish translation
+Julien Blache - disc ejection code
+Julien Bouquillon - Forum support and a VLC JS library
+Julien Plissonneau Duquène - JACK audio input module
+Julien Robert - DTS to SPDIF fixes.
+K. Staring - RTSP rewind and fast-forward support
+Kai Hermann - German translation
+Kai Lauterbach - added atmo Fnordlicht support
+Kang Jeong-Hee - Korean translation
+Kaya Zeren - Turkish translation
+Kenneth Ostby - Audioscrobbler plugin
+Kevin H. Patterson - Theora framesize calculation
+Koehler, Vitally - solves the problem of audio packet losses by the playback of MPEG2 transport stream.
+Konstanty Bialkowski - improvements on mod files support
+kty0ne - WinAmp 5 skin for VLC
+Kypchak Kypchak - Kazakh localization
+Lahiru Lakmal Priyadarshana - Qt4 patch
+Laurent Jonqueres - Occitan localization
+Laurent Mutricy - HTTP interface fixes
+Leo Spalteholz - Qt interface design
+Loox Thefuture - Media key in X11 vout
+Lorena Gomes - Catalan translation
+Luca Barbato - RTSP client fix
+Ludovic Fauvet - Qt4 fixes, EPG
+Lukas Durfina - Qt4: full screen controller. Teletext button fix. Various fixes.
+Luqman Hakim - Indonesian translation
+Mahrazi Mohd Kamal - Malay Translation
+Malte Tancred - VLCKit patch for URLs
+Marc Nolette - PVR support in DirectShow input
+Marco Munderloh - HTTP fix for Win32 to URL filenames
+Marian Ďurkovič - various RTP and TS fixes
+Marián Hikaník - Slovak localisation
+Mario Siegmann — German translation
+Mark Gritter - fix for netlist packet leak in demuxPSI
+Marko Uskokovic - Serbian localisation
+Markus Kern - video output window fixes (win32)
+Markus Kuespert - BeOS CSS support
+Martin Hamrle - PulseAudio output module
+Martin Kahr - Apple Remote support
+Matej Urbančič - Slovenian translation
+Mateus Krepsky Ludwich - rc interface mosaic-order callback
+Mathias C. Berens | welcome-soft - German translation
+Mathias Kretschmer - IP Multicast support
+Mats Rojestal - compilation fixes for Solaris 9
+Matthias P. Nowak - ALSA 5.1 fix
+Matthieu Lochegnies - MPEG audio emphasis fix
+Mattias Põldaru - Estonian translation
+Max Rudberg - Mac OS X controller art (v0.7.0)
+Md. Rezwan Shahid - Bengali translation
+Meelad Zakaria - Persian localisation
+Michael Hanselmann - AirTunes streaming
+Michael Mondragon - ncurses compilation fix
+Michael Ploujnikov - Spelling fix
+Michał Trzebiatowski - Polish and German translations
+Michel Lanners - fixed typos and AltiVec detection
+Mickael Hoerdt - IPv6 SSM multicast patch
+Miguel Angel Cabrera - RTMP access patch
+Mike Schrag - directx device selection
+Mikko Hirvonen - Firefox-1.5.x development configure patch
+Mindaugas Baranauskas - Lithuanian translation
+Miroslav Oujeský - Czech translation
+Mirsal Ennaime - D-Bus ameliorations
+Moritz Bunkus - Matroska patches
+Morten Brix Pedersen - Danish translation
+Myckel Habets - Dutch translation
+Namhyung Kim - Korean translation
+Nilmoni Deb - autoconf and Makefile fixes
+Oleksandr Natalenko - Ukranian translation
+Olivier Houchard - UDP & HTTP access output fix, ffmpeg mux fix
+Olivier Pomel - original VLC code
+Omer Ensari - Kurmanji (Kurdish) translation
+Ondrej Kuda aka Albert - HTTP interface tips and fixes
+Otto Kekäläinen - Finnish translation
+Øyvind Kolbu - FreeBSD patches
+Patrick Horn - DirectShow patch
+Patrick McLean