总代码.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. ######远程订阅写入本地1
  2. if(getVar("QJS")&&getVar("QJS")!="null"){
  3. eval(getVar("QJS"));
  4. }else{
  5. eval(e2Rex(getHttp('https://egwang186.coding.net/p/egwang186/d/iptv/git/raw/master/aliyun/QJS.js'),'.dn64()'));
  6. }
  7. var filename='一个直播远程索引.txt';
  8. if(getVar("rurl").indexOf(",http")>0){
  9. var 记录=getVar("rurl").match(/.+?,http.+/g);
  10. if(_.read(filename)){
  11. var 旧记录=_.read(filename).match(/.+?,http.+/g);
  12. for(var i in 记录){
  13. var 记录项=[];记录项.push(记录[i]);
  14. var 旧记录=记录项.concat(旧记录.filter(item=>item!=记录[i]));
  15. }
  16. var 新记录=旧记录;
  17. }else{
  18. var 新记录=记录;
  19. }
  20. _.write(新记录.join("\n"),filename);
  21. _.read(filename);
  22. }else{
  23. "请输入正确格式(支持批量):名称,地址";
  24. }
  25. ######源文本写入本地2
  26. if(getVar("QJS")&&getVar("QJS")!="null"){
  27. eval(getVar("QJS"));
  28. }else{
  29. eval(e2Rex(getHttp('https://egwang186.coding.net/p/egwang186/d/iptv/git/raw/master/aliyun/QJS.js'),'.dn64()'));
  30. }
  31. var indexname='一个直播本地索引.txt';
  32. if(getVar("text")!='null'&&getVar("text").indexOf(",")>1&&getVar("sort")!='null'&&getVar("sort").length>1){
  33. var filename=getVar("sort")+'.txt';
  34. var 记录=getVar("text").match(/.+?,.+/g);
  35. if(_.read(filename)){
  36. var 旧记录=_.read(filename).match(/.+?,.+/g);
  37. var 新记录=记录.concat(旧记录);
  38. }else{
  39. var 新记录=记录;
  40. }
  41. var a=getVar("sort")+","+getVar("sort")+'.txt';
  42. var item=[];item.push(a);
  43. if(_.read(indexname)){
  44. var 旧索引=_.read(indexname).match(/.+?,.+/g);
  45. var 新索引=item.concat(旧索引.filter(u=>u!=a));
  46. _.write(新索引.join("\n"),indexname);
  47. }else{
  48. _.write(item.join("\n"),indexname);
  49. }
  50. _.write(新记录.join("\n"),filename);
  51. _.read(indexname)+_.read(filename);
  52. }else{
  53. "请输入正确格式(支持批量):名称,地址";
  54. }
  55. ######读取远程订阅3
  56. if(getVar("QJS")&&getVar("QJS")!="null"){
  57. eval(getVar("QJS"));
  58. }else{
  59. eval(e2Rex(getHttp('https://egwang186.coding.net/p/egwang186/d/iptv/git/raw/master/aliyun/QJS.js'),'.dn64()'));
  60. }
  61. var filename='一个直播远程索引.txt';
  62. var code=_.read(filename).match(/.+?,.+/g);
  63. var items=[];
  64. for(var i in code){
  65. var title=code[i].split(",")[0];
  66. var url="q:自定义播放器?url=远程$$"+code[i].split(",")[1];
  67. items.push({title:title,url:url});
  68. }
  69. JSON.stringify(items);
  70. ######读取本地文本4
  71. if(getVar("QJS")&&getVar("QJS")!="null"){
  72. eval(getVar("QJS"));
  73. }else{
  74. eval(e2Rex(getHttp('https://egwang186.coding.net/p/egwang186/d/iptv/git/raw/master/aliyun/QJS.js'),'.dn64()'));
  75. }
  76. var filename='一个直播本地索引.txt';
  77. var code=_.read(filename).match(/.+?,.+/g);
  78. var items=[];
  79. for(var i in code){
  80. var title=code[i].split(",")[0];
  81. var url="q:自定义播放器?url=本地$$"+code[i].split(",")[1];
  82. items.push({title:title,url:url});
  83. }
  84. JSON.stringify(items);
  85. ######选集地址5
  86. if(getVar("QJS")&&getVar("QJS")!="null"){
  87. eval(getVar("QJS"));
  88. }else{
  89. eval(e2Rex(getHttp('https://egwang186.coding.net/p/egwang186/d/iptv/git/raw/master/aliyun/QJS.js'),'.dn64()'));
  90. }
  91. var type=getVar("url").split("$$")[0];
  92. var u=getVar("url").split("$$")[1];
  93. if(type=="远程"){
  94. var code=getHttp(u);
  95. }else if(type=="本地"){
  96. var code=_.read(u);
  97. }
  98. function 选集列表(){
  99. var res={};var items=[];
  100. for(var i=0;i<分类.length;i++){
  101. var 分类CODE=分类[i];
  102. var 列表=e2Arr(分类CODE,列表规则).filter(Boolean);
  103. if(线路){
  104. var 标题=e2Rex(线路[i],标题规则);
  105. }else{
  106. var 标题=e2Rex(分类CODE,标题规则);
  107. }
  108. var LIST=[];
  109. for(var j=0;j<列表.length;j++){
  110. var 选集=e2Rex(列表[j],选集规则);
  111. var 选集地址=e2Rex(列表[j],选集地址规则);
  112. LIST.push({title:选集,url:选集地址});
  113. }
  114. var play_={};
  115. play_.title=标题;
  116. play_.list=LIST;
  117. items.push(play_);
  118. }
  119. res.data=items;
  120. return JSON.stringify(res);
  121. }
  122. if(code.indexOf("#genre#")!=-1){
  123. var 分类=code.split(/.+?#genre#.*/).filter(item=>item.indexOf("://")!=-1);
  124. var 线路=code.match(/.+?#genre#.*/g);
  125. var 列表规则=".z(.+?,.+)";
  126. var 标题规则=".tz(#genre#)";
  127. var 选集地址规则=".c(http://ip111.cn/?wd=).ty(,)";
  128. var 选集规则=".tz(,)";选集列表();
  129. }else if(code.indexOf("#EXTINF:")!=-1){
  130. var code=code.match(/#EXTINF:.+[\s]+.+/g);
  131. var res={};var items=[];
  132. for(var i in code){
  133. var 选集=code[i].match(/,(.*)/)[1]||"无选集名称";var 选集地址=code[i].match(/,.*[\s]+(.+)/)[1]||"无播放地址";
  134. if(code[i].search(/group-title=".*?"/)!=-1){
  135. var type=code[i].match(/group-title="(.*?)"/)[1]||"不规范分类";
  136. }else{
  137. var type="未分类";
  138. }
  139. var 当前条目=[];当前条目.push({title:选集,url:"http://ip111.cn/?wd="+选集地址});
  140. if(items.length==0) {
  141. items.push({title:type,list:当前条目});
  142. }else{
  143. let 寻找=items.some(item=>{
  144. //判断类型,有就添加到当前项
  145. if(item.title == type){
  146. item.list=item.list.concat(当前条目);
  147. return true
  148. }
  149. });
  150. if (!寻找) {
  151. //如果没找相同类型添加一个类型
  152. items.push({title:type,list:当前条目});
  153. }
  154. }
  155. }
  156. res.data=items;
  157. JSON.stringify(res);
  158. }else if(code.search(/\$c_start.+?\$c_end/)!=-1){
  159. var 分类=code.split(/\$c_start.+?\$c_end/).filter(item=>item.indexOf("://")!=-1);
  160. var 线路=code.match(/\$c_start.+?\$c_end/g);
  161. var 列表规则=".z(.+?,.+)";
  162. var 标题规则=".ty(c_start).tz($c_end)";
  163. var 选集地址规则=".c(http://ip111.cn/?wd=).ty(,)";
  164. var 选集规则=".tz(,)";选集列表();
  165. }else{
  166. var code=code.match(/.+?,.+/g);
  167. var res={};var items=[];
  168. for(var i in code){
  169. var 选集=code[i].match(/(.+),/)[1];var 选集地址=code[i].match(/,[\s]*?(.+)/)[1];
  170. if(code[i].indexOf("|")!=-1){
  171. var type=选集.split("|")[0];
  172. var 选集标题=选集.split("|")[1];
  173. }else{
  174. var type=getVar("name")+"-无子分类";
  175. var 选集标题=选集;
  176. }
  177. var 当前条目=[];当前条目.push({title:选集标题,url:"http://ip111.cn/?wd="+选集地址});
  178. if(items.length==0) {
  179. items.push({title:type,list:当前条目});
  180. }else{
  181. let 寻找=items.some(item=>{
  182. //判断类型,有就添加到当前项
  183. if(item.title == type){
  184. item.list=item.list.concat(当前条目);
  185. return true
  186. }
  187. });
  188. if (!寻找) {
  189. //如果没找相同类型添加一个类型
  190. items.push({title:type,list:当前条目});
  191. }
  192. }
  193. }
  194. res.data=items;
  195. JSON.stringify(res);
  196. }
  197. ######免嗅探6
  198. var uu=getVar("url").split("/?wd=")[1];
  199. if(uu.indexOf("#")!=-1){
  200. var urls=uu.split("#");
  201. var items=[];
  202. for(var i=0;i<urls.length;i++){
  203. if(urls[i].indexOf(".php")!=-1){
  204. var resp = JZ(JSON.stringify({ url: urls[i], redirect: false }));
  205. var u = resp.head.Location || resp.head.location;
  206. if(!u){
  207. u=uu+"&type=.m3u8";
  208. }
  209. }else if(urls[i].indexOf("mitv://")!=-1){
  210. var u=urls[i].replace("mitv://","P2p://");
  211. }else{
  212. var u=urls[i];
  213. }
  214. items.push({url:u});
  215. }
  216. JSON.stringify(items);
  217. }else{
  218. if(uu.indexOf(".php")!=-1){
  219. var resp=JZ(JSON.stringify({url:uu,redirect:false}));
  220. var u=resp.head.Location||resp.head.location;
  221. if(!u){
  222. u=uu+"&type=.m3u8";
  223. }
  224. }else if(uu.indexOf("mitv://")!=-1){
  225. var u=uu.replace("mitv://","P2p://");
  226. }else{
  227. var u=uu;
  228. }
  229. JSON.stringify({url:u});
  230. }
  231. ######管理订阅7
  232. if(getVar("QJS")&&getVar("QJS")!="null"){
  233. eval(getVar("QJS"));
  234. }else{
  235. eval(e2Rex(getHttp('https://egwang186.coding.net/p/egwang186/d/iptv/git/raw/master/aliyun/QJS.js'),'.dn64()'));
  236. }
  237. var filename='一个直播远程索引.txt';
  238. var code=_.read(filename).match(/.+?,.+/g);
  239. var items=[];
  240. for(var i in code){
  241. var title=code[i].split(",")[0];
  242. var url="q:管理订阅按钮?url="+code[i];
  243. items.push({title:title,url:url});
  244. }
  245. JSON.stringify(items);
  246. ######管理本地8
  247. if(getVar("QJS")&&getVar("QJS")!="null"){
  248. eval(getVar("QJS"));
  249. }else{
  250. eval(e2Rex(getHttp('https://egwang186.coding.net/p/egwang186/d/iptv/git/raw/master/aliyun/QJS.js'),'.dn64()'));
  251. }
  252. var filename='一个直播本地索引.txt';
  253. var code=_.read(filename).match(/.+?,.+/g);
  254. var items=[];
  255. for(var i in code){
  256. var title=code[i].split(",")[0];
  257. var url="q:展示本地内容?url="+code[i];
  258. items.push({title:title,url:url});
  259. }
  260. JSON.stringify(items);
  261. ######展示本地内容9
  262. if(getVar("QJS")&&getVar("QJS")!="null"){
  263. eval(getVar("QJS"));
  264. }else{
  265. eval(e2Rex(getHttp('https://egwang186.coding.net/p/egwang186/d/iptv/git/raw/master/aliyun/QJS.js'),'.dn64()'));
  266. }
  267. var filename=getVar("url").split(",")[1];
  268. var code=_.read(filename).match(/.+?,.+/g);
  269. var items=[];
  270. for(var i in code){
  271. var title=code[i].split(",")[0];
  272. var url="q:管理本地按钮?url="+code[i];
  273. items.push({title:title,url:url});
  274. }
  275. JSON.stringify(items);
  276. ######QJS10
  277. ZXZhbChmdW5jdGlvbihlLGYsYSxkLGMsZyl7Yz1mdW5jdGlvbihiKXtyZXR1cm4oYjxmPyIiOmMocGFyc2VJbnQoYi9mKSkpKygzNTwoYiU9Zik/U3RyaW5nLmZyb21DaGFyQ29kZShiKzI5KTpiLnRvU3RyaW5nKDM2KSl9O2lmKCEiIi5yZXBsYWNlKC9eLyxTdHJpbmcpKXtmb3IoO2EtLTspZ1tjKGEpXT1kW2FdfHxjKGEpO2Q9W2Z1bmN0aW9uKGIpe3JldHVybiBnW2JdfV07Yz1mdW5jdGlvbigpe3JldHVybiJcXHcrIn07YT0xfWZvcig7YS0tOylkW2FdJiYoZT1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxiIitjKGEpKyJcXGIiLCJnIiksZFthXSkpO3JldHVybiBlfSgiKDUoKXszIDY9e307MyBtPTEuMDszIHE9Ui4xdi4xdy4xeC4xeTszIHI9Ui4xdi4xdy4xeC4xeSgpLmMuMjc7MyBzPTF6LjI4LjI5LjJhKCk7MyB0PVMuMmI7MyB1PVMuMUE7MyB2PXQuVC4yYzszIHc9MUIoKSt2KycyZCcrditFKCkuVS5WKDAsNCkrJyQkJCcrRSgpLjE4K3Y7SD0oMUMpPT4xRCAxQz09PScyZSc7NSAxOShhKXsyZiAxYT0xRCBhOzcgYSE9SSYmKDFhPT0nMmcnfHwxYT09JzUnKX0zIHk9Uy4yaC4yaTszIHo9OCB5LjJqLjJrKCk7NSBXKGEpezFFPXsxRjo1KCl7NyBhKCl9LH07MyBiPTggeS4ybCgxRSk7ei5YKGIpOzcgYn01IFkoYSxiKXtKIEs9MDtKIDFiPVtdO0woSzxhLkQpezFiLjFjKGEuMm0oSyxLK2IpKTtLKz1ifTcgMWIuMm4oKG8pPT5vLkQ+MCl9NSBYKGwsbil7Yz1bXTtaPVkobCxsLkQvbik7MyBuPTA7TChuPFouRCl7NSBsKHgpezcgNSBvKCl7MyBhPVtdOzFkKEogaT0wO2k8Wlt4XS5EO2krKyl7YS4xYyhaW3hdW2ldKCkpfTcgYX19Yy4xYyhXKGwobikpKTtuKyt9NyBjfTUgMTAoZil7MyBhPWYuMm8oKTs5KCFhLjFHKCkpYS4xMCgpfTUgRihhLGIpezMgYz04IHQuVCh3KydcdTY1NzBcdTYzNmUnK3YrYik7MTAoYyk7MyBkPTggdC4ycChjLDFlKTtkLkYoYSk7ZC5NKCl9NSBOKGEpezMgYj04IHQuVCh3KydcdTY1NzBcdTYzNmUnK3YrYSk7MyBjPTA7OSghYi4xRygpfHwoYz1iLkQoKSk9PTApNycnOzMgZD11LjFILjFJLjFKKHUuMUsuMUwsYyk7MyBlPTggdC4ycShiKTtlLk4oZCk7ZS5NKCk7NyA4IHUuMnIoZCl9MyBBPVIuMnMuMnQ7MyBCPUEuMnUuMnY7NSAxMShvKXtKezFmLEcsTywxZywxMiwxaH09bzszIGE9QS4ydy4yeCgxZik7YS4yeSgxMyk7YS4yeigyQSk7MWg9PT0xZT9hLjFNKDFoKTphLjFNKDEzKTs5KDE5KEcpKTFkKHggMU4gRylhLkcoeCxHW3hdKTs5KDE5KE8pKXs5KDFnPT09MTMpYS4yQihPKTsxTyAxZChwIDFOIE8pYS4yQyhwLE9bcF0pfTMgYjs5KDFnPT09MTN8fDEyPT0nMkQnKWI9YS4xMihCLjJFKS4xUCgpOzFPIGI9YS4xMihCLjJGKS4xUCgpOzcgYn01IDFRKGEsYil7YS4yRyhiKTs3IGEuMkgoKX01IDFSKGEsYil7NyBiKyc9JythLjJJKGIpfTUgMVMoYSl7MyBiPScnOzMgYz1hLjJKKCkuMVQoKS4xVSgpO0woYy4xVigpKXszIGQ9Yy4xVygpO2IrPWQuMVgoKSsnPScrZC4xWSgpKyc7J303IGJ9NSAxWihhLGIpezcgYS5HKGIpfTUgMjAoYSl7MyBiPScnOzMgYz1hLjJLKCkuMVQoKS4xVSgpO0woYy4xVigpKXszIGQ9Yy4xVygpO2IrPWQuMVgoKSsnPScrZC4xWSgpKyc7J303IGJ9NSAxaShhKXszIGI9YS4xaignLycpOzkoYS5EKCk9PWIrMSl7YT1hLlYoMCxiKTs3IDFpKGEpfTcgYS5WKDAsYS4xaignLicpKX01IDFrKG8pezJMe0p7MWwsMjF9PW87MyBhPTExKG8pOzMgYj0xaShhLjFmKCkuMjIoKSk7MyBjPXMuMk0oYS4yTigpLjJPKCc7JylbMF0pOzMgZD1iLlYoYi4xaignLycpKzEpKycuJytjO1A9SCgxbCk/MWwrditkOncrJ1x1NGUwYlx1OGY3ZCcrditkOzMgZj1hLjJQKCk7MyBnPTggdS4xSC4xSS4xSih1LjFLLjFMLDJRKTszIGg9MDszIGk9OCB0LjJSKCk7TCgoaD1mLk4oZykpIT0tMSl7aS5GKGcsMCxoKX0zIGo9OCB0LlQoUCk7MTAoaik7MyBrPTggdC4yUyhqKTtrLkYoaS4yVCgpKTs5KDIxPT09MWUpNyBQO1EoJ1x1NGUwYlx1OGY3ZFx1NjIxMFx1NTI5Zlx1ZmYwY1x1OGRlZlx1NWY4NDonK1ApOzcgUH0yVShlKXsxNChlKTtRKCdcdTRlMGJcdThmN2RcdTU5MzFcdThkMjUsXHU4YmY3XHU2MjUzXHU1ZjAwXHU4YzAzXHU4YmQ1XHU1M2YwXHU2N2U1XHU3NzBiXHU1MTc3XHU0ZjUzXHU1ZjAyXHU1ZTM4XHU0ZmUxXHU2MDZmJyl9MlZ7OShpIT1JKWkuTSgpOzkoayE9SSlrLk0oKTs5KGYhPUkpZi5NKCl9fTMgQz1yLjJXKEUoKS5VLHIuMlgpOzUgMW0oYSxiKXszIGM9Qy4xbigpO2MuMlkoYSxiKTtjLjFvKCl9NSAxcChhLGIpezcgQy4yWihhLGIpfTUgMXEoYSl7MyBjPUMuMW4oKTtjLjMwKGEpO2MuMW8oKX01IDIzKCl7MyBjPUMuMW4oKTtjLjMxKCk7Yy4xbygpfTUgJCgpezMgYT0xNS5EOzMyKGEpezI0IDE6NyAxNigxNVswXSk7MjQgMjo3IDMzKDE1WzBdLDE1WzFdKTszNDo3IDM1KCl9fTUgMTQoZSl7SChlKT9cdTYyYTVcdTk1MTkoZSk6XHU2MmE1XHU5NTE5KGUuMjIoKSl9NSBRKGEpe3EuaC5iKGEpfTUgMXIoKXs4IFIuMXouMzYuMzcoKS4zOCg0KX01IDFCKCl7NyByLjM5KEkpLjNhKCl9NSAxNyhhKXtTLjFBLjNiLjE3KGEpfTUgRSgpe289e307by5VPTFzKDE2KCcxdCcpLCcuMXUoVSkudCgpJyk7by4yNT0xcygxNignMXQnKSwnLjF1KDI1KS50KCknKTtvLjE4PTFzKDE2KCcxdCcpLCcuMXUoMTgpLnQoKScpOzcgb302LjNjPW07Ni5OPU47Ni5GPUY7Ni4xNz0xNzs2Llc9Vzs2Llg9WDs2Llk9WTs2LjFyPTFyOzYuSD1IOzYuMTE9MTE7Ni4zZD0xUTs2LjNlPTFSOzYuM2Y9MVM7Ni4zZz0xWjs2LjNoPTIwOzYuMWs9MWs7Ni5FPUU7Ni5RPVE7Ni4xND0xNDs2LjFtPTFtOzYuMXA9MXA7Ni4xcT0xcTs2LjNpPTIzOzYuJD0kOzI2LjY9Nn0uMUYoMjYpKTsiLAo2MiwyMDUsIiAgIHZhciAgZnVuY3Rpb24gXyByZXR1cm4gbmV3IGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIGluZm8gd3JpdGUgaGVhZGVyIGlzU3RyaW5nIG51bGwgbGV0IGluZGV4IHdoaWxlIGNsb3NlIHJlYWQgcGFyYW1zIHNhdmVwYXRoIHRvYXN0IFBhY2thZ2VzIGphdmEgRmlsZSBzaWduIHN1YnN0cmluZyB0aHJlYWQgc3VibWl0IGNodW5rIGxpc3QgbWtkaXJzIGh0dHAgbWV0aG9kIHRydWUgZXJyb3IgYXJndW1lbnRzIGdldFZhciBzbGVlcCBuYW1lIGlzT2JqZWN0IHR5cGUgcmVzIHB1c2ggZm9yIGZhbHNlIHVybCBqc29uIHJlIHRyaW1VIGxhc3RJbmRleE9mIGRvd25sb2FkIHNldHBhdGggcHV0U3AgZWRpdCBjb21taXQgZ2V0U3AgY2xlYXJTcCBiYWNrIGUyUmV4IFFNSU5GTyBnZXQgY24gbWJyb3dzZXIgY29uZmlnIEFwcCBhbmRyb2lkIGxhbmcgcGF0aCB2YWwgdHlwZW9mIG9iaiBjYWxsIGV4aXN0cyByZWZsZWN0IEFycmF5IG5ld0luc3RhbmNlIEJ5dGUgVFlQRSBmb2xsb3dSZWRpcmVjdHMgaW4gZWxzZSBleGVjdXRlIGh0dHBCb2R5IGh0dHBDb29raWUgaHR0cENvb2tpZXMgZW50cnlTZXQgaXRlcmF0b3IgaGFzTmV4dCBuZXh0IGdldEtleSBnZXRWYWx1ZSBodHRwSGVhZGVyIGh0dHBIZWFkZXJzIHRpcHMgdG9TdHJpbmcgcmVtb3ZlU3AgY2FzZSB2ZXJzaW9uIHRoaXMgYXBwbGljYXRpb25Db250ZXh0IHdlYmtpdCBNaW1lVHlwZU1hcCBnZXRTaW5nbGV0b24gaW8gc2VwYXJhdG9yIHFtIHN0cmluZyBjb25zdCBvYmplY3QgdXRpbCBjb25jdXJyZW50IEV4ZWN1dG9ycyBuZXdDYWNoZWRUaHJlYWRQb29sIEZ1dHVyZVRhc2sgc2xpY2UgZmlsdGVyIGdldFBhcmVudEZpbGUgRmlsZVdyaXRlciBGaWxlSW5wdXRTdHJlYW0gU3RyaW5nIG9yZyBqc291cCBDb25uZWN0aW9uIE1ldGhvZCBKc291cCBjb25uZWN0IGlnbm9yZUNvbnRlbnRUeXBlIG1heEJvZHlTaXplIDEwNDg1NzYwMDAgcmVxdWVzdEJvZHkgZGF0YSBwb3N0IFBPU1QgR0VUIGNoYXJzZXQgYm9keSBjb29raWUgY29va2llcyBoZWFkZXJzIHRyeSBnZXRFeHRlbnNpb25Gcm9tTWltZVR5cGUgY29udGVudFR5cGUgc3BsaXQgYm9keVN0cmVhbSA0MDk2IEJ5dGVBcnJheU91dHB1dFN0cmVhbSBGaWxlT3V0cHV0U3RyZWFtIHRvQnl0ZUFycmF5IGNhdGNoIGZpbmFsbHkgZ2V0U2hhcmVkUHJlZmVyZW5jZXMgTU9ERV9QUklWQVRFIHB1dFN0cmluZyBnZXRTdHJpbmcgcmVtb3ZlIGNsZWFyIHN3aXRjaCBwdXRWYXIgZGVmYXVsdCBnZXRDb2RlIGFwcCBJbnN0cnVtZW50YXRpb24gc2VuZEtleURvd25VcFN5bmMgZ2V0RXh0ZXJuYWxGaWxlc0RpciBnZXRQYXRoIFRocmVhZCBWRVJTSU9OIGJkIGNrIGNrcyBoZCBoZHMgZGVsU3AiLnNwbGl0KCIgIiksCjAse30pKTs=