From 41d3763b5717519b39399512bda66182c54c69b6 Mon Sep 17 00:00:00 2001 From: eson <474420502@qq.com> Date: Mon, 27 Jul 2020 00:35:41 +0800 Subject: [PATCH] TODO: finish extractor data --- crx/0.1.2_0.crx | Bin 0 -> 26871 bytes crx/0.1.2_0.pem | 28 ++++ sql/remake_database.sh | 10 ++ store.go | 3 +- tasks/twitch/twitch_task1/task_twitch.go | 2 +- tasks/twitch/twitch_task2/task_twitch.go | 160 +++++++++++++---------- utils.go | 9 +- 7 files changed, 142 insertions(+), 70 deletions(-) create mode 100644 crx/0.1.2_0.crx create mode 100644 crx/0.1.2_0.pem create mode 100644 sql/remake_database.sh diff --git a/crx/0.1.2_0.crx b/crx/0.1.2_0.crx new file mode 100644 index 0000000000000000000000000000000000000000..54ac5ce1ccac8a5f21ed789eacd2a182647ecdf0 GIT binary patch literal 26871 zcma&N18}8Xvo^eA+nLz5?TKyMn%K4`wr$%J+fF9Q#J2h8dEWD#I`8wH_p5)^?!Bt+ z>U-7RtGlo6)!j?jfr$kK004*r0|3aCpwPv@3;{qy3~=C3R3YLak8nUhKwton03Zaw z*K=s#03aYhE1W+O?Bmt^CZ*N4%8s5w{yFbo`H!zXZajNtOnzp$c|ffK`0j?Qe2b4; zqbI*t>%+AsYv+O^%pkfH96U2Zos@EPvbRnGfF=)EPIa?_dy%7c4}S{owIlv90jdEr z%N44Vr~(D~wxty3`Izd9_s6!p2iigOP^}DDXcLHqW~WBpLKT3@&{rdak%WJ8e=cKUs?gM`Rt%SwZPAfbvsWE?t&;<5+8Xm zF^tzOxWFJl03c*P;QAHADwm^o+1e#NagLvIV4&tw9nqPfNJ|w>N*{Be-t!A+=@ci;>mLn+JZ2RE4p;@0?@bbJY>i`YYmSGDRSy3quB9Lge|ZSO z?feV*H*34jnj}gyb5<{TT)GPqzn7~URpwIJbQVg!vQEE>Zt8t?sSFKN)KMe@sfcVs z(}boRKb}Re!?68FMPI8=z{{zofHF=a?Rvgc)19lmW06a~j~3e!XMXW6qL8!z`rW%rlQ%xczVFJFG*z7!y5~zt z0<$=nDJt#_p;{Z(rwHxcHOk4cJ{ZP5gBCPvlufGniv$(^hupz@{E|4kx)9J}BX)&m zL4C3A@d2dL{4@jWJFpV_6od0F@O){G0rowtl7Oz=)GL}u&?-=)&;fV^+UV`mG?~;u zjI$J#f2qA;NBnJ*6K2R%L_cKFZ2h$vZHn?&L))QIS&6;R^Z4et##RT=}?A3+UcV3P)D3DKc3Gn0&y zs3csZRCzEe?#8fift(v+T7%<|1$^1Q{zOQax)>9s*}N+tZ91%~RvJa-8+xqklql8~ z*{Ouz19ciK?{8H56Qepl=IIEyw|P1r$4NVzAWq_p!sC`2e3(t0`hg%0%Nr_M+rQ3$ z8EgX~Knm}hms5;Tf}kEn?kQI`mn!-YSQ-WPhC3M>&PPEn&uQsgTN3`DvR=N@1079s z9TeC;7pz92Up`Ft)`B~=qCsH#qcJ`^b>=v0i9Hv=aWOajUe1y3OuJW?5!qVT?eAPZ z?DDTx%Q^Hh&P$r*;BG z2d>Z2MrkvhIlO^P9zvmFZL2|Dna&7#Rhcf~z#djr=tP$M+IXly)ML~w&B&y-B{AsUs^ z(<8&7b8;||3$lat@Z0YM2`*!~UlKv9*b1TY-+Kq$kI#=MaFiK(yyw-0!a94JsY1T#b;xZlS?ku0WKqJ~p{{OLUI3e(GD*BC#byEzRJ>Bgzky~ey1 zN(56cc9+sFJfL=3+1o?M^`?4{>7nJ`!K)=4NEez>F0RNc> z?2E_Pz{%j>m{5XW4#JcIkP=6A%U4D@1n2LJ>5WkM)9KS4@7DWRO*C@41nlk-0(y<33V;)H#&Pd8UF|(K4nMKlaMa6-?yV&;ndfRf9HcXPn;7+uxK(J319RN?ywc|n8P z1V_fh#l+Fs*OM?*xUwi!%CroYKYKTZ3%X3ZqR3fFQ)^(@?+B~&SY?|(%cvYg*;Ho7 z5J78>8APh)afsP1F$$aJDVls86D$365|?BPlno{n>X}^>G`XYa;F!(I;#Y&;Bg~eH zxSkF5>XVaU=65XCY6lMn1mn&Xzk?@jfQ>%^9MQ8xYrKgPo1ZziGf<*qy1Q&rkY=-L}yGQv+;l>}*z?+iTjHi%7l?OjPS`?)$RZ zvYI8TWcFcF`h;fkNIdi2^U?kbbRInLUS3F1P($T}aC~uQa5M?>)jDk-!WKh&;PgAM zSc?Z{Subg;VZh+%Q1o8F9v3cJkP;D8H?JHBp`ZzMDlU++Bk+S)L9gKwb&%>QVZNJn zyI0h9(^@`MBvY_RJ5MTL9K?9v@1%*6qe5JXqu0X*`a(aM`>$CR@>G0RAY(A0l35Ub zs_}jY6)$0r5~I_kjMx~ol_WZaG@3e_C(9DMgN1b^t+Y-`IWW5nyF;1vD6O(iNfjjL z6r0*@L>i*Uw#{;qdctG)2bZVl8-%a*IfWD3wa=2<9%=#+n& zg}vwPaXY+?>rj@!@Skh!gPqq=@z_G{wgk$l-=ZsJU=9|2(wOyNt0~4!{P_wdMUa)E zhm8~A7*Gr8JUZKTYSd2AHX+Pw`}S#H%nQBWyZ_YF>AC3NLK9^CN_)MYd5>>WNz?oR zCS$&;pp;)OFr8HqvlUlfv=;rMW_*ZcURg4ZT6z*eB7nvZJUtoBKZQD+MkpI@unTS{ zocVK8P{HS^RM&A{YQeJ_5BN4eqg>4VrX63dUMcZ4OVS)+f^BjWKgR3MUNLDDMW$;s z2R>K<@^rkAfTkrj{GeEh;*ObQGUwOtoA2(qok{T4etb4;$sgLc&DCwOSSW;q~~blU}5j{f7##{+keCPU*`HZR9k$#M)wHZBk_vioAH`6BEu`WxN<1p|f#MpkAHcFwlObmmSr)(r|y*RJs4u=Xk= z6r+=MyZiP2bI{OiSY_dqE^KXOq~Xw`SmC0BWu(oLMWhz(=#nmMFZvR-^@VSVk_<2- zbh30~G!zOHbdt>~bMy0ZQ`1u8(#zvi;KzO=21;p}3W+%x5oHr%_?B!lTwxXe@KjNH zGo)HyZp;H70QhUm{>RV!7ifJU(WIJ`-8u(iH^hjqzPotoLR{8>6)J1zVE($W-@}~E zqarF8?JS#C+CqF{G{L>^Wt2FtO^ZK5$2ZV8k*UZnFXn#hRzjZX(I}pa;zP4TvnwRK zpgKirb!}9tA5UXMH|9aqQADF-M@?Zed6_|nimk5NqrtT?qDfS1LQ>SR6VHm7hUIhb zim8?Lhfg@dMO+vW-PWt1SPb9J{1c;5h+9$4;`-3T`nG`ba0b|c`LZYn=+>T@$H5Gy zQMX1&UDpP*80Fx?uxj0W#9kCM|L{?jRqkp$T)%5A@sVeqbLQ2sF+)$IC;Ghi@$MO_ zDvvqMfSF*(Ahgb(Y(_@199X=lYLX{1R4SkmPH8$%q7Brej}aF7hFj0Zv-P2;Rj5Gz zntvVS0DS=JBWYNTk}sM}H)|x78Br})wnGX*K+K`TInB&RA~6Oz8;f2M*HItI2&?$n z1Ja-EpCD9ZNSGu(Iyi_F2OmG*9jc7s4&4Th(8SD;XdxyiX8SfR8haXUL36?-?@EI()`l~w7;ALsovI>1@VApO zakYfUwFT}glZ&oKzKeJyBxR*3&>;q$p>VKdC5clD4s~o)5(oK&0~S ziq{zHbTO$4uo4jRhO2>W!`{(K?IQGm7IYpLFP`)pO7M<9KGYeZkx|vA{kg1zz*ovj z@7ua$S)oOobp*ypFp`cw23f9kC?j+YfzH4egjHB_9)+XHpQ@`53c?*)@`HfjhK@=r ztt5L&VFs^Amwcux{6khf@&jSok@$mh8=8dxJ)T0$dQusR)sbXHorbvyS ze_Ovj)sbi*+EmdP?zt?nFBZl7@Jef^J;!;|{Bmk*(JVuwg zf)RkoJT2eCZFqP(4NM0a@=y1|`>r0*il@P+RKy?BJ!7ByYNeihtw;2mo&(+I8raM} zp4wrZ4&gsyhucLYduMQRs+Gjc{UtVSG8UZ}h6KZ<(O4eXHBy*b%k6<)pFsbP-xfJ< zoEm?D(H9Woeu2^70Q(R8wy?D{G5YIt8>}khxXy;i`@IMF7a=fhnq-Zsid_0=9&_}3 z8F$x6IxJ{4Nz`*5aIST9{^zES-%hABH-r|!6`sqZL0x1Qi#6%u?ogsiTs? z3K$9!cMRq_ao;|-Hdi+Co2r)50b)kEJ+|-o4z)TpJK{LYyOI_JSn3oR_(w%=J7t4> zp?=@xmcFZr0in9SwGKAfNUUrc-N=S}Fk_b~FgZGxPCWv?z1NCho9SWMv)9zqD$Y+$ zUHzql-7KedKbwLsm;HNq-a{S5oaDgu3~YO@J-gJON9?;;u)%xd?q~N{-=$&CGYmq{3Rp9%v_?tM%c5A<@M^Pa77bgI1WXGX?6^O#RfaE zvu2v*RH1!?-|Y36a{pY0@+KR9e~LYQtLw-F%S0X`kLM)i7KphIkJ2Q0UYb3q6a>>pOE#?m*=0R3ZV zlQyb3sgq)!tBu*7;(K=m&dj~XoTw(BLT}FLs3&qiN^xar{lp|=Pa|1-+u7g_9A}EG4R6~$qBQJuZqU{WG36o%vRyL%02b=EWgmJU4Y8=qNENcG zA{bc=T$NrULPuPzu_Ukth(J>qH$y#Ya*1fWd#4hLz5965=uK8V#wCAxMH`6NE=fTk z%f=hVUpacKSi&)a9-&ifT(H_X(rZ?cKAMLGf;RxGycCI&lc(COjg3(pgoX-Zj;+G( ziOVCp`7MpG%0vr#+yI#S^63wC40ZBPf3wiuYYvN)X{w>JW)2noB`CWHI`py_(5VzV^S#&yseOaoWhdO3&!%j7)x0tPSpLsG#Z#9gK>01+{rw+MV zL4ENqc&F&HdfcFwB)WyI3qkYNN8Hl*LESY$YxNWN4mLN-{)?9)y4GcY9x|7+{p$SB z_&sD>#tQq}8LRH!tX;viy7Na(JgNFb44_e~138X!f84{jOi#RGk4?NXjtPY~2u|1c z{IKp;Pv1~Vcug~5XS~ZhCv|7E^r!Z1Q!MuBZ_l3BZ0lTkMtQZDN7?qYJPW%{uF8v2 z*^cZ`;~|7V@*1@Ve(-EC^O>Y!>O~h6w`Xe9`8O&O1of@q*FD><{KixP zXSlaY$hW;waL{<7X_cG8>gvlT3=t9j!7V2Cf3fdmjQ;5R0=%v-Li%@h77jXlTQi_8P@&gwdD-u9 z(AZyxL;#$GxQOD{%{XYQWE-003x^govQBx&L{Zjk%Tz=J4lqmxN`5kc?e} zVMWXi8CTOWO_^e%3L@Ep0g9G^lM*UB=8paegy6uK6M-sHNj@6*VwKN`lqiPC57}m- zb|)*LUkFrSvyyrA7T>pQ*FEw0Q!@rM5=B(En>V*l~rU04eJtBJe$E0Awj)FSU_`UM?6eF22St!mbSKfR4XSZ=$xIL z+^DFiE&$t9s#tz}m`-?rF!QauyE_KI#|YLVfZx>A6uLzG6mTh>Y8==_Krny=5Nq-* zVI6aejWnsDunhp1b}!-i!ZL2=mJ53x94?=#sKoh?hJl&9VAXbgv+1QrC{)C6p`+Ol z?o}vknC`Wpmb`7|>L}IH^L?DzGY%YhyII_l0A$Rf!GgbwIK_s6_y4(S@qj{7kciLy z-QN0iLfp_G2WaIp(?z^prja;gJ*bJIfCdHD3P0lT8&1Hql&smqt3DLrS|KQPiAihCS2P7(F8b3i0qV?P>!^CIC&pc$ma|4{^l@1R-YN0l0(h z&A=xbOoKiVuyR%ODVYr)Qjys(03aR}4cFM&t{kdN=wZ!iajY6bs{s9*a0YyS71i<= zGvEt$Vl5|(`h-6xC*K4cWAQe*=jI%;6f~$wNu(hUL`l~`Oy3WjIZ2P*3+h!RM`Ta< zl@jseXvh1Fe0(#IetqqoAdv^YUmV;dxV-fFzR|+DPhvQq3_@0b`PEIe&VBHnVVyb^ zaySn7HiUg$?@heP*RgD?x*`Mk>Q%4UE#u4{mRwWIj*SQ>T8w_Yegk|P((l>J%7!0= z%Te|)&k=7LVq_C0dVnYW>NV%x{q-S2=q68IJW{NH+*qSKI8E+PPL=~4h0d2r9#)j= z@@OgDVgugATu^3O_O9QO?_Txf8k_l2t*zG6<-Sv(rsH5^a}h|)*%FO;m!twqI)OXb z!`ZFg%zf9r1b|>T9CQJ)i4UeNY|i0`Bl`Yafr%<;raof<4#SQ>V|}tA!2?SGcPr=K zbf6@UGIBYqb)9dBe(U${;Iiz)yRVUp6+LmZTF$kIuutGtR^B3sSG05w=h+#KYF2A- zB6p!^T^;}wwkLB)Q(M{A-;+=+-vHRl_67Dm(^3aA)|Z=I zO>`+0-ys!1a?``8Zb#Bg3VaQh!j7a#ke`2vahr@KQYsDM_yP}7M~7DFcu#%752?(_V=0G`0tk^+ANUb)4OO#lE~{4cqlqP9d&Y=7#Mx1pEZXj1`ziWVTaNaZcO1?6Gw2v4--SKJ1W^ ze1`GUF2J79PD)96G!_*NHZ@qzJ^B0#Gwnqc@bnLqsk6i>b3(#@fdG(rb(NHup?V*e z?#ctLfUZ2c=t0z>1W4;`Oi4hQF?x3ZkN^r=S{aBdq;`{m^N__fC?|Mzg~T|(ix#ad zQc9Y84q|?F4&r(hx*CvQ*oy|Ob-dI-=f~>7!7f5`V-%vuPkxQc{dEV1^|+ z2vPL}J0L8bxk#Jw^-N>-r#qRS^~R2e)B1$F;GXaM-LW@TdNZK+H*dGdfa$v%PqsEd zCWGCs8`KG1P*fpa060W{94^3LKroy{zUo0ya&V{2ohBPv4d;g$(b!U!^#it#*^ zlk>ZO+Z9GMjnn0FQ?p>r#KdGb^%=z!Z)=_VnpdrXjWVfxg^F1suEUpXJyf>@gA8&Vl zKK*rOztrWukbcLGG~Y@4Hd8FD&gsK%q($0;6DZMl!xtvC-b2AK-+?wt8iIq1dCf@9 zyL2yM6vwszBs^}W=mKT{7MTWW06*MMkxmZ~MqkE-KGM7lx4P!*CiuX5HgR?kOCwG>1pLxY+Ok=c9o&t{pd1cr42?=@yUr%nUVIUkFV zFfBxF`&L07FkF>v=2DJPB&3IccVNFd?Uc?y1?~aJzn0Wm1~$y@ad@1EtRLGdv@>pmjHk(#;dALfnIL0hTaID z^>>rrnI_>-T|h4XOH3IhUACEsG~_iSk`3b=8x|`7U{6K5&k9w!w4Uldnimi-jJ$aB z`VQwW(Az(e0Q8om@3^k!&(TKRP+tw0*#ash5xEkVkPx(swjC&z$!MmEU;^*$01$aw zBvgK->7KL{&{a!{XhoLG7%+8wbDo!$hRV#2D5Q^KUVtF;Ut0tA2nE$d$@BqjFUAimQ3 z_}G?6GZ7_x4}iIG&gr~%1If{FFp-8E&c)$!wi4Xl-ri)}(vh9E9)8pji9uh@<9=g2 zY*RbDJBlHM!@`fQWDk9-R+G)U9$RhU2)J`n)J|8^c~4G~-R(iNXi;1sKqdD0;qKxh z<$K^fFPx{e8aLtwK+(TBc@--K4{}$!=!2V1A)xGE;&32xb4%aK>%0dh@qq%K-hCuQq$*Ln!Gh34 zS1p@Lkv|KXn_W`Y&$~eh@WbDem*Hg*XQQIOv0pT4who_O&CSg@QSQt1aH^sf<&>9K zcXKGB7FB%>xmPFN^y1O6u`%lKW=H$~8m&;D0NPoZoO7UAh5zidE`(t#>c0wgRbTWE zr^U$jx6`TuQvCQ|oEGBOnuvcpE&SV00{{TX=`W|n5j_~+C1oUtI_Ue@Ju3W0@kSs8 zEyztcC`JN~B(mBBO&PCBGtf8XvYv>(ra^i30Yr%8`703|30BjpiA`t^3lH)qyO9yW z07>%Z4f|oHrzz&s1(Kf^AOEW7_Ui|DEjbZ10ny>2<$bG~S;XKDJ`(4Xp_J9dc@>x! zJRrV*qC(LAff~|*h{Ake%@T$CDqY3e;juEI2W9FNlg8l z6SImlFO!Ou4L#`g=;I+$TG#l#4=hv|I9r&=!N;r5Z%xma)^0xFSlJSMKi=GX!bla7 z7dF6Cigb1GP*ijORdL$nMasB|R>h($&$O2P)H_&qlp`JT@oUTg(R^sxf+iU(J$k== zSwD5s7;`O*eiY;I51by3LlF@^ZwtTmI>z+fUA4e;pUX}VoC~+@=HHYY|5?CkLT%TU zUv)T>FZzdonVJ3;un9=|+y5e9g0D3R{uZ#KhsPZN07CPZfYpP~leesJzM>NT$Ia37 z-zwias?rIPEX$CzQH}C{7i0m&>Z1!$K&&fS1J!i z1kWW|S_g~gCL_~|Y}7YUckFI*@{#CAH*hDc4nMrI*moa#c00B{Zh)}ccL|e9q^GBQ z05~8En}-^gDxST33|w5;!V2~QsF8y{)3*;=Ruz^``B6z6Yx}{Bc*kPHY00LZ4y`S!zHLlMeMbD`cYnUkS>qxCl zzdzpYo0{Y{)wRCmlrHM7E?eV8jisffjrNH_Ama|mjHq|%rdO)!=#vuwmnc})DFvLi zzg9L~vSCM?K?nDF%OVV7l`ZpUR;ucm?h0fJ?2QN~jY)>~vA3+Bw^TNL_s;+X5VTI# zEm0XwG)HbBgX-Z`tCoPiB#m5q6*-6q9zkVgXY*NC@m43cdrFOvocndU?T?B2mn4p0 zJWK93)$Rlf8OT%K$Aw9Ugku`vWJwk^dxI+@di9L29s1|mOelcm34f=&7cbcX5bcn( z1NBcHxa+gayFX2&<#1mI5QJf4i;=g1d1_WI9hen;lcQW*6xe|`W-rO}TaE3&>$D~Xd_a-H>1D>pHZBj*c2Iw=Ua2x+&vA4@v%F)5Z z-)c)zqDuPERafUQjT!|Z?{jjhSd=st*v>`(hu}rh0K>CuS?7Oe;Ch)G3=jXLrP_CJ zclPo5&?s7f>D{*y>UO~)j|1}K$32|!6c$dYQrrRvL-SR$V*9>vaA`vCPESrwnl!Aw z`WsnK#OfuUw!3Ot`N~-uqMXXf`ObfwFdfaInO8b6Nu z`>V;p!@eceKP>2O@uRUT(9_a3t*8@dDePg6JPq-*$IFIZfEqkabIa49zb-E?&+~GQ z7-R1{tX_)lf>+bOf!LLE2CDNx{guV|561(T98ZjS%3*s?Vg1-Oh@wqp4RLj3rEIjHD(DQ!5KbAmdChJ(Y%Tg7C&;tHNmz zhzZG#v2Ehrm52zxo0gO-h1RYVUTMX2x18W{Azz|EIfmdey~5e zBRJ%6nt}rI6u1+UxbvLaXy6aKe>h#OreN-lr_gx5mU2G(26ueB%0Y^Bg-Yaa)4{o8 zd^43f*jw+>4JDtMjJ`c(VS_zZ+I523i0g}FsdN9yitdK#m*0QJxpZ$NKv!?H{y?XTXB(5@$9BA?hJ=T2hSaD96EtP!dXYGk$6|k5krK=b zY~gT#w)e5&)BYyuM~|kfez}bGj!3$}zD>BZbBtA0zNM~?U^G!xS?L5dj{TnCswmo* zE=zL9^gVzG9i;4RaZ4pd^fmiiPqJ6c5UW9w51;W?oY$>^Yaw&dgEZT%1=gxoj(VX7ZCfDxZHuR(O3AoN35%zxvIUX zq(erljwc`aUXqUz<=tkDzUi7Fq4YZ7?oIO?pLgKOXOP-WzQ?DiyCpJunrYiAhRfgMwM?Z1 z9*`!66FzP~-&aO|*OaQ%chU@o0fxD97MIpMWtJWJ#p({b$W|_kmI?q%7R;XwzkXD^ zR4v;H-7mfP$)1b^G;p^lTd+5rD%IV~`x(HnNrIEX_G=JYWW2S~b;o+RiyMED8gTBsV-|euB z!H1YQIOhsMe-~ICo zX@v2G!kqy-xS3eAQGpDRtPDL!Rbr!}csOcaLu05#NF~bmRVpgwczF@4jAP=+5@#ab zd4q_NxALiBVd}yjPP0X9v&5_@2OrMeeX=W(ow#a*4l}|bj=ihc*KN9aHNxUVoC3z? zcXn#}%S0&1mN|nBXon~J4kF=-aqlmkti;sI%lErGw@d!F&X(Jt7f6Sw&E6mw;{JZq z>)(|zdu1>-v?UDrakZu}>3=v>rKEEgCTlXlL^shiq#(3sVpYgMmANYM@NBP)~fg6+NHwv=UZyA7%Q5E5<=75h!t0I&^YC( zsIV)rBdz-gE19_lr}>zdsfw3OQ~Rp3`nv9q!b-9@ruFtV3m_Y-jpr8!Z;!R+vqfh` zTifa;_V^q5)f+4@!nRRX-sR*(63I;MDU$Or<(m86B$k4@lQNQpz}gn3>D|-uAi}Mt z=8@mXErv)@>}`XxMM$D&bY7F~5ju#%RQNX@IeJ*>z&WiVIjNa@kwB8mWG08+HWATJ zm}K>&Fi>-IxV9~&E_+*5q+_s6e%WgD;m7mBOye&xwu201+#aB|trBx@MDvZp{gD#{}WiN#YnezqH>6}(^LP5Gp zm$TWc&a>#2iiKnkHhmclDkU`=<+mLy+-gmN&LP;^Fc;0-TicW}RzVSE3MtNGuc&Bs zlx~y^B8Uk^|LRz?#~hhA^`MLp!|r&iIIZPCsfg=jHc8X)=eWdLdBNc~=H;=E-d7Q}I?cU|!NyRu ziyjV(L(I8fQVx~Za}HW99o;L(K^{{-Jst0T>HG2r2}yR0hq0u{f{xTEpfPo&EIkQ}q4@5T%)*0*0PvHRtx*=Efx1gT@yeP#f^;fH5iH%R=w}hKOgVv*~E$~+Si&fAC6{;h3G*Kyb}#eitQ|T3RIZ7hXqg- zz|z=A`gi?{wHkMN5kQygJc4BJJi38Ijk_cC9_fl=Ta~EM&e=TGV|o#r4A`$3WkHyq zscnX91^`b_6rl(9N;ss_J^fJzxSW=j#$=@N2S>wP)%16>fHw_nI;e?>3E6OAfOj39 zEe+m%YpVGLE3e`YWy4&pO8M-5%T6wDBYJdg04t;NcM-JfiH_fP$0xjju=UD~FUht> z+1U!DhvYT8Bye-v?|)~}JR1)zf|y&#%+lYjaAnAXj^=$e@=XMudBsy(>J69F~U`QTbu{@GQ)ujIAuJj_@d;9kn`KeKS9yuYl{B?QU& za#iv{?9_SLW$1g^z~4J|L(omWi&LW4d#_nUh+OPwGo#$1#?u~(PAw@UCWs0wq*c;L z{BCME)Rk}TNEFX5!o$OJ$A01y<={_v{f1wwVC!o=zIH_Y%Vksm!d8D`?YpQ&5q)x` zZsn3E6Y9cDZkb?dG4J!xX>{xQY^<`TLY&j+mRUwsX0FHaO&U9G%*x-BUf{1X{pq4aj80Kz^u3Q<&K5r2mcVXShS4qtoJ z@99psFS6E)!mrRz9-rip6kOel9Y@=-?=gS8-*xlmbv($s?ityGDoYfn*Mx0pD3FOA zRqMM&H{EbGUQ&H+$mAaT1MZEEqs-glT^{sgzPaKcx0mFOgRhw#3}&d@X*j!iF$Bue zD(;|=`&OA_#9o(K%up*WQ9TT083p7tIr-_&oA^RItb!Hk-I(?uTA68>L`I~f>&|3a z()Ea#8-6VgXKT}KoKzeKv;MDdUh6)_EpP2gZk&kbg4Z7M6n~JdR!cRb&Fn}u)ynT2 z7?(5^{d;|-@lUVj@n);$sP^-`e_p{STSFx<`!Xt<^d2)j7AJJ>-Az5>Z!_@gq8Ht) z)*pN{p{^KhHKToFsB2tF+bMej{?rj%8F5tBp3Kt;iu;r3kD-4{%?4R~FY0=5a6P5F zl9QUsk=R`dLgJ4~emncU9yAQ`x6K0Q`TCE?@aHS?2YFkIZ~p@+o>yN)8%`=LfcqP{av*`A&-!NfJD$%nv0y`vkB|G!Ne;gcp-k&p zjPIL4GZs`Dt23t@^922=e0({jnlNrm{c?>@5nqOrPDd+2MLYLc$W>lNXmPc$SYN1# zcVh61H%Da%A@O9nk7wfj_{>A3|6tK|a{oDNLxazU0dQ7}m7?=L1CEJ~@21&sgD}nc zY)JRz)R>A0HwQ;*@J(gKFlW%BX~=PA<81+~>BBzGQd3@_yDwQ>=Lc^F8{S07J*UOV zL#Ka1fZ1MgR;X!a_4>h!vfr^9j2q|6a4%=MMtnxHPOk1tW1MPx=du-Hc+JsENw;6<;ODRDjr3V&1Qo9n~vR>2e>zs51-th^U%NId+2!act8vnN4uL z5I1cO(k+arWFwCd2BGLn#UXYH&PiC6Gp;qMSRQr^sf<8jRw5a&sBmv*rKh3os0G|x zD``=N6m=MgBQ}UF#gs6spP5~wl}#{dKXIT4b%3^m;2P~WlIDWRPfvHl$o;0= z6-u#XGm9VcyZ{}#uDddi)_?D?TGQ7|t4ntZwn`Ik;;y?@z#Bwu{Ib4I5a1~n#NtBB z+S6y7SV}SnLAC24yvqa~Opt8Nm#=Kff*=R%&cGmnyD(H@u;=}E#zDn73)Ac;wc0Q#-!7%G-(s!6%Mee_Mx;1L&0)~`uHb1>d!oxIQ@VqGO85Uy2?vxWE*^PG94K~YS1QJaBb zLZZkcL2J*8Fhoq1sBGj6Ofl-xOGF|L+CNcYDWsoyP!?BVs@BL-EG~nyC5eLo$W#cd zTpn;vFo+fK1HR6ggZKO>1V5XitYi#U%2AhhTW9bK`%Z#5Ah`Vfu zm<9C$IWh(H12{~{fU?%8g~2#uc_N4kKaHj-C6BCe!7d7r1wRMTJyeT{aM5Q!yLc-0 zI$kga`_O(MSy_Ny802_K#?w$h93sy{Ab009>B-Q(eQ7Lm7Q)mO+{Ru$GxkOmO8ao# zzzuL^7&A>gz4{P9MB0(ZL?1O3?FINJAm&uL8XyhU5FG6%sbxttT6&G_Ni+ilpBd^U zWj}$6e=f+&_Q~VnN(C{&_VeHl^mAyw^8_PLH|Y2`@Yrvq-9F3j5jS41RESno+ z>UV?UAH1v9LF%A-WA5kEiam+z>FK%Aqj;oTKBTfiq8n3kxBPj+XJ!{>!zWKtx_RE= zU(L=9-EkG!v%4fX<~uak?3a3eUTS`VfH3n3TXv%yFPV?j6cDar2G^gCXjxl}|6WX? zKolVv5H1n!j&t*TfTmeMW_Pl+I`aV{RD5(VgRf6alsWz-=MzUt{lGi!QU26uyygO85?ZJ zaY@&o_-O4s_V*kz9B|vP_X4@iTh#B_9vOhISoowQD3qD|y~=>=iNp2ASK6@@uwE8y zgS64;*1}0$5qYcP+m$*mGU$5$KL0#S>#t>R2RB4p10&pInPTt=(%*q>lB~+iR9P;U zgS82FovhIGyixl+!oa=Zb@YVr@0E5<;CvvVuX{?uU+Fc>|Kt&j936v|4Sr@Yz`pw^ zehL>`oTyOYG#XWvK1dZ?K$C!-&S8Sh7r3^6b_@9RiD})VROjqIzMX*%27A+FV|s!J zx=-{GJh_;6!_a{qRfeP9bL=3YGs3LRgfHttY=C)hhG)P!P2}gBb`n_!eqY$beTG^f zHQfNHS*beccoebNTPq>62&Jbcl?v3(Q zidBL+ae6T))|=;u4^l0M&h?gq-O>?-o9ghJ+$iyH#-FFc1|hdT)7(sdwjZl)14P`~ z?Z&V54OOx3JMZ2x#1&HL|CnB4aA{Rn2J;ZZjFu@KQq39HPPJ}5s_nisBd%`L9d=xd z4be`fgIjx|2!zDh*N$qkQ+qf=Iq%!;nHyaBtqk6%=j@f+pA<2d z6-chq9BuS-v$ZXpxihl~+ppvajCy?($&%6*HES0e=Ro(QX2`ZBgG1l)W)!O~cPtUE zTmaLQ-Id(dy8nzYbK_S=<_^v|>v71ZJ?BNaQg*`yj-Mhi7?)x;&$`bzQi`Y98U4TO zT|-{wZQz&Q?R@DS#(&bguiH(^GFIOh5xXF6@Ppt-ZSC0}vGEm0@@90`j2J}YhMGq- z*DRahht9rk6YxFsv*q3ClhkZ_GTX5f1lpg;j67B~WGPq=M#z{IE-%&Q8<(tq8-j~EX*PsOl0WIN<;Ao|!GiGRGJg+f(noD={RnEVD-K2t ztc!N8%$3(g5LE2t@h^yK-ldE7E3{Htka*Ez~I;5MLTlS{yiypL3ikmLi(DrYpX=a;q( z*kBhIDg0bnef@eMlt$Nrz`mzG9LzEGn_=zG|W zAvLc*PgRw}9f`jv9iPSsuK5xyFQS7bxM8fMOcg8yGZ_8k5A8D(P}(StF{lX2P85bJ ziCDM9KJPS#F7itZwMf(|VphoP;6q0`UY5jkGs9g;XTsO@qT|!?!u@f>ak_0r5CYff zO0REDS#`uTC3NbXX#`j&QmdJ=^OHh}0>@&|v>ZP1=9y7nSZM7*8ntV_auQLWC}-=y zU_jrbAwqdR$s(W~&V18fNmw{z@BKryC10ca*NN&`h-%eAtuiqsJZPe^i{_kb6$P|~ z)5_f7G#T!%Hl{h#!ePHH|CDqU%$-caqLzVR1t54L+PGEt!rF`VK~>by=#s`Ln41q; zM_YDNcABf-(zXwW+?k+mdY?rDW+^$8Uj(Kx~%L!1H?KJgymi&ludI8qJgDML%L}_d-&M- zKCEzj2s3mx_ctPYT?o{ztBLm=fMZjjdv%y^^rqV4wCgafu8X`r;^+>i0Nm!aZkY`( zK{Is#u>+EZuE#76Mx;|ia5*O-|QR1r>6D4-cdm{=oXe~C1P`d1-AO)*nH_y9#J8Z3`+B#k%!}Id2alpX4=_4Le zx_Z8GObD&c(Yy<5hpPBHp8A70M~;oWq7-RgT#4}Y{OOO28$9(UP^0;X56>ruV*|c@ zF-y~te#J|L_(f1VyUki%ybNd{2Q_k)mDQ!%zpXp@?5246|9ZL3s3x|yJ0UdbN|lZj zLAn71=?X#sX%~?yO+u9-ND+~Mbfg98O{ECZrAiGTAkrlCjtbJd6sceM)ECXwyY8=h zSZA$dF?-Ks=FB;no&D_U#RKL-x}7wb%!?7qE1NoLdak9UqFdqiZCPSx316EQB?Udd z^lp5DQ9H+GH*MB(6$J}3n$2b5fmeGljoM{XNLfihc>h%253ER7&L>W1oHU7-v>CUzl8;^pe_rgPq4yxo_DmGQrR=%! zt^Mn{`sL5{vUx~f_LVU$D`jXh&@dedE)yD}Z|wK=N90~$`tl^4HycdT$1~CIy_(Mi zGzsLU%)PE@NFya2ATYo(lCR)$KbB)KR6=3lj-Izu)19>AH`fF zY~P&}hj)!l^7P_g8z`JXPj_)>p&vn;f6fQF!n&*YEexL&h+WH{Du^Icy{p!pW2U%b zB4ZY75QnrG1*S%tZ=yTW=^4iK+!Os@s3yx#|>?O z-)_+-Wt50-R!GyFn>+O(#HWggn$Hd{a^9EO-~kbSN+^mS$0O!K@fW}P`v3q(;F9!0K9YAECO^xrGSq zr4eO^@MpcSP-MsS+FC%*yIR_1x+f5*J{C1v8YqfLgQdePf*B-u}&MB%ElO`Q=$JwK_f`XMy zA=6ML^S=mFT527phYJ+SdR7I z*!mz=o$a^h0dJoxoYwgJZ4?2?cI!ysO((*(f9y(-Xu-P z*E6rKwyY3$ief`7K&{?>9nDT^_yxa5|}Zw*m8A^Thb6A=e3JnJZ&*)3KqEYn`%0{Gz@29 z!ivEx;f?;K#&e%zJnaL%CPNYQah$PxJ(eW>3(_89&@xs}@;KeL;-+Oh9*0}dT_F_d zaHxMy-@x{iQ)8pOGHa!Wv-AC@x9TANg;%$%N!1Bbz_&gBglGqpDrHy8qvr!Oy>*{5G!8uag71)CB?oGiqK zNllD~o*hm%oUbRjkN-h7oryQ9ldS@GuN&~1J@xFhTr%a5ph!Q@z`{)yPZH6G!~3r? z&i7Y=0j#a$K{_5!zhZ+&MW|FWdv-=LNK<(z|QQ^G=ve2mn&J(~>5u&N$1m+&xEvkB~y zb*iqj;=cCNy!SbF&tHg6exg)vY7|^^nrmC!ol9^v>1u_SgY9DLrk%?7`7)#Ji0B9> zkbv8VHg4_NpO>BaRowgSXs2Zhy8nII`EIyu0g3(_!{wir9nd1$jJXIJPbQQ4m&*=F z?z?p}Tw3{x2}QHl%nhQ3K&*gSaG=3^6+UNK>r>Va1WDFbfwfSZtNO|wzBV?ca^oz# zzR#f!S*`xeCENFDzxa=S$(I^&KTMjTj}uP+;GWYwY@nq+2qFPNp63(R)-i3eHw|<9 zg$~m8-SqBd<2sdY_FVfJOwNT;s@V^gU6S9dg(zxLCwBl3Uf6vIemd>mCQFu-H6Mx8 zAN6tdzJ7X$yMLjv@KbtjDZdQIJ`%WCWVop-U%S4!>-o0B;v$TPC_>;U%?n>{(w_cmzPUj{o&77f2FMVjUw8Hc@^FNe)Ye*F|UHF|BV~-Pgfs2h<0iY zg6tH`(Dw0v^%#bQ{O;?F7Pq9(pzyDAvJevVsie}w*E^-;e95GkE+Q)=!^h7w!_Uu> zMdzy`E2p*(GZhupbGDCQ3Lb3PHwr4JM-A5jWl9PrX3I0hb}BA2-CIp z@`gQXlc{C_hxkmgIh35fORh7-*{z`GCu|sG?S><9rbI~(RRKzL-Lh)WKeq|s5eXD` zZOS!fYqeb2neBpnt$-f*G{PZq6r*Q|d{5nCi^@^%Oa^Z~naou4O;nc!zO*jl!{ZGT zxMJ0ur#Hy^-WEXO`-850a66?6+}T$dJ#&EFp3lPY@&QALwAVwv$CndS?Gt$@_-Jzz z_lzdL;%0vC@dC$S@hVj)!;pt)b)@$;^;;8YIO`=+(=7?$LG+r_C1f5EExYRG2na`*)9QCY?V?KOzmwF z?Q|1i%bt2VzE_l+0)mJ=9G}S~)5^3kF3X@QkdV4H0%ue3;B2I)DMahaP@BZl zf~dY|kr|PMse{+nMFP*#tsa?1XT+~BE{=6ZMy_4EzTZ+8%G9ll@2jkO_UO-d-pf4; z$wsvJQH$=B=*@oeTB@N-SHCMDwb-)%u>vCgT>;TCv^0>Xk+g6z3*@pRZ`$31$;w~I z)Ohmro|7v};O=d#+G+MIEdoEP5dM5=%lbO1{X9jc;0*lQKxWuB>`@hVcZspSEQPJy zY1$H);F|eL`x=X@iT?0nO_i%Y)0RX>d$JSk^TUZt8y$e;m-kmmZ=O-n%+=w6Jr?v} zyMy8LVDY+KF1a-0>wNfiQNI}ai%=f-B{om&=h zg8;)uGTB=1utaU>g80-Go#$-?dXWvys!m6 zpxxja@((7MBELw%_xQTmlb8LEL}zLhGc&8}P(~o>|cS(@9d-@+R$F?OuZrJoZ zfa(jPmP5R6nzVLmb~aQcor+kNS0jXsopqo8LJNzk&;Lw5r%a z`qf67eMMSWNQsEvB!sY?Wls#Y138pwu(&JJ-!&klF}v+>nBUE{o9xsUO3=C{I>n5i zzr%-Zrc$F3BUDsaC_omC{!yA{!cVbTQbO+oBcN>J?sn(S(p=UX5uT@Z^tZ!l%)*2& zu%)IZC)aSDbG?DW3v_ISUJe8?o9ERKBUelgDzz@$b9QtrnjRBR?7;o{;P5PB8*8WR zh8HvlPY{4lJxPBA*owXn)63g3e{C>M;kV*G9%Nm*3&39hy&^O(xcRUFE`$fDy2mnN zO4laG$;oLX4WEJlC$?>x1V`2ZuQjb=C!ET2!b=r(=*#htMOE>#>fOxj4y9c!Q~)r_r+8rfxj;wq%T7ebMD?V7pnW&#PBp0Ubj)l_&l3wr$CiHmV|X20#Dkeb!Ew_FU$pM z3%4&O=joSs8WtMY7wCp{m~)9Rn$V0#ef|t$>)@gaDTfJXN}mE*mkwLOwg88V?;}g2 za#zPmfpUxNv*^pk2k~Hxi_TbGmO**z+FXX7U*oTEN5buksfZsj$63L27hv`Hh0S8y z!P^f*(remtBTA#x5t+JxNc<2h(iQ1GzE|ZPwq&-CRl%)nVG?7?6~sP9`ha*8oBl~a z&)gaKCaes<;;iVyYSox}tvu}NglxA!#CO>Eh_%eyb{ zGP)w8xIw^x$e?)(4~f3%`n0;>!mu*j3a_NCOYD-`oD?Yw3k!R%De-Iu@|Us(76t_L z#JBA1qJ+eg8tRV7q2|VGI(LwL8Wc4#&9bF>l2x|~Ch+JbwX5POUs&Vr6Y&Taw?q*m zsO(289J?F*2)*oYRBL9_e@?0*74@Pve8i=T+p$Oj-3DZ%hQI?cN*MwAeRmR;UBTq{ zKP3g9U9F90V4bs9OGV_XIc?Iw|8^f zc^VlRnStOlM-*%$DDJN~hgn*;Tgi>05;cFs)ZGUpgOfFC zR9UeoTgN8HB$uz6b`Tkq2cnYvb8L^Li;GLOeJpOdfHsg(aj7bDH7D- ze=RN2I>6%g?Kdx8kGHQYgN*6CQXTbCc8(SiSa)@+&D5|V%D5ik_4V~yUNXZJ08cp} zI#UV17R9wVH#a053d7Bj$(MH!Sv4=_C2Ab95`u90d`@!8CTL|7jp^RruUj4OQfAfR zq|n4cHot8fYvqD%sTRwk#H_F(ir)LyfI7a9@m~%75FsIF(;T1pUN}8ihQ7rDYehKz zHq15sy>cp+EZGzl03~FXjHh|ySE{%4g^Jw^>y{!U)4&2yk8tKJ%x~p@=oeY{y#zN` zSxS8FN|m1Wf5KCfZIv|P7GT+o~w&Xey-L9!#vAt8ehGq);Bykp`l%InnDS)vxj6JQemK?w`BqxH?e#oueJKfvQIv%+!q(W> zSf0K`!A>niu#1N6AYU)fB`iMAx=91q7E-*B>@*NRBxqJbrygB$G3-+*#G-S*qN>Vc z?Vdcm`^M zlorD-XgT6fN;$Tm0C)iXe-yg^W)b5jr*t9wJlmc4A(lz>gp;Y6y%@S70Ubc@N}Cr?ZQRhbLx8*5KeJ_s z(JNZV4T-Eqs`#2zT(D|U&Y^#83D{^*+|kbII}e8y>#j@uO|Ijyyy8MyK?bbo|$&rkGSl-K!!_| zB$HXPszuUX)I3tG9BXv@e$56m{zU*?uSS{#7_kl`t==(VwaL6z=Nv85%ku;#w)uC_ zrNt=r_nYt!6yEHRHU$mmnIv%_A3(2E=N+)UV%=ac@ggVYRIP|NvxAH;gc3~lvE&Vc zx*7drvi>|0+7BPy(?d%aH_-hzBjLM#aRdDFKh`f$KlF<(8!cCgCg~X%2M6V~_UG*Q zF6=s4{WriFMWHK+*9i@^3`z;9HL0)MEUV;_GobWE$x|CDhH&NK;!qx$W)4 zB-2t3mwi{2PuINr_|f!^v-204RntfS>M?q704mu)9$vwH**9;2Y&~}yaOJ<^k)3r5 zXYj@o38372n&wknx}FIb;lKQdSI2eRzGLyat27J-c##sk99Y0ZdYF)`Sayq$*8L@usEz{2k;J`LK?V>i;G>?6%!K^ zJxkedywgTjzOXrP!y$UCBYlO@^f4>2d|1e2Z)TQO;7wze@dN}JS!CQhltvH4rvw$< z@iWiJ%qZYhOp7gaS|B7bP30-}B^*YefR~?t<{-wZe8i84h}bpNWt$s7f1KB4W!g(k z`i6#{Y*r*XT|F21i~NB2p*G|SA`@NDdZ`1p5tMiN(k1FBHZj(@8P<=8GkxXl1p zX$rGyTnQ|xx33oO*W8kRACkz{nn%_kjyyeC-Xiqs6(xXdmkJiV72!T9pN_QP zUa1$wkR#*u#LzmdC0S5UPtW$#9^ZRPk4;GxQTj*?W3>;=aG~o)uG^l-w^U8Z?%vC_ zsxLt0m6nM^edsb{Z4L6SHQP^K7lv2>Af6tb7xDA73_@Fv(7NFt!tsx{{r`FV_yzDw zRKB|Muh8QSevbJ*e*djGqVMhFnACql9EX0Nv}iQq|K*gQA-{_NKZblezRK@AL8l*n z3k3fedYm17yy=hQJI<{=X_4ri{}khj3B(MYJ_df6j-1Q;9mEkpAm$6u&0=S`#(tP3F80& literal 0 HcmV?d00001 diff --git a/crx/0.1.2_0.pem b/crx/0.1.2_0.pem new file mode 100644 index 0000000..6b412b5 --- /dev/null +++ b/crx/0.1.2_0.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4DYEiDPfw094p +axusu7+kP9J9waL3+794PORnMoBnoKEBuEAfeWLZPtX338nq3dmyiVvNsNKFimcH +vVFye5uHdFOfXZ7f6oIBzeY0616dhcASjV7nj0HkuhDhZQGvBWegQrFJrQQDG99T +kXv3mH8e4W6qvwpyRedXqQJC3gE0LOKvUGlWABQwwq9NF5Uf6vJyXYMv7uBMwpWc +liAtJ6v9742IIGjmZhhaQELliOUucbaeilzxJ29XyVXGhEXNERAXbswSGectHvoz +HsBo4YVzKaR2b8wRXGT1W7am1MwFmOzZcX8tQAXTnoThsAL5tLHi+HJ5QRNbSf6h +C44x8bcdAgMBAAECggEAW+G5/pK00FAkj06+MRxFTqzh2w/o2J2f91mGuJH4kkMZ +Pa+Kq2vA0i1RSf45YfvAqyVxZB0K68mtJ6r2Vw2oFhYXjO6C2svKfTYZ339E66SS +v3A92aGlxpawyKTRE1vCYLoKoXozD45BjgmJ9o/1nifyRGE8yNFm7VcdHt6PgUix +914dJWeSwF94tnRqPJwfOXJkpTXdiWQunGWBOH2nK6y/r2xlLiR4EXDA/4LwMegh +5XHWA4YOG0jQc5a/U5w+899/JKvduo5ZU738jKrtcqD8b2G76R+VTxzbv11ROm6E +AMo1nTHRtbPAKDbSSPWgrzjxQPVGbJPJ+BnzF2V3rQKBgQDnC8OxPuhFvEdjmijW +1lPWkB4NBJ9uBtWEMhHe5PTeHs0sfm9AZvM8npObMNcOvmQH3bGX2aY9XoEHZbjK +ixM5miVazdEt0y7UonzcXqjpOvjiqlaAcMP+2Y6ejqi1JD3sflyi/GmLNCtlbRsZ +Fx7sgPNk+LueGvwK35TWIsL7hwKBgQDL7mpjYk5V3osb1AGqcaJYsVa9Qm2izsAl +g13sxollDLazaitwAt3r+FMtLVgJPptTlV37QF1WbSCfGCYjjFRP0WQN1lTlZqUN +4QNKQ6SI/Wp4qjl127T2n/1toc7Mhjs00V+RJiFYpN5cdvXniBXjJC0oh30tL+L8 +Cvws2QYJOwKBgQDJEqD1QSUNg4SxdvkxtwbxhSzR8YL6UzJAwP5yd9lu8Wln3oTd +jHsE95DID6Ipr6IIgnRLDdyyLeumz20ZwB00FSWLN/FiqxZncR2u/yaLC4qMYOe1 +Ee5QfW+0J71FH8xQY8wk//yua/GUbHaXyFpeQv8PkbReLWfJ4rh5/3inQwKBgQCl +7M9dG6BXF6Ihu0a7soeAGJJVnRXtUMFgBFnIi+VAda61nh3Hnl2IYFz0th8aLnlc +8XwtMLqA1nujVpe5drUm2FzLMWeT2wdSmpD9vLnDyET39rCX53J+87/UksHbASBt +IinaxKZ/JG3T1+rOPphoXofroQnFWWAa6KkzqETT/wKBgDv2KDnZqYMSNy4xtz96 +IdOpYioocSvRS5kUUwokAIU9CYIo5+iyaJYok25u6OaRNOr1vqzqeG5j8Rdc/kQc +70df/gZ2Gejn+3BYJtwtgeB25KfCjd+jhTHOOgLbnK0tX3h8X5wkpA0628inwMhg +Q9GxE6HDisGIr0S5PWnZFh34 +-----END PRIVATE KEY----- diff --git a/sql/remake_database.sh b/sql/remake_database.sh new file mode 100644 index 0000000..180663b --- /dev/null +++ b/sql/remake_database.sh @@ -0,0 +1,10 @@ +# /bin/bash +USER=root +HOST=127.0.0.1 +PORT=4000 + +# mysql -h $HOST -u $USER -P $PORT -c "drop database intimate_source"; +# mysql -h $HOST -u $USER -P $PORT -c "drop database intimate_extractor"; + +mysql -h $HOST -u $USER -P $PORT < ./intimate_extractor.sql; +mysql -h $HOST -u $USER -P $PORT < ./intimate_source.sql; diff --git a/store.go b/store.go index 2c07234..45f7f06 100644 --- a/store.go +++ b/store.go @@ -87,7 +87,8 @@ func (store *StoreSource) Insert(isource IGet) { // Deduplicate 去重 func (store *StoreSource) Deduplicate(target Target, field string) { - _, err := store.db.Exec(`DELETE FROM ` + store.table + ` WHERE uid NOT IN (SELECT MAX(s.uid) FROM (SELECT uid, ` + field + ` FROM ` + store.table + `force index(target_type_idx) WHERE target_type = "` + string(target) + `" ) s GROUP BY s.` + string(target) + `) ;`) + sql := `DELETE FROM ` + store.table + ` WHERE uid NOT IN (SELECT MAX(s.uid) FROM (SELECT uid, ` + field + ` FROM ` + store.table + ` force index(target_type_idx) WHERE target_type = "` + string(target) + `" ) s GROUP BY s.` + string(field) + `) ;` + _, err := store.db.Exec(sql) if err != nil { panic(err) } diff --git a/tasks/twitch/twitch_task1/task_twitch.go b/tasks/twitch/twitch_task1/task_twitch.go index 4f0aa50..cdff148 100644 --- a/tasks/twitch/twitch_task1/task_twitch.go +++ b/tasks/twitch/twitch_task1/task_twitch.go @@ -50,7 +50,7 @@ func (cl *ChannelLink) Execute() { for i := 0; i <= 200; i++ { wd.KeyDown(selenium.EndKey) - time.Sleep(time.Second * 3) + time.Sleep(time.Second * 2) } elements, err := wd.FindElements(selenium.ByXPATH, "//span/a[contains(@data-a-target,'card-') and @href]") diff --git a/tasks/twitch/twitch_task2/task_twitch.go b/tasks/twitch/twitch_task2/task_twitch.go index eb3780a..178f0b8 100644 --- a/tasks/twitch/twitch_task2/task_twitch.go +++ b/tasks/twitch/twitch_task2/task_twitch.go @@ -5,7 +5,11 @@ import ( "encoding/json" "intimate" "log" + "os" + "os/signal" "regexp" + "sync/atomic" + "syscall" "time" "github.com/tebeka/selenium" @@ -27,88 +31,112 @@ type UserList struct { func (cl *UserList) Execute() { // DELETE FROM source_twitch WHERE uid NOT IN (SELECT MAX(s.uid) FROM (SELECT uid, source FROM source_twitch ) s GROUP BY s.source) ; //article//a[@data-a-target='preview-card-title-link'] - var err error + wd := intimate.GetChromeDriver(3030) - sourceChannel, err := sstore.Pop(intimate.TTwitchChannel) - if err != nil { - panic(err) - } + var loop int32 = 1 - weburl := sourceChannel.Source.String + "?sort=VIEWER_COUNT" - err = wd.Get(weburl) - if err != nil { - panic(err) - } + go func() { + signalchan := make(chan os.Signal) + signal.Notify(signalchan, syscall.SIGKILL, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGSTOP) + log.Println("accept stop command:", <-signalchan) + atomic.StoreInt32(&loop, 0) + }() - wd.WaitWithTimeout(func(wd selenium.WebDriver) (bool, error) { - _, err := wd.FindElement(selenium.ByXPATH, "(//div/p[@class=''])[last()]") - if err != nil { - return false, err - } - return true, nil - }, time.Second*10) + for atomic.LoadInt32(&loop) > 0 { - btn, err := wd.FindElement(selenium.ByXPATH, "//button[@data-a-target='browse-sort-menu']") - if err != nil { - panic(err) - } - btn.Click() - - var elements []selenium.WebElement - var liveurls = 0 - var delayerror = 3 - for i := 0; i < 2; i++ { - elements, err = wd.FindElements(selenium.ByXPATH, "(//div/p[@class=''])[last()]") + var err error + sourceChannel, err := sstore.Pop(intimate.TTwitchChannel) if err != nil { panic(err) } - wd.KeyDown(selenium.EndKey) - time.Sleep(time.Second * 2) - if len(elements) == liveurls { - delayerror-- - if delayerror <= 0 { + + weburl := sourceChannel.Source.String + "?sort=VIEWER_COUNT" + err = wd.Get(weburl) + if err != nil { + panic(err) + } + + wd.WaitWithTimeout(func(wd selenium.WebDriver) (bool, error) { + _, err := wd.FindElement(selenium.ByXPATH, "(//div/p[@class=''])[last()]") + if err != nil { + return false, err + } + return true, nil + }, time.Second*10) + + btn, err := wd.FindElement(selenium.ByXPATH, "//button[@data-a-target='browse-sort-menu']") + if err != nil { + log.Println(err) + continue + } + btn.Click() + + var elements []selenium.WebElement + var liveurls = 0 + var delayerror = 3 + for i := 0; i < 200 && atomic.LoadInt32(&loop) > 0; i++ { + elements, err = wd.FindElements(selenium.ByXPATH, "(//div/p[@class=''])[last()]") + if err != nil { + log.Println(err) break } - } else { - delayerror = 3 + wd.KeyDown(selenium.EndKey) + wd.KeyUp(selenium.EndKey) + time.Sleep(time.Second * 2) + if len(elements) == liveurls { + if liveurls == 0 { + delayerror -= 2 + } else { + delayerror-- + } + + if delayerror <= 0 { + break + } + } else { + delayerror = 3 + } + liveurls = len(elements) } - } - elements, err = wd.FindElements(selenium.ByXPATH, "//article//a[@data-a-target='preview-card-title-link' and @href]") - if err != nil { - panic(err) - } - - for _, e := range elements { - - attr, err := e.GetAttribute("href") + elements, err = wd.FindElements(selenium.ByXPATH, "//article//a[@data-a-target='preview-card-title-link' and @href]") if err != nil { log.Println(err) continue } - streamer := &intimate.Streamer{} - matches := regexp.MustCompile(`https://www.twitch.tv/(\w+)`).FindStringSubmatch(attr) - if len(matches) == 2 { - streamer.UserId = matches[1] - } else { - log.Println(attr) - continue + for _, e := range elements { + + attr, err := e.GetAttribute("href") + if err != nil { + log.Println(err) + continue + } + streamer := &intimate.Streamer{} + + matches := regexp.MustCompile(`https://www.twitch.tv/(\w+)`).FindStringSubmatch(attr) + if len(matches) == 2 { + streamer.UserId = matches[1] + } else { + log.Println(attr) + continue + } + + streamer.Platform = intimate.Ptwitch + + updateUrl := make(map[string]string) + updateUrl["live"] = attr + streamer.LiveUrl = sql.NullString{String: attr, Valid: true} + data, err := json.Marshal(updateUrl) + if err != nil { + log.Println(err) + continue + } + streamer.UpdateUrl = data + streamer.Operator = 0 + + estore.InsertStreamer(streamer) } - - streamer.Platform = intimate.Ptwitch - - updateUrl := make(map[string]string) - updateUrl["live"] = attr - streamer.LiveUrl = sql.NullString{String: attr, Valid: true} - data, err := json.Marshal(updateUrl) - if err != nil { - log.Println(err) - continue - } - streamer.UpdateUrl = data - streamer.Operator = 0 - - estore.InsertStreamer(streamer) + log.Println("streamer insert", len(elements)) } } diff --git a/utils.go b/utils.go index 64f9efe..774de66 100644 --- a/utils.go +++ b/utils.go @@ -51,10 +51,11 @@ func ParseDuration(dt string) (time.Duration, error) { func GetChromeDriver(port int) selenium.WebDriver { caps := selenium.Capabilities{"browserName": "chrome"} chromecaps := chrome.Capabilities{} - err := chromecaps.AddExtension("/home/eson/test/ssh-key/0.1.2_0.crx") + err := chromecaps.AddExtension("../../../crx/0.1.2_0.crx") if err != nil { panic(err) } + chromecaps.Args = append(chromecaps.Args, "--proxy-pac-url=http://127.0.0.1:1081/pac") chromecaps.Args = append(chromecaps.Args, "--disk-cache-dir=/tmp/chromedriver-cache") chromecaps.ExcludeSwitches = append(chromecaps.ExcludeSwitches, "enable-automation") caps.AddChrome(chromecaps) @@ -63,8 +64,12 @@ func GetChromeDriver(port int) selenium.WebDriver { panic(err) } wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port)) + if err != nil { + panic(err) + } runtime.SetFinalizer(wd, func(obj interface{}) { - if err := wd.Close(); err != nil { + log.Println(obj) + if err := obj.(selenium.WebDriver).Close(); err != nil { log.Println(err) } })