Greasy Fork is available in English.
TẠO LINK SUPER, NHẬN SUPER 3 NGÀY, NGHE NHẠC, HACK XP/GEM/STREAK
// ==UserScript==
// @name DUOLINGO INTEGRATION
// @namespace http://tampermonkey.net/
// @version 2026.08.01
// @description TẠO LINK SUPER, NHẬN SUPER 3 NGÀY, NGHE NHẠC, HACK XP/GEM/STREAK
// @author orgorakasumi
// @match https://www.duolingo.com/*
// @grant GM_xmlhttpRequest
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_addStyle
// @connect auto-super.vercel.app
// @connect www.duolingo.com
// @connect stories.duolingo.com
// @connect goals-api.duolingo.com
// @connect greasyfork.org
// @run-at document-idle
// @license MIT
// @icon https://d35aaqx5ub95lt.cloudfront.net/vendor/38dc6a042b0de3f6aeb44ff2aa70de73.svg
// ==/UserScript==
(function(){'use strict';
var VER='2026.08.01b';
var API='https://auto-super.vercel.app';
var FREE_KEY='Auto-Super';
var MAX_EN=25;var COST_LINK=2;var COST_S3=3;var HACK_EN_COST=2;
var ZALO='https://zalo.me/g/omtyaxafze06b2f7fefb';
var ADMIN_PW='ADMIN KEY SUPER';var ADMIN_DOB='280714';
var GF_SCRIPT_URL='https://greasyfork.org/vi/scripts/586818-duolingo-get-super-family-plan/code';
var GF_API_URL='https://greasyfork.org/scripts/586818.json';
var MUSIC=[{id:'dQw4w9WgXcQ',t:'Rick Astley - Never Gonna Give You Up'},{id:'kJQP7kiw5Fk',t:'Luis Fonsi - Despacito'},{id:'JGwWNGJdvx8',t:'Ed Sheeran - Shape of You'},{id:'RgKAFK5djSk',t:'Wiz Khalifa - See You Again'},{id:'fJ9rUzIMcZQ',t:'Queen - Bohemian Rhapsody'},{id:'60ItHLz5WEA',t:'Alan Walker - Faded'},{id:'OPf0YbXqDm0',t:'Mark Ronson - Uptown Funk'},{id:'9bZkp7q19f0',t:'PSY - Gangnam Style'},{id:'CevxZvSJLk8',t:'Katy Perry - Roar'},{id:'LXb3EKWsInQ',t:'Imagine Dragons - Radioactive'}];
var _sess=null,_tier=null,_isAdmin=false,_duoUser=null;
var _creating=false,_activating=false;
var _mIdx=0,_mPlay=false,_linkRaf=null;
var _hackRunning=false,_hackTask=null,_duoFullData=null;
var _remoteVer=null,_isOutdated=false,_showingHacker=true;
var _apiKey=null,_keyData=null,_usedToday=0;
var _cdRemain=0,_cdTimer=null;
var _S=function(k,v){GM_setValue(k,v)};
var _G=function(k,d){return GM_getValue(k,d)};
var $=function(id){return document.getElementById(id)};
function _ts7(){var n=new Date(Date.now()+7*3600000);return String(n.getUTCHours()).padStart(2,'0')+':'+String(n.getUTCMinutes()).padStart(2,'0')+':'+String(n.getUTCSeconds()).padStart(2,'0')}
function _toast(m,tp,dr){tp=tp||'info';dr=dr||2000;var w=$('ds-tw');if(!w)return;if(w.children.length>=2)w.firstElementChild.remove();var t=document.createElement('div');t.className='ds-tst ds-tst-'+tp;t.innerHTML='<div class="ds-dot"></div><span>'+m+'</span>';w.appendChild(t);setTimeout(function(){t.classList.add('out');setTimeout(function(){if(t.parentNode)t.remove()},240)},dr)}
function _log(id,m,tp){var e=$(id);if(!e)return;var c={o:'lo',e:'le',i:'li',w:'lw'}[tp]||'li';var s=document.createElement('span');s.className='ds-le '+c;s.textContent='['+_ts7()+'] '+m;e.appendChild(s);e.appendChild(document.createTextNode('\n'));e.scrollTop=e.scrollHeight}
function _logC(id){var e=$(id);if(e)e.textContent=''}
function _sleep(ms){return new Promise(function(r){setTimeout(r,ms)})}
function _fmtCD(s){var m=Math.floor(s/60),sec=s%60;return String(m).padStart(2,'0')+':'+String(sec).padStart(2,'0')}
function _cmpVer(v1,v2){var a=v1.split(/[.\-]/).map(Number),b=v2.split(/[.\-]/).map(Number);for(var i=0;i<Math.max(a.length,b.length);i++){var x=a[i]||0,y=b[i]||0;if(x>y)return 1;if(x<y)return-1}return 0}
function _checkVersion(){GM_xmlhttpRequest({method:'GET',url:GF_API_URL,headers:{'Accept':'application/json'},timeout:8000,onload:function(r){if(r.status!==200)return;try{var d=JSON.parse(r.responseText),rv=(d.version||'').trim();if(!rv)return;_remoteVer=rv;if(_cmpVer(rv,VER)>0){_isOutdated=true;_showUpdateBanner(rv)}else{_isOutdated=false;var b=$('ds-update-banner');if(b)b.style.display='none'}}catch(e){}},onerror:function(){},ontimeout:function(){}})}
function _showUpdateBanner(rv){var b=$('ds-update-banner');if(!b)return;b.style.display='flex';var vt=$('ds-update-ver');if(vt)vt.textContent='v'+rv}
/* ═══ GM HELPERS — FIX: raw response luôn là string ═══ */
function _gmGet(url,hdr){
return new Promise(function(ok){
GM_xmlhttpRequest({method:'GET',url:url,headers:hdr||{'Content-Type':'application/json'},timeout:60000,
onload:function(r){
var rawStr=r.responseText||'';
var parsed=null;
try{parsed=JSON.parse(rawStr)}catch(e){}
ok({status:r.status,data:parsed,raw:rawStr});
},
onerror:function(){ok({status:0,data:null,raw:'network_error'})},
onetimeout:function(){ok({status:0,data:null,raw:'timeout'})}
});
})}
function _gmPost(url,body,hdr){
return new Promise(function(ok){
GM_xmlhttpRequest({method:'POST',url:url,headers:hdr||{'Content-Type':'application/json'},data:body?JSON.stringify(body):null,timeout:90000,
onload:function(r){
var rawStr=r.responseText||'';
var parsed=null;
try{parsed=JSON.parse(rawStr)}catch(e){}
ok({status:r.status,data:parsed,raw:rawStr});
},
onerror:function(){ok({status:0,data:null,raw:'network_error'})},
onetimeout:function(){ok({status:0,data:null,raw:'timeout'})}
});
})}
function _gmReq(method,url,body,hdr){
return new Promise(function(ok){
GM_xmlhttpRequest({method:method,url:url,headers:hdr||{'Content-Type':'application/json'},data:body?JSON.stringify(body):null,timeout:60000,
onload:function(r){
var rawStr=r.responseText||'';
var parsed=null;
try{parsed=JSON.parse(rawStr)}catch(e){}
ok({status:r.status,data:parsed,raw:rawStr});
},
onerror:function(){ok({status:0,data:null,raw:'network_error'})},
onetimeout:function(){ok({status:0,data:null,raw:'timeout'})}
});
})}
function _gmPut(url,body,hdr){return new Promise(function(ok){GM_xmlhttpRequest({method:'PUT',url:url,headers:hdr||{'Content-Type':'application/json'},data:body?JSON.stringify(body):null,timeout:90000,onload:function(r){ok({status:r.status,data:r.responseText})},onerror:function(){ok({status:0})},ontimeout:function(){ok({status:0})}})})}
function _gmPatch(url,body,hdr){return new Promise(function(ok){GM_xmlhttpRequest({method:'PATCH',url:url,headers:hdr||{'Content-Type':'application/json'},data:body?JSON.stringify(body):null,timeout:30000,onload:function(r){ok({status:r.status})},onerror:function(){ok({status:0})},ontimeout:function(){ok({status:0})}})})}
function _getJwt(){var m=document.cookie.match(/(^| )jwt_token=([^;]+)/);return m?m[2]:null}
function _getUid(){var j=_getJwt();if(!j)return null;try{var b=j.split('.')[1].replace(/-/g,'+').replace(/_/g,'/');return JSON.parse(atob(b+'='.repeat((4-b.length%4)%4))).sub}catch(e){return null}}
function _duoH(j){return{'Content-Type':'application/json; charset=UTF-8','Authorization':'Bearer '+j,'Accept':'application/json; charset=UTF-8','Origin':'https://www.duolingo.com','Referer':'https://www.duolingo.com/','User-Agent':navigator.userAgent}}
async function _fetchDuoUser(){var j=_getJwt(),u=_getUid();if(!j||!u)return null;var r=await _gmGet('https://www.duolingo.com/2017-06-30/users/'+u+'?fields=id,username',_duoH(j));if(r.data&&r.data.username){_duoUser=r.data.username;return _duoUser}return null}
async function _fetchDuoFull(){var j=_getJwt(),u=_getUid();if(!j||!u)return null;var r=await _gmGet('https://www.duolingo.com/2017-06-30/users/'+u+'?fields=id,username,fromLanguage,learningLanguage,totalXp,gems,streak,streakData,timezone',_duoH(j));if(r.data&&r.data.id){_duoFullData=r.data;return r.data}return null}
function _findVip(key){return _G('vip_users',[]).find(function(u){return u.key===key})}
function _genKey(){var c='ABCDEFGHJKLMNPQRSTUVWXYZ23456789',k='';for(var i=0;i<4;i++)k+=c.charAt(Math.floor(Math.random()*c.length));if(_findVip(k))return _genKey();return k}
function _enKey(){var uid=_duoUser||_getUid()||'unknown';return 'en_st_'+uid}
function _dKey(){var n=new Date(Date.now()+7*3600000);return n.getUTCFullYear()+'-'+String(n.getUTCMonth()+1).padStart(2,'0')+'-'+String(n.getUTCDate()).padStart(2,'0')}
function _getEn(){var k=_enKey(),s=_G(k,{});if(s.d!==_dKey())return MAX_EN;return s.e!==undefined?s.e:MAX_EN}
function _useEn(c){var d=_dKey(),k=_enKey(),s=_G(k,{});if(s.d!==d)s={d:d,e:MAX_EN};s.e=Math.max(0,s.e-c);_S(k,s);return s.e}
function _canEn(c){return _isUnl()?true:_getEn()>=c}
function _isUnl(){return _tier==='VIP'||_tier==='ADMIN'}
function _startCv(){var btn=$('ds-cr-btn'),cv=$('ds-lcv');if(!cv||!btn)return;if(_linkRaf)cancelAnimationFrame(_linkRaf);var W=btn.offsetWidth||280,H=btn.offsetHeight||44;cv.width=W;cv.height=H;var ctx=cv.getContext('2d');var C=['#a78bfa','#38bdf8','#34d399','#f472b6','#fbbf24','#7c3aed'];var sp=Array.from({length:18},function(){return{x:Math.random()*W,y:H/2,vx:(Math.random()-.5)*4,vy:(Math.random()-.5)*3,l:0,ml:16+Math.random()*18,c:C[Math.floor(Math.random()*C.length)],r:.7+Math.random()*2,g:.08+Math.random()*.06,t:[]}});var t=0;function fr(){ctx.clearRect(0,0,W,H);t++;var sx=((t*1.4)%(W+60))-30;var sg=ctx.createLinearGradient(sx-50,0,sx+30,0);sg.addColorStop(0,'transparent');sg.addColorStop(.5,'rgba(167,139,250,.12)');sg.addColorStop(1,'transparent');ctx.fillStyle=sg;ctx.fillRect(0,0,W,H);sp.forEach(function(s){s.l++;if(s.l>s.ml||s.x<0||s.x>W||s.y<0||s.y>H){s.x=W*.2+Math.random()*W*.6;s.y=H/2+(Math.random()-.5)*H*.4;s.vx=(Math.random()-.5)*4;s.vy=(Math.random()-.5)*3;s.l=0;s.c=C[Math.floor(Math.random()*C.length)];s.t=[]}s.t.push({x:s.x,y:s.y});if(s.t.length>6)s.t.shift();s.vy+=s.g;s.x+=s.vx;s.y+=s.vy;var a=1-s.l/s.ml;for(var i=1;i<s.t.length;i++){var p=i/s.t.length;ctx.beginPath();ctx.moveTo(s.t[i-1].x,s.t[i-1].y);ctx.lineTo(s.t[i].x,s.t[i].y);ctx.strokeStyle=s.c;ctx.globalAlpha=p*a*.5;ctx.lineWidth=p*s.r*1.5;ctx.stroke()}ctx.globalAlpha=1;ctx.beginPath();ctx.arc(s.x,s.y,s.r*a,0,Math.PI*2);ctx.fillStyle=s.c;ctx.globalAlpha=a*.8;ctx.fill();ctx.globalAlpha=1});_linkRaf=requestAnimationFrame(fr)}fr()}
function _stopCv(){if(_linkRaf){cancelAnimationFrame(_linkRaf);_linkRaf=null}var c=$('ds-lcv');if(c)c.getContext('2d').clearRect(0,0,c.width,c.height)}
function _playRnd(){var i;do{i=Math.floor(Math.random()*MUSIC.length)}while(i===_mIdx&&MUSIC.length>1);_mIdx=i;_playM(i)}
function _playM(i){var m=MUSIC[i],f=$('ds-mif'),t=$('ds-mt'),b=$('ds-mp');if(!f||!t)return;f.src='https://www.youtube.com/embed/'+m.id+'?autoplay=1&loop=1&playlist='+m.id;t.textContent='#'+(i+1)+' '+m.t;_mPlay=true;if(b)b.textContent='⏸️ DỪNG'}
function _stopM(){var f=$('ds-mif'),b=$('ds-mp'),t=$('ds-mt');if(f)f.src='';_mPlay=false;if(b)b.textContent='▶️ PHÁT';if(t)t.textContent='🎵 Nhấn PHÁT'}
function _startCD(sec){if(_cdTimer)clearInterval(_cdTimer);_cdRemain=Math.ceil(sec);var btn=$('ds-cr-btn');if(btn){btn.disabled=true;btn.textContent='⏳ CHỜ '+_fmtCD(_cdRemain)}var cdEl=$('ds-cd-txt');if(cdEl)cdEl.style.display='';_cdTimer=setInterval(function(){_cdRemain--;if(_cdRemain<=0){clearInterval(_cdTimer);_cdTimer=null;_cdRemain=0;if(btn){btn.disabled=false;btn.textContent='⚡ TẠO LINK'}if(cdEl)cdEl.style.display='none';_toast('✅ Có thể tạo link!','ok',2000)}else{if(btn)btn.textContent='⏳ CHỜ '+_fmtCD(_cdRemain);if(cdEl)cdEl.textContent='⏳ Cooldown: '+_fmtCD(_cdRemain)}},1000)}
async function _actS3(){if(_activating)return;if(!_canEn(COST_S3)){_toast('💤 Không đủ năng lượng!','err');return}var btn=$('ds-s3b');if(!btn)return;_activating=true;btn.disabled=true;btn.textContent='⏳ ĐANG KÍCH HOẠT...';_logC('ds-ls3');_log('ds-ls3','Đang lấy thông tin...','i');try{var j=_getJwt(),u=_getUid();if(!j||!u){_log('ds-ls3','❌ Đăng nhập Duolingo!','e');return}var h=_duoH(j);var ur=await _gmGet('https://www.duolingo.com/2017-06-30/users/'+u+'?fields=id,username,fromLanguage,learningLanguage',h);if(!ur.data||!ur.data.username){_log('ds-ls3','❌ Không lấy user!','e');return}_log('ds-ls3','👤 '+ur.data.username,'o');var r=await _gmPost('https://www.duolingo.com/2017-06-30/users/'+u+'/shop-items',{itemName:'immersive_subscription',isFree:true,consumed:true,fromLanguage:ur.data.fromLanguage||'en',learningLanguage:ur.data.learningLanguage||'es',productId:'com.duolingo.immersive_free_trial_subscription'},h);if(r.status===200||r.status===201){if(!_isUnl())_useEn(COST_S3);_log('ds-ls3','✅ THÀNH CÔNG!','o');_toast('🎉 Super 3 ngày!','ok',4000);_updEn()}else if(r.status===409){_log('ds-ls3','⚠️ Đã có Super!','w')}else{_log('ds-ls3','❌ HTTP '+r.status+' '+JSON.stringify(r.data).substring(0,80),'e')}}catch(e){_log('ds-ls3','❌ '+e.message,'e')}finally{setTimeout(function(){_activating=false;btn.disabled=false;btn.textContent='⚡ KÍCH HOẠT SUPER 3 NGÀY (3⚡)'},500)}}
function _hackLog(m,tp){_log('ds-hlog',m,tp)}
function _hackLogC(){_logC('ds-hlog')}
function _updHackProg(type,pct){var f=$('dh-'+type+'-fill'),p=$('dh-'+type+'-prog');if(f)f.style.width=Math.min(100,Math.max(0,pct))+'%';if(p){if(pct>0&&pct<100)p.classList.add('on');if(pct>=100)setTimeout(function(){p.classList.remove('on')},2000)}}
function _updHackStats(){var d=_duoFullData;if(!d)return;var xe=$('dh-xp-val'),ge=$('dh-gem-val'),se=$('dh-streak-val');if(xe)xe.textContent=(d.totalXp||0).toLocaleString();if(ge)ge.textContent=(d.gems||0).toLocaleString();if(se)se.textContent=d.streak||0}
function _updStatus(m,c){var e=$('dh-status');if(e){e.textContent=m;e.style.color=c||'#00ff64';e.style.background=c==='#ff4b4b'?'rgba(255,75,75,.08)':c==='#ffc800'?'rgba(255,200,0,.08)':'rgba(0,255,100,.08)'}}
function _updHackerUser(){var u=_duoUser||'Chưa đăng nhập';var ne=$('dh-username');if(ne)ne.textContent='👤 '+u;var tb=$('dh-tier-badge');if(tb){if(_tier==='ADMIN'){tb.textContent='ADMIN';tb.className='ds-bdg ds-bdga'}else if(_tier==='VIP'){tb.textContent='VIP';tb.className='ds-bdg ds-bdgv'}else{tb.textContent='FREE';tb.className='ds-bdg ds-bdgf'}}}
function _updHackerEn(){var v=$('dh-en-val'),f=$('dh-en-fill'),w=$('dh-energy-wrap');if(!v||!f)return;if(_isUnl()){v.textContent='♾️';v.style.color='#FFD700';f.style.width='100%';f.className='dh-energy-fill dh-eful';if(w)w.style.display='none'}else{var e=_getEn(),p=Math.round(e/MAX_EN*100);v.textContent=e+'/'+MAX_EN;v.style.color='';f.style.width=p+'%';f.className='dh-energy-fill '+(p>50?'dh-efhi':p>20?'dh-efmd':'dh-eflo');if(w)w.style.display=''}}
async function _hackXP(amount){var j=_getJwt(),u=_getUid();if(!j||!u)throw new Error('Đăng nhập Duolingo!');var h=_duoH(j);var earned=0,loops=0,consecFail=0;var _isInf=amount>=99999;while(_hackRunning&&_hackTask==='xp'){if(!_isInf&&earned>=amount)break;if(!_isUnl()&&_getEn()<HACK_EN_COST){_hackLog('💤 Hết năng lượng!','w');break}try{var now=Math.floor(Date.now()/1000),dur=Math.floor(Math.random()*121+300);var r=await _gmPost('https://stories.duolingo.com/api2/stories/fr-en-le-passeport/complete',{awardXp:true,completedBonusChallenge:true,fromLanguage:'fr',learningLanguage:'en',hasXpBoost:false,illustrationFormat:'svg',isFeaturedStoryInPracticeHub:true,isLegendaryMode:true,isV2Redo:false,isV2Story:false,masterVersion:true,maxScore:0,score:0,happyHourBonusXp:469,startTime:now,endTime:now+dur},h);if(r.status===200){var xp=r.data&&r.data.awardedXp?r.data.awardedXp:499;consecFail=0;if(!_isUnl())_useEn(HACK_EN_COST);earned+=xp;loops++;_hackLog('✅ +'+xp+' XP','o');if(_duoFullData)_duoFullData.totalXp=(_duoFullData.totalXp||0)+xp}else if(r.status===429){consecFail++;if(consecFail>=5){_hackLog('❌ Rate-limited!','e');break}await _sleep(3000);continue}else{consecFail++;if(consecFail>=5){_hackLog('❌ Quá nhiều lỗi!','e');break}await _sleep(2000);continue}}catch(e){consecFail++}_updHackProg('xp',_isInf?((loops%9)*11+1):Math.min(100,Math.floor(earned/amount*100)));_updHackerEn();await _sleep(_G('safe_m','')?3000:1000)}return earned}
async function _hackGems(amount){var j=_getJwt(),u=_getUid();if(!j||!u)throw new Error('Đăng nhập Duolingo!');var h=_duoH(j);var total=0,consecFail=0;var _isInf=amount>=99999;while(_hackRunning&&_hackTask==='gem'){if(!_isInf&&total>=amount)break;if(!_isUnl()&&_getEn()<HACK_EN_COST){_hackLog('💤 Hết năng lượng!','w');break}try{var rr=await _gmGet('https://www.duolingo.com/2023-05-23/users/'+u+'?fields=rewardBundles{rewards}',h);if(!rr.data||!rr.data.rewardBundles){consecFail++;if(consecFail>=5)break;await _sleep(3000);continue}var gems=[];(rr.data.rewardBundles||[]).forEach(function(b){(b.rewards||[]).forEach(function(rw){if(!rw.consumed&&(rw.id||'').match(/^SKILL_COMPLETION/))gems.push({id:rw.id,amount:rw.amount||0})})});if(gems.length===0){_hackLog('⚠️ Không có reward...','w');await _sleep(_G('safe_m','')?2000:500);continue}consecFail=0;var results=await Promise.all(gems.map(function(g){return _gmPatch('https://www.duolingo.com/2023-05-23/users/'+u+'/rewards/'+g.id,{consumed:true,fromLanguage:_duoFullData&&_duoFullData.fromLanguage||'en',learningLanguage:_duoFullData&&_duoFullData.learningLanguage||'en'},h)}));var batch=0;results.forEach(function(ok,i){if(ok.status===200)batch+=gems[i].amount||0});if(batch>0){if(!_isUnl())_useEn(HACK_EN_COST);total+=batch;_hackLog('✅ +'+batch+' KC','o');if(_duoFullData)_duoFullData.gems=(_duoFullData.gems||0)+batch}}catch(e){consecFail++}_updHackProg('gem',_isInf?((total>0?50:0)):Math.min(100,Math.floor(total/amount*100)));_updHackerEn();await _sleep(_G('safe_m','')?2000:400)}return total}
async function _hackStreak(days){var j=_getJwt(),u=_getUid();if(!j||!u)throw new Error('Đăng nhập Duolingo!');var h=_duoH(j);var done=0,consecFail=0;var _isInf=days>=9999;var tz=(_duoFullData&&_duoFullData.timezone)||Intl.DateTimeFormat().resolvedOptions().timeZone;var base;var dateStr=_duoFullData&&_duoFullData.streakData&&_duoFullData.streakData.currentStreak&&_duoFullData.streakData.currentStreak.startDate;if(dateStr&&/^\d{4}-\d{2}-\d{2}$/.test(dateStr)){var p=dateStr.split('-');base={y:+p[0],m:+p[1],d:+p[2]}}else{var dtf=new Intl.DateTimeFormat('en-US',{timeZone:tz,year:'numeric',month:'2-digit',day:'2-digit'});var parts={};dtf.formatToParts(new Date()).forEach(function(x){if(x.type!=='literal')parts[x.type]=x.value});base={y:+parts.year,m:+parts.month,d:+parts.day}}function wallClockToSecs(y,m,d,h,mn,s){var guess=Date.UTC(y,m-1,d,h,mn,s);var dtf2=new Intl.DateTimeFormat('en-US',{timeZone:tz,hourCycle:'h23',year:'numeric',month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit',second:'2-digit'});var o={};dtf2.formatToParts(new Date(guess)).forEach(function(x){if(x.type!=='literal')o[x.type]=x.value});var localAsUtc=Date.UTC(+o.year,+o.month-1,+o.day,+o.hour,+o.minute,+o.second);return Math.floor((guess-(localAsUtc-guess))/1000)}while(_hackRunning&&_hackTask==='streak'){if(!_isInf&&done>=days)break;if(!_isUnl()&&_getEn()<HACK_EN_COST){_hackLog('💤 Hết năng lượng!','w');break}var endSecs=wallClockToSecs(base.y,base.m,base.d-1-done,12,0,0);var sess=null;try{var sr=await _gmPost('https://www.duolingo.com/2017-06-30/sessions',{challengeTypes:['assist','translate','listen','select','match','judge','dialogue','characterIntro','completeReverseTranslation'],fromLanguage:_duoFullData&&_duoFullData.fromLanguage||'en',learningLanguage:_duoFullData&&_duoFullData.learningLanguage||'en',type:'GLOBAL_PRACTICE',isFinalLevel:false,isV2:true,juicy:true,smartTipsVersion:2},h);if(sr.status===200&&sr.data&&sr.data.id)sess=sr.data}catch(e){}if(!sess){consecFail++;if(consecFail>=5){_hackLog('❌ Quá nhiều lỗi!','e');break}await _sleep(2000);continue}try{var ur=await _gmPut('https://www.duolingo.com/2017-06-30/sessions/'+sess.id,Object.assign({},sess,{heartsLeft:5,startTime:endSecs-1,endTime:endSecs,enableBonusPoints:false,failed:false,maxInLessonStreak:9,shouldLearnThings:true}),h);if(ur.status===200){consecFail=0;if(!_isUnl())_useEn(HACK_EN_COST);done++;_hackLog('✅ +'+done+' Streak','o');if(_duoFullData)_duoFullData.streak=(_duoFullData.streak||0)+1}else{consecFail++;if(consecFail>=5){_hackLog('❌ Rate-limited!','e');break}}}catch(e){consecFail++}_updHackProg('streak',_isInf?((done%9)*11+1):Math.min(100,Math.floor(done/days*100)));_updHackerEn();await _sleep(_G('safe_m','')?3000:1000)}return done}
function _switchToHacker(){_showingHacker=true;$('ds-main').style.display='none';$('ds-hacker-panel').style.display='flex';$('ds-hdt').innerHTML='Duolingo <span>Hacker</span>';var btn=$('ds-toggle-btn');btn.textContent='⚡ Get Super';btn.className='ds-toggle-btn to-super';_updHackerUser();_updHackerEn();_updStatus('⏳ Đang tải...','#FFCD00');_fetchDuoFull().then(function(){_updHackStats();_updHackerUser();_updStatus('✅ Sẵn sàng','#00ff64')});if(_isUnl()){$('dh-xp-cost').textContent='♾️ Miễn phí';$('dh-gem-cost').textContent='♾️ Miễn phí';$('dh-streak-cost').textContent='♾️ Miễn phí'}else{$('dh-xp-cost').textContent='⚡'+HACK_EN_COST+'/lần';$('dh-gem-cost').textContent='⚡'+HACK_EN_COST+'/lần';$('dh-streak-cost').textContent='⚡'+HACK_EN_COST+'/ngày'}}
function _switchToSuper(){_showingHacker=false;$('ds-hacker-panel').style.display='none';$('ds-main').style.display='flex';$('ds-hdt').innerHTML='Duolingo <span>Get Super</span>';var btn=$('ds-toggle-btn');btn.textContent='🛡️ Hacker';btn.className='ds-toggle-btn to-hacker';_updEn()}
GM_addStyle('#ds-r{--bg:#0a0a0a;--sf:#1a1a1a;--bd:#333;--tx:#fff;--mu:#888;--go:#FFD700;--cr:16px;--br:10px}#ds-r[data-red="1"]{--go:#ff4b4b;--bd:#ff4b4b}#ds-r[data-red="1"] .ds-hdt span{color:#ff4b4b}#ds-r *{box-sizing:border-box;font-family:"Segoe UI",Arial,sans-serif!important}.ds-sh{position:fixed;right:16px;bottom:16px;z-index:2147483647;display:flex;flex-direction:column;align-items:flex-end;gap:8px;transition:bottom .3s}.ds-tg{display:flex;align-items:center;gap:7px;padding:7px 15px 7px 10px;border-radius:99px;border:1.5px solid rgba(255,215,0,.3);background:var(--bg);cursor:pointer;box-shadow:0 2px 16px rgba(255,215,0,.18);user-select:none;color:var(--tx)}.ds-tg:hover{transform:translateY(-2px);box-shadow:0 6px 24px rgba(255,215,0,.3)}.ds-tgl{font-size:12px;font-weight:700;color:var(--go)}.ds-cd{width:380px;background:var(--bg);border:2px solid var(--go);border-radius:var(--cr);box-shadow:0 8px 32px rgba(255,215,0,.15);overflow:hidden;max-height:85vh;display:flex;flex-direction:column;position:relative;color:var(--tx);transition:opacity .3s}.ds-hd{background:linear-gradient(135deg,#1a1a0a,#0a0a1a);padding:12px 14px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(255,215,0,.2);flex-shrink:0;gap:8px}.ds-hdl{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.ds-hdt{font-size:15px;font-weight:900;color:var(--go);white-space:nowrap}.ds-hdt span{color:#FF6B6B}.ds-ub{font-size:11px;font-weight:800;color:#fff;background:linear-gradient(135deg,#1cb0f3,#0099cc);padding:3px 10px;border-radius:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.ds-hdr{display:flex;align-items:center;gap:6px;flex-shrink:0}.ds-sbtn{background:none;border:1px solid var(--bd);color:var(--mu);cursor:pointer;font-size:16px;transition:all .2s;padding:4px 8px;border-radius:8px}.ds-sbtn:hover{transform:rotate(90deg);color:var(--go);border-color:var(--go)}.ds-sec{padding:12px 14px;display:flex;flex-direction:column;gap:8px}.ds-lb{font-size:11px;font-weight:700;color:var(--go);text-transform:uppercase;letter-spacing:1px}.ds-sm{font-size:12px;font-weight:600;color:var(--mu)}.ds-iw{display:flex;align-items:center;gap:8px;border:1.5px solid var(--bd);border-radius:10px;padding:0 12px;background:var(--sf);height:44px;flex:1;min-width:0}.ds-iw:focus-within{border-color:var(--go)}.ds-in{flex:1;min-width:0;border:none;background:none;outline:none;font-size:13px;font-weight:700;color:var(--tx);height:44px}.ds-in::placeholder{color:var(--mu);opacity:.6}.ds-b{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:44px;padding:0 16px;border-radius:var(--br);border:2px solid transparent;font-size:13px;font-weight:800;cursor:pointer;transition:all .15s;white-space:nowrap;flex-shrink:0;position:relative;overflow:hidden}.ds-b:hover{transform:translateY(-2px);filter:brightness(1.1)}.ds-b:active{transform:translateY(1px);filter:brightness(.9)}.ds-b:disabled{opacity:.4;cursor:not-allowed;transform:none!important}.ds-b.busy{pointer-events:none;opacity:.7}.ds-bp{background:linear-gradient(135deg,#FFD700,#FFA500);color:#000;box-shadow:0 3px 0 #B8860B}.ds-bg{background:linear-gradient(135deg,#58cc02,#2d9e00);color:#fff;box-shadow:0 3px 0 #1a6b00}.ds-bpk{background:linear-gradient(135deg,#7c3aed,#ec4899);color:#fff;box-shadow:0 3px 0 #5b21b6}.ds-bo{background:linear-gradient(135deg,#ff6b00,#ff9500);color:#fff;box-shadow:0 3px 0 #cc5500}.ds-bd{background:linear-gradient(135deg,#ff4b4b,#cc0000);color:#fff;box-shadow:0 3px 0 #990000}.ds-bu{background:linear-gradient(135deg,#ff9500,#ff6b00);color:#fff;box-shadow:0 3px 0 #cc5500;animation:ds-pulse 2s ease-in-out infinite}@keyframes ds-pulse{0%,100%{box-shadow:0 3px 0 #cc5500,0 0 0 0 rgba(255,149,0,.4)}50%{box-shadow:0 3px 0 #cc5500,0 0 0 8px rgba(255,149,0,0)}}.ds-bo2{background:transparent;border:2px solid var(--bd);color:var(--tx);box-shadow:none}.ds-bo2:hover{border-color:var(--go);color:var(--go)}.ds-bf{width:100%}.ds-bs{height:36px;font-size:12px;padding:0 12px}.ds-dv{height:1px;background:var(--bd);margin:0;flex-shrink:0}.ds-rw{display:flex;align-items:center;gap:8px}.ds-bt{display:flex;align-items:center;justify-content:space-between}.ds-bdg{display:inline-flex;align-items:center;padding:3px 12px;border-radius:99px;font-size:10px;font-weight:800;text-transform:uppercase}.ds-bdgf{background:#d7ffb8;color:#2d6a00}.ds-bdgv{background:linear-gradient(135deg,#FFD700,#FFA500);color:#000}.ds-bdga{background:linear-gradient(135deg,#ff4b4b,#ff0000);color:#fff}.ds-tabs{display:flex;border-bottom:1px solid var(--bd);padding:0 8px;flex-shrink:0}.ds-tab{flex:1;padding:10px 4px 9px;border:none;background:none;font-size:11px;font-weight:800;color:var(--mu);cursor:pointer;transition:color .2s;border-bottom:2px solid transparent}.ds-tab:hover{color:var(--tx)}.ds-tab.on{color:var(--go);border-bottom-color:var(--go)}.ds-pn{display:none;flex-direction:column}.ds-pn.on{display:flex;flex:1;overflow-y:auto;min-height:0}.ds-pn.on::-webkit-scrollbar{width:4px}.ds-pn.on::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}.ds-log{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:10px 12px;font-size:11px;font-family:"Courier New",monospace!important;color:#adff2f;max-height:200px;overflow-y:auto;white-space:pre-wrap;word-break:break-all;line-height:1.6;position:relative}.ds-log::-webkit-scrollbar{width:4px}.ds-log::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}.ds-le{display:block;animation:ds-ls .2s ease both}@keyframes ds-ls{from{opacity:0;transform:translateX(-6px)}to{opacity:1;transform:none}}.lo{color:#adff2f}.le{color:#ff4b4b}.li{color:#1cb0f3}.lw{color:#ffc800}.ds-ft{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;font-size:10px;color:var(--mu);flex-shrink:0}.ds-tw{position:absolute;bottom:50px;left:50%;transform:translateX(-50%);z-index:200;display:flex;flex-direction:column;align-items:center;gap:5px;pointer-events:none;width:calc(100% - 30px)}.ds-tst{display:flex;align-items:center;gap:7px;padding:8px 14px;border-radius:10px;font-size:12px;font-weight:700;animation:ds-tu .3s cubic-bezier(.34,1.4,.64,1) both;border:1px solid rgba(255,255,255,.1);backdrop-filter:blur(12px)}.ds-tst.out{animation:ds-td .2s ease-in forwards}@keyframes ds-tu{from{opacity:0;transform:translateY(8px) scale(.93)}to{opacity:1;transform:none}}@keyframes ds-td{to{opacity:0;transform:translateY(5px) scale(.95)}}.ds-tst-ok{background:rgba(15,25,15,.9);color:#fff;border-color:rgba(88,204,2,.3)}.ds-tst-err{background:rgba(30,10,10,.9);color:#fff;border-color:rgba(255,75,75,.3)}.ds-tst-warn{background:rgba(28,20,5,.9);color:#ffc800;border-color:rgba(255,200,0,.3)}.ds-tst-info{background:rgba(8,18,30,.9);color:#fff;border-color:rgba(28,176,243,.3)}.ds-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.ds-tst-ok .ds-dot{background:#58cc02}.ds-tst-err .ds-dot{background:#ff4b4b}.ds-tst-warn .ds-dot{background:#ffc800}.ds-tst-info .ds-dot{background:#1cb0f3}.ds-si{display:flex;justify-content:space-between;align-items:center;padding:10px 0;border-bottom:1px solid var(--bd)}.ds-si:last-child{border-bottom:none}.ds-sw{width:44px;height:24px;background:var(--bd);border-radius:12px;cursor:pointer;position:relative;transition:background .25s;flex-shrink:0}.ds-sw.on{background:var(--go)}.ds-sw::after{content:"";position:absolute;width:20px;height:20px;background:#fff;border-radius:50%;top:2px;left:2px;transition:transform .25s;box-shadow:0 1px 4px rgba(0,0,0,.3)}.ds-sw.on::after{transform:translateX(20px)}#ds-main{display:none;flex-direction:column;flex:1;min-height:0;overflow:hidden}#ds-hacker-panel{display:none;flex-direction:column;flex:1;min-height:0;overflow:hidden}#ds-so{display:none;position:fixed;inset:0;background:rgba(0,0,0,.65);z-index:2147483646}#ds-so.on{display:block}#ds-sm{display:none;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:350px;background:var(--bg);border:2px solid var(--go);border-radius:16px;box-shadow:0 12px 48px rgba(0,0,0,.7);z-index:2147483647;flex-direction:column;overflow:hidden;max-height:80vh}#ds-sm.on{display:flex}.ds-sh2{display:flex;justify-content:space-between;align-items:center;padding:14px;border-bottom:1px solid var(--bd);background:linear-gradient(135deg,#1a1a0a,#0a0a1a)}.ds-mp2{display:flex;flex-direction:column;gap:8px;padding:10px 14px}.ds-miw{width:100%;border-radius:10px;overflow:hidden;background:#000}.ds-miw iframe{width:100%;height:160px;border:none}.ds-mt2{font-size:12px;font-weight:700;color:var(--go);text-align:center;padding:4px}.ds-mc{display:flex;gap:8px}.ds-mc .ds-b{flex:1;height:38px;font-size:12px}.ds-pw{height:8px;background:var(--sf);border-radius:99px;overflow:hidden;border:1px solid var(--bd);position:relative}.ds-pf{height:100%;border-radius:99px;background:linear-gradient(90deg,#7c3aed,#1cb0f3,#34d399,#f472b6,#7c3aed);background-size:300%;transition:width .65s cubic-bezier(.34,1.2,.64,1);animation:ds-rs 3s linear infinite}.ds-pf::before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.3),transparent);background-size:200%;animation:ds-ps 1.8s ease-in-out infinite;border-radius:99px}@keyframes ds-rs{to{background-position:300% center}}@keyframes ds-ps{from{background-position:200% 0}to{background-position:-200% 0}}.ds-lcv{position:absolute;inset:0;pointer-events:none;border-radius:var(--br);opacity:0;transition:opacity .3s}.ds-b.busy .ds-lcv{opacity:1}.ds-ap{flex:1;overflow-y:auto;min-height:0;padding:12px 14px}.ds-at{color:#ff4b4b;font-weight:900;font-size:14px;text-transform:uppercase;margin-bottom:12px}.ds-al{max-height:350px;overflow-y:auto;display:flex;flex-direction:column;gap:4px}.ds-al::-webkit-scrollbar{width:4px}.ds-al::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}.ds-uc{display:flex;align-items:center;padding:8px 10px;background:var(--sf);border:1px solid rgba(255,215,0,.3);border-radius:8px;font-size:12px;gap:8px}.ds-uc .ds-un{font-weight:700;color:var(--tx);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ds-uc .ds-uk{font-size:10px;color:var(--mu);font-family:monospace!important}.ds-uc .ds-vb{font-size:9px;font-weight:900;color:#000;background:linear-gradient(135deg,#FFD700,#FFA500);padding:2px 8px;border-radius:4px;text-transform:uppercase;flex-shrink:0}.ds-uc .ds-rv{height:28px;padding:0 10px;border-radius:6px;border:none;font-size:10px;font-weight:800;cursor:pointer;flex-shrink:0;background:#ff4b4b;color:#fff}.ds-ra{padding:10px 14px;border-top:1px solid var(--bd);display:flex;gap:8px;flex-shrink:0}.ds-s3{background:linear-gradient(135deg,rgba(255,107,0,.08),rgba(255,149,0,.08));border:1.5px solid rgba(255,149,0,.3);border-radius:12px;padding:14px;display:flex;flex-direction:column;gap:10px}.ds-s3t{font-size:14px;font-weight:900;color:#FFA500}.ds-s3d{font-size:11px;color:var(--mu);line-height:1.5}.ds-ew{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:10px 14px;display:flex;flex-direction:column;gap:6px}.ds-eh{display:flex;justify-content:space-between;align-items:center}.ds-el{font-size:11px;font-weight:700;color:var(--go);text-transform:uppercase;letter-spacing:1px;display:flex;align-items:center;gap:6px}.ds-ev{font-size:14px;font-weight:900}.ds-eb{height:10px;background:rgba(255,255,255,.05);border-radius:99px;overflow:hidden;border:1px solid var(--bd)}.ds-ef{height:100%;border-radius:99px;transition:width .5s}.ds-efhi{background:linear-gradient(90deg,#58cc02,#2d9e00)}.ds-efmd{background:linear-gradient(90deg,#ffc800,#ff9500)}.ds-eflo{background:linear-gradient(90deg,#ff4b4b,#cc0000)}.ds-eful{background:linear-gradient(90deg,#FFD700,#FFA500)}.ds-ec{display:flex;gap:8px;font-size:10px;color:var(--mu)}.ds-ec span{background:rgba(255,255,255,.03);padding:2px 8px;border-radius:6px;border:1px solid var(--bd)}.ds-ti{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:10px 14px;display:flex;justify-content:space-between;align-items:center}.ds-ti .tl{font-size:11px;color:var(--mu)}.ds-ti .tv{font-size:13px;font-weight:800}.tf{color:#58cc02}.tvv{color:#FFD700}.ta{color:#ff4b4b}.ds-ib{background:linear-gradient(135deg,rgba(28,176,243,.08),rgba(28,176,243,.03));border:1.5px solid rgba(28,176,243,.25);border-radius:10px;padding:10px 14px;display:flex;align-items:center;gap:10px;font-size:12px}.ds-in2{font-size:15px;font-weight:900;color:#1cb0f3}.ds-ih{font-size:10px;color:var(--mu);line-height:1.4}.ds-le2{background:rgba(255,215,0,.08);border:1.5px solid rgba(255,215,0,.3);border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:8px}.ds-le2t{font-size:12px;font-weight:800;color:var(--go)}.ds-ct{display:inline-flex;align-items:center;padding:1px 7px;border-radius:5px;margin-left:4px;font-size:10px;font-weight:700;cursor:pointer;background:var(--sf);border:1px solid var(--bd);color:var(--mu);transition:transform .1s,background .12s,color .12s;vertical-align:middle}.ds-ct:hover{background:var(--go);color:#000;border-color:var(--go)}.ds-ct:active{transform:scale(.88)}.ds-ct.ok{background:#58cc02;color:#fff;border-color:#58cc02}.ds-gr{font-size:28px;font-weight:900;color:var(--go);font-family:monospace!important;letter-spacing:6px;text-align:center;padding:6px 0}.ds-upd-banner{display:none;align-items:center;gap:10px;padding:10px 14px;background:linear-gradient(135deg,rgba(255,149,0,.12),rgba(255,107,0,.08));border-bottom:1.5px solid rgba(255,149,0,.4);cursor:pointer;transition:background .2s;flex-shrink:0}.ds-upd-banner:hover{background:linear-gradient(135deg,rgba(255,149,0,.20),rgba(255,107,0,.15))}.ds-upd-ico{font-size:20px;flex-shrink:0;animation:ds-bounce 1.5s ease-in-out infinite}@keyframes ds-bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-3px)}}.ds-upd-info{flex:1;min-width:0}.ds-upd-title{font-size:12px;font-weight:800;color:#ff9500;line-height:1.3}.ds-upd-sub{font-size:10px;color:var(--mu);line-height:1.3;margin-top:1px}.ds-upd-btn{height:32px;padding:0 12px;border-radius:8px;border:none;font-size:11px;font-weight:800;cursor:pointer;background:linear-gradient(135deg,#ff9500,#ff6b00);color:#fff;box-shadow:0 2px 0 #cc5500;transition:all .15s;flex-shrink:0;white-space:nowrap}.ds-upd-btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.ds-upd-btn:active{transform:translateY(1px)}.ds-upd-close{background:none;border:none;color:var(--mu);font-size:16px;cursor:pointer;padding:4px 8px;border-radius:6px;flex-shrink:0;transition:all .15s;line-height:1}.ds-upd-close:hover{color:#ff4b4b;background:rgba(255,75,75,.15)}.ds-tob{display:flex;align-items:center;gap:4px}.ds-toggle-btn{height:34px;padding:0 14px;border-radius:99px;border:1.5px solid rgba(255,215,0,.4);background:var(--bg);cursor:pointer;font-size:11px;font-weight:800;transition:all .2s;white-space:nowrap;flex-shrink:0}.ds-toggle-btn:hover{transform:translateY(-2px)}.ds-toggle-btn.to-super{color:var(--go);border-color:rgba(255,215,0,.4)}.ds-toggle-btn.to-super:hover{box-shadow:0 4px 16px rgba(255,215,0,.25);border-color:rgba(255,215,0,.7)}.ds-toggle-btn.to-hacker{color:#00ff64;border-color:rgba(0,255,100,.4)}.ds-toggle-btn.to-hacker:hover{box-shadow:0 4px 16px rgba(0,255,100,.25);border-color:rgba(0,255,100,.7)}#ds-dob{display:none;position:fixed;inset:0;z-index:2147483647;background:rgba(0,0,0,.9);justify-content:center;align-items:center}#ds-dob .db{background:var(--bg);border:2px solid #ff4b4b;border-radius:16px;padding:24px;display:flex;flex-direction:column;align-items:center;gap:14px;max-width:340px;width:90%}#ds-dob .dt{font-size:16px;font-weight:900;color:#ff4b4b}#ds-dob .dd{font-size:12px;color:var(--mu);text-align:center}#ds-di{width:100%;height:44px;border:1.5px solid var(--bd);border-radius:10px;padding:0 14px;background:var(--sf);color:var(--tx);font-size:16px;font-weight:700;text-align:center;letter-spacing:4px;outline:none}#ds-di:focus{border-color:#ff4b4b}#ds-de{font-size:11px;color:#ff4b4b;display:none}.dh-body{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}.dh-body::-webkit-scrollbar{width:4px}.dh-body::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}.dh-stats{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:10px 14px;display:flex;justify-content:space-around;text-align:center}.dh-stat-v{font-size:18px;font-weight:900;color:#fff}.dh-stat-l{font-size:10px;color:var(--mu);text-transform:uppercase;margin-top:2px}.dh-section{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:8px}.dh-section-t{font-size:13px;font-weight:800;color:var(--go);display:flex;justify-content:space-between;align-items:center}.dh-section-c{font-size:10px;color:var(--mu);font-weight:600}.dh-row{display:flex;gap:8px;align-items:center}.dh-input{flex:1;height:38px;border:1.5px solid var(--bd);border-radius:8px;padding:0 10px;background:#0a0a0a;color:var(--tx);font-size:13px;font-weight:700;outline:none}.dh-input:focus{border-color:#00ff64}.dh-btn{height:38px;padding:0 14px;border-radius:8px;border:none;font-size:12px;font-weight:800;cursor:pointer;transition:all .15s;white-space:nowrap}.dh-btn:hover{transform:translateY(-2px);filter:brightness(1.1)}.dh-btn:active{transform:translateY(1px)}.dh-btn:disabled{opacity:.4;cursor:not-allowed;transform:none!important}.dh-btn-go{background:linear-gradient(135deg,#00ff64,#00cc50);color:#000;box-shadow:0 3px 0 #009940}.dh-btn-stop{background:linear-gradient(135deg,#ff4b4b,#cc0000);color:#fff;box-shadow:0 3px 0 #990000}.dh-prog{height:6px;background:rgba(0,255,100,.08);border-radius:99px;overflow:hidden;border:1px solid rgba(0,255,100,.2)}.dh-prog.on{height:6px}.dh-fill{height:100%;border-radius:99px;background:linear-gradient(90deg,#00ff64,#00cc50,#00ff64);background-size:200%;width:0%;transition:width .5s;animation:dh-gs 2s linear infinite}@keyframes dh-gs{to{background-position:200% center}}.dh-log{background:#0a0a0a;border:1.5px solid var(--bd);border-radius:10px;padding:10px 12px;font-size:11px;font-family:"Courier New",monospace!important;color:#00ff64;max-height:160px;overflow-y:auto;white-space:pre-wrap;word-break:break-all;line-height:1.6}.dh-log::-webkit-scrollbar{width:4px}.dh-log::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}.dh-status{font-size:12px;text-align:center;padding:8px;border-radius:8px;font-weight:700}.dh-footer{text-align:center;padding:8px;font-size:10px;color:var(--mu);flex-shrink:0;border-top:1px solid var(--bd)}.dh-user-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;background:linear-gradient(135deg,rgba(28,176,243,.08),rgba(124,58,237,.05));border:1.5px solid rgba(28,176,243,.2);border-radius:10px}.dh-user-name{font-size:13px;font-weight:800;color:#1cb0f3}.dh-energy-wrap{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:10px 14px;display:flex;flex-direction:column;gap:6px}.dh-energy-h{display:flex;justify-content:space-between;align-items:center}.dh-energy-label{font-size:11px;font-weight:700;color:var(--go);text-transform:uppercase;letter-spacing:1px}.dh-energy-val{font-size:14px;font-weight:900}.dh-energy-bar{height:8px;background:rgba(255,255,255,.05);border-radius:99px;overflow:hidden;border:1px solid var(--bd)}.dh-energy-fill{height:100%;border-radius:99px;transition:width .5s}.dh-efhi{background:linear-gradient(90deg,#58cc02,#2d9e00)}.dh-efmd{background:linear-gradient(90deg,#ffc800,#ff9500)}.dh-eflo{background:linear-gradient(90deg,#ff4b4b,#cc0000)}.dh-eful{background:linear-gradient(90deg,#FFD700,#FFA500)}.ds-quota-wrap{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:8px 14px;display:flex;flex-direction:column;gap:5px}.ds-quota-h{display:flex;justify-content:space-between;align-items:center}.ds-quota-label{font-size:11px;font-weight:700;color:var(--go)}.ds-quota-val{font-size:12px;font-weight:800}.ds-quota-bar{height:6px;background:rgba(255,255,255,.05);border-radius:99px;overflow:hidden;border:1px solid var(--bd)}.ds-quota-fill{height:100%;border-radius:99px;background:linear-gradient(90deg,#1cb0f3,#7c3aed);transition:width .5s}.ds-cd-txt{font-size:11px;font-weight:700;color:#ffc800;display:none;text-align:center;padding:4px 0}');
function createUI(){var r=document.createElement('div');r.id='ds-r';r.innerHTML='<div class="ds-sh" id="ds-shell"><div class="ds-tob"><button class="ds-tg" id="ds-tog"><span style="font-size:15px">👁️</span><span class="ds-tgl" id="ds-togl">ẨN</span></button></div><div class="ds-cd" id="ds-card"><div class="ds-tw" id="ds-tw"></div><div class="ds-hd"><div class="ds-hdl"><div class="ds-hdt" id="ds-hdt">Duolingo <span>Integration</span></div><div class="ds-ub" id="ds-ub" style="display:none">👤 ...</div></div><div class="ds-hdr"><span class="ds-bdg ds-bdgf" id="ds-kb" style="display:none">FREE</span><button class="ds-sbtn" id="ds-sbtn" style="display:none">⚙️</button><button class="ds-toggle-btn to-super" id="ds-toggle-btn" style="display:none">⚡ Get Super</button></div></div><div class="ds-upd-banner" id="ds-update-banner" onclick="window.open(\''+GF_SCRIPT_URL+'\',\'_blank\')"><span class="ds-upd-ico">🔄</span><div class="ds-upd-info"><div class="ds-upd-title">⚠️ Có bản mới!</div><div class="ds-upd-sub">Phiên bản <span id="ds-update-ver">...</span> đã sẵn sàng</div></div><button class="ds-upd-btn" id="ds-update-btn">CẬP NHẬT</button><button class="ds-upd-close" id="ds-upd-close" title="Đóng">✕</button></div><div id="ds-so"></div><div id="ds-sm"><div class="ds-sh2"><div class="ds-lb" style="font-size:14px">⚙️ CÀI ĐẶT</div><button class="ds-b ds-bs ds-bd" id="ds-csm">✕</button></div><div class="ds-sec"><div class="ds-si"><span style="font-size:13px;font-weight:700">🛡️ Chế độ An Toàn</span><div class="ds-sw'+(_G('safe_m','')?' on':'')+'" id="ds-sws"></div></div><div class="ds-si"><span style="font-size:13px;font-weight:700">🔴 Chữ Đỏ</span><div class="ds-sw'+(_G('red_m','')?' on':'')+'" id="ds-swr"></div></div></div><div class="ds-dv"></div><div class="ds-lb" style="padding:12px 14px 4px">🎵 NGHE NHẠC</div><div class="ds-mp2"><div class="ds-miw"><iframe id="ds-mif" src="" allow="autoplay"></iframe></div><div class="ds-mt2" id="ds-mt">🎵 Nhấn PHÁT</div><div class="ds-mc"><button class="ds-b ds-bs ds-bg" id="ds-mp">▶️ PHÁT</button><button class="ds-b ds-bs ds-bo" id="ds-mr">🎲 RANDOM</button><button class="ds-b ds-bs ds-bd" id="ds-ms">⏹ DỪNG</button></div></div></div><div class="ds-sec" id="ds-auth"><div class="ds-lb">NHẬP KEY ĐỂ SỬ DỤNG</div><div class="ds-ib" id="ds-aib" style="display:none"><div><div style="font-size:10px;color:var(--mu);margin-bottom:2px">TÊN DUOLINGO</div><div class="ds-in2" id="ds-aun">...</div></div><div class="ds-ih">💡 Nói Admin: <strong style="color:#1cb0f3">"Em là <span id="ds-aun2">...</span>"</strong></div></div><div class="ds-rw"><div class="ds-iw"><input id="ds-ki" class="ds-in" type="password" placeholder="Nhập key..." autocomplete="off"></div><button class="ds-b ds-bp" id="ds-ubtn">NHẬP</button></div><button class="ds-b ds-bg ds-bf" id="ds-fbtn">🔑 DÙNG MIỄN PHÍ</button><div class="ds-bt"><span class="ds-sm">VIP = ♾️ năng lượng + Nhạc + Hacker</span><a href="'+ZALO+'" target="_blank" rel="noopener" class="ds-b ds-bs ds-bpk">NHẬN KEY VIP</a></div></div><div id="ds-main"><div class="ds-sec" style="padding-bottom:4px;gap:10px"><div class="ds-ib" id="ds-mib"><div><div style="font-size:10px;color:var(--mu);margin-bottom:2px">TÊN DUOLINGO</div><div class="ds-in2" id="ds-mun">...</div></div><span class="ds-bdg ds-bdgf" id="ds-tbdg">FREE</span></div><div class="ds-ti"><span class="tl">Gói hiện tại</span><span class="tv tf" id="ds-tdis">FREE</span></div><div class="ds-ew"><div class="ds-eh"><span class="ds-el">⚡ NĂNG LƯỢNG</span><span class="ds-ev" id="ds-env">25/25</span></div><div class="ds-eb"><div class="ds-ef ds-efhi" id="ds-enf" style="width:100%"></div></div><div class="ds-ec"><span>⚡ Link: 2</span><span>🌟 Super 3 ngày: 3</span><span>🛡️ Hacker: 2/lần</span></div></div></div><div class="ds-tabs"><button class="ds-tab on" data-tab="link">⚡ LINK</button><button class="ds-tab" data-tab="s3">🌟 SUPER</button><button class="ds-tab" data-tab="log">📋 LOG</button><button class="ds-tab" data-tab="admin" id="ds-ta" style="display:none">👑 ADMIN</button></div><div class="ds-pn on" id="ds-pn-link" style="padding:12px 14px;gap:10px"><div class="ds-bt"><span class="ds-lb">⚡ TẠO LINK FAMILY PLAN</span></div><div id="ds-lex"></div><button class="ds-b ds-bp ds-bf" id="ds-cr-btn" style="position:relative;overflow:hidden"><canvas class="ds-lcv" id="ds-lcv"></canvas>⚡ TẠO LINK</button><div class="ds-cd-txt" id="ds-cd-txt">⏳ Cooldown: 00:00</div><div class="ds-pw" id="ds-prog" style="display:none"><div class="ds-pf" id="ds-pf" style="width:0%"></div></div><div class="ds-log" id="ds-ll" style="max-height:350px">Sẵn sàng...</div></div><div class="ds-pn" id="ds-pn-s3" style="padding:12px 14px;gap:10px"><div class="ds-s3"><div class="ds-s3t">🌟 Kích hoạt Super (3⚡)</div><div class="ds-s3d">Super Duolingo miễn phí ~3 ngày. Cần đăng nhập.</div><button class="ds-b ds-bo ds-bf" id="ds-s3b">⚡ KÍCH HOẠT SUPER 3 NGÀY (3⚡)</button><div class="ds-pw" id="ds-ps3" style="display:none"><div class="ds-pf" id="ds-ps3f" style="width:0%"></div></div></div><div class="ds-log" id="ds-ls3">Nhấn nút để kích hoạt...</div></div><div class="ds-pn" id="ds-pn-log" style="padding:12px 14px;gap:10px"><div class="ds-bt"><div class="ds-lb">📋 LỊCH SỬ</div><button class="ds-b ds-bs ds-bg" id="ds-ca">📋 COPY ALL</button></div><div class="ds-bt"><button class="ds-b ds-bs ds-bo2" id="ds-lh">🔄 TẢI</button><button class="ds-b ds-bs ds-bd" id="ds-ch">🗑️ XÓA</button></div><div class="ds-log" id="ds-lh2" style="max-height:250px">Bấm 🔄 TẢI...</div></div><div class="ds-pn" id="ds-pn-admin"><div class="ds-ap"><div class="ds-at">👑 QUẢN LÝ VIP</div><div class="ds-sm" style="margin-bottom:8px;color:#ff4b4b;font-weight:700">🔑 API Key (Auto-Super backup):</div><div class="ds-rw"><div class="ds-iw"><input type="password" id="ds-admin-api" class="ds-in" placeholder="Nhập API key Auto-Super..." autocomplete="off"></div><button class="ds-b ds-bs ds-bg" id="ds-save-api">💾</button></div><div id="ds-api-st" class="ds-sm" style="margin:4px 0 12px;color:#ffc800">⚠️ Chưa có key</div><div class="ds-sm" style="margin-bottom:8px;color:#FFA500;font-weight:700">Nhập tên Duolingo → Tạo key VIP (4 ký tự):</div><div class="ds-rw"><div class="ds-iw"><input type="text" id="ds-vun" class="ds-in" placeholder="👤 Tên Duolingo..."></div><button class="ds-b ds-bs ds-bg" id="ds-avip">🔑 TẠO</button></div><div id="ds-gen-result"></div><div class="ds-dv" style="margin:8px 0"></div><div class="ds-lb" style="margin-bottom:6px">DANH SÁCH VIP</div><div class="ds-al" id="ds-vl"></div></div></div><div class="ds-ra"><button class="ds-b ds-bo2 ds-bs" id="ds-chk" style="flex:1">🔑 ĐỔI KEY</button><button class="ds-b ds-bd ds-bs" id="ds-rk" style="flex:1">🗑️ GỠ KEY</button></div></div><div id="ds-hacker-panel"><div class="dh-body"><div class="dh-user-bar"><span class="dh-user-name" id="dh-username">👤 Chưa đăng nhập</span><span class="ds-bdg ds-bdgf" id="dh-tier-badge">FREE</span></div><div class="dh-energy-wrap" id="dh-energy-wrap"><div class="dh-energy-h"><span class="dh-energy-label">⚡ NĂNG LƯỢNG</span><span class="dh-energy-val" id="dh-en-val">25/25</span></div><div class="dh-energy-bar"><div class="dh-energy-fill dh-efhi" id="dh-en-fill" style="width:100%"></div></div></div><div class="dh-stats"><div><div class="dh-stat-v" id="dh-xp-val">-</div><div class="dh-stat-l">⚡ XP</div></div><div><div class="dh-stat-v" id="dh-gem-val">-</div><div class="dh-stat-l">💎 Kim Cương</div></div><div><div class="dh-stat-v" id="dh-streak-val">-</div><div class="dh-stat-l">🔥 Streak</div></div></div><div class="dh-section"><div class="dh-section-t"><span>⚡ Farm XP (Story API ~499XP)</span><span class="dh-section-c" id="dh-xp-cost">⚡'+HACK_EN_COST+'/lần</span></div><div class="dh-row"><input type="number" class="dh-input" id="dh-xp-input" value="5000" min="100" max="99999"><button class="dh-btn dh-btn-go" id="dh-xp-btn">⚡ FARM XP</button></div><div class="dh-prog" id="dh-xp-prog"><div class="dh-fill" id="dh-xp-fill"></div></div></div><div class="dh-section"><div class="dh-section-t"><span>💎 Hack Kim Cương (Rewards)</span><span class="dh-section-c" id="dh-gem-cost">⚡'+HACK_EN_COST+'/lần</span></div><div class="dh-row"><input type="number" class="dh-input" id="dh-gem-input" value="10000" min="100" max="99999"><button class="dh-btn dh-btn-go" id="dh-gem-btn">💎 NHẬN KC</button></div><div class="dh-prog" id="dh-gem-prog"><div class="dh-fill" id="dh-gem-fill"></div></div></div><div class="dh-section"><div class="dh-section-t"><span>🔥 Hack Streak (Sessions)</span><span class="dh-section-c" id="dh-streak-cost">⚡'+HACK_EN_COST+'/ngày</span></div><div class="dh-row"><input type="number" class="dh-input" id="dh-streak-input" value="100" min="1" max="9999"><button class="dh-btn dh-btn-go" id="dh-streak-btn">🔥 TĂNG STREAK</button></div><div class="dh-prog" id="dh-streak-prog"><div class="dh-fill" id="dh-streak-fill"></div></div></div><div class="dh-log" id="ds-hlog">Sẵn sàng...</div><div class="dh-status" id="dh-status" style="background:rgba(0,255,100,.08);color:#00ff64">✅ Sẵn sàng</div></div><div class="dh-footer">🛡️ DuoHacker Methods v'+VER+'</div></div><div class="ds-dv"></div><div class="ds-ft"><span>v'+VER+'</span><a href="'+ZALO+'" target="_blank" rel="noopener" style="color:var(--go);text-decoration:none">Zalo Group</a></div></div></div><div id="ds-dob"><div class="db"><div class="dt">🔐 XÁC THỰC ADMIN</div><div class="dd">Nhập ngày sinh (ddMMyy)</div><input type="password" id="ds-di" placeholder="******" maxlength="6" autocomplete="off"><div id="ds-de">❌ Sai!</div><div style="display:flex;gap:8px;width:100%"><button class="ds-b ds-bs ds-bd" id="ds-dc" style="flex:1">HỦY</button><button class="ds-b ds-bs ds-bg" id="ds-dk" style="flex:1">OK</button></div></div></div>';document.body.appendChild(r)}
function bindEvents(){
$('ds-tog').onclick=function(){var c=$('ds-card'),s=$('ds-shell'),l=$('ds-togl');if(l.textContent==='ẨN'){s.style.bottom='-'+(c.scrollHeight-30)+'px';c.style.opacity='0';l.textContent='HIỆN'}else{s.style.bottom='16px';c.style.opacity='1';l.textContent='ẨN'}};
$('ds-sbtn').onclick=function(){$('ds-sm').classList.add('on');$('ds-so').classList.add('on')};
$('ds-csm').onclick=function(){$('ds-sm').classList.remove('on');$('ds-so').classList.remove('on')};
$('ds-so').onclick=function(){$('ds-sm').classList.remove('on');$('ds-so').classList.remove('on')};
$('ds-sws').onclick=function(){this.classList.toggle('on');_S('safe_m',this.classList.contains('on')?'1':'');_toast(this.classList.contains('on')?'🛡️ An toàn BẬT':'🛡️ An toàn TẮT','info',1500)};
$('ds-swr').onclick=function(){this.classList.toggle('on');$('ds-r').setAttribute('data-red',this.classList.contains('on')?'1':'');_S('red_m',this.classList.contains('on')?'1':'');_toast(this.classList.contains('on')?'🔴 ON':'🔴 OFF','info',1500)};
$('ds-fbtn').onclick=function(){doUnlock(FREE_KEY)};
$('ds-ubtn').onclick=function(){var k=$('ds-ki').value.trim();if(k)doUnlock(k)};
$('ds-ki').onkeydown=function(e){if(e.key==='Enter'){var k=this.value.trim();if(k)doUnlock(k)}};
document.querySelectorAll('.ds-tab').forEach(function(tab){tab.onclick=function(){document.querySelectorAll('.ds-tab').forEach(function(t){t.classList.remove('on')});tab.classList.add('on');document.querySelectorAll('.ds-pn').forEach(function(p){p.classList.remove('on')});var p=$('ds-pn-'+tab.dataset.tab);if(p)p.classList.add('on');if(tab.dataset.tab==='admin')renderVip()}});
$('ds-chk').onclick=function(){_sess=null;_tier=null;_isAdmin=false;_apiKey=null;_keyData=null;_showingHacker=true;if(_cdTimer){clearInterval(_cdTimer);_cdTimer=null}_cdRemain=0;_S('ds_key','');$('ds-main').style.display='none';$('ds-hacker-panel').style.display='none';$('ds-toggle-btn').style.display='none';$('ds-auth').style.display='';$('ds-ki').value='';$('ds-kb').style.display='none';$('ds-sbtn').style.display='none';$('ds-lex').innerHTML='';resetBtn();$('ds-hdt').innerHTML='Duolingo <span>Integration</span>'};
$('ds-rk').onclick=function(){if(confirm('Gỡ key?')){_S('ds_key','');location.reload()}};
$('ds-s3b').onclick=function(){_actS3()};
$('ds-mp').onclick=function(){if(_mPlay)_stopM();else _playM(_mIdx)};
$('ds-mr').onclick=function(){_playRnd()};
$('ds-ms').onclick=function(){_stopM()};
$('ds-cr-btn').onclick=function(){doCreate()};
$('ds-lh').onclick=function(){loadHist()};
$('ds-ca').onclick=function(){var h=_G('hist',[]);if(!h.length){_toast('Trống!','err');return}navigator.clipboard.writeText(h.join('\n')).then(function(){_toast('📋 Copy '+h.length+'!','ok')})};
$('ds-ch').onclick=function(){if(confirm('Xóa?')){_S('hist',[]);$('ds-lh2').textContent='Đã xóa.';_toast('🗑️ OK!','ok')}};
$('ds-avip').onclick=function(){addVip()};
$('ds-save-api').onclick=function(){var k=$('ds-admin-api').value.trim();if(!k){_toast('Nhập API key!','err');return}_S('admin_api_key',k);_apiKey=k;$('ds-admin-api').value='';$('ds-api-st').textContent='✅ Key đã lưu';$('ds-api-st').style.color='#58cc02';_toast('✅ Đã lưu API key!','ok')};
$('ds-dk').onclick=function(){var v=$('ds-di').value.trim();if(v===ADMIN_DOB){$('ds-dob').style.display='none';$('ds-di').value='';$('ds-de').style.display='none';_tier='ADMIN';_isAdmin=true;doUnlockAdmin()}else{$('ds-de').style.display='';$('ds-di').value='';_toast('❌ Sai!','err')}};
$('ds-di').onkeydown=function(e){if(e.key==='Enter')$('ds-dk').click()};
$('ds-dc').onclick=function(){$('ds-dob').style.display='none';$('ds-di').value='';$('ds-de').style.display='none';_sess=null};
$('ds-update-btn').onclick=function(e){e.stopPropagation();window.open(GF_SCRIPT_URL,'_blank')};
$('ds-upd-close').onclick=function(e){e.stopPropagation();$('ds-update-banner').style.display='none'};
$('ds-toggle-btn').onclick=function(){if(_showingHacker){_switchToSuper()}else{_switchToHacker()}};
$('dh-xp-btn').onclick=async function(){var btn=this;if(_hackRunning&&_hackTask==='xp'){_hackRunning=false;_hackTask=null;btn.textContent='⚡ FARM XP';btn.className='dh-btn dh-btn-go';_updStatus('⏹ Đã dừng','#ffc800');return}var amount=parseInt($('dh-xp-input').value)||5000;if(amount<100){_toast('⚠️ Tối thiểu 100 XP','err');return}if(!_isUnl()&&_getEn()<HACK_EN_COST){_toast('💤 Không đủ năng lượng!','err');return}_hackRunning=true;_hackTask='xp';btn.textContent='⏹ DỪNG';btn.className='dh-btn dh-btn-stop';_hackLogC();_hackLog('⚡ Farm XP qua Story API (~499XP/lần)...','i');_updHackProg('xp',0);_updStatus('⚡ Đang farm XP...','#FFCD00');try{var earned=await _hackXP(amount);if(earned>0){_hackLog('🎉 +'+earned+' XP!','o');_updStatus('✅ +'+earned+' XP!','#00ff64');_toast('🎉 +'+earned+' XP!','ok',3000);_updHackProg('xp',100);await _fetchDuoFull();_updHackStats();_updEn();_updHackerEn()}else{_hackLog('⚠️ Không farm được','w');_updStatus('⚠️ Không thành công','#ffc800')}}catch(e){_hackLog('❌ '+e.message,'e');_updStatus('❌ '+e.message,'#ff4b4b')}_hackRunning=false;_hackTask=null;btn.textContent='⚡ FARM XP';btn.className='dh-btn dh-btn-go'};
$('dh-gem-btn').onclick=async function(){var btn=this;if(_hackRunning&&_hackTask==='gem'){_hackRunning=false;_hackTask=null;btn.textContent='💎 NHẬN KC';btn.className='dh-btn dh-btn-go';_updStatus('⏹ Đã dừng','#ffc800');return}var amount=parseInt($('dh-gem-input').value)||10000;if(!_isUnl()&&_getEn()<HACK_EN_COST){_toast('💤 Không đủ năng lượng!','err');return}_hackRunning=true;_hackTask='gem';btn.textContent='⏹ DỪNG';btn.className='dh-btn dh-btn-stop';_hackLogC();_hackLog('💎 Hack KC qua Rewards exploit...','i');_updHackProg('gem',0);_updStatus('💎 Đang hack KC...','#FFCD00');try{var gained=await _hackGems(amount);if(gained>0){_hackLog('🎉 +'+gained+' KC!','o');_updStatus('✅ +'+gained+' KC!','#00ff64');_toast('🎉 +'+gained+' KC!','ok',3000);_updHackProg('gem',100);await _fetchDuoFull();_updHackStats();_updEn();_updHackerEn()}else{_hackLog('⚠️ Không nhận được KC','w');_updStatus('⚠️ Không thành công','#ffc800')}}catch(e){_hackLog('❌ '+e.message,'e');_updStatus('❌ '+e.message,'#ff4b4b')}_hackRunning=false;_hackTask=null;btn.textContent='💎 NHẬN KC';btn.className='dh-btn dh-btn-go'};
$('dh-streak-btn').onclick=async function(){var btn=this;if(_hackRunning&&_hackTask==='streak'){_hackRunning=false;_hackTask=null;btn.textContent='🔥 TĂNG STREAK';btn.className='dh-btn dh-btn-go';_updStatus('⏹ Đã dừng','#ffc800');return}var days=parseInt($('dh-streak-input').value)||100;if(days<1||days>9999){_toast('⚠️ 1-9999 ngày','err');return}if(!_isUnl()&&_getEn()<HACK_EN_COST){_toast('💤 Không đủ năng lượng!','err');return}_hackRunning=true;_hackTask='streak';btn.textContent='⏹ DỪNG';btn.className='dh-btn dh-btn-stop';_hackLogC();_hackLog('🔥 Streak qua Sessions (timezone-aware)...','i');_updHackProg('streak',0);_updStatus('🔥 Đang tăng Streak...','#FFCD00');try{var increased=await _hackStreak(days);if(increased>0){_hackLog('🎉 +'+increased+' Streak!','o');_updStatus('✅ +'+increased+' Streak!','#00ff64');_toast('🎉 +'+increased+' Streak!','ok',3000);_updHackProg('streak',100);await _fetchDuoFull();_updHackStats();_updEn();_updHackerEn()}else{_hackLog('⚠️ Không tăng được','w');_updStatus('⚠️ Không thành công','#ffc800')}}catch(e){_hackLog('❌ '+e.message,'e');_updStatus('❌ '+e.message,'#ff4b4b')}_hackRunning=false;_hackTask=null;btn.textContent='🔥 TĂNG STREAK';btn.className='dh-btn dh-btn-go'};
}
async function doUnlock(key){if(!key)return;key=key.trim();if(key===ADMIN_PW){$('ds-dob').style.display='flex';setTimeout(function(){$('ds-di').focus()},100);return}var tier=null;if(key===FREE_KEY)tier='FREE';else if(_findVip(key))tier='VIP';if(!tier){_toast('❌ Key không hợp lệ!','err');return}_toast('⏳ Kết nối...','info',1000);var r=await _gmGet(API+'/api/key/info?key='+encodeURIComponent(FREE_KEY));if(r.data&&r.data.ok){_sess={key:key};_tier=tier;_isAdmin=false;_S('ds_key',key);afterUnlock(key,tier)}else{_sess=null;_toast('❌ Lỗi kết nối API','err')}}
async function doUnlockAdmin(){var savedApi=_G('admin_api_key','');if(savedApi)_apiKey=savedApi;_toast('⏳ Kết nối API...','info',1000);var r=await _gmGet(API+'/api/key/info?key='+encodeURIComponent(FREE_KEY));if(r.data&&r.data.ok){_sess={key:ADMIN_PW};if(savedApi)_apiKey=savedApi;_S('ds_key',ADMIN_PW);afterUnlock(ADMIN_PW,'ADMIN')}else{_sess=null;_toast('❌ Lỗi kết nối API','err')}}
function afterUnlock(key,tier){var kb=$('ds-kb');if(tier==='ADMIN'){kb.textContent='ADMIN';kb.className='ds-bdg ds-bdga'}else if(tier==='FREE'){kb.textContent='FREE';kb.className='ds-bdg ds-bdgf'}else{kb.textContent='VIP';kb.className='ds-bdg ds-bdgv'}kb.style.display='';$('ds-sbtn').style.display=(tier==='VIP'||tier==='ADMIN')?'':'none';$('ds-toggle-btn').style.display='';$('ds-ta').style.display=(tier==='ADMIN')?'':'none';var mp=document.querySelector('.ds-mp2');if(mp)mp.style.display=tier==='FREE'?'none':'';$('ds-auth').style.display='none';_showingHacker=true;$('ds-main').style.display='none';$('ds-hacker-panel').style.display='flex';$('ds-hdt').innerHTML='Duolingo <span>Hacker</span>';var tBtn=$('ds-toggle-btn');tBtn.textContent='⚡ Get Super';tBtn.className='ds-toggle-btn to-super';var tb=$('ds-tbdg');if(tier==='ADMIN'){tb.textContent='ADMIN';tb.className='ds-bdg ds-bdga'}else if(tier==='VIP'){tb.textContent='VIP';tb.className='ds-bdg ds-bdgv'}else{tb.textContent='FREE';tb.className='ds-bdg ds-bdgf'}var u=_duoUser||'Chưa đăng nhập';$('ds-ub').textContent='👤 '+u;$('ds-ub').style.display='';$('ds-aun').textContent=u;$('ds-aun2').textContent=u;$('ds-mun').textContent=u;$('ds-aib').style.display=_duoUser?'':'none';_updEn();var td=$('ds-tdis');if(tier==='ADMIN'){td.textContent='ADMIN ♾️';td.className='tv ta'}else if(tier==='VIP'){td.textContent='VIP ♾️';td.className='tv tvv'}else{td.textContent='FREE';td.className='tv tf'}$('ds-lex').innerHTML='';resetBtn();if(_isAdmin){var as=$('ds-api-st');if(as){if(_G('admin_api_key','')){as.textContent='✅ Key đã lưu';as.style.color='#58cc02'}else{as.textContent='⚠️ Chưa có key';as.style.color='#ffc800'}}}_updHackerUser();_updHackerEn();_updStatus('⏳ Đang tải...','#FFCD00');_fetchDuoFull().then(function(){_updHackStats();_updHackerUser();_updStatus('✅ Sẵn sàng','#00ff64')});if(_isUnl()){$('dh-xp-cost').textContent='♾️ Miễn phí';$('dh-gem-cost').textContent='♾️ Miễn phí';$('dh-streak-cost').textContent='♾️ Miễn phí'}else{$('dh-xp-cost').textContent='⚡'+HACK_EN_COST+'/lần';$('dh-gem-cost').textContent='⚡'+HACK_EN_COST+'/lần';$('dh-streak-cost').textContent='⚡'+HACK_EN_COST+'/ngày'}var m='✅ Xin chào';if(_duoUser)m+=' '+_duoUser;m+=' ['+tier+']';if(tier==='FREE')m+=' | ⚡ '+_getEn()+'/'+MAX_EN;_toast(m,'ok',3000)}
/* ════════════════════════════════════════════════════════════════
CREATE LINK v5 — CHỈ LOG RAW RESPONSE
════════════════════════════════════════════════════════════════ */
async function doCreate(){
if(_creating)return;
if(!_canEn(COST_LINK)){_toast('💤 Hết năng lượng!','err');return}
if(_cdRemain>0){_toast('⏳ Chờ cooldown '+_fmtCD(_cdRemain),'warn');return}
var j=_getJwt(),u=_getUid();
if(!j||!u){_toast('❌ Đăng nhập Duolingo trước!','err');return}
var btn=$('ds-cr-btn'),prog=$('ds-prog'),fill=$('ds-pf');
_creating=true;btn.classList.add('busy');btn.disabled=true;_startCv();
prog.style.display='';fill.style.transition='none';fill.style.width='10%';
_logC('ds-ll');
var h=_duoH(j);
var DUO='https://www.duolingo.com';
var linkFound=null;
var L=function(m,tp){_log('ds-ll',m,tp||'i')};
L('═══ RAW RESPONSE CHECK ═══','i');
L('UID: '+u,'i');
L('','i');
try{
/* ── BƯỚC 1: Get subscriptions (confirm) ── */
L('━━━ SUBS ━━━','w');
var subR=await _gmGet(DUO+'/2017-06-30/users/'+u+'/subscriptions',h);
L('GET /subscriptions → HTTP '+subR.status,'i');
L('Raw length: '+(subR.raw?subR.raw.length:0),'i');
if(subR.raw)L('Raw (first 300): '+subR.raw.substring(0,300),'o');
fill.style.width='20%';
/* ── BƯỚC 2: Get invites (the key one) ── */
L('','i');
L('━━━ INVITES RAW ━━━','w');
var invR=await _gmGet(DUO+'/2017-06-30/users/'+u+'/family-plan/invites',h);
L('GET /invites → HTTP '+invR.status,'i');
L('Data type: '+(typeof invR.data),'i');
L('Data is null: '+(invR.data===null),'i');
L('Raw type: '+(typeof invR.raw),'i');
L('Raw length: '+(invR.raw?String(invR.raw).length:0),'i');
if(invR.raw&&String(invR.raw).length>0){
var rawStr=String(invR.raw);
L('','i');
L('━━━ RAW CONTENT ━━━','w');
/* Hiển thị raw response đầy đủ (tối đa 800 ký tự) */
var chunks=Math.ceil(rawStr.length/200);
for(var ci=0;ci<Math.min(chunks,4);ci++){
var start=ci*200;
var end=Math.min(start+200,rawStr.length);
L('['+start+'-'+end+'] '+rawStr.substring(start,end),'o');
}
if(rawStr.length>800)L('... ('+rawStr.length+' chars total)','i');
/* ── Parse attempts ── */
L('','i');
L('━━━ PARSE ATTEMPTS ━━━','w');
/* Try JSON parse */
var parsed=null;
try{parsed=JSON.parse(rawStr);L('JSON parse: OK','o')}catch(e){L('JSON parse: FAIL - '+e.message,'w')}
if(parsed&&typeof parsed==='object'){
var keys=Object.keys(parsed);
L('Keys: '+keys.join(', '),'o');
keys.forEach(function(k){
var v=parsed[k];
var t=Array.isArray(v)?'array['+v.length+']':typeof v;
var s=t==='string'?v.substring(0,80):t==='object'?JSON.stringify(v).substring(0,80):String(v).substring(0,80);
L(' '+k+' ('+t+'): '+s,'o');
});
/* Deep search for URLs */
var fullJson=JSON.stringify(parsed);
var urls=fullJson.match(/https?:\/\/[^\s"'\\]+/gi)||[];
if(urls.length>0){
L('','i');
L('URLs found: '+urls.length,'o');
urls.forEach(function(url,i){
L(' '+(i+1)+'. '+url,'o');
if(url.indexOf('invite')!==-1||url.indexOf('family')!==-1){
linkFound=url;
L(' ^^ INVITE URL!','o');
}
});
}
}else if(typeof parsed==='string'){
L('Parsed as string: '+parsed.substring(0,200),'o');
}
/* Regex on raw */
var inviteUrls=rawStr.match(/https?:\/\/[^\s"'\\]*invite[^\s"'\\]*/gi)||[];
if(inviteUrls.length>0&&!linkFound){
linkFound=inviteUrls[0];
L('Regex invite URL: '+linkFound,'o');
}
/* Check if raw is just empty array/object */
if(rawStr==='[]'||rawStr==='{}'||rawStr==='null'||rawStr==='""'){
L('','i');
L('⚠️ Response is EMPTY: '+rawStr,'w');
L('User is FP member but no invites exist','w');
}
}else{
L('⚠️ RAW IS EMPTY/NULL','w');
L('','i');
L('GET /invites returned 200 but empty body.','w');
L('User might be FP member without','w');
L('permission to view invites.','w');
}
fill.style.width='60%';
/* ── BƯỚC 3: Try POST endpoints ── */
if(!linkFound){
L('','i');
L('━━━ POST ENDPOINTS ━━━','w');
var postTests=[
{url:DUO+'/2017-06-30/users/'+u+'/family-plan/members/invite',body:{},desc:'members/invite {}'},
{url:DUO+'/2017-06-30/users/'+u+'/family-plan/members/invite',body:{email:'[email protected]'},desc:'members/invite email'},
{url:DUO+'/2017-06-30/users/'+u+'/family-plan/members/invite',body:null,desc:'members/invite null'},
];
for(var pi=0;pi<postTests.length;pi++){
var pt=postTests[pi];
var pr=await _gmPost(pt.url,pt.body,h);
L('POST '+pt.desc+' → HTTP '+pr.status,'i');
if(pr.raw)L(' Raw: '+String(pr.raw).substring(0,120),'o');
if(pr.status===200||pr.status===201){
var rawP=String(pr.raw||'');
var urls2=rawP.match(/https?:\/\/[^\s"'\\]+/gi)||[];
urls2.forEach(function(url){
if(url.indexOf('invite')!==-1){linkFound=url;L(' INVITE URL: '+url,'o')}
});
}
await _sleep(100);
}
}
fill.style.transition='width .3s ease';fill.style.width='100%';
setTimeout(function(){prog.style.display='none';fill.style.transition='none';fill.style.width='0%'},500);
/* ── KẾT QUẢ ── */
L('','i');
L('═══ RESULT ═══','w');
if(linkFound&&typeof linkFound==='string'&&linkFound.length>10){
if(!_isUnl())_useEn(COST_LINK);
if(linkFound.indexOf('http')!==0)linkFound='https://www.duolingo.com/family-plan/invite/'+linkFound;
L('🎉 LINK: '+linkFound,'o');
var le=$('ds-ll');
var s=document.createElement('span');s.className='lo ds-le';s.textContent='🔗 '+linkFound;
var c=document.createElement('span');c.className='ds-ct';c.textContent='copy';
c.onclick=function(e){e.stopPropagation();navigator.clipboard.writeText(linkFound).catch(function(){});c.textContent='✓';c.classList.add('ok');setTimeout(function(){c.textContent='copy';c.classList.remove('ok')},1400)};
le.appendChild(s);le.appendChild(c);le.appendChild(document.createTextNode('\n'));
var hist=_G('hist',[]);hist.unshift(linkFound);_S('hist',hist);
_updEn();_toast('🎉 Link!','ok',4000);
}else{
L('','i');
L('📋 PHÂN TÍCH CUỐI CÙNG:','w');
L('','i');
L('GET /subscriptions → 200 (81 users)','o');
L('GET /invites → 200 (empty/null body)','o');
L('POST /members/invite → 400','o');
L('','i');
L('CẬU LÀ MEMBER (không phải owner).','w');
L('','i');
L('81 users kia là ACE trong Family Plan','w');
L('mà CẬU ĐANG ĐƯỢC NHẬN SUPER từ đó.','w');
L('','i');
L('👉 CHỈ OWNER mới tạo được invite link.','w');
L('👉 Cậu cần liên hệ OWNER của Family Plan','w');
L(' để họ tạo link mới cho cậu.','w');
L('','i');
L('Hoặc: Mua Family Plan riêng ($120/năm)','w');
L(' → cậu thành owner → tạo link được.','w');
_toast('❌ Không có invite link (cậu là member)','err',5000);
}
}catch(e){
L('❌ Exception: '+e.message,'e');
_toast('❌ '+e.message,'err');
}finally{
_creating=false;resetBtn();
}
}
function resetBtn(){_creating=false;var b=$('ds-cr-btn');if(b){b.classList.remove('busy');b.disabled=false;b.textContent='⚡ TẠO LINK'}_stopCv()}
function loadHist(){var le=$('ds-lh2');le.textContent='';var h=_G('hist',[]);if(!h.length){_log('ds-lh2','📭 Chưa có link.','w');_toast('Chưa có!','warn');return}_log('ds-lh2','📋 '+h.length+' link','i');_log('ds-lh2','─────────────────','i');h.forEach(function(u,i){var s=document.createElement('span');s.className='lo ds-le';s.textContent='#'+String(i+1).padStart(3,'0')+' '+u;s.style.animationDelay=(i*.035)+'s';var c=document.createElement('span');c.className='ds-ct';c.textContent='copy';c.onclick=function(e){e.stopPropagation();navigator.clipboard.writeText(u).catch(function(){});c.textContent='✓';c.classList.add('ok');setTimeout(function(){c.textContent='copy';c.classList.remove('ok')},1400)};le.appendChild(s);le.appendChild(c);le.appendChild(document.createTextNode('\n'))});_toast('✅ '+h.length+' link!','ok')}
function addVip(){var n=$('ds-vun').value.trim();if(!n){_toast('Nhập tên Duolingo!','err');return}var v=_G('vip_users',[]);var ex=v.find(function(u){return u.username.toLowerCase()===n.toLowerCase()});if(ex){$('ds-gen-result').innerHTML='<div class="ds-ss ds-sser">❌ <strong>'+n+'</strong> đã có key: <strong>'+ex.key+'</strong></div>';_toast('❌ Đã có key!','err',3000);return}var key=_genKey();v.push({key:key,username:n,ts:new Date().toISOString()});_S('vip_users',v);$('ds-vun').value='';$('ds-gen-result').innerHTML='<div class="ds-le2"><div class="ds-le2t">✅ Key VIP cho <strong>'+n+'</strong>:</div><div class="ds-gr" id="ds-gen-key">'+key+'</div><div style="text-align:center"><span class="ds-ct" id="ds-copy-gen" style="font-size:12px;padding:3px 12px">📋 Copy key</span></div></div>';$('ds-copy-gen').onclick=function(){navigator.clipboard.writeText(key).catch(function(){});this.textContent='✓ Copied!';this.classList.add('ok');var self=this;setTimeout(function(){self.textContent='📋 Copy key';self.classList.remove('ok')},1500)};renderVip();_toast('✅ Tạo key cho '+n+'!','ok',3000)}
function renderVip(){var list=$('ds-vl');if(!list)return;list.innerHTML='';var v=_G('vip_users',[]);if(!v.length){list.innerHTML='<div style="text-align:center;padding:20px;color:var(--mu);font-size:12px">Chưa có VIP.</div>';return}v.forEach(function(u,i){var c=document.createElement('div');c.className='ds-uc';c.innerHTML='<div style="min-width:0;flex:1"><div class="ds-un">👤 '+u.username+'</div><div class="ds-uk">🔑 '+u.key+'</div></div><div class="ds-vb">VIP</div><button class="ds-rv">GỠ</button>';c.querySelector('.ds-rv').onclick=function(){if(confirm('Gỡ '+u.username+'?')){v.splice(i,1);_S('vip_users',v);renderVip();_toast('🗑️ OK!','ok')}};list.appendChild(c)})}
function _updEn(){var v=$('ds-env'),f=$('ds-enf');if(!v||!f)return;if(_isUnl()){v.textContent='♾️ VIP';v.style.color='#FFD700';f.style.width='100%';f.className='ds-ef ds-eful'}else{var e=_getEn(),p=Math.round(e/MAX_EN*100);v.textContent=e+'/'+MAX_EN;v.style.color='';f.style.width=p+'%';f.className='ds-ef '+(p>50?'ds-efhi':p>20?'ds-efmd':'ds-eflo')}}
async function init(){createUI();bindEvents();$('ds-r').setAttribute('data-red',_G('red_m','')?'1':'');await _fetchDuoUser();var u=_duoUser||'Chưa đăng nhập';$('ds-ub').textContent='👤 '+u;$('ds-aun').textContent=u;$('ds-aun2').textContent=u;$('ds-mun').textContent=u;$('ds-aib').style.display=_duoUser?'':'none';var sk=_G('ds_key','');if(sk){if(sk===FREE_KEY||sk===ADMIN_PW||_findVip(sk)){$('ds-ki').value=sk;doUnlock(sk)}else{_S('ds_key','')}}if(_G('admin_api_key','')){var as=$('ds-api-st');if(as){as.textContent='✅ Key đã lưu';as.style.color='#58cc02'}}_toast('🚀 v'+VER+' RAW CHECK','info',2000);setTimeout(_checkVersion,2000)}
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init);else init();
})();