From f24dc92c1daab17661b45c75abc026c6e08edb3b Mon Sep 17 00:00:00 2001 From: thuhole Date: Sat, 25 Jul 2020 15:27:36 +0000 Subject: [PATCH] 200725232734 --- asset-manifest.json | 8 ++++---- index.html | 2 +- ... precache-manifest.e43112daed80ff17b2ee66a8d3c9e790.js | 8 ++++---- service-worker.js | 2 +- .../js/{main.50ae84bd.chunk.js => main.2255dcc2.chunk.js} | 4 ++-- static/js/main.2255dcc2.chunk.js.map | 1 + static/js/main.50ae84bd.chunk.js.map | 1 - 7 files changed, 13 insertions(+), 13 deletions(-) rename precache-manifest.b7b6b8f31159a60daffb5c0c6a7b27e4.js => precache-manifest.e43112daed80ff17b2ee66a8d3c9e790.js (98%) rename static/js/{main.50ae84bd.chunk.js => main.2255dcc2.chunk.js} (57%) create mode 100644 static/js/main.2255dcc2.chunk.js.map delete mode 100644 static/js/main.50ae84bd.chunk.js.map diff --git a/asset-manifest.json b/asset-manifest.json index 6a0d150..6a0f513 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,15 +1,15 @@ { "files": { "main.css": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/css/main.79dcf351.chunk.css", - "main.js": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/main.50ae84bd.chunk.js", - "main.js.map": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/main.50ae84bd.chunk.js.map", + "main.js": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/main.2255dcc2.chunk.js", + "main.js.map": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/main.2255dcc2.chunk.js.map", "runtime-main.js": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/runtime-main.4687ccd5.js", "runtime-main.js.map": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/runtime-main.4687ccd5.js.map", "static/css/2.f2d92645.chunk.css": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/css/2.f2d92645.chunk.css", "static/js/2.c92cdfa8.chunk.js": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/2.c92cdfa8.chunk.js", "static/js/2.c92cdfa8.chunk.js.map": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/2.c92cdfa8.chunk.js.map", "index.html": "./index.html", - "precache-manifest.b7b6b8f31159a60daffb5c0c6a7b27e4.js": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/precache-manifest.b7b6b8f31159a60daffb5c0c6a7b27e4.js", + "precache-manifest.e43112daed80ff17b2ee66a8d3c9e790.js": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/precache-manifest.e43112daed80ff17b2ee66a8d3c9e790.js", "service-worker.js": "./service-worker.js", "static/css/2.f2d92645.chunk.css.map": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/css/2.f2d92645.chunk.css.map", "static/css/main.79dcf351.chunk.css.map": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/css/main.79dcf351.chunk.css.map", @@ -21,6 +21,6 @@ "static/css/2.f2d92645.chunk.css", "static/js/2.c92cdfa8.chunk.js", "static/css/main.79dcf351.chunk.css", - "static/js/main.50ae84bd.chunk.js" + "static/js/main.2255dcc2.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index 42ece78..fa9cb26 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -T大树洞
\ No newline at end of file +T大树洞
\ No newline at end of file diff --git a/precache-manifest.b7b6b8f31159a60daffb5c0c6a7b27e4.js b/precache-manifest.e43112daed80ff17b2ee66a8d3c9e790.js similarity index 98% rename from precache-manifest.b7b6b8f31159a60daffb5c0c6a7b27e4.js rename to precache-manifest.e43112daed80ff17b2ee66a8d3c9e790.js index 8bd146b..2ca4e26 100644 --- a/precache-manifest.b7b6b8f31159a60daffb5c0c6a7b27e4.js +++ b/precache-manifest.e43112daed80ff17b2ee66a8d3c9e790.js @@ -1,6 +1,6 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ { - "revision": "ff19fdea5cae12f6b44489acf11c3b2d", + "revision": "26c409f5fdb2250ead28f8453cbc4424", "url": "./index.html" }, { @@ -8,7 +8,7 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/css/2.f2d92645.chunk.css" }, { - "revision": "bc43142a4c0aa951185d", + "revision": "ee0df7e883fd607a157e", "url": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/css/main.79dcf351.chunk.css" }, { @@ -20,8 +20,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/2.c92cdfa8.chunk.js.LICENSE.txt" }, { - "revision": "bc43142a4c0aa951185d", - "url": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/main.50ae84bd.chunk.js" + "revision": "ee0df7e883fd607a157e", + "url": "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/static/js/main.2255dcc2.chunk.js" }, { "revision": "cf05fc4acca188c8036e", diff --git a/service-worker.js b/service-worker.js index 1d22f23..d2f8fb9 100644 --- a/service-worker.js +++ b/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://cdn.jsdelivr.net/npm/workbox-cdn@4.3.1/workbox/workbox-sw.js"); importScripts( - "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/precache-manifest.b7b6b8f31159a60daffb5c0c6a7b27e4.js" + "https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages-master/precache-manifest.e43112daed80ff17b2ee66a8d3c9e790.js" ); self.addEventListener('message', (event) => { diff --git a/static/js/main.50ae84bd.chunk.js b/static/js/main.2255dcc2.chunk.js similarity index 57% rename from static/js/main.50ae84bd.chunk.js rename to static/js/main.2255dcc2.chunk.js index 56bf817..c532e1d 100644 --- a/static/js/main.50ae84bd.chunk.js +++ b/static/js/main.2255dcc2.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonpwebhole=this.webpackJsonpwebhole||[]).push([[0],{137:function(e,t){},156:function(e,t,n){},434:function(e,t,n){},436:function(e,t,n){},437:function(e,t,n){},446:function(e,t,n){},447:function(e,t,n){},448:function(e,t,n){},449:function(e,t,n){},450:function(e,t,n){"use strict";n.r(t);var a=n(0),o=n.n(a),r=n(10),i=n.n(r),s=(n(91),n(1)),c=n(2),l=n(5),u=n(4),h=n(3),p=n(12),d=n(24),m=n(15),f=n(7),g=n.n(f),b=n(9),v=n(25),E=n.n(v),_=function(){function e(){Object(s.a)(this,e),this.names={},this.current_h=Math.random()}return Object(c.a)(e,[{key:"get",value:function(e){return"\u6d1e\u4e3b"===(e=e.toLowerCase())?["hsl(0,0%,97%)","hsl(0,0%,16%)"]:(this.names[e]||(this.current_h+=.618033988749895,this.current_h%=1,this.names[e]=["hsl(".concat(360*this.current_h,", 50%, 90%)"),"hsl(".concat(360*this.current_h,", 60%, 20%)")]),this.names[e])}}]),e}(),w=/(^|[^\d\u20e3\ufe0e\ufe0f])(#\d{1,7})(?![\d\u20e3\ufe0e\ufe0f])/g,k=/((?:https?:\/\/)?thuhole\.com\/?#(?:#|%23)(\d{1,7}))(?!\d|\u20e3|\ufe0e|\ufe0f)/g,A=/(^|[^A-Za-z])((?:(?:Angry|Baby|Crazy|Diligent|Excited|Fat|Greedy|Hungry|Interesting|Jolly|Kind|Little|Magic|Na\xefve|Old|PKU|Quiet|Rich|Superman|Tough|Undefined|Valuable|Wifeless|Xiangbuchulai|Young|Zombie)\s)?(?:Alice|Bob|Carol|Dave|Eve|Francis|Grace|Hans|Isabella|Jason|Kate|Louis|Margaret|Nathan|Olivia|Paul|Queen|Richard|Susan|Thomas|Uma|Vivian|Winnie|Xander|Yasmine|Zach)|You Win(?: \d+)?|\u6d1e\u4e3b)(?![A-Za-z])/gi,y=/(^|[^.@a-zA-Z0-9_])((?:https?:\/\/)?(?:(?:[\w-]+\.)+[a-zA-Z]{2,3}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::\d{1,5})?(?:\/[\w~!@#$%^&*()\-_=+[\]{};:,./?|]*)?)(?![a-zA-Z0-9])/gi;function O(e,t){return e=[[null,e]],t.forEach((function(t){var n=Object(p.a)(t,2),a=n[0],o=n[1];e=[].concat.apply([],e.map((function(e){var t=Object(p.a)(e,2),n=t[0],r=t[1];return n?[e]:r.split(o).map((function(e){return o.test(e)?[a,e]:[null,e]})).filter((function(e){var t=Object(p.a)(e,2),n=t[0],a=t[1];return null!==n||a}))})))})),e}var x=n(71),N=n.n(x),C=n(72),j=n.n(C),S=n(73),I=n.n(S),D=(n(96),n(97),n(74)),U=n.n(D),R=n(75),H=n.n(R),T=n(76),L=n.n(T),Q=n(77),M=n.n(Q),P=n(78),G=n.n(P),X=n(79),F=n.n(X),V=(n(98),n(99),n(80)),W=n.n(V);function B(e){if(!e.ok)throw Error("\u7f51\u7edc\u9519\u8bef ".concat(e.status," ").concat(e.statusText));return e.text().then((function(e){try{return JSON.parse(e)}catch(t){throw console.error("json parse error"),console.trace(t),console.log(e),new SyntaxError("JSON Parse Error "+e.substr(0,50))}}))}function Y(){return"&PKUHelperAPI=3.0&jsapiver="+encodeURIComponent("v0.3.1.128-"+2*Math.floor(+new Date/72e5))}var K=n(38);function z(e){return e<10?"0"+e:""+e}function q(e){return"".concat(e.getMonth()+1,"-").concat(z(e.getDate())," ").concat(e.getHours(),":").concat(z(e.getMinutes()),":").concat(z(e.getSeconds()))}var Z=I()(j.a);function J(e){var t=new Date(1e3*e.stamp);return o.a.createElement("span",{className:"time-str"},o.a.createElement(N.a,{date:t,formatter:Z,title:t.toLocaleString("zh-CN",{timeZone:"Asia/Shanghai",hour12:!1})}),"\xa0",e.short?null:q(t))}function $(e){return o.a.createElement("p",{className:"centered-line title-line aux-margin"},o.a.createElement("span",{className:"black-outline"},e.text))}U.a,H.a,L.a,M.a,G.a,F.a,W.a;var ee=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={loading_status:"idle",recaptcha_verified:!1},a.username_ref=o.a.createRef(),a.password_ref=o.a.createRef(),a.input_token_ref=o.a.createRef(),a.popup_anchor=document.getElementById("pkuhelper_login_popup_anchor"),a.popup_anchor||(a.popup_anchor=document.createElement("div"),a.popup_anchor.id="pkuhelper_login_popup_anchor",document.body.appendChild(a.popup_anchor)),a}return Object(c.a)(n,[{key:"do_sendcode",value:function(e){var t=this;this.state.recaptcha_verified?"loading"!==this.state.loading_status&&this.setState({loading_status:"loading"},(function(){fetch("https://thuhole.com/api_xmcp/login/send_code?user="+encodeURIComponent(t.username_ref.current.value)+"&code_type="+encodeURIComponent(e)+"&recaptcha_token="+localStorage.recaptcha+Y(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({excluded_scopes:[]})}).then(B).then((function(e){if(console.log(e),!e.success)throw new Error(JSON.stringify(e));alert(e.msg),t.setState({loading_status:"done"})})).catch((function(e){console.error(e),alert("\u53d1\u9001\u5931\u8d25\n"+e),t.setState({loading_status:"done"})}))})):alert("reCAPTCHA\u98ce\u63a7\u7cfb\u7edf\u6b63\u5728\u8bc4\u4f30\u60a8\u7684\u6d4f\u89c8\u5668\u5b89\u5168\u72b6\u6001\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002")}},{key:"do_login",value:function(e){var t=this;"loading"!==this.state.loading_status&&this.setState({loading_status:"loading"},(function(){fetch("https://thuhole.com/api_xmcp/login/login?user="+encodeURIComponent(t.username_ref.current.value)+"&valid_code="+encodeURIComponent(t.password_ref.current.value)+Y(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({excluded_scopes:[]})}).then(B).then((function(n){if(0!==n.code){if(n.msg)throw new Error(n.msg);throw new Error(JSON.stringify(n))}e(n.user_token),alert("\u767b\u5f55\u6210\u529f"),t.setState({loading_status:"done"}),t.props.on_close()})).catch((function(e){console.error(e),alert("\u767b\u5f55\u5931\u8d25\n"+e),t.setState({loading_status:"done"})}))}))}},{key:"do_input_token",value:function(e){var t=this;if("loading"!==this.state.loading_status){var n=this.input_token_ref.current.value;this.setState({loading_status:"loading"},(function(){fetch("https://thuhole.com/api_xmcp/hole/system_msg?user_token="+encodeURIComponent(n)+Y()).then((function(e){return e.json()})).then((function(a){if(a.error)throw new Error(a.error);if(0===a.result.length)throw new Error("result check failed");t.setState({loading_status:"done"}),e(n),t.props.on_close()})).catch((function(e){alert("Token\u68c0\u9a8c\u5931\u8d25\n"+e),t.setState({loading_status:"done"}),console.error(e)}))}))}}},{key:"render",value:function(){var e=this;return i.a.createPortal(o.a.createElement(K.b,{reCaptchaKey:"6Leq0a0ZAAAAAHEStocsqtJfKEs9APB0LdgzTNfZ",useRecaptchaNet:!0},o.a.createElement(K.a,{onVerify:function(t){e.setState({recaptcha_verified:!0}),localStorage.recaptcha=t}}),o.a.createElement("div",null,o.a.createElement("div",{className:"thuhole-login-popup-shadow"}),o.a.createElement("div",{className:"thuhole-login-popup"},o.a.createElement("p",null,o.a.createElement("b",null,"\u63a5\u6536\u9a8c\u8bc1\u7801\u6765\u767b\u5f55 T\u5927\u6811\u6d1e")),o.a.createElement("p",null,o.a.createElement("label",null,"\u3000\u90ae\u7bb1\xa0",o.a.createElement("input",{ref:this.username_ref,type:"email",autoFocus:!0,defaultValue:"@mails.tsinghua.edu.cn"})),o.a.createElement("span",{className:"thuhole-login-type"},o.a.createElement("a",{onClick:function(t){return e.do_sendcode("mail")}},"\xa0\u53d1\u9001\u90ae\u4ef6\xa0"))),o.a.createElement("p",null,o.a.createElement("label",null,"\u9a8c\u8bc1\u7801\xa0",o.a.createElement("input",{ref:this.password_ref,type:"tel"})),o.a.createElement("button",{type:"button",disabled:"loading"===this.state.loading_status,onClick:function(t){return e.do_login(e.props.token_callback)}},"\u767b\u5f55")),o.a.createElement("hr",null),o.a.createElement("p",null,o.a.createElement("b",null,"\u4ece\u5176\u4ed6\u8bbe\u5907\u5bfc\u5165\u767b\u5f55\u72b6\u6001")),o.a.createElement("p",null,o.a.createElement("input",{ref:this.input_token_ref,placeholder:"User Token"}),o.a.createElement("button",{type:"button",disabled:"loading"===this.state.loading_status,onClick:function(t){return e.do_input_token(e.props.token_callback)}},"\u5bfc\u5165")),o.a.createElement("hr",null),o.a.createElement("p",{style:{fontSize:11}},"This site is protected by reCAPTCHA and the Google ",o.a.createElement("a",{href:"https://policies.google.com/privacy"},"Privacy Policy")," and ",o.a.createElement("a",{href:"https://policies.google.com/terms"},"Terms of Service")," apply."),o.a.createElement("p",null,o.a.createElement("button",{onClick:this.props.on_close},"\u53d6\u6d88"))))),this.popup_anchor)}}]),n}(a.Component),te=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={popup_show:!1},a.on_popup_bound=a.on_popup.bind(Object(l.a)(a)),a.on_close_bound=a.on_close.bind(Object(l.a)(a)),a}return Object(c.a)(n,[{key:"on_popup",value:function(){this.setState({popup_show:!0})}},{key:"on_close",value:function(){this.setState({popup_show:!1})}},{key:"render",value:function(){return o.a.createElement(o.a.Fragment,null,this.props.children(this.on_popup_bound),this.state.popup_show&&o.a.createElement(ee,{token_callback:this.props.token_callback,on_close:this.on_close_bound}))}}]),n}(a.Component),ne=function(){function e(){var t=this;Object(s.a)(this,e),this.db=null,this.added_items_since_maintenance=0,this.encrypt=this.encrypt.bind(this),this.decrypt=this.decrypt.bind(this);var n=indexedDB.open("hole_cache_db",1);n.onerror=console.error.bind(console),n.onupgradeneeded=function(e){console.log("comment cache db upgrade"),e.target.result.createObjectStore("comment",{keyPath:"pid"}).createIndex("last_access","last_access",{unique:!1})},n.onsuccess=function(e){console.log("comment cache db loaded"),t.db=e.target.result,setTimeout(t.maintenance.bind(t),1)}}return Object(c.a)(e,[{key:"encrypt",value:function(e,t){for(var n=JSON.stringify(t),a="",o=0,r=(42^e)%128;o1e3?(console.log("comment cache db maintenance",a),t.index("last_access").openKeyCursor().onsuccess=function(e){var n=e.target.result;n&&(t.delete(n.primaryKey),--a>1e3&&n.continue())}):console.log("comment cache db no need to maintenance",a),e.added_items_since_maintenance=0},n.onerror=console.error.bind(console)}}},{key:"clear",value:function(){this.db&&(indexedDB.deleteDatabase("hole_cache_db"),console.log("delete comment cache db"))}}]),e}();function ae(){return window.hole_cache||(window.hole_cache=new ne),window.hole_cache}function oe(e){return Y()+(e?"&user_token="+e:"")}var re=function(){var e=Object(b.a)(g.a.mark((function e(t){var n,a,o=arguments;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=o.length>1&&void 0!==o[1]&&o[1],e.next=3,B(t);case 3:if(0===(a=e.sent).code){e.next=14;break}if(!a.msg){e.next=13;break}if(!n){e.next=10;break}alert(a.msg),e.next=11;break;case 10:throw new Error(a.msg);case 11:e.next=14;break;case 13:throw new Error(JSON.stringify(a));case 14:return e.abrupt("return",a);case 15:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),ie=function(e,t){return e.sort((function(e,t){return parseInt(e.cid,10)-parseInt(t.cid,10)})).map((function(e){return e._display_color=t.get(e.name),e.variant={},e}))},se={load_replies:function(){var e=Object(b.a)(g.a.mark((function e(t,n,a,o){var r,i;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=parseInt(t),e.next=3,fetch(ve+"/api.php?action=getcomment&pid="+t+oe(n));case 3:return r=e.sent,e.next=6,re(r);case 6:return i=e.sent,ae().put(t,o,i),i.data=ie(i.data,a),e.abrupt("return",i);case 10:case"end":return e.stop()}}),e)})));return function(t,n,a,o){return e.apply(this,arguments)}}(),load_replies_with_cache:function(){var e=Object(b.a)(g.a.mark((function e(t,n,a,o){var r;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=parseInt(t),e.next=3,ae().get(t,o);case 3:if(!(r=e.sent)){e.next=9;break}return r.data=ie(r.data,a),e.abrupt("return",{data:r,cached:!0});case 9:return e.next=11,se.load_replies(t,n,a,o);case 11:return r=e.sent,e.abrupt("return",{data:r,cached:!r});case 13:case"end":return e.stop()}}),e)})));return function(t,n,a,o){return e.apply(this,arguments)}}(),set_attention:function(){var e=Object(b.a)(g.a.mark((function e(t,n,a){var o,r;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(o=new URLSearchParams).append("user_token",a),o.append("pid",t),o.append("switch",n?"1":"0"),e.next=6,fetch(ve+"/api.php?action=attention"+oe(a),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:o});case 6:return r=e.sent,ae().delete(t),e.abrupt("return",re(r,!0));case 9:case"end":return e.stop()}}),e)})));return function(t,n,a){return e.apply(this,arguments)}}(),report:function(){var e=Object(b.a)(g.a.mark((function e(t,n,a){var o,r;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(o=new URLSearchParams).append("user_token",a),o.append("pid",t),o.append("reason",n),e.next=6,fetch(ve+"/api.php?action=report"+oe(a),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:o});case 6:return r=e.sent,e.abrupt("return",re(r,!0));case 8:case"end":return e.stop()}}),e)})));return function(t,n,a){return e.apply(this,arguments)}}(),get_list:function(){var e=Object(b.a)(g.a.mark((function e(t,n){var a;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(ve+"/api.php?action=getlist&p="+t+oe(n));case 2:return a=e.sent,e.abrupt("return",re(a));case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),get_search:function(){var e=Object(b.a)(g.a.mark((function e(t,n,a){var o;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(ve+"/api.php?action=search&pagesize=50&page="+t+"&keywords="+encodeURIComponent(n)+oe(a));case 2:return o=e.sent,e.abrupt("return",re(o));case 4:case"end":return e.stop()}}),e)})));return function(t,n,a){return e.apply(this,arguments)}}(),get_single:function(){var e=Object(b.a)(g.a.mark((function e(t,n){var a;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(ve+"/api.php?action=getone&pid="+t+oe(n));case 2:return a=e.sent,e.abrupt("return",re(a));case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),get_attention:function(){var e=Object(b.a)(g.a.mark((function e(t){var n;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(ve+"/api.php?action=getattention"+oe(t));case 2:return n=e.sent,e.abrupt("return",re(n));case 4:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()},ce=n(39),le=n.n(ce),ue=(n(156),n(81)),he=n.n(ue),pe=n(82),de=n.n(pe),me=n(40),fe=n.n(me),ge=(n(433),n(434),n(435),new he.a({html:!1,linkify:!1,breaks:!0,inline:!0,highlight:function(e,t){if(t&&fe.a.getLanguage(t))try{return'
'+fe.a.highlight(t,e,!0).value+"
"}catch(n){}return'
'+ge.utils.escapeHtml(e)+"
"}}).use(de.a,{throwOnError:!1,errorColor:"#aa0000"})),be=function(e){return ge.render(e)},ve="https://thuhole.com/services/thuhole";function Ee(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _e(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:" ",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"g",a=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(!a)return e?new RegExp("(".concat(e.split(t).filter((function(e){return!!e})).map(Ee).join("|"),")"),n):/^$/g;try{return new RegExp("("+e.slice(1,-1)+")",n)}catch(o){return/^$/g}}function we(e){return o.a.createElement("span",{className:"colored-span",style:{"--coloredspan-bgcolor-light":e.colors[0],"--coloredspan-bgcolor-dark":e.colors[1]}},e.children)}function ke(e){return/^https?:\/\//.test(e)?e:"http://"+e}a.PureComponent;var Ae=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(){return Object(s.a)(this,n),t.apply(this,arguments)}return Object(c.a)(n,[{key:"render",value:function(){var e=this.props,t=[{shouldProcessNode:function(e){return"img"===e.name},processNode:function(e,t,n){return o.a.createElement("div",{key:n},"[\u56fe\u7247]")}},{shouldProcessNode:function(e){return/^h[123456]$/.test(e.name)},processNode:function(e,t,n){var a=+e.name[1];a<3&&(a=3);var r="h".concat(a);return o.a.createElement(r,{key:n},t)}},{shouldProcessNode:function(e){return"a"===e.name},processNode:function(e,t,n){return o.a.createElement("a",{href:ke(e.attribs.href),target:"_blank",rel:"noopenner noreferrer",className:"ext-link",key:n},t,o.a.createElement("span",{className:"icon icon-new-tab"}))}},{shouldProcessNode:function(e){return"text"===e.type&&(!e.parent||!e.parent.attribs||"application/x-tex"!==e.parent.attribs.encoding)},processNode:function(t,n,a){var r=O(t.data,[["url_pid",k],["url",y],["pid",w],["nickname",A]]);return o.a.createElement(o.a.Fragment,{key:a},r.map((function(t,n){var a=Object(p.a)(t,2),r=a[0],i=a[1];return o.a.createElement("span",{key:n},"url_pid"===r?o.a.createElement("span",{className:"url-pid-link",title:i},"/##"):"url"===r?o.a.createElement("a",{href:ke(i),className:"ext-link",target:"_blank",rel:"noopener noreferrer"},i,o.a.createElement("span",{className:"icon icon-new-tab"})):"pid"===r?o.a.createElement("a",{href:"#"+i,onClick:function(t){t.preventDefault(),e.show_pid(i.substring(1))}},i):"nickname"===r?o.a.createElement(we,{colors:e.color_picker.get(i)},i):"search"===r?o.a.createElement("span",{className:"search-query-highlight"},i):i)})))}},{shouldProcessNode:function(){return!0},processNode:new le.a.ProcessNodeDefinitions(o.a).processDefaultNode}],n=new le.a.Parser;if(e.author&&e.text.match(/^(?:#+ |>|```|\t|\s*-|\s*\d+\.)/)){var a=be(e.text);return o.a.createElement(o.a.Fragment,null,e.author,n.parseWithInstructions(a,(function(e){return"script"!==e.type}),t)||"")}var r=e.text;e.author&&(r=e.author+" "+r);var i=be(r);return n.parseWithInstructions(i,(function(e){return"script"!==e.type}),t)||null}}]),n}(a.Component);window.TEXTAREA_BACKUP={};var ye=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={text:""},a.on_change_bound=a.on_change.bind(Object(l.a)(a)),a.on_keydown_bound=a.on_keydown.bind(Object(l.a)(a)),a.clear=a.clear.bind(Object(l.a)(a)),a.area_ref=o.a.createRef(),a.change_callback=e.on_change||function(){},a.submit_callback=e.on_submit||function(){},a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){var e=this;this.setState({text:window.TEXTAREA_BACKUP[this.props.id]||""},(function(){e.change_callback(e.state.text)}))}},{key:"componentWillUnmount",value:function(){window.TEXTAREA_BACKUP[this.props.id]=this.state.text,this.change_callback(this.state.text)}},{key:"on_change",value:function(e){this.setState({text:e.target.value}),this.change_callback(e.target.value)}},{key:"on_keydown",value:function(e){"Enter"===e.key&&e.ctrlKey&&!e.altKey&&(e.preventDefault(),this.submit_callback())}},{key:"clear",value:function(){this.setState({text:""})}},{key:"set",value:function(e){this.change_callback(e),this.setState({text:e})}},{key:"get",value:function(){return this.state.text}},{key:"focus",value:function(){this.area_ref.current.focus()}},{key:"render",value:function(){return o.a.createElement("textarea",{ref:this.area_ref,onChange:this.on_change_bound,value:this.state.text,onKeyDown:this.on_keydown_bound})}}]),n}(a.Component),Oe=null;function xe(e){var t=/iPhone|iPad|iPod/i.test(window.navigator.userAgent);return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone?null:t?navigator.standalone?null:o.a.createElement("div",{className:"box promotion-bar"},o.a.createElement("span",{className:"icon icon-about"}),"\xa0 \u7528 Safari \u628a\u6811\u6d1e ",o.a.createElement("b",null,"\u6dfb\u52a0\u5230\u4e3b\u5c4f\u5e55")," \u66f4\u597d\u7528"):Oe?o.a.createElement("div",{className:"box promotion-bar"},o.a.createElement("span",{className:"icon icon-about"}),"\xa0 \u628a\u7f51\u9875\u7248\u6811\u6d1e"," ",o.a.createElement("b",null,o.a.createElement("a",{onClick:function(){Oe&&Oe.prompt()}},"\u5b89\u88c5\u5230\u684c\u9762"))," ","\u66f4\u597d\u7528"):null}window.addEventListener("beforeinstallprompt",(function(e){console.log("pwa: received before install prompt"),Oe=e}));var Ne=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={moved:!0,init_y:0,init_x:0},a.on_begin_bound=a.on_begin.bind(Object(l.a)(a)),a.on_move_bound=a.on_move.bind(Object(l.a)(a)),a.on_end_bound=a.on_end.bind(Object(l.a)(a)),a.MOVE_THRESHOLD=3,a.last_fire=0,a}return Object(c.a)(n,[{key:"on_begin",value:function(e){this.setState({moved:!1,init_y:(e.touches?e.touches[0]:e).screenY,init_x:(e.touches?e.touches[0]:e).screenX})}},{key:"on_move",value:function(e){this.state.moved||Math.abs((e.touches?e.touches[0]:e).screenY-this.state.init_y)+Math.abs((e.touches?e.touches[0]:e).screenX-this.state.init_x)>this.MOVE_THRESHOLD&&this.setState({moved:!0})}},{key:"on_end",value:function(e){this.state.moved||this.do_callback(e),this.setState({moved:!0})}},{key:"do_callback",value:function(e){this.last_fire+100>+new Date||(this.last_fire=+new Date,this.props.callback(e))}},{key:"render",value:function(){return o.a.createElement("div",{onTouchStart:this.on_begin_bound,onMouseDown:this.on_begin_bound,onTouchMove:this.on_move_bound,onMouseMove:this.on_move_bound,onClick:this.on_end_bound},this.props.children)}}]),n}(a.PureComponent);n(436);function Ce(e,t,n,a){a=a||!1,e.addEventListener?e.addEventListener(t,n,a):e.attachEvent&&e.attachEvent("on".concat(t),(function(t){n.call(e,t||window.event)}))}function je(e,t,n,a){a=a||!1,e.removeEventListener?e.removeEventListener(t,n,a):e.detachEvent&&e.detachEvent("on".concat(t),n)}var Se=function(e){if(!(e instanceof HTMLElement))return document.documentElement;for(var t="absolute"===e.style.position,n=/(scroll|auto)/,a=e;a;){if(!a.parentNode)return e.ownerDocument||document.documentElement;var o=window.getComputedStyle(a),r=o.position,i=o.overflow,s=o["overflow-x"],c=o["overflow-y"];if("static"===r&&t)a=a.parentNode;else{if(n.test(i)&&n.test(s)&&n.test(c))return a;a=a.parentNode}}return e.ownerDocument||e.documentElement||document.documentElement};var Ie=0,De=0,Ue="data-lazyload-listened",Re=[],He=[],Te=!1;try{var Le=Object.defineProperty({},"passive",{get:function(){Te=!0}});window.addEventListener("test",null,Le)}catch(Rt){}var Qe,Me=!!Te&&{capture:!1,passive:!0},Pe=function(e){var t=i.a.findDOMNode(e);if(t instanceof HTMLElement){var n=Se(t);(e.props.overflow&&n!==t.ownerDocument&&n!==document&&n!==document.documentElement?function(e,t){var n,a,o=i.a.findDOMNode(e);try{var r=t.getBoundingClientRect();n=r.top,a=r.height}catch(Rt){n=Ie,a=De}var s,c,l=window.innerHeight||document.documentElement.clientHeight,u=Math.max(n,0),h=Math.min(l,n+a)-u;try{var p=o.getBoundingClientRect();s=p.top,c=p.height}catch(Rt){s=Ie,c=De}var d=s-u,m=Array.isArray(e.props.offset)?e.props.offset:[e.props.offset,e.props.offset];return d-m[0]<=h&&d+c+m[1]>=0}(e,n):function(e){var t,n,a=i.a.findDOMNode(e);if(!(a.offsetWidth||a.offsetHeight||a.getClientRects().length))return!1;try{var o=a.getBoundingClientRect();t=o.top,n=o.height}catch(Rt){t=Ie,n=De}var r=window.innerHeight||document.documentElement.clientHeight,s=Array.isArray(e.props.offset)?e.props.offset:[e.props.offset,e.props.offset];return t-s[0]<=r&&t+n+s[1]>=0}(e))?e.state.visible&&!e.state.hidden||(e.props.once&&He.push(e),e.setState({visible:!0,hidden:!1})):e.props.once||(e.props.unmountIfInvisible?!0===e.visible&&e.setState({visible:!1}):e.props.hiddenIfInvisible&&!1===e.state.hidden&&e.setState({hidden:!0}))}},Ge=function(){for(var e=0;e=0?a=setTimeout(c,t-l):(a=null,n||(s=e.apply(r,o),a||(r=null,o=null)))};return function(){r=this,o=arguments,i=+new Date;var l=n&&!a;return a||(a=setTimeout(c,t)),l&&(s=e.apply(r,o),r=null,o=null),s}}(Ge,"number"===typeof this.props.debounce?this.props.debounce:300),Qe="debounce"):void 0!==this.props.throttle?(Xe=function(e,t,n){var a,o;return t||(t=250),function(){var r=n||this,i=+new Date,s=arguments;a&&i8e3&&(r=8e3*r/e,e=8e3,i=!0),r>8e3&&(e=8e3*e/r,r=8e3,i=!0),r*e>5e6){var s=Math.sqrt(r*e/5e6);r/=s,e/=s,i=!0}console.log("chosen img size",e,r);var c=document.createElement("canvas"),l=c.getContext("2d");c.width=e,c.height=r,l.drawImage(o,0,0,e,r);for(var u,h,p=.1,d=.9;d-p>=.03;)u=(d+p)/2,h=c.toDataURL("image/jpeg",u),console.log(p,d,"trying quality",u,"size",h.length),h.length<=6e5?p=u:d=u;p>=.101?(console.log("chosen img quality",u),t({img:a(h),quality:u,width:Math.round(e),height:Math.round(r),compressed:i})):n("\u56fe\u7247\u8fc7\u5927\uff0c\u65e0\u6cd5\u4e0a\u4f20")},o.src=e}(e)}))},o.readAsDataURL(e)}))}},{key:"on_img_change",value:function(){var e=this;this.img_ref.current&&this.img_ref.current.files.length?this.setState({img_tip:"\uff08\u6b63\u5728\u5904\u7406\u56fe\u7247\u2026\u2026\uff09"},(function(){e.proc_img(e.img_ref.current.files[0]).then((function(t){e.setState({img_tip:"\uff08".concat(t.compressed?"\u538b\u7f29\u5230":"\u5c3a\u5bf8"," ").concat(t.width,"*").concat(t.height," / ")+"\u8d28\u91cf ".concat(Math.floor(100*t.quality),"% / ").concat(Math.floor(t.img.length/(4/3)/1e3),"KB\uff09")})})).catch((function(t){e.setState({img_tip:"\u56fe\u7247\u65e0\u6548\uff1a".concat(t)})}))})):this.setState({img_tip:null})}},{key:"on_submit",value:function(e){var t=this;e&&e.preventDefault(),"loading"!==this.state.loading_status&&(this.img_ref.current.files.length?(this.setState({loading_status:"processing"}),this.proc_img(this.img_ref.current.files[0]).then((function(e){t.setState({loading_status:"loading"}),t.do_post(t.state.text,e.img)})).catch((function(e){alert(e)}))):(this.setState({loading_status:"loading"}),this.do_post(this.state.text,null)))}},{key:"toggle_preview",value:function(){this.setState({preview:!this.state.preview})}},{key:"render",value:function(){var e=this;return o.a.createElement("form",{onSubmit:this.on_submit.bind(this),className:"post-form box"},o.a.createElement("div",{className:"post-form-bar"},o.a.createElement("label",null,"\u56fe\u7247",o.a.createElement("input",{ref:this.img_ref,type:"file",accept:"image/*",disabled:"done"!==this.state.loading_status,onChange:this.on_img_change_bound})),this.state.preview?o.a.createElement("button",{type:"button",onClick:function(){e.toggle_preview()}},o.a.createElement("span",{className:"icon icon-eye-blocked"}),"\xa0\u7f16\u8f91"):o.a.createElement("button",{type:"button",onClick:function(){e.toggle_preview()}},o.a.createElement("span",{className:"icon icon-eye"}),"\xa0\u9884\u89c8"),"done"!==this.state.loading_status?o.a.createElement("button",{disabled:"disabled"},o.a.createElement("span",{className:"icon icon-loading"}),"\xa0","processing"===this.state.loading_status?"\u5904\u7406":"\u4e0a\u4f20"):o.a.createElement("button",{type:"submit"},o.a.createElement("span",{className:"icon icon-send"}),"\xa0\u53d1\u8868")),!!this.state.img_tip&&o.a.createElement("p",{className:"post-form-img-tip"},o.a.createElement("a",{onClick:function(){e.img_ref.current.value="",e.on_img_change()}},"\u5220\u9664\u56fe\u7247"),this.state.img_tip),this.state.preview?o.a.createElement("div",{className:"post-preview"},o.a.createElement(Ae,{text:this.state.text,color_picker:this.color_picker,show_pid:function(){}})):o.a.createElement(ye,{ref:this.area_ref,id:"new_post",on_change:this.on_change_bound,on_submit:this.on_submit.bind(this)}),o.a.createElement("p",null,o.a.createElement("small",null,"\u8bf7\u9075\u5b88",o.a.createElement("a",{href:"https://thuhole.com/policy.html",target:"_blank"},"\u6811\u6d1e\u7ba1\u7406\u89c4\u8303\uff08\u8bd5\u884c\uff09"),"\uff0c\u6587\u660e\u53d1\u8a00")))}}]),n}(a.Component),ht="https://img.thuhole.com/",pt={a:!0,audio:!0},dt=[],mt=["\u6027\u76f8\u5173","\u653f\u6cbb\u76f8\u5173","\u6027\u8bdd\u9898","\u653f\u6cbb\u8bdd\u9898","\u6298\u53e0","NSFW","\u5237\u5c4f","\u771f\u5b9e\u6027\u53ef\u7591","\u7528\u6237\u4e3e\u62a5\u8f83\u591a","\u4e3e\u62a5\u8f83\u591a","\u91cd\u590d\u5185\u5bb9"];window.LATEST_POST_ID=parseInt(localStorage._LATEST_POST_ID,10)||0;function ft(e,t){return function(){var n=Object(b.a)(g.a.mark((function n(a){var r,i,s,c,l,u,h=arguments;return g.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return r=h.length>1&&void 0!==h[1]&&h[1],i=new _,e(s="\u6811\u6d1e #"+a,o.a.createElement("div",{className:"box box-tip"},"\u6b63\u5728\u52a0\u8f7d #",a),r?"replace":"push"),n.prev=4,n.next=7,se.get_single(a,t);case 7:return(c=n.sent).data.variant={},n.next=11,se.load_replies_with_cache(a,t,i,parseInt(c.data.reply));case 11:l=n.sent,u=l.data,e(s,o.a.createElement(vt,{key:+new Date,info:c.data,replies:u.data,attention:u.attention,token:t,show_sidebar:e,color_picker:i,deletion_detect:"on"===localStorage.DELETION_DETECT}),"replace"),n.next=20;break;case 16:n.prev=16,n.t0=n.catch(4),console.error(n.t0),e(s,o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement("a",{onClick:function(){return ft(e,t)(a,!0)}},"\u91cd\u65b0\u52a0\u8f7d")),o.a.createElement("p",null,""+n.t0)),"replace");case 20:case"end":return n.stop()}}),n,null,[[4,16]])})));return function(e){return n.apply(this,arguments)}}()}var gt=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){return Object(s.a)(this,n),t.call(this,e)}return Object(c.a)(n,[{key:"render",value:function(){var e=this,t=this.props.info.text,n=t.indexOf("]"),a=t.substr(0,n+1),r=t.substr(n+2);return o.a.createElement("div",{className:"flow-reply box",style:this.props.info._display_color?{"--box-bgcolor-light":this.props.info._display_color[0],"--box-bgcolor-dark":this.props.info._display_color[1]}:null},o.a.createElement("div",{className:"box-header"},o.a.createElement("code",{className:"box-id"},"#",this.props.info.cid),!!this.props.do_filter_name&&o.a.createElement("span",{className:"reply-header-badge clickable",onClick:function(){e.props.do_filter_name(e.props.info.name)}},o.a.createElement("span",{className:"icon icon-locate"})),"\xa0",null!==this.props.info.tag&&o.a.createElement("span",{className:"box-header-tag"},this.props.info.tag),o.a.createElement(J,{stamp:this.props.info.timestamp,short:!1})),o.a.createElement("div",{className:"box-content"},o.a.createElement(Ae,{author:a,text:r,color_picker:this.props.color_picker,show_pid:this.props.show_pid})))}}]),n}(a.PureComponent),bt=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){return Object(s.a)(this,n),t.call(this,e)}return Object(c.a)(n,[{key:"copy_link",value:function(e){e.preventDefault(),E()("".concat(e.target.href).concat(this.props.info.tag?" \u3010"+this.props.info.tag+"\u3011":"","\n")+"".concat(this.props.info.text).concat("image"===this.props.info.type?" [\u56fe\u7247]":"audio"===this.props.info.type?" [\u8bed\u97f3]":"","\n")+"\uff08".concat(q(new Date(1e3*this.props.info.timestamp))," ").concat(this.props.info.likenum,"\u5173\u6ce8 ").concat(this.props.info.reply,"\u56de\u590d\uff09\n")+this.props.replies.map((function(e){return(e.tag?"\u3010"+e.tag+"\u3011":"")+e.text})).join("\n"))}},{key:"render",value:function(){var e=this,t=this.props;return o.a.createElement("div",{className:"flow-item"+(t.is_quote?" flow-item-quote":"")},!!t.is_quote&&o.a.createElement("div",{className:"quote-tip black-outline"},o.a.createElement("div",null,o.a.createElement("span",{className:"icon icon-quote"}))),o.a.createElement("div",{className:"box"},!!window.LATEST_POST_ID&&parseInt(t.info.pid,10)>window.LATEST_POST_ID&&o.a.createElement("div",{className:"flow-item-dot"}),!!this.props.attention&&!this.props.cached&&o.a.createElement("div",{className:"flow-item-dot"}),o.a.createElement("div",{className:"box-header"},!!this.props.do_filter_name&&o.a.createElement("span",{className:"reply-header-badge clickable",onClick:function(){e.props.do_filter_name("\u6d1e\u4e3b")}},o.a.createElement("span",{className:"icon icon-locate"})),!!parseInt(t.info.likenum,10)&&o.a.createElement("span",{className:"box-header-badge"},t.info.likenum,"\xa0",o.a.createElement("span",{className:"icon icon-"+(t.attention?"star-ok":"star")})),!!parseInt(t.info.reply,10)&&o.a.createElement("span",{className:"box-header-badge"},t.info.reply,"\xa0",o.a.createElement("span",{className:"icon icon-reply"})),o.a.createElement("code",{className:"box-id"},o.a.createElement("a",{href:"##"+t.info.pid,onClick:this.copy_link.bind(this)},"#",t.info.pid)),"\xa0",null!==t.info.tag&&"\u6298\u53e0"!==t.info.tag&&o.a.createElement("span",{className:"box-header-tag"},t.info.tag),o.a.createElement(J,{stamp:t.info.timestamp,short:!t.img_clickable})),o.a.createElement("div",{className:"box-content"},o.a.createElement(Ae,{text:t.info.text,color_picker:t.color_picker,show_pid:t.show_pid}),"image"===t.info.type&&o.a.createElement("p",{className:"img"},t.img_clickable?o.a.createElement("a",{className:"no-underline",href:ht+t.info.url,target:"_blank"},o.a.createElement("img",{src:ht+t.info.url,onError:function(e){e.target.src===ht+t.info.url&&(e.target.src="https://img2.thuhole.com/"+t.info.url)},alt:ht+t.info.url})):o.a.createElement("img",{src:ht+t.info.url,onError:function(e){e.target.src===ht+t.info.url&&(e.target.src="https://img2.thuhole.com/"+t.info.url)},alt:ht+t.info.url}))),!(!t.attention||!t.info.variant.latest_reply)&&o.a.createElement("p",{className:"box-footer"},"\u6700\u65b0\u56de\u590d"," ",o.a.createElement(J,{stamp:t.info.variant.latest_reply,short:!1}))))}}]),n}(a.PureComponent),vt=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={attention:e.attention,info:e.info,replies:e.replies,loading_status:"done",error_msg:null,filter_name:null,rev:!1},a.color_picker=e.color_picker,a.syncState=e.sync_state||function(){},a.reply_ref=o.a.createRef(),a}return Object(c.a)(n,[{key:"set_variant",value:function(e,t){this.setState((function(n){return e?{replies:n.replies.map((function(n){return n.cid===e?Object.assign({},n,{variant:Object.assign({},n.variant,t)}):n}))}:{info:Object.assign({},n.info,{variant:Object.assign({},n.info.variant,t)})}}),(function(){this.syncState({info:this.state.info,replies:this.state.replies})}))}},{key:"load_replies",value:function(){var e=this,t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.setState({loading_status:"loading",error_msg:null}),se.load_replies(this.state.info.pid,this.props.token,this.color_picker,null).then((function(n){e.setState((function(e,a){return{replies:n.data,info:t?Object.assign({},e.info,{reply:""+n.data.length}):e.info,attention:!!n.attention,loading_status:"done",error_msg:null}}),(function(){e.syncState({replies:e.state.replies,attention:e.state.attention,info:e.state.info}),e.state.replies.length&&e.set_variant(null,{latest_reply:Math.max.apply(null,e.state.replies.map((function(e){return parseInt(e.timestamp)})))})}))})).catch((function(t){console.error(t),e.setState({replies:[],loading_status:"done",error_msg:""+t})}))}},{key:"toggle_attention",value:function(){var e=this;this.setState({loading_status:"loading"});var t=!this.state.attention;se.set_attention(this.state.info.pid,t,this.props.token).then((function(n){e.setState({loading_status:"done",attention:t}),e.syncState({attention:t})})).catch((function(t){e.setState({loading_status:"done"}),alert("\u8bbe\u7f6e\u5173\u6ce8\u5931\u8d25"),console.error(t)}))}},{key:"report",value:function(){var e=prompt("\u4e3e\u62a5 #".concat(this.state.info.pid," \u7684\u7406\u7531\uff1a"));null!==e&&se.report(this.state.info.pid,e,this.props.token).then((function(e){alert("\u4e3e\u62a5\u6210\u529f")})).catch((function(e){alert("\u4e3e\u62a5\u5931\u8d25"),console.error(e)}))}},{key:"set_filter_name",value:function(e){this.setState((function(t){return{filter_name:e===t.filter_name?null:e}}))}},{key:"toggle_rev",value:function(){this.setState((function(e){return{rev:!e.rev}}),Ge)}},{key:"show_reply_bar",value:function(e,t){if(this.reply_ref.current&&!t.target.closest("a, .clickable")){var n=this.reply_ref.current.get();if(/^\s*(?:Re (?:|\u6d1e\u4e3b|(?:[A-Z][a-z]+ )?(?:[A-Z][a-z]+)|You Win(?: \d+)?):)?\s*$/.test(n)){var a="Re "+e+": ";a===this.reply_ref.current.get()?this.reply_ref.current.set(""):this.reply_ref.current.set(a)}}}},{key:"render",value:function(){var e=this;if("loading"===this.state.loading_status)return o.a.createElement("p",{className:"box box-tip"},"\u52a0\u8f7d\u4e2d\u2026\u2026");var t=ft(this.props.show_sidebar,this.props.token),n=this.state.filter_name?this.state.replies.filter((function(t){return t.name===e.state.filter_name})):this.state.replies.slice();this.state.rev&&n.reverse();var a=Object(m.a)({},"\u6d1e\u4e3b",1);n.forEach((function(e){void 0===a[e.name]&&(a[e.name]=0),a[e.name]++}));var r=this.state.filter_name&&"\u6d1e\u4e3b"!==this.state.filter_name?null:o.a.createElement(Ne,{callback:function(t){e.show_reply_bar("",t)}},o.a.createElement(bt,{info:this.state.info,attention:this.state.attention,img_clickable:!0,color_picker:this.color_picker,show_pid:t,replies:this.state.replies,set_variant:function(t){e.set_variant(null,t)},do_filter_name:a["\u6d1e\u4e3b"]>1?this.set_filter_name.bind(this):null}));return o.a.createElement("div",{className:"flow-item-row sidebar-flow-item"},o.a.createElement("div",{className:"box box-tip"},!!this.props.token&&o.a.createElement("span",null,o.a.createElement("a",{onClick:this.report.bind(this)},o.a.createElement("span",{className:"icon icon-flag"}),o.a.createElement("label",null,"\u4e3e\u62a5")),"\xa0\xa0"),o.a.createElement("a",{onClick:this.load_replies.bind(this)},o.a.createElement("span",{className:"icon icon-refresh"}),o.a.createElement("label",null,"\u5237\u65b0")),(this.state.replies.length>=1||this.state.rev)&&o.a.createElement("span",null,"\xa0\xa0",o.a.createElement("a",{onClick:this.toggle_rev.bind(this)},o.a.createElement("span",{className:"icon icon-order-rev"}),o.a.createElement("label",null,this.state.rev?"\u8fd8\u539f":"\u9006\u5e8f"))),!!this.props.token&&o.a.createElement("span",null,"\xa0\xa0",o.a.createElement("a",{onClick:function(){e.toggle_attention()}},this.state.attention?o.a.createElement("span",null,o.a.createElement("span",{className:"icon icon-star-ok"}),o.a.createElement("label",null,"\u5df2\u5173\u6ce8")):o.a.createElement("span",null,o.a.createElement("span",{className:"icon icon-star"}),o.a.createElement("label",null,"\u672a\u5173\u6ce8"))))),!!this.state.filter_name&&o.a.createElement("div",{className:"box box-tip flow-item filter-name-bar"},o.a.createElement("p",null,o.a.createElement("span",{style:{float:"left"}},o.a.createElement("a",{onClick:function(){e.set_filter_name(null)}},"\u8fd8\u539f")),o.a.createElement("span",{className:"icon icon-locate"}),"\xa0\u5f53\u524d\u53ea\u770b\xa0",o.a.createElement(we,{colors:this.color_picker.get(this.state.filter_name)},this.state.filter_name))),!this.state.rev&&r,!!this.state.error_msg&&o.a.createElement("div",{className:"box box-tip flow-item"},o.a.createElement("p",null,"\u56de\u590d\u52a0\u8f7d\u5931\u8d25"),o.a.createElement("p",null,this.state.error_msg)),this.props.deletion_detect&&parseInt(this.state.info.reply)>this.state.replies.length&&!!this.state.replies.length&&o.a.createElement("div",{className:"box box-tip flow-item box-danger"},parseInt(this.state.info.reply)-this.state.replies.length," ","\u6761\u56de\u590d\u88ab\u5220\u9664"),n.map((function(n,r){return o.a.createElement(Ve,{key:r,offset:1500,height:"5em",overflow:!0,once:!0},o.a.createElement(Ne,{callback:function(t){e.show_reply_bar(n.name,t)}},o.a.createElement(gt,{info:n,color_picker:e.color_picker,show_pid:t,set_variant:function(t){e.set_variant(n.cid,t)},do_filter_name:a[n.name]>1?e.set_filter_name.bind(e):null})))})),this.state.rev&&r,this.props.token?o.a.createElement(lt,{pid:this.state.info.pid,token:this.props.token,area_ref:this.reply_ref,on_complete:this.load_replies.bind(this)}):o.a.createElement("div",{className:"box box-tip flow-item"},"\u767b\u5f55\u540e\u53ef\u4ee5\u56de\u590d\u6811\u6d1e"))}}]),n}(a.PureComponent),Et=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).needFold=mt.indexOf(e.info.tag)>-1&&("\u70ed\u699c"===e.search_param||!e.search_param)&&window.config.fold,a.state={replies:[],reply_status:"done",reply_error:null,info:Object.assign({},e.info,{variant:{}}),hidden:window.config.block_words.some((function(t){return e.info.text.includes(t)}))||a.needFold,attention:null!==e.attention_override&&e.attention_override,cached:!0},a.color_picker=new _,a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){parseInt(this.state.info.reply,10)&&this.load_replies(null,!1)}},{key:"load_replies",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];console.log("fetching reply",this.state.info.pid),this.setState({reply_status:"loading",reply_error:null}),se.load_replies_with_cache(this.state.info.pid,this.props.token,this.color_picker,parseInt(this.state.info.reply)).then((function(a){var o=a.data,r=a.cached;t.setState((function(e,t){return{replies:o.data,info:Object.assign({},e.info,{reply:n?""+o.data.length:e.info.reply,variant:o.data.length?{latest_reply:Math.max.apply(null,o.data.map((function(e){return parseInt(e.timestamp)})))}:{}}),attention:!!o.attention,reply_status:"done",reply_error:null,cached:r}}),e)})).catch((function(n){console.error(n),t.setState({replies:[],reply_status:"failed",reply_error:""+n},e)}))}},{key:"show_sidebar",value:function(){this.props.show_sidebar("\u6811\u6d1e #"+this.state.info.pid,o.a.createElement(vt,{key:+new Date,info:this.state.info,replies:this.state.replies,attention:this.state.attention,sync_state:this.setState.bind(this),token:this.props.token,show_sidebar:this.props.show_sidebar,color_picker:this.color_picker,deletion_detect:this.props.deletion_detect}))}},{key:"render",value:function(){var e=this,t=ft(this.props.show_sidebar,this.props.token,this.state.info.pid),n=[["url_pid",k],["url",y],["pid",w],["nickname",A]];this.props.search_param&&n.push(["search",this.props.search_param.match(/\/.+\//)?_e(this.props.search_param," ","gi",!0):_e(this.props.search_param," ","gi")]);var a=O(this.state.info.text,n),r=null;if(!this.props.is_quote){var i,s=Object(d.a)(a);try{for(s.s();!(i=s.n()).done;){var c=Object(p.a)(i.value,2),l=c[0],u=c[1];if(u=u.length>0?u.substring(1):u,"pid"===l&&-1===dt.indexOf(u)&&parseInt(u)10&&o.a.createElement("div",{className:"box box-tip"},"\u8fd8\u6709 ",this.state.replies.length-10," \u6761")));return this.state.hidden?o.a.createElement("div",{className:"flow-item-row flow-item-row-with-prompt",onClick:function(t){pt[t.target.tagName.toLowerCase()]||e.show_sidebar()}},o.a.createElement("div",{className:"flow-item"+(this.props.is_quote?" flow-item-quote":"")},!!this.props.is_quote&&o.a.createElement("div",{className:"quote-tip black-outline"},o.a.createElement("div",null,o.a.createElement("span",{className:"icon icon-quote"}))),o.a.createElement("div",{className:"box"},o.a.createElement("div",{className:"box-header"},!!this.props.do_filter_name&&o.a.createElement("span",{className:"reply-header-badge clickable",onClick:function(){e.props.do_filter_name("\u6d1e\u4e3b")}},o.a.createElement("span",{className:"icon icon-locate"})),o.a.createElement("code",{className:"box-id"},"#",this.props.info.pid),"\xa0",null!==this.props.info.tag&&"\u6298\u53e0"!==this.props.info.tag&&o.a.createElement("span",{className:"box-header-tag"},this.props.info.tag),o.a.createElement(J,{stamp:this.props.info.timestamp,short:!0}),o.a.createElement("span",{className:"box-header-badge"},this.needFold?"\u5df2\u9690\u85cf":"\u5df2\u5c4f\u853d"),o.a.createElement("div",{style:{clear:"both"}}))))):r?o.a.createElement("div",null,h,o.a.createElement(_t,{pid:r,show_sidebar:this.props.show_sidebar,token:this.props.token,deletion_detect:this.props.deletion_detect})):h}}]),n}(a.PureComponent),_t=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={loading_status:"empty",error_msg:null,info:null},a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){this.load()}},{key:"load",value:function(){var e=this;this.setState({loading_status:"loading"},(function(){se.get_single(e.props.pid,e.props.token).then((function(t){e.setState({loading_status:"done",info:t.data})})).catch((function(t){-1!==(""+t).indexOf("\u6ca1\u6709\u8fd9\u6761\u6811\u6d1e")?e.setState({loading_status:"empty"}):e.setState({loading_status:"error",error_msg:""+t})}))}))}},{key:"render",value:function(){return"empty"===this.state.loading_status?null:"loading"===this.state.loading_status?o.a.createElement("div",{className:"aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("span",{className:"icon icon-loading"}),"\u63d0\u5230\u4e86 #",this.props.pid)):"error"===this.state.loading_status?o.a.createElement("div",{className:"aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement("a",{onClick:this.load.bind(this)},"\u91cd\u65b0\u52a0\u8f7d")),o.a.createElement("p",null,this.state.error_msg))):o.a.createElement(Et,{info:this.state.info,show_sidebar:this.props.show_sidebar,token:this.props.token,is_quote:!0,deletion_detect:this.props.deletion_detect})}}]),n}(a.PureComponent);function wt(e){return o.a.createElement(it.Consumer,null,(function(t){var n=t.value;return o.a.createElement("div",{className:"flow-chunk"},!!e.title&&o.a.createElement($,{text:e.title}),e.list.map((function(t,a){return o.a.createElement(Ve,{key:t.pid,offset:200,height:"15em",hiddenIfInvisible:!1},o.a.createElement("div",null,!!(e.deletion_detect&&"list"===e.mode&&a&&e.list[a-1].pid-t.pid>1)&&o.a.createElement("div",{className:"flow-item-row"},o.a.createElement("div",{className:"box box-tip flow-item box-danger"},e.list[a-1].pid-t.pid-1," \u6761\u88ab\u5220\u9664")),o.a.createElement(Et,{info:t,show_sidebar:e.show_sidebar,token:n,attention_override:"attention_finished"===e.mode||null,deletion_detect:e.deletion_detect,search_param:e.search_param})))})))}))}var kt=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={mode:e.mode,search_param:e.search_text,loaded_pages:0,chunks:{title:"",data:[]},loading_status:"done",error_msg:null},a.on_scroll_bound=a.on_scroll.bind(Object(l.a)(a)),window.LATEST_POST_ID=parseInt(localStorage._LATEST_POST_ID,10)||0,a}return Object(c.a)(n,[{key:"load_page",value:function(e){var t=this,n=function(e){console.error(e),t.setState((function(t,n){return{loaded_pages:t.loaded_pages-1,loading_status:"failed",error_msg:""+e}}))};if(e>this.state.loaded_pages+1)throw new Error("bad page");if(e===this.state.loaded_pages+1){if(console.log("fetching page",e),"list"===this.state.mode)se.get_list(e,this.props.token).then((function(n){if(1===e&&n.data.length){var a=-1;n.data.forEach((function(e){parseInt(e.pid,10)>a&&(a=parseInt(e.pid,10))})),localStorage._LATEST_POST_ID=""+a}t.setState((function(e,t){return{chunks:{title:"News Feed",data:e.chunks.data.concat(n.data.filter((function(t){return 0===e.chunks.data.length||!e.chunks.data.slice(-100).some((function(e){return e.pid===t.pid}))})))},loading_status:"done"}}))})).catch(n);else if("search"===this.state.mode)se.get_search(e,this.state.search_param,this.props.token).then((function(e){var n=0===e.data.length;t.setState((function(a,o){return{chunks:{title:'Result for "'+t.state.search_param+'"',data:a.chunks.data.concat(e.data.filter((function(e){return 0===a.chunks.data.length||!a.chunks.data.slice(-100).some((function(t){return t.pid===e.pid}))})))},mode:n?"search_finished":"search",loading_status:"done"}}))})).catch(n);else if("single"===this.state.mode){var a=parseInt(this.state.search_param.substr(1),10);se.get_single(a,this.props.token).then((function(e){t.setState({chunks:{title:"PID = "+a,data:[e.data]},mode:"single_finished",loading_status:"done"})})).catch(n)}else{if("attention"!==this.state.mode)return void console.log("nothing to load");var o=!!this.state.search_param,r=o&&!!this.state.search_param.match(/\/.+\//),i=/.+/;if(r)try{i=new RegExp(this.state.search_param.slice(1,-1))}catch(Rt){alert("\u8bf7\u68c0\u67e5\u6b63\u5219\u8868\u8fbe\u5f0f\u5408\u6cd5\u6027\uff01\n".concat(Rt)),i=/.+/}console.log(o,r),se.get_attention(this.props.token).then((function(e){t.setState({chunks:{title:"".concat(o?r?"Result for RegEx ".concat(i.toString()," in "):'Result for "'.concat(t.state.search_param,'" in '):"","Attention List"),data:o?r?e.data.filter((function(e){return!!e.text.match(i)})):e.data.filter((function(e){return t.state.search_param.split(" ").every((function(t){return e.text.includes(t)}))})):e.data},mode:"attention_finished",loading_status:"done"})})).catch(n)}this.setState((function(e,t){return{loaded_pages:e.loaded_pages+1,loading_status:"loading",error_msg:null}}))}}},{key:"on_scroll",value:function(e){e.target===document&&(document.body.scrollHeight-window.scrollY-window.innerHeight2&&o.a.createElement("a",{className:"no-underline",onClick:this.do_back_bound},"\xa0",o.a.createElement("span",{className:"icon icon-back"}),"\xa0"),n))}}]),n}(a.PureComponent),Nt=n(85),Ct=n.n(Nt),jt=(n(449),function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={level:0,fired:!1},a.callback=e.callback,a.esc_interval=null,a}return Object(c.a)(n,[{key:"do_fire",value:function(){var e=this;this.esc_interval&&(clearInterval(this.esc_interval),this.esc_interval=null),this.setState({level:1,fired:!0}),this.callback(),window.setTimeout((function(){e.setState({level:0,fired:!1})}),300)}},{key:"componentDidMount",value:function(){var e=this;window.config.pressure&&(Ct.a.set(document.body,{change:function(t){e.state.fired||(t>=.999?e.do_fire():e.setState({level:t}))},end:function(){e.setState({level:0,fired:!1})}},{polyfill:!1,only:"touch",preventSelect:!1}),document.addEventListener("keydown",(function(t){t.repeat||"Escape"!==t.key||(e.esc_interval&&clearInterval(e.esc_interval),e.setState({level:.2},(function(){e.esc_interval=setInterval((function(){var t=e.state.level+.1;t>=.999?e.do_fire():e.setState({level:t})}),30)})))})),document.addEventListener("keyup",(function(t){"Escape"===t.key&&(e.esc_interval&&(clearInterval(e.esc_interval),e.esc_interval=null),e.setState({level:0}))})))}},{key:"render",value:function(){var e=25*(this.state.level-.4)-500;return o.a.createElement("div",{className:"pressure-box"+(this.state.fired?" pressure-box-fired":"")+(this.state.level<=1e-4?" pressure-box-empty":""),style:{left:e,right:e,top:e,bottom:e}})}}]),n}(a.Component));function St(e){return o.a.createElement("div",{id:"global-hint-container",style:{display:"none"}})}var It=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),a=t.call(this,e),qe(),function(e){function t(){(void 0===e?window.matchMedia("(prefers-color-scheme: dark)").matches:e)?document.body.classList.add("root-dark-mode"):document.body.classList.remove("root-dark-mode")}t(),window.matchMedia("(prefers-color-scheme: dark)").addListener((function(){t()}))}({default:void 0,light:!1,dark:!0}[window.config.color_scheme]),a.state={sidebar_stack:[[null,null]],mode:"list",search_text:null,flow_render_key:+new Date,token:localStorage.TOKEN||null},a.show_sidebar_bound=a.show_sidebar.bind(Object(l.a)(a)),a.set_mode_bound=a.set_mode.bind(Object(l.a)(a)),a.on_pressure_bound=a.on_pressure.bind(Object(l.a)(a)),a.inthu_flag=-1!==window[atob("ZG9jdW1lbnQ")][atob("Y29va2ll")].indexOf(atob("dGh1X2lwX2ZsYWc9eWVz")),a}return Object(c.a)(n,[{key:"on_pressure",value:function(){this.state.sidebar_stack.length>1?this.show_sidebar(null,null,"clear"):this.set_mode("list",null)}},{key:"show_sidebar",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"push";this.setState((function(a){var o=a.sidebar_stack.slice();if("push"===n)1===o.length&&(document.body.style.top="-".concat(window.scrollY,"px"),document.body.style.position="fixed",document.body.style.width="100vw"),o.length>10&&o.splice(1,1),o=o.concat([[e,t]]);else if("pop"===n){if(1===o.length)return;if(2===o.length){var r=document.body.style.top;document.body.style.position="",document.body.style.top="",document.body.style.width="",window.scrollTo(0,-1*parseInt(r||"0"))}o.pop()}else if("replace"===n)o.pop(),o=o.concat([[e,t]]);else{if("clear"!==n)throw new Error("bad show_sidebar mode");var i=document.body.style.top;document.body.style.position="",document.body.style.top="",document.body.style.width="",window.scrollTo(0,-1*parseInt(i||"0")),o=[[null,null]]}return{sidebar_stack:o}}))}},{key:"set_mode",value:function(e,t){this.setState({mode:e,search_text:t,flow_render_key:+new Date})}},{key:"render",value:function(){var e=this;return o.a.createElement(it.Provider,{value:{value:this.state.token,set_value:function(t){localStorage.TOKEN=t||"",e.setState({token:t})}}},o.a.createElement(jt,{callback:this.on_pressure_bound}),o.a.createElement("div",{className:"bg-img",style:Je()}),o.a.createElement(Ot,{show_sidebar:this.show_sidebar_bound,set_mode:this.set_mode_bound,mode:this.state.mode}),o.a.createElement(it.Consumer,null,(function(t){return o.a.createElement("div",{className:"left-container"},o.a.createElement(St,{token:t.value}),!t.value&&o.a.createElement("div",{className:"flow-item-row aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement(te,{token_callback:t.set_value},(function(e){return o.a.createElement("a",{onClick:e},o.a.createElement("span",{className:"icon icon-login"}),"\xa0\u767b\u5f55\u5230 T\u5927\u6811\u6d1e")}))))),e.inthu_flag||t.value?o.a.createElement(kt,{key:e.state.flow_render_key,show_sidebar:e.show_sidebar_bound,mode:e.state.mode,search_text:e.state.search_text,token:t.value}):o.a.createElement($,{text:"\u8bf7\u767b\u5f55\u540e\u67e5\u770b\u5185\u5bb9"}),o.a.createElement("br",null))})),o.a.createElement(xt,{show_sidebar:this.show_sidebar_bound,stack:this.state.sidebar_stack}))}}],[{key:"is_darkmode",value:function(){return"dark"===window.config.color_scheme||"light"!==window.config.color_scheme&&window.matchMedia("(prefers-color-scheme: dark)").matches}}]),n}(a.Component),Dt=Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));function Ut(e){navigator.serviceWorker.register(e).then((function(e){e.onupdatefound=function(){var t=e.installing;t.onstatechange=function(){"installed"===t.state&&(navigator.serviceWorker.controller?console.log("New content is available; please refresh."):console.log("Content is cached for offline use."))}}})).catch((function(e){console.error("Error during service worker registration:",e)}))}i.a.render(o.a.createElement(It,null),document.getElementById("root")),"serviceWorker"in navigator&&window.addEventListener("load",(function(){var e="".concat(".","/service-worker.js");Dt?(function(e){fetch(e).then((function(t){404===t.status||-1===t.headers.get("content-type").indexOf("javascript")?navigator.serviceWorker.ready.then((function(e){e.unregister().then((function(){window.location.reload()}))})):Ut(e)})).catch((function(){console.log("No internet connection found. App is running in offline mode.")}))}(e),navigator.serviceWorker.ready.then((function(){console.log("This web app is being served cache-first by a service worker. To learn more, visit https://goo.gl/SC7cgQ")}))):Ut(e)}))},74:function(e,t){e.exports="data:image/png;base64,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"},75:function(e,t){e.exports="data:image/png;base64,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"},76:function(e,t){e.exports="data:image/png;base64,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"},77:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFdklEQVR42sVW+VNTVxS+f4Od9oeW0RmlU8dOcRx3BEHbqiio3dtfamds+0N1bGe62emirYpSLRYDguAWJQihLZBAEkgKgbCHgIBAXbBTtgSykhAQEL/ecyWtwwMHx9DemS/vvXvv+c73zj3n5DEAjHBodJz9MD7BvuP3KVbb0xqV1p6lzENzS9u7Y3zOVWNittXPMmvMWmaNjZgeW8OZY91i1pSbzSqcg6y01Lj7V7UOap3Bma9WhyiKtEyh0bGsQg0L+P3n5talDNZ5LpWZCwqYqqYxJk9TggK1Bkpza7pWrWNdsZHM/uKymZ1Pgvb07ohiel0Jy7VcO1ug0iCfc+WbW7fUa0vYrUw5u6G8IhXglR1l/qR45tu/l9WeTo5XGqvxS3k1tPmF+t6Y8MXOVYui+3ZEb+ROHoq+HVEb3WtCo23bIhZrCwoNuZyHuKpTU474v/2M+dOSmDdDJhVgzUxn1oQDcd7w59C5+00oqxqgsLTBnHAIQ8vnoy9uPbiDWYH2kk1dwmFkWdqRU2nG9V2vw8e5rScOx/ZnX5YK6Dvw6Z6+VzYMepY8hT8++ZALMONKfQuqkxLhWf88rNvCZy2A54KwqTp1UnCQgPZ9H8Cz5ElYX93gsR38/COpgO3r5bata+FYHYrKve8jp7EDuW23USRLQveKhXDERc5agCMuAt0rF6JQdkpw5DS1o3LPbsFti1nLIxQplx7BljVyO3fSExUG/YYVyFMVIa/lOvLfewcdyxbAvTNq1gJobzu3Ue16G3nNnCNfDUP0cvRELwX5IF9SAbERchtftO+MRsOKUKjXhUG9JRJlSxegm4fUvn32OUB7ycYYNh/qzRFQh4cJTuK23Y+kVED/1nA5BxycwMZxbWUoml4IQdemVXBujwStPQpc3KZr8yo0hYWglXMRJ3FPrksF2F57Sc4BK4f9jZfhfmuzgPPNTWLO9oggG7IN8BDnAzxSAaWL5sk58C+emMS8x8S0PFIBjQf3yznwH0EqwAfIOTAThqZgpjXf7CAV4PAMyjkwFXa3R1xHx+9i4h4wzn/o6r8zKtb6XW4MjdwBnxLw+ofF3HRcD2D2AlxeH5yDXpgsjdBWmFBcVY3S2jr0DTiEKN/wCFpu3ERReQUM1TW4+VcXfFxQ0AQMDvmFiPQcJb5PTkHi+Qs4cEqGo2fS0dndCxrFlVX4OvEkvvjxOCrMDSISQRMQgM3pgtXhFPd0lV3OxOmsKyICdByd3T04xkVVNFhw994cCPDwSIyMjQtyGhVms4hIt61fPA/wcz+WnjF3Alw8DygKvXYHbvf0IlmhgDy/QCQdCeviQuZUAL04kX/1UyK++TkJB2XJ+JMLIWd0DHMugEqNMrysrh6GmlocP3ceOlMlhkfHRA7MuYCByXoPDD0vucOnU2HlR0IOe/oHRBJSuU4EswoCjYjelOqeGhENpVaHhIyzounQcPNSjU87g/qWVvF83zYIAty+IdGI1GVGXCpQ4Te9ARnKXHx5/AQqLU3CWUNbu5g7kpomypOaFdmQ7WMLoPKjClCo1Dh54SJSMhVIy85BbXMLRnhUKNzUGU+cPYdsjRYpiixc4tVBzcsz9AgCXF7vQ3OAOiJlO139PBfG7k4IJ5Qb9Ka0RiUZ2PPQkua+JAKcfJIvzGhEZxwAOZ7aIzwPrLunrE/z3zLN90Brh9zu8vCmMsY3DIozDCYcHJTIlNTNHdelAorLTPG1lmbYuUrfCA/nsB+D/uDA679/fBSBWstVaPTGIxIBXX22EH151UVdqQn1V1sF6ppagoIAX6mpBhpD+YUSY9Uz0s/ygQFWXtPA1MXGjzUGo4Fv1HCoggRNkcGoLykz7fvdVMP0HBIB/xf+Bi8VajXQRja5AAAAAElFTkSuQmCC"},78:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHWklEQVR42q1XCWxUVRR9f19mptAWqYKSEoUgETQC1rIZW6UaFKo0KsoixhQRjGAIhSCimGitlgq4ASXKUgJKiAQFQXYVLGUtO7SlWFuUli5TWtqyPO97/z7m9acat0nOzJ+/vHvuuffdez8hf/5RfFAlKNKvQv6nj2zk33zU/0KGPajJJ1yXxN/TUxmcPFB95uGB6pjUh9VxjzygjU3urz6XlKAO69ZVSXAsEu8zauE6frWUv1JLkb0e+qA6cu1yc3v1cbueVjmUXnY9tACaAI2AS3D+V4dWHbDrdnxp7fswy8jt0knp/g+UkslFDj6epa+gNEA56sBQBRj6BXFOOi4DXITrDQDqcAwdpEwL2KRDKEgS4zuTAZ3jSGIoQPqGHHInLB0H0H1EDOE4lz71IW08N1wJC54BlCDO+owznHdoy0mb1u216OWjFg3vs2jRFquq+oAdDh/xnrsKa4QLHVp30G4o2WGVbVluHcibb27IzjQW39tT6Y/GdRECsiLb2MQJFKHhk4Ba5iHK34hgx+dsenGbSS8fZ+Tgfxmg3vVUqwFUAqrwuA6fY+twdYN0Wro+F1UwhRzRJzZZpfSKG/G82qXl+Xb1zJf03BEp6luQfLMAs5MHqVPGp2l5VyAH6AW4v1hSq6QNtUT4xHkgMipVy0C7Nv92TNKr/rDdyNmKReDG4Unqe3hjFCAECLA/rz6vf8y9KZHUuoAeXkOPG3yqXYuoMCJFewXXdfh30CZ9LxXaLVzyEkwyyPweXZVJGKfbAV0AN7Pb135q7mpFAIzXHbWbM6fq68cM1zKZUklMrQGgHOCJIerbo4dr70x4Vnt/arr2QaeOSj/03iNgaKT7+T12DWctEg/Y5rxurJP2LlMhmv1uXmoWcG8EASCTlWF8w8gBYgDtUC1XgoOZT1DN9lg3eDZa3+aae7lXIqYsxpBYC7OM7+7ro6bBPbEiYbYsN/f5CUweZyzCHdUNcBtuvZskdJDIBVEB/UYivD5RX8IylJ7GRU8jCUYKwpG/wTqaPkafHRNF7s7LMbf7CeRmGtvkQooetpPyJ4iqOOi5LuoAI6B2jlP6NuBi3LhQokgQ8RKousBqKd0B4aqQCEDBai51ri/OMTcNS1HHw3qdJTIa2rAwBLq/kRkiu3vHKyMqi52mG5WwVCJSjLkB25OetLxiVYrXTnkkvH3u0uPb7XNvTjPm9eqhDPFVP60tAhrKwiQjsQ4ZsGqJubXmLCOCW+s311Oi2Nsh9ftNXv1oueuRKpHUYqSu4HMXHbpxpfnDC6O0jFvjlN5tNC1FVEId4xaL/6OiosigkcO1OdvXWkd4eWYLNrtejQCjtfkmrSuwPRJlbutiVIxkzovqF6Atle71N6fo86Wua4kcEN3QQBLRmK1BPNe1Rzfl6bcyjOVFe+2LXBXWFc/YNFxg0pqfoSQftiPGarA6yqFjCHvX18znyaojEcPfJnVMmCAS6Yjbx8I86ZP2mDrjdL59gRctCMflQguKkElPbTZr1nxqFoSPQUEToftVamxMkXJPyace9ZXiNmYDAy8GcCvFIhmeJ5NGagu4ARb/Mq/MHttgVsClxJh2JGlyurZw/2arhJdhNkuckkjAcz+usk6gk7rsfVuDg47eO0iEkSCjHtNmcC/FLgB5oe026gpJkSpm98GJ6uTzhXaY7ygREjhuOeHQgEMG+ieUv/3JmWWsadULwMvSnValqhDW5zuxvMHqR5L7qjN48pbhvSxpqx2a0FsZK8tOUpPVtK+WmWvnv2HkzX7VWPrGK/qSWRO1z2ZO0BfMSNezM17Us6BafrR6nrmTx/Y3N9JmQY2dq6yTsEw8Go5DkJggGcJrxO9OpNHBSJecoE1sReCD6cZSSkM3to0oKpFBIrKlWDI1H7Jp01GbNh+z6bWrLp32op7XllojH9fe5gr8EqmarD70u0sZ1yr+c6YYy1rJWuIbywQg7k0whtXvh1FsvzeONZ+w6ReZ+m4YXj6cnq5/AmSyQbm5ue8a668LtUQOwO5pgkkK5seHWs2Je1azbhiKeHsVx6xahBivGM5YN6oi94xld4NfLVFFnUiDw12we7VVhP0iJEqxkZaijpmbZeR9kW18v/Fz8+Der63SC/l2be0h+0pdIQ6Yhfa1sl1WTfkuq4HnwV8pddZ3jdUDNitCx4XhRExa0WIwDEphC+L008vSyeCgQ4bCeJ0aCihPhlwyDLZa95U5bCJCtS653ohegYqU+cb331FJzJ+Fc4wNsPYtWFOihAKWVP06SENELJ5rj7/svzW4H1dr3dYV5pHyn+2aRjYTVnnZ3WoWvORVv4rDdjhvkfnTkIHqZNwd0fjriiTUUAkXibSTekIskuqAheg2abDooqskITaGDL2vlzIaXtkmJSWqryX316bCXPha0v3qy3d0VdJ0gwxAr0003BHtmP53Q9EgTFRFDI4CAWmeixYzIp638TnTt0YA7++IiMZzpv999M9exVWJnI6LWz612ktq+REjxVsQFa9lyh/6q3mOr9bMWwAAAABJRU5ErkJggg=="},79:function(e,t){e.exports="data:image/png;base64,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"},80:function(e,t){e.exports="data:image/png;base64,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"},86:function(e,t,n){e.exports=n(450)},91:function(e,t,n){},96:function(e,t,n){},97:function(e,t,n){},98:function(e,t){e.exports="data:image/png;base64,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"},99:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAFfklEQVR42qWXWWicVRiG/39mUim4NRq88MZWXIpLe+FS6lYKtZsW0UrRUmyllUIXpQiN3hXBC1sxdyom6q2lVRGhUqvFClURUVFUsu+ZmD2TTDKTycTn/fudcPzNJJMaeDOTnHO+7z3ffoLm5uagFFpaWpJ8LmloaAgaGxuD3t7epePj49unpqbeLhQKn4EvwQVwjv+dYm1fOp2u0t76+vqgqampAhmp+XTMqxwB0XcUr8pmsydQ8jPK0oYe0G3f+8AgGGDPn+x9t7+//8HW1taIODKSiyWQ0MGurq4bEKbbjoEZUATTYApMgglDrnDpp2j7hPzk5ORJyN9qJBLlEoiUDw4ObkNIhydQ6JHQ4eHhF1jfgLlXg7v5vn5oaGj3xMTE++xpjZ0ZyWQy+7Fo4Cw6H4GENnLgcExIu/6HRa7XugjOBcno7Oy8EjI7ccVvOstnJIP4OG4kwlIEopuj6JAdlElnuFUtiq/Tmt1ApkwiTJ+hIWF+TmiP9nZ0dChgj/my+LtGJPyYcAHnzL5VfuRAXgfGxsZe1rrWLCOCcuAHMO7agazs1CUWM7KkyYtiwm0OdUuL7KJTLiFAt/VvWQ4SdiYpZbjkCbOEAjhHYN7hLiWWS8QEU7/jfM73Ov3PlAfOrEZoQbi9Zu6UvnOhaic/n89/3dbWFq1FBQNGd7IwbinWiTWuRkjolLe3t1+BKZ8nJV8FRyH4ylxgrVp7RkdHDxIDyxwJXQQZARb4wSxcxCpbpTtiy6E3HTuYHnI+crGB8v2xrFgQEHrLBa0XYxtdvcjlcp9HMcDtr4LZr8Ysze2v8fI11MGBgYFtZqFiGcq1J0+wvWRyQnNnILOj6yfb8zc/VQGp8RR/9Mr8sDppfgtjUR1QcFZBdjN4FGwsAa1tAverDMcKT5Si6HvNKmmGorZbjGrFRqwx9d65Uk4H5a/FIF71nBv6+voesdKt/nEq4NcX1lByKq9+jvoW4OB9NJjHwCawuQS0tgU8jLkTMRKRO3t6em5ReVZ1Bd+KwFfW1bKq7UYgjPWF7ZYhZQchMVDtVc7AlXB0VJpy9YwzInDeCpAI3OUT8LJg72KzgMx6ww9Cj8C1rLeBFkfgrOeC9XEXWPSmRkZGdpCih8EBcLAEDqiXsHePmlI8DswFy9E1rHoDLioIP+JLvyKT4rCrVBBqKvqfQRjaVLXGglA6zyot9lhEFl0Jjqeh0N3dXcXhleA2cHsJaG0lZr7R0vlfWaCeg4WOWhqOkYYvilEVVvjLikMbplsaL0RE9UPms1FDpgRGLcLTuOHZeCFSbUDXBQvoIQrRTa4U17rgIeCe8eIgCkKEHVlsEHK792KlOOQi95j5p2lI56NSLH+x8IAKkRZg+AeNpILDUUuVEKxSiateh+iHoE6jVwnUsf4BqMGyy72OGHVVKu0ZV8656K6oGWl0lmlYPO2l0DFzQcqZ73LghhNL5Z2uV3DJX+iOumRKG1IWnTcrMGxoEMOn3UjtDSTlwO1VO0+Zhe/V9OxGM9J9nbk5FZ8H99nkop1Z0vJJu00YL88LjGSz8YPyNVZpC2bd407nf4ZS+Qlfn/AHSU0ymCv0htKkd9PAS9toZHMTkWSprugizu8E3seSpfiacyy3m4pEjdfbReY7zLbFxqiSY7lLNW69VgOHnXXKT2tSduRKPkwcCQ0U9uqZTS2E/ah+Tmdcp64GKsEysIIYWqsGhKJvrNDMntObQCNZXPmCTzOErkbg2di0U7CUVeHpstdTxpRO+1OTCDNNbXCZFFc+7+PUjdQyO758HJN+apNTxh6iae9xOmBVUBYbhvQ5sug5pdrlPk79B0aFUsleyVUUG/WOT8D39jS/CH7XJ2tH2LNCe60hJRd6nv8Dwj5T3q96iTAAAAAASUVORK5CYII="}},[[86,1,2]]]); -//# sourceMappingURL=main.50ae84bd.chunk.js.map \ No newline at end of file +(this.webpackJsonpwebhole=this.webpackJsonpwebhole||[]).push([[0],{137:function(e,t){},156:function(e,t,n){},434:function(e,t,n){},436:function(e,t,n){},437:function(e,t,n){},446:function(e,t,n){},447:function(e,t,n){},448:function(e,t,n){},449:function(e,t,n){},450:function(e,t,n){"use strict";n.r(t);var a=n(0),o=n.n(a),r=n(10),i=n.n(r),s=(n(91),n(1)),c=n(2),l=n(5),u=n(4),h=n(3),d=n(12),p=n(24),m=n(15),f=n(7),g=n.n(f),b=n(9),v=n(25),E=n.n(v),_=function(){function e(){Object(s.a)(this,e),this.names={},this.current_h=Math.random()}return Object(c.a)(e,[{key:"get",value:function(e){return"\u6d1e\u4e3b"===(e=e.toLowerCase())?["hsl(0,0%,97%)","hsl(0,0%,16%)"]:(this.names[e]||(this.current_h+=.618033988749895,this.current_h%=1,this.names[e]=["hsl(".concat(360*this.current_h,", 50%, 90%)"),"hsl(".concat(360*this.current_h,", 60%, 20%)")]),this.names[e])}}]),e}(),w=/(^|[^\d\u20e3\ufe0e\ufe0f])(#\d{1,7})(?![\d\u20e3\ufe0e\ufe0f])/g,k=/((?:https?:\/\/)?thuhole\.com\/?#(?:#|%23)(\d{1,7}))(?!\d|\u20e3|\ufe0e|\ufe0f)/g,A=/(^|[^A-Za-z])((?:(?:Angry|Baby|Crazy|Diligent|Excited|Fat|Greedy|Hungry|Interesting|Jolly|Kind|Little|Magic|Na\xefve|Old|PKU|Quiet|Rich|Superman|Tough|Undefined|Valuable|Wifeless|Xiangbuchulai|Young|Zombie)\s)?(?:Alice|Bob|Carol|Dave|Eve|Francis|Grace|Hans|Isabella|Jason|Kate|Louis|Margaret|Nathan|Olivia|Paul|Queen|Richard|Susan|Thomas|Uma|Vivian|Winnie|Xander|Yasmine|Zach)|You Win(?: \d+)?|\u6d1e\u4e3b)(?![A-Za-z])/gi,y=/(^|[^.@a-zA-Z0-9_])((?:https?:\/\/)?(?:(?:[\w-]+\.)+[a-zA-Z]{2,3}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::\d{1,5})?(?:\/[\w~!@#$%^&*()\-_=+[\]{};:,./?|]*)?)(?![a-zA-Z0-9])/gi;function O(e,t){return e=[[null,e]],t.forEach((function(t){var n=Object(d.a)(t,2),a=n[0],o=n[1];e=[].concat.apply([],e.map((function(e){var t=Object(d.a)(e,2),n=t[0],r=t[1];return n?[e]:r.split(o).map((function(e){return o.test(e)?[a,e]:[null,e]})).filter((function(e){var t=Object(d.a)(e,2),n=t[0],a=t[1];return null!==n||a}))})))})),e}var x=n(71),N=n.n(x),C=n(72),j=n.n(C),S=n(73),I=n.n(S),D=(n(96),n(97),n(74)),U=n.n(D),R=n(75),H=n.n(R),T=n(76),L=n.n(T),Q=n(77),M=n.n(Q),P=n(78),G=n.n(P),X=n(79),F=n.n(X),V=(n(98),n(99),n(80)),W=n.n(V);function B(e){if(!e.ok)throw Error("\u7f51\u7edc\u9519\u8bef ".concat(e.status," ").concat(e.statusText));return e.text().then((function(e){try{return JSON.parse(e)}catch(t){throw console.error("json parse error"),console.trace(t),console.log(e),new SyntaxError("JSON Parse Error "+e.substr(0,50))}}))}function Y(){return"&PKUHelperAPI=3.0&jsapiver="+encodeURIComponent("v0.3.1.129-"+2*Math.floor(+new Date/72e5))}var K=n(38);function z(e){return e<10?"0"+e:""+e}function q(e){return"".concat(e.getMonth()+1,"-").concat(z(e.getDate())," ").concat(e.getHours(),":").concat(z(e.getMinutes()),":").concat(z(e.getSeconds()))}var Z=I()(j.a);function J(e){var t=new Date(1e3*e.stamp);return o.a.createElement("span",{className:"time-str"},o.a.createElement(N.a,{date:t,formatter:Z,title:t.toLocaleString("zh-CN",{timeZone:"Asia/Shanghai",hour12:!1})}),"\xa0",e.short?null:q(t))}function $(e){return o.a.createElement("p",{className:"centered-line title-line aux-margin"},o.a.createElement("span",{className:"black-outline"},e.text))}U.a,H.a,L.a,M.a,G.a,F.a,W.a;var ee=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={loading_status:"idle",recaptcha_verified:!1},a.username_ref=o.a.createRef(),a.password_ref=o.a.createRef(),a.input_token_ref=o.a.createRef(),a.popup_anchor=document.getElementById("pkuhelper_login_popup_anchor"),a.popup_anchor||(a.popup_anchor=document.createElement("div"),a.popup_anchor.id="pkuhelper_login_popup_anchor",document.body.appendChild(a.popup_anchor)),a}return Object(c.a)(n,[{key:"do_sendcode",value:function(e){var t=this;this.state.recaptcha_verified?"loading"!==this.state.loading_status&&this.setState({loading_status:"loading"},(function(){fetch("https://thuhole.com/api_xmcp/login/send_code?user="+encodeURIComponent(t.username_ref.current.value)+"&code_type="+encodeURIComponent(e)+"&recaptcha_token="+localStorage.recaptcha+Y(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({excluded_scopes:[]})}).then(B).then((function(e){if(console.log(e),!e.success)throw new Error(JSON.stringify(e));alert(e.msg),t.setState({loading_status:"done"})})).catch((function(e){console.error(e),alert("\u53d1\u9001\u5931\u8d25\n"+e),t.setState({loading_status:"done"})}))})):alert("reCAPTCHA\u98ce\u63a7\u7cfb\u7edf\u6b63\u5728\u8bc4\u4f30\u60a8\u7684\u6d4f\u89c8\u5668\u5b89\u5168\u72b6\u6001\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002")}},{key:"do_login",value:function(e){var t=this;"loading"!==this.state.loading_status&&this.setState({loading_status:"loading"},(function(){fetch("https://thuhole.com/api_xmcp/login/login?user="+encodeURIComponent(t.username_ref.current.value)+"&valid_code="+encodeURIComponent(t.password_ref.current.value)+Y(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({excluded_scopes:[]})}).then(B).then((function(n){if(0!==n.code){if(n.msg)throw new Error(n.msg);throw new Error(JSON.stringify(n))}e(n.user_token),alert("\u767b\u5f55\u6210\u529f"),t.setState({loading_status:"done"}),t.props.on_close()})).catch((function(e){console.error(e),alert("\u767b\u5f55\u5931\u8d25\n"+e),t.setState({loading_status:"done"})}))}))}},{key:"do_input_token",value:function(e){var t=this;if("loading"!==this.state.loading_status){var n=this.input_token_ref.current.value;this.setState({loading_status:"loading"},(function(){fetch("https://thuhole.com/api_xmcp/hole/system_msg?user_token="+encodeURIComponent(n)+Y()).then((function(e){return e.json()})).then((function(a){if(a.error)throw new Error(a.error);if(0===a.result.length)throw new Error("result check failed");t.setState({loading_status:"done"}),e(n),t.props.on_close()})).catch((function(e){alert("Token\u68c0\u9a8c\u5931\u8d25\n"+e),t.setState({loading_status:"done"}),console.error(e)}))}))}}},{key:"render",value:function(){var e=this;return i.a.createPortal(o.a.createElement(K.b,{reCaptchaKey:"6Leq0a0ZAAAAAHEStocsqtJfKEs9APB0LdgzTNfZ",useRecaptchaNet:!0},o.a.createElement(K.a,{onVerify:function(t){e.setState({recaptcha_verified:!0}),localStorage.recaptcha=t}}),o.a.createElement("div",null,o.a.createElement("div",{className:"thuhole-login-popup-shadow"}),o.a.createElement("div",{className:"thuhole-login-popup"},o.a.createElement("p",null,o.a.createElement("b",null,"\u63a5\u6536\u9a8c\u8bc1\u7801\u6765\u767b\u5f55 T\u5927\u6811\u6d1e")),o.a.createElement("p",null,o.a.createElement("label",null,"\u3000\u90ae\u7bb1\xa0",o.a.createElement("input",{ref:this.username_ref,type:"email",autoFocus:!0,defaultValue:"@mails.tsinghua.edu.cn"})),o.a.createElement("span",{className:"thuhole-login-type"},o.a.createElement("a",{onClick:function(t){return e.do_sendcode("mail")}},"\xa0\u53d1\u9001\u90ae\u4ef6\xa0"))),o.a.createElement("p",null,o.a.createElement("label",null,"\u9a8c\u8bc1\u7801\xa0",o.a.createElement("input",{ref:this.password_ref,type:"tel"})),o.a.createElement("button",{type:"button",disabled:"loading"===this.state.loading_status,onClick:function(t){return e.do_login(e.props.token_callback)}},"\u767b\u5f55")),o.a.createElement("hr",null),o.a.createElement("p",null,o.a.createElement("b",null,"\u4ece\u5176\u4ed6\u8bbe\u5907\u5bfc\u5165\u767b\u5f55\u72b6\u6001")),o.a.createElement("p",null,o.a.createElement("input",{ref:this.input_token_ref,placeholder:"User Token"}),o.a.createElement("button",{type:"button",disabled:"loading"===this.state.loading_status,onClick:function(t){return e.do_input_token(e.props.token_callback)}},"\u5bfc\u5165")),o.a.createElement("hr",null),o.a.createElement("p",{style:{fontSize:11}},"This site is protected by reCAPTCHA and the Google ",o.a.createElement("a",{href:"https://policies.google.com/privacy"},"Privacy Policy")," and ",o.a.createElement("a",{href:"https://policies.google.com/terms"},"Terms of Service")," apply."),o.a.createElement("p",null,o.a.createElement("button",{onClick:this.props.on_close},"\u53d6\u6d88"))))),this.popup_anchor)}}]),n}(a.Component),te=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={popup_show:!1},a.on_popup_bound=a.on_popup.bind(Object(l.a)(a)),a.on_close_bound=a.on_close.bind(Object(l.a)(a)),a}return Object(c.a)(n,[{key:"on_popup",value:function(){this.setState({popup_show:!0})}},{key:"on_close",value:function(){this.setState({popup_show:!1})}},{key:"render",value:function(){return o.a.createElement(o.a.Fragment,null,this.props.children(this.on_popup_bound),this.state.popup_show&&o.a.createElement(ee,{token_callback:this.props.token_callback,on_close:this.on_close_bound}))}}]),n}(a.Component),ne=function(){function e(){var t=this;Object(s.a)(this,e),this.db=null,this.added_items_since_maintenance=0,this.encrypt=this.encrypt.bind(this),this.decrypt=this.decrypt.bind(this);var n=indexedDB.open("hole_cache_db",1);n.onerror=console.error.bind(console),n.onupgradeneeded=function(e){console.log("comment cache db upgrade"),e.target.result.createObjectStore("comment",{keyPath:"pid"}).createIndex("last_access","last_access",{unique:!1})},n.onsuccess=function(e){console.log("comment cache db loaded"),t.db=e.target.result,setTimeout(t.maintenance.bind(t),1)}}return Object(c.a)(e,[{key:"encrypt",value:function(e,t){for(var n=JSON.stringify(t),a="",o=0,r=(42^e)%128;o1e3?(console.log("comment cache db maintenance",a),t.index("last_access").openKeyCursor().onsuccess=function(e){var n=e.target.result;n&&(t.delete(n.primaryKey),--a>1e3&&n.continue())}):console.log("comment cache db no need to maintenance",a),e.added_items_since_maintenance=0},n.onerror=console.error.bind(console)}}},{key:"clear",value:function(){this.db&&(indexedDB.deleteDatabase("hole_cache_db"),console.log("delete comment cache db"))}}]),e}();function ae(){return window.hole_cache||(window.hole_cache=new ne),window.hole_cache}function oe(e){return Y()+(e?"&user_token="+e:"")}var re=function(){var e=Object(b.a)(g.a.mark((function e(t){var n,a,o=arguments;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=o.length>1&&void 0!==o[1]&&o[1],e.next=3,B(t);case 3:if(0===(a=e.sent).code){e.next=14;break}if(!a.msg){e.next=13;break}if(!n){e.next=10;break}alert(a.msg),e.next=11;break;case 10:throw new Error(a.msg);case 11:e.next=14;break;case 13:throw new Error(JSON.stringify(a));case 14:return e.abrupt("return",a);case 15:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),ie=function(e,t){return e.sort((function(e,t){return parseInt(e.cid,10)-parseInt(t.cid,10)})).map((function(e){return e._display_color=t.get(e.name),e.variant={},e}))},se={load_replies:function(){var e=Object(b.a)(g.a.mark((function e(t,n,a,o){var r,i;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=parseInt(t),e.next=3,fetch(ve+"/api.php?action=getcomment&pid="+t+oe(n));case 3:return r=e.sent,e.next=6,re(r);case 6:return i=e.sent,ae().put(t,o,i),i.data=ie(i.data,a),e.abrupt("return",i);case 10:case"end":return e.stop()}}),e)})));return function(t,n,a,o){return e.apply(this,arguments)}}(),load_replies_with_cache:function(){var e=Object(b.a)(g.a.mark((function e(t,n,a,o){var r;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=parseInt(t),e.next=3,ae().get(t,o);case 3:if(!(r=e.sent)){e.next=9;break}return r.data=ie(r.data,a),e.abrupt("return",{data:r,cached:!0});case 9:return e.next=11,se.load_replies(t,n,a,o);case 11:return r=e.sent,e.abrupt("return",{data:r,cached:!r});case 13:case"end":return e.stop()}}),e)})));return function(t,n,a,o){return e.apply(this,arguments)}}(),set_attention:function(){var e=Object(b.a)(g.a.mark((function e(t,n,a){var o,r;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(o=new URLSearchParams).append("user_token",a),o.append("pid",t),o.append("switch",n?"1":"0"),e.next=6,fetch(ve+"/api.php?action=attention"+oe(a),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:o});case 6:return r=e.sent,ae().delete(t),e.abrupt("return",re(r,!0));case 9:case"end":return e.stop()}}),e)})));return function(t,n,a){return e.apply(this,arguments)}}(),report:function(){var e=Object(b.a)(g.a.mark((function e(t,n,a){var o,r;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(o=new URLSearchParams).append("user_token",a),o.append("pid",t),o.append("reason",n),e.next=6,fetch(ve+"/api.php?action=report"+oe(a),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:o});case 6:return r=e.sent,e.abrupt("return",re(r,!0));case 8:case"end":return e.stop()}}),e)})));return function(t,n,a){return e.apply(this,arguments)}}(),get_list:function(){var e=Object(b.a)(g.a.mark((function e(t,n){var a;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(ve+"/api.php?action=getlist&p="+t+oe(n));case 2:return a=e.sent,e.abrupt("return",re(a));case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),get_search:function(){var e=Object(b.a)(g.a.mark((function e(t,n,a){var o;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(ve+"/api.php?action=search&pagesize=50&page="+t+"&keywords="+encodeURIComponent(n)+oe(a));case 2:return o=e.sent,e.abrupt("return",re(o));case 4:case"end":return e.stop()}}),e)})));return function(t,n,a){return e.apply(this,arguments)}}(),get_single:function(){var e=Object(b.a)(g.a.mark((function e(t,n){var a;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(ve+"/api.php?action=getone&pid="+t+oe(n));case 2:return a=e.sent,e.abrupt("return",re(a));case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),get_attention:function(){var e=Object(b.a)(g.a.mark((function e(t){var n;return g.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(ve+"/api.php?action=getattention"+oe(t));case 2:return n=e.sent,e.abrupt("return",re(n));case 4:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()},ce=n(39),le=n.n(ce),ue=(n(156),n(81)),he=n.n(ue),de=n(82),pe=n.n(de),me=n(40),fe=n.n(me),ge=(n(433),n(434),n(435),new he.a({html:!1,linkify:!1,breaks:!0,inline:!0,highlight:function(e,t){if(t&&fe.a.getLanguage(t))try{return'
'+fe.a.highlight(t,e,!0).value+"
"}catch(n){}return'
'+ge.utils.escapeHtml(e)+"
"}}).use(pe.a,{throwOnError:!1,errorColor:"#aa0000"})),be=function(e){return ge.render(e)},ve="https://thuhole.com/services/thuhole";function Ee(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _e(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:" ",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"g",a=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(!a)return e?new RegExp("(".concat(e.split(t).filter((function(e){return!!e})).map(Ee).join("|"),")"),n):/^$/g;try{return new RegExp("("+e.slice(1,-1)+")",n)}catch(o){return/^$/g}}function we(e){return o.a.createElement("span",{className:"colored-span",style:{"--coloredspan-bgcolor-light":e.colors[0],"--coloredspan-bgcolor-dark":e.colors[1]}},e.children)}function ke(e){return/^https?:\/\//.test(e)?e:"http://"+e}a.PureComponent;var Ae=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(){return Object(s.a)(this,n),t.apply(this,arguments)}return Object(c.a)(n,[{key:"render",value:function(){var e=this.props,t=[{shouldProcessNode:function(e){return"img"===e.name},processNode:function(e,t,n){return o.a.createElement("div",{key:n},"[\u56fe\u7247]")}},{shouldProcessNode:function(e){return/^h[123456]$/.test(e.name)},processNode:function(e,t,n){var a=+e.name[1];a<3&&(a=3);var r="h".concat(a);return o.a.createElement(r,{key:n},t)}},{shouldProcessNode:function(e){return"a"===e.name},processNode:function(e,t,n){return o.a.createElement("a",{href:ke(e.attribs.href),target:"_blank",rel:"noopenner noreferrer",className:"ext-link",key:n},t,o.a.createElement("span",{className:"icon icon-new-tab"}))}},{shouldProcessNode:function(e){return"text"===e.type&&(!e.parent||!e.parent.attribs||"application/x-tex"!==e.parent.attribs.encoding)},processNode:function(t,n,a){var r=O(t.data,[["url_pid",k],["url",y],["pid",w],["nickname",A]]);return o.a.createElement(o.a.Fragment,{key:a},r.map((function(t,n){var a=Object(d.a)(t,2),r=a[0],i=a[1];return o.a.createElement("span",{key:n},"url_pid"===r?o.a.createElement("span",{className:"url-pid-link",title:i},"/##"):"url"===r?o.a.createElement("a",{href:ke(i),className:"ext-link",target:"_blank",rel:"noopener noreferrer"},i,o.a.createElement("span",{className:"icon icon-new-tab"})):"pid"===r?o.a.createElement("a",{href:"#"+i,onClick:function(t){t.preventDefault(),e.show_pid(i.substring(1))}},i):"nickname"===r?o.a.createElement(we,{colors:e.color_picker.get(i)},i):"search"===r?o.a.createElement("span",{className:"search-query-highlight"},i):i)})))}},{shouldProcessNode:function(){return!0},processNode:new le.a.ProcessNodeDefinitions(o.a).processDefaultNode}],n=new le.a.Parser;if(e.author&&e.text.match(/^(?:#+ |>|```|\t|\s*-|\s*\d+\.)/)){var a=be(e.text);return o.a.createElement(o.a.Fragment,null,e.author,n.parseWithInstructions(a,(function(e){return"script"!==e.type}),t)||"")}var r=e.text;e.author&&(r=e.author+" "+r);var i=be(r);return n.parseWithInstructions(i,(function(e){return"script"!==e.type}),t)||null}}]),n}(a.Component);window.TEXTAREA_BACKUP={};var ye=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={text:""},a.on_change_bound=a.on_change.bind(Object(l.a)(a)),a.on_keydown_bound=a.on_keydown.bind(Object(l.a)(a)),a.clear=a.clear.bind(Object(l.a)(a)),a.area_ref=o.a.createRef(),a.change_callback=e.on_change||function(){},a.submit_callback=e.on_submit||function(){},a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){var e=this;this.setState({text:window.TEXTAREA_BACKUP[this.props.id]||""},(function(){e.change_callback(e.state.text)}))}},{key:"componentWillUnmount",value:function(){window.TEXTAREA_BACKUP[this.props.id]=this.state.text,this.change_callback(this.state.text)}},{key:"on_change",value:function(e){this.setState({text:e.target.value}),this.change_callback(e.target.value)}},{key:"on_keydown",value:function(e){"Enter"===e.key&&e.ctrlKey&&!e.altKey&&(e.preventDefault(),this.submit_callback())}},{key:"clear",value:function(){this.setState({text:""})}},{key:"set",value:function(e){this.change_callback(e),this.setState({text:e})}},{key:"get",value:function(){return this.state.text}},{key:"focus",value:function(){this.area_ref.current.focus()}},{key:"render",value:function(){return o.a.createElement("textarea",{ref:this.area_ref,onChange:this.on_change_bound,value:this.state.text,onKeyDown:this.on_keydown_bound})}}]),n}(a.Component),Oe=null;function xe(e){var t=/iPhone|iPad|iPod/i.test(window.navigator.userAgent);return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone?null:t?navigator.standalone?null:o.a.createElement("div",{className:"box promotion-bar"},o.a.createElement("span",{className:"icon icon-about"}),"\xa0 \u7528 Safari \u628a\u6811\u6d1e ",o.a.createElement("b",null,"\u6dfb\u52a0\u5230\u4e3b\u5c4f\u5e55")," \u66f4\u597d\u7528"):Oe?o.a.createElement("div",{className:"box promotion-bar"},o.a.createElement("span",{className:"icon icon-about"}),"\xa0 \u628a\u7f51\u9875\u7248\u6811\u6d1e"," ",o.a.createElement("b",null,o.a.createElement("a",{onClick:function(){Oe&&Oe.prompt()}},"\u5b89\u88c5\u5230\u684c\u9762"))," ","\u66f4\u597d\u7528"):null}window.addEventListener("beforeinstallprompt",(function(e){console.log("pwa: received before install prompt"),Oe=e}));var Ne=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={moved:!0,init_y:0,init_x:0},a.on_begin_bound=a.on_begin.bind(Object(l.a)(a)),a.on_move_bound=a.on_move.bind(Object(l.a)(a)),a.on_end_bound=a.on_end.bind(Object(l.a)(a)),a.MOVE_THRESHOLD=3,a.last_fire=0,a}return Object(c.a)(n,[{key:"on_begin",value:function(e){this.setState({moved:!1,init_y:(e.touches?e.touches[0]:e).screenY,init_x:(e.touches?e.touches[0]:e).screenX})}},{key:"on_move",value:function(e){this.state.moved||Math.abs((e.touches?e.touches[0]:e).screenY-this.state.init_y)+Math.abs((e.touches?e.touches[0]:e).screenX-this.state.init_x)>this.MOVE_THRESHOLD&&this.setState({moved:!0})}},{key:"on_end",value:function(e){this.state.moved||this.do_callback(e),this.setState({moved:!0})}},{key:"do_callback",value:function(e){this.last_fire+100>+new Date||(this.last_fire=+new Date,this.props.callback(e))}},{key:"render",value:function(){return o.a.createElement("div",{onTouchStart:this.on_begin_bound,onMouseDown:this.on_begin_bound,onTouchMove:this.on_move_bound,onMouseMove:this.on_move_bound,onClick:this.on_end_bound},this.props.children)}}]),n}(a.PureComponent);n(436);function Ce(e,t,n,a){a=a||!1,e.addEventListener?e.addEventListener(t,n,a):e.attachEvent&&e.attachEvent("on".concat(t),(function(t){n.call(e,t||window.event)}))}function je(e,t,n,a){a=a||!1,e.removeEventListener?e.removeEventListener(t,n,a):e.detachEvent&&e.detachEvent("on".concat(t),n)}var Se=function(e){if(!(e instanceof HTMLElement))return document.documentElement;for(var t="absolute"===e.style.position,n=/(scroll|auto)/,a=e;a;){if(!a.parentNode)return e.ownerDocument||document.documentElement;var o=window.getComputedStyle(a),r=o.position,i=o.overflow,s=o["overflow-x"],c=o["overflow-y"];if("static"===r&&t)a=a.parentNode;else{if(n.test(i)&&n.test(s)&&n.test(c))return a;a=a.parentNode}}return e.ownerDocument||e.documentElement||document.documentElement};var Ie=0,De=0,Ue="data-lazyload-listened",Re=[],He=[],Te=!1;try{var Le=Object.defineProperty({},"passive",{get:function(){Te=!0}});window.addEventListener("test",null,Le)}catch(Rt){}var Qe,Me=!!Te&&{capture:!1,passive:!0},Pe=function(e){var t=i.a.findDOMNode(e);if(t instanceof HTMLElement){var n=Se(t);(e.props.overflow&&n!==t.ownerDocument&&n!==document&&n!==document.documentElement?function(e,t){var n,a,o=i.a.findDOMNode(e);try{var r=t.getBoundingClientRect();n=r.top,a=r.height}catch(Rt){n=Ie,a=De}var s,c,l=window.innerHeight||document.documentElement.clientHeight,u=Math.max(n,0),h=Math.min(l,n+a)-u;try{var d=o.getBoundingClientRect();s=d.top,c=d.height}catch(Rt){s=Ie,c=De}var p=s-u,m=Array.isArray(e.props.offset)?e.props.offset:[e.props.offset,e.props.offset];return p-m[0]<=h&&p+c+m[1]>=0}(e,n):function(e){var t,n,a=i.a.findDOMNode(e);if(!(a.offsetWidth||a.offsetHeight||a.getClientRects().length))return!1;try{var o=a.getBoundingClientRect();t=o.top,n=o.height}catch(Rt){t=Ie,n=De}var r=window.innerHeight||document.documentElement.clientHeight,s=Array.isArray(e.props.offset)?e.props.offset:[e.props.offset,e.props.offset];return t-s[0]<=r&&t+n+s[1]>=0}(e))?e.state.visible&&!e.state.hidden||(e.props.once&&He.push(e),e.setState({visible:!0,hidden:!1})):e.props.once||(e.props.unmountIfInvisible?!0===e.visible&&e.setState({visible:!1}):e.props.hiddenIfInvisible&&!1===e.state.hidden&&e.setState({hidden:!0}))}},Ge=function(){for(var e=0;e=0?a=setTimeout(c,t-l):(a=null,n||(s=e.apply(r,o),a||(r=null,o=null)))};return function(){r=this,o=arguments,i=+new Date;var l=n&&!a;return a||(a=setTimeout(c,t)),l&&(s=e.apply(r,o),r=null,o=null),s}}(Ge,"number"===typeof this.props.debounce?this.props.debounce:300),Qe="debounce"):void 0!==this.props.throttle?(Xe=function(e,t,n){var a,o;return t||(t=250),function(){var r=n||this,i=+new Date,s=arguments;a&&i8e3&&(r=8e3*r/e,e=8e3,i=!0),r>8e3&&(e=8e3*e/r,r=8e3,i=!0),r*e>5e6){var s=Math.sqrt(r*e/5e6);r/=s,e/=s,i=!0}console.log("chosen img size",e,r);var c=document.createElement("canvas"),l=c.getContext("2d");c.width=e,c.height=r,l.drawImage(o,0,0,e,r);for(var u,h,d=.1,p=.9;p-d>=.03;)u=(p+d)/2,h=c.toDataURL("image/jpeg",u),console.log(d,p,"trying quality",u,"size",h.length),h.length<=6e5?d=u:p=u;d>=.101?(console.log("chosen img quality",u),t({img:a(h),quality:u,width:Math.round(e),height:Math.round(r),compressed:i})):n("\u56fe\u7247\u8fc7\u5927\uff0c\u65e0\u6cd5\u4e0a\u4f20")},o.src=e}(e)}))},o.readAsDataURL(e)}))}},{key:"on_img_change",value:function(){var e=this;this.img_ref.current&&this.img_ref.current.files.length?this.setState({img_tip:"\uff08\u6b63\u5728\u5904\u7406\u56fe\u7247\u2026\u2026\uff09"},(function(){e.proc_img(e.img_ref.current.files[0]).then((function(t){e.setState({img_tip:"\uff08".concat(t.compressed?"\u538b\u7f29\u5230":"\u5c3a\u5bf8"," ").concat(t.width,"*").concat(t.height," / ")+"\u8d28\u91cf ".concat(Math.floor(100*t.quality),"% / ").concat(Math.floor(t.img.length/(4/3)/1e3),"KB\uff09")})})).catch((function(t){e.setState({img_tip:"\u56fe\u7247\u65e0\u6548\uff1a".concat(t)})}))})):this.setState({img_tip:null})}},{key:"on_submit",value:function(e){var t=this;e&&e.preventDefault(),"loading"!==this.state.loading_status&&(this.img_ref.current.files.length?(this.setState({loading_status:"processing"}),this.proc_img(this.img_ref.current.files[0]).then((function(e){t.setState({loading_status:"loading"}),t.do_post(t.state.text,e.img)})).catch((function(e){alert(e)}))):(this.setState({loading_status:"loading"}),this.do_post(this.state.text,null)))}},{key:"toggle_preview",value:function(){this.setState({preview:!this.state.preview})}},{key:"render",value:function(){var e=this;return o.a.createElement("form",{onSubmit:this.on_submit.bind(this),className:"post-form box"},o.a.createElement("div",{className:"post-form-bar"},o.a.createElement("label",null,"\u56fe\u7247",o.a.createElement("input",{ref:this.img_ref,type:"file",accept:"image/*",disabled:"done"!==this.state.loading_status,onChange:this.on_img_change_bound})),this.state.preview?o.a.createElement("button",{type:"button",onClick:function(){e.toggle_preview()}},o.a.createElement("span",{className:"icon icon-eye-blocked"}),"\xa0\u7f16\u8f91"):o.a.createElement("button",{type:"button",onClick:function(){e.toggle_preview()}},o.a.createElement("span",{className:"icon icon-eye"}),"\xa0\u9884\u89c8"),"done"!==this.state.loading_status?o.a.createElement("button",{disabled:"disabled"},o.a.createElement("span",{className:"icon icon-loading"}),"\xa0","processing"===this.state.loading_status?"\u5904\u7406":"\u4e0a\u4f20"):o.a.createElement("button",{type:"submit"},o.a.createElement("span",{className:"icon icon-send"}),"\xa0\u53d1\u8868")),!!this.state.img_tip&&o.a.createElement("p",{className:"post-form-img-tip"},o.a.createElement("a",{onClick:function(){e.img_ref.current.value="",e.on_img_change()}},"\u5220\u9664\u56fe\u7247"),this.state.img_tip),this.state.preview?o.a.createElement("div",{className:"post-preview"},o.a.createElement(Ae,{text:this.state.text,color_picker:this.color_picker,show_pid:function(){}})):o.a.createElement(ye,{ref:this.area_ref,id:"new_post",on_change:this.on_change_bound,on_submit:this.on_submit.bind(this)}),o.a.createElement("p",null,o.a.createElement("small",null,"\u8bf7\u9075\u5b88",o.a.createElement("a",{href:"https://thuhole.com/policy.html",target:"_blank"},"\u6811\u6d1e\u7ba1\u7406\u89c4\u8303\uff08\u8bd5\u884c\uff09"),"\uff0c\u6587\u660e\u53d1\u8a00")))}}]),n}(a.Component),ht="https://img.thuhole.com/",dt={a:!0,audio:!0},pt=[],mt=["\u6027\u76f8\u5173","\u653f\u6cbb\u76f8\u5173","\u6027\u8bdd\u9898","\u653f\u6cbb\u8bdd\u9898","\u6298\u53e0","NSFW","\u5237\u5c4f","\u771f\u5b9e\u6027\u53ef\u7591","\u7528\u6237\u4e3e\u62a5\u8f83\u591a","\u4e3e\u62a5\u8f83\u591a","\u91cd\u590d\u5185\u5bb9"];window.LATEST_POST_ID=parseInt(localStorage._LATEST_POST_ID,10)||0;function ft(e,t){return function(){var n=Object(b.a)(g.a.mark((function n(a){var r,i,s,c,l,u,h=arguments;return g.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return r=h.length>1&&void 0!==h[1]&&h[1],i=new _,e(s="\u6811\u6d1e #"+a,o.a.createElement("div",{className:"box box-tip"},"\u6b63\u5728\u52a0\u8f7d #",a),r?"replace":"push"),n.prev=4,n.next=7,se.get_single(a,t);case 7:return(c=n.sent).data.variant={},n.next=11,se.load_replies_with_cache(a,t,i,parseInt(c.data.reply));case 11:l=n.sent,u=l.data,e(s,o.a.createElement(vt,{key:+new Date,info:c.data,replies:u.data,attention:u.attention,token:t,show_sidebar:e,color_picker:i,deletion_detect:"on"===localStorage.DELETION_DETECT}),"replace"),n.next=20;break;case 16:n.prev=16,n.t0=n.catch(4),console.error(n.t0),e(s,o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement("a",{onClick:function(){return ft(e,t)(a,!0)}},"\u91cd\u65b0\u52a0\u8f7d")),o.a.createElement("p",null,""+n.t0)),"replace");case 20:case"end":return n.stop()}}),n,null,[[4,16]])})));return function(e){return n.apply(this,arguments)}}()}var gt=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){return Object(s.a)(this,n),t.call(this,e)}return Object(c.a)(n,[{key:"render",value:function(){var e=this,t=this.props.info.text,n=t.indexOf("]"),a=t.substr(0,n+1),r=t.substr(n+2);return o.a.createElement("div",{className:"flow-reply box",style:this.props.info._display_color?{"--box-bgcolor-light":this.props.info._display_color[0],"--box-bgcolor-dark":this.props.info._display_color[1]}:null},o.a.createElement("div",{className:"box-header"},o.a.createElement("code",{className:"box-id"},"#",this.props.info.cid),!!this.props.do_filter_name&&o.a.createElement("span",{className:"reply-header-badge clickable",onClick:function(){e.props.do_filter_name(e.props.info.name)}},o.a.createElement("span",{className:"icon icon-locate"})),"\xa0",null!==this.props.info.tag&&o.a.createElement("span",{className:"box-header-tag"},this.props.info.tag),o.a.createElement(J,{stamp:this.props.info.timestamp,short:!1})),o.a.createElement("div",{className:"box-content"},o.a.createElement(Ae,{author:a,text:r,color_picker:this.props.color_picker,show_pid:this.props.show_pid})))}}]),n}(a.PureComponent),bt=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){return Object(s.a)(this,n),t.call(this,e)}return Object(c.a)(n,[{key:"copy_link",value:function(e){e.preventDefault(),E()("".concat(e.target.href).concat(this.props.info.tag?" \u3010"+this.props.info.tag+"\u3011":"","\n")+"".concat(this.props.info.text).concat("image"===this.props.info.type?" [\u56fe\u7247]":"audio"===this.props.info.type?" [\u8bed\u97f3]":"","\n")+"\uff08".concat(q(new Date(1e3*this.props.info.timestamp))," ").concat(this.props.info.likenum,"\u5173\u6ce8 ").concat(this.props.info.reply,"\u56de\u590d\uff09\n")+this.props.replies.map((function(e){return(e.tag?"\u3010"+e.tag+"\u3011":"")+e.text})).join("\n"))}},{key:"render",value:function(){var e=this,t=this.props;return o.a.createElement("div",{className:"flow-item"+(t.is_quote?" flow-item-quote":"")},!!t.is_quote&&o.a.createElement("div",{className:"quote-tip black-outline"},o.a.createElement("div",null,o.a.createElement("span",{className:"icon icon-quote"}))),o.a.createElement("div",{className:"box"},!!window.LATEST_POST_ID&&parseInt(t.info.pid,10)>window.LATEST_POST_ID&&o.a.createElement("div",{className:"flow-item-dot"}),!!this.props.attention&&!this.props.cached&&o.a.createElement("div",{className:"flow-item-dot"}),o.a.createElement("div",{className:"box-header"},!!this.props.do_filter_name&&o.a.createElement("span",{className:"reply-header-badge clickable",onClick:function(){e.props.do_filter_name("\u6d1e\u4e3b")}},o.a.createElement("span",{className:"icon icon-locate"})),!!parseInt(t.info.likenum,10)&&o.a.createElement("span",{className:"box-header-badge"},t.info.likenum,"\xa0",o.a.createElement("span",{className:"icon icon-"+(t.attention?"star-ok":"star")})),!!parseInt(t.info.reply,10)&&o.a.createElement("span",{className:"box-header-badge"},t.info.reply,"\xa0",o.a.createElement("span",{className:"icon icon-reply"})),o.a.createElement("code",{className:"box-id"},o.a.createElement("a",{href:"##"+t.info.pid,onClick:this.copy_link.bind(this)},"#",t.info.pid)),"\xa0",null!==t.info.tag&&"\u6298\u53e0"!==t.info.tag&&o.a.createElement("span",{className:"box-header-tag"},t.info.tag),o.a.createElement(J,{stamp:t.info.timestamp,short:!t.img_clickable})),o.a.createElement("div",{className:"box-content"},o.a.createElement(Ae,{text:t.info.text,color_picker:t.color_picker,show_pid:t.show_pid}),"image"===t.info.type&&o.a.createElement("p",{className:"img"},t.img_clickable?o.a.createElement("a",{className:"no-underline",href:ht+t.info.url,target:"_blank"},o.a.createElement("img",{src:ht+t.info.url,onError:function(e){e.target.src===ht+t.info.url&&(e.target.src="https://img2.thuhole.com/"+t.info.url)},alt:ht+t.info.url})):o.a.createElement("img",{src:ht+t.info.url,onError:function(e){e.target.src===ht+t.info.url&&(e.target.src="https://img2.thuhole.com/"+t.info.url)},alt:ht+t.info.url}))),!(!t.attention||!t.info.variant.latest_reply)&&o.a.createElement("p",{className:"box-footer"},"\u6700\u65b0\u56de\u590d"," ",o.a.createElement(J,{stamp:t.info.variant.latest_reply,short:!1}))))}}]),n}(a.PureComponent),vt=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={attention:e.attention,info:e.info,replies:e.replies,loading_status:"done",error_msg:null,filter_name:null,rev:!1},a.color_picker=e.color_picker,a.syncState=e.sync_state||function(){},a.reply_ref=o.a.createRef(),a}return Object(c.a)(n,[{key:"set_variant",value:function(e,t){this.setState((function(n){return e?{replies:n.replies.map((function(n){return n.cid===e?Object.assign({},n,{variant:Object.assign({},n.variant,t)}):n}))}:{info:Object.assign({},n.info,{variant:Object.assign({},n.info.variant,t)})}}),(function(){this.syncState({info:this.state.info,replies:this.state.replies})}))}},{key:"load_replies",value:function(){var e=this,t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.setState({loading_status:"loading",error_msg:null}),se.load_replies(this.state.info.pid,this.props.token,this.color_picker,null).then((function(n){e.setState((function(e,a){return{replies:n.data,info:t?Object.assign({},e.info,{reply:""+n.data.length}):e.info,attention:!!n.attention,loading_status:"done",error_msg:null}}),(function(){e.syncState({replies:e.state.replies,attention:e.state.attention,info:e.state.info}),e.state.replies.length&&e.set_variant(null,{latest_reply:Math.max.apply(null,e.state.replies.map((function(e){return parseInt(e.timestamp)})))})}))})).catch((function(t){console.error(t),e.setState({replies:[],loading_status:"done",error_msg:""+t})}))}},{key:"toggle_attention",value:function(){var e=this;this.setState({loading_status:"loading"});var t=!this.state.attention;se.set_attention(this.state.info.pid,t,this.props.token).then((function(n){e.setState({loading_status:"done",attention:t}),e.syncState({attention:t})})).catch((function(t){e.setState({loading_status:"done"}),alert("\u8bbe\u7f6e\u5173\u6ce8\u5931\u8d25"),console.error(t)}))}},{key:"report",value:function(){var e=prompt("\u4e3e\u62a5 #".concat(this.state.info.pid," \u7684\u7406\u7531\uff1a"));null!==e&&se.report(this.state.info.pid,e,this.props.token).then((function(e){alert("\u4e3e\u62a5\u6210\u529f")})).catch((function(e){alert("\u4e3e\u62a5\u5931\u8d25"),console.error(e)}))}},{key:"set_filter_name",value:function(e){this.setState((function(t){return{filter_name:e===t.filter_name?null:e}}))}},{key:"toggle_rev",value:function(){this.setState((function(e){return{rev:!e.rev}}),Ge)}},{key:"show_reply_bar",value:function(e,t){if(this.reply_ref.current&&!t.target.closest("a, .clickable")){var n=this.reply_ref.current.get();if(/^\s*(?:Re (?:|\u6d1e\u4e3b|(?:[A-Z][a-z]+ )?(?:[A-Z][a-z]+)|You Win(?: \d+)?):)?\s*$/.test(n)){var a="Re "+e+": ";a===this.reply_ref.current.get()?this.reply_ref.current.set(""):this.reply_ref.current.set(a)}}}},{key:"render",value:function(){var e=this;if("loading"===this.state.loading_status)return o.a.createElement("p",{className:"box box-tip"},"\u52a0\u8f7d\u4e2d\u2026\u2026");var t=ft(this.props.show_sidebar,this.props.token),n=this.state.filter_name?this.state.replies.filter((function(t){return t.name===e.state.filter_name})):this.state.replies.slice();this.state.rev&&n.reverse();var a=Object(m.a)({},"\u6d1e\u4e3b",1);n.forEach((function(e){void 0===a[e.name]&&(a[e.name]=0),a[e.name]++}));var r=this.state.filter_name&&"\u6d1e\u4e3b"!==this.state.filter_name?null:o.a.createElement(Ne,{callback:function(t){e.show_reply_bar("",t)}},o.a.createElement(bt,{info:this.state.info,attention:this.state.attention,img_clickable:!0,color_picker:this.color_picker,show_pid:t,replies:this.state.replies,set_variant:function(t){e.set_variant(null,t)},do_filter_name:a["\u6d1e\u4e3b"]>1?this.set_filter_name.bind(this):null}));return o.a.createElement("div",{className:"flow-item-row sidebar-flow-item"},o.a.createElement("div",{className:"box box-tip"},!!this.props.token&&o.a.createElement("span",null,o.a.createElement("a",{onClick:this.report.bind(this)},o.a.createElement("span",{className:"icon icon-flag"}),o.a.createElement("label",null,"\u4e3e\u62a5")),"\xa0\xa0"),o.a.createElement("a",{onClick:this.load_replies.bind(this)},o.a.createElement("span",{className:"icon icon-refresh"}),o.a.createElement("label",null,"\u5237\u65b0")),(this.state.replies.length>=1||this.state.rev)&&o.a.createElement("span",null,"\xa0\xa0",o.a.createElement("a",{onClick:this.toggle_rev.bind(this)},o.a.createElement("span",{className:"icon icon-order-rev"}),o.a.createElement("label",null,this.state.rev?"\u8fd8\u539f":"\u9006\u5e8f"))),!!this.props.token&&o.a.createElement("span",null,"\xa0\xa0",o.a.createElement("a",{onClick:function(){e.toggle_attention()}},this.state.attention?o.a.createElement("span",null,o.a.createElement("span",{className:"icon icon-star-ok"}),o.a.createElement("label",null,"\u5df2\u5173\u6ce8")):o.a.createElement("span",null,o.a.createElement("span",{className:"icon icon-star"}),o.a.createElement("label",null,"\u672a\u5173\u6ce8"))))),!!this.state.filter_name&&o.a.createElement("div",{className:"box box-tip flow-item filter-name-bar"},o.a.createElement("p",null,o.a.createElement("span",{style:{float:"left"}},o.a.createElement("a",{onClick:function(){e.set_filter_name(null)}},"\u8fd8\u539f")),o.a.createElement("span",{className:"icon icon-locate"}),"\xa0\u5f53\u524d\u53ea\u770b\xa0",o.a.createElement(we,{colors:this.color_picker.get(this.state.filter_name)},this.state.filter_name))),!this.state.rev&&r,!!this.state.error_msg&&o.a.createElement("div",{className:"box box-tip flow-item"},o.a.createElement("p",null,"\u56de\u590d\u52a0\u8f7d\u5931\u8d25"),o.a.createElement("p",null,this.state.error_msg)),this.props.deletion_detect&&parseInt(this.state.info.reply)>this.state.replies.length&&!!this.state.replies.length&&o.a.createElement("div",{className:"box box-tip flow-item box-danger"},parseInt(this.state.info.reply)-this.state.replies.length," ","\u6761\u56de\u590d\u88ab\u5220\u9664"),n.map((function(n,r){return o.a.createElement(Ve,{key:r,offset:1500,height:"5em",overflow:!0,once:!0},o.a.createElement(Ne,{callback:function(t){e.show_reply_bar(n.name,t)}},o.a.createElement(gt,{info:n,color_picker:e.color_picker,show_pid:t,set_variant:function(t){e.set_variant(n.cid,t)},do_filter_name:a[n.name]>1?e.set_filter_name.bind(e):null})))})),this.state.rev&&r,this.props.token?o.a.createElement(lt,{pid:this.state.info.pid,token:this.props.token,area_ref:this.reply_ref,on_complete:this.load_replies.bind(this)}):o.a.createElement("div",{className:"box box-tip flow-item"},"\u767b\u5f55\u540e\u53ef\u4ee5\u56de\u590d\u6811\u6d1e"))}}]),n}(a.PureComponent),Et=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).needFold=mt.indexOf(e.info.tag)>-1&&("\u70ed\u699c"===e.search_param||!e.search_param)&&window.config.fold&&"attention"!==e.mode&&"attention_finished"!==e.mode,a.state={replies:[],reply_status:"done",reply_error:null,info:Object.assign({},e.info,{variant:{}}),hidden:window.config.block_words.some((function(t){return e.info.text.includes(t)}))||a.needFold,attention:null!==e.attention_override&&e.attention_override,cached:!0},a.color_picker=new _,a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){parseInt(this.state.info.reply,10)&&this.load_replies(null,!1)}},{key:"load_replies",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];console.log("fetching reply",this.state.info.pid),this.setState({reply_status:"loading",reply_error:null}),se.load_replies_with_cache(this.state.info.pid,this.props.token,this.color_picker,parseInt(this.state.info.reply)).then((function(a){var o=a.data,r=a.cached;t.setState((function(e,t){return{replies:o.data,info:Object.assign({},e.info,{reply:n?""+o.data.length:e.info.reply,variant:o.data.length?{latest_reply:Math.max.apply(null,o.data.map((function(e){return parseInt(e.timestamp)})))}:{}}),attention:!!o.attention,reply_status:"done",reply_error:null,cached:r}}),e)})).catch((function(n){console.error(n),t.setState({replies:[],reply_status:"failed",reply_error:""+n},e)}))}},{key:"show_sidebar",value:function(){this.props.show_sidebar("\u6811\u6d1e #"+this.state.info.pid,o.a.createElement(vt,{key:+new Date,info:this.state.info,replies:this.state.replies,attention:this.state.attention,sync_state:this.setState.bind(this),token:this.props.token,show_sidebar:this.props.show_sidebar,color_picker:this.color_picker,deletion_detect:this.props.deletion_detect}))}},{key:"render",value:function(){var e=this,t=ft(this.props.show_sidebar,this.props.token,this.state.info.pid),n=[["url_pid",k],["url",y],["pid",w],["nickname",A]];this.props.search_param&&n.push(["search",this.props.search_param.match(/\/.+\//)?_e(this.props.search_param," ","gi",!0):_e(this.props.search_param," ","gi")]);var a=O(this.state.info.text,n),r=null;if(!this.props.is_quote){var i,s=Object(p.a)(a);try{for(s.s();!(i=s.n()).done;){var c=Object(d.a)(i.value,2),l=c[0],u=c[1];if(u=u.length>0?u.substring(1):u,"pid"===l&&-1===pt.indexOf(u)&&parseInt(u)10&&o.a.createElement("div",{className:"box box-tip"},"\u8fd8\u6709 ",this.state.replies.length-10," \u6761")));return this.state.hidden?o.a.createElement("div",{className:"flow-item-row flow-item-row-with-prompt",onClick:function(t){dt[t.target.tagName.toLowerCase()]||e.show_sidebar()}},o.a.createElement("div",{className:"flow-item"+(this.props.is_quote?" flow-item-quote":"")},!!this.props.is_quote&&o.a.createElement("div",{className:"quote-tip black-outline"},o.a.createElement("div",null,o.a.createElement("span",{className:"icon icon-quote"}))),o.a.createElement("div",{className:"box"},o.a.createElement("div",{className:"box-header"},!!this.props.do_filter_name&&o.a.createElement("span",{className:"reply-header-badge clickable",onClick:function(){e.props.do_filter_name("\u6d1e\u4e3b")}},o.a.createElement("span",{className:"icon icon-locate"})),o.a.createElement("code",{className:"box-id"},"#",this.props.info.pid),"\xa0",null!==this.props.info.tag&&"\u6298\u53e0"!==this.props.info.tag&&o.a.createElement("span",{className:"box-header-tag"},this.props.info.tag),o.a.createElement(J,{stamp:this.props.info.timestamp,short:!0}),o.a.createElement("span",{className:"box-header-badge"},this.needFold?"\u5df2\u9690\u85cf":"\u5df2\u5c4f\u853d"),o.a.createElement("div",{style:{clear:"both"}}))))):r?o.a.createElement("div",null,h,o.a.createElement(_t,{pid:r,show_sidebar:this.props.show_sidebar,token:this.props.token,deletion_detect:this.props.deletion_detect})):h}}]),n}(a.PureComponent),_t=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={loading_status:"empty",error_msg:null,info:null},a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){this.load()}},{key:"load",value:function(){var e=this;this.setState({loading_status:"loading"},(function(){se.get_single(e.props.pid,e.props.token).then((function(t){e.setState({loading_status:"done",info:t.data})})).catch((function(t){-1!==(""+t).indexOf("\u6ca1\u6709\u8fd9\u6761\u6811\u6d1e")?e.setState({loading_status:"empty"}):e.setState({loading_status:"error",error_msg:""+t})}))}))}},{key:"render",value:function(){return"empty"===this.state.loading_status?null:"loading"===this.state.loading_status?o.a.createElement("div",{className:"aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("span",{className:"icon icon-loading"}),"\u63d0\u5230\u4e86 #",this.props.pid)):"error"===this.state.loading_status?o.a.createElement("div",{className:"aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement("a",{onClick:this.load.bind(this)},"\u91cd\u65b0\u52a0\u8f7d")),o.a.createElement("p",null,this.state.error_msg))):o.a.createElement(Et,{info:this.state.info,mode:this.props.mode,show_sidebar:this.props.show_sidebar,token:this.props.token,is_quote:!0,deletion_detect:this.props.deletion_detect})}}]),n}(a.PureComponent);function wt(e){return o.a.createElement(it.Consumer,null,(function(t){var n=t.value;return o.a.createElement("div",{className:"flow-chunk"},!!e.title&&o.a.createElement($,{text:e.title}),e.list.map((function(t,a){return o.a.createElement(Ve,{key:t.pid,offset:500,height:"15em",hiddenIfInvisible:!1},o.a.createElement("div",null,!!(e.deletion_detect&&"list"===e.mode&&a&&e.list[a-1].pid-t.pid>1)&&o.a.createElement("div",{className:"flow-item-row"},o.a.createElement("div",{className:"box box-tip flow-item box-danger"},e.list[a-1].pid-t.pid-1," \u6761\u88ab\u5220\u9664")),o.a.createElement(Et,{info:t,mode:e.mode,show_sidebar:e.show_sidebar,token:n,attention_override:"attention_finished"===e.mode||null,deletion_detect:e.deletion_detect,search_param:e.search_param})))})))}))}var kt=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={mode:e.mode,search_param:e.search_text,loaded_pages:0,chunks:{title:"",data:[]},loading_status:"done",error_msg:null},a.on_scroll_bound=a.on_scroll.bind(Object(l.a)(a)),window.LATEST_POST_ID=parseInt(localStorage._LATEST_POST_ID,10)||0,a}return Object(c.a)(n,[{key:"load_page",value:function(e){var t=this,n=function(e){console.error(e),t.setState((function(t,n){return{loaded_pages:t.loaded_pages-1,loading_status:"failed",error_msg:""+e}}))};if(e>this.state.loaded_pages+1)throw new Error("bad page");if(e===this.state.loaded_pages+1){if(console.log("fetching page",e),"list"===this.state.mode)se.get_list(e,this.props.token).then((function(n){if(1===e&&n.data.length){var a=-1;n.data.forEach((function(e){parseInt(e.pid,10)>a&&(a=parseInt(e.pid,10))})),localStorage._LATEST_POST_ID=""+a}t.setState((function(e,t){return{chunks:{title:"News Feed",data:e.chunks.data.concat(n.data.filter((function(t){return 0===e.chunks.data.length||!e.chunks.data.slice(-100).some((function(e){return e.pid===t.pid}))})))},loading_status:"done"}}))})).catch(n);else if("search"===this.state.mode)se.get_search(e,this.state.search_param,this.props.token).then((function(e){var n=0===e.data.length;t.setState((function(a,o){return{chunks:{title:'Result for "'+t.state.search_param+'"',data:a.chunks.data.concat(e.data.filter((function(e){return 0===a.chunks.data.length||!a.chunks.data.slice(-100).some((function(t){return t.pid===e.pid}))})))},mode:n?"search_finished":"search",loading_status:"done"}}))})).catch(n);else if("single"===this.state.mode){var a=parseInt(this.state.search_param.substr(1),10);se.get_single(a,this.props.token).then((function(e){t.setState({chunks:{title:"PID = "+a,data:[e.data]},mode:"single_finished",loading_status:"done"})})).catch(n)}else{if("attention"!==this.state.mode)return void console.log("nothing to load");var o=!!this.state.search_param,r=o&&!!this.state.search_param.match(/\/.+\//),i=/.+/;if(r)try{i=new RegExp(this.state.search_param.slice(1,-1))}catch(Rt){alert("\u8bf7\u68c0\u67e5\u6b63\u5219\u8868\u8fbe\u5f0f\u5408\u6cd5\u6027\uff01\n".concat(Rt)),i=/.+/}console.log(o,r),se.get_attention(this.props.token).then((function(e){t.setState({chunks:{title:"".concat(o?r?"Result for RegEx ".concat(i.toString()," in "):'Result for "'.concat(t.state.search_param,'" in '):"","Attention List"),data:o?r?e.data.filter((function(e){return!!e.text.match(i)})):e.data.filter((function(e){return t.state.search_param.split(" ").every((function(t){return e.text.includes(t)}))})):e.data},mode:"attention_finished",loading_status:"done"})})).catch(n)}this.setState((function(e,t){return{loaded_pages:e.loaded_pages+1,loading_status:"loading",error_msg:null}}))}}},{key:"on_scroll",value:function(e){e.target===document&&(document.body.scrollHeight-window.scrollY-window.innerHeight2&&o.a.createElement("a",{className:"no-underline",onClick:this.do_back_bound},"\xa0",o.a.createElement("span",{className:"icon icon-back"}),"\xa0"),n))}}]),n}(a.PureComponent),Nt=n(85),Ct=n.n(Nt),jt=(n(449),function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),(a=t.call(this,e)).state={level:0,fired:!1},a.callback=e.callback,a.esc_interval=null,a}return Object(c.a)(n,[{key:"do_fire",value:function(){var e=this;this.esc_interval&&(clearInterval(this.esc_interval),this.esc_interval=null),this.setState({level:1,fired:!0}),this.callback(),window.setTimeout((function(){e.setState({level:0,fired:!1})}),300)}},{key:"componentDidMount",value:function(){var e=this;window.config.pressure&&(Ct.a.set(document.body,{change:function(t){e.state.fired||(t>=.999?e.do_fire():e.setState({level:t}))},end:function(){e.setState({level:0,fired:!1})}},{polyfill:!1,only:"touch",preventSelect:!1}),document.addEventListener("keydown",(function(t){t.repeat||"Escape"!==t.key||(e.esc_interval&&clearInterval(e.esc_interval),e.setState({level:.2},(function(){e.esc_interval=setInterval((function(){var t=e.state.level+.1;t>=.999?e.do_fire():e.setState({level:t})}),30)})))})),document.addEventListener("keyup",(function(t){"Escape"===t.key&&(e.esc_interval&&(clearInterval(e.esc_interval),e.esc_interval=null),e.setState({level:0}))})))}},{key:"render",value:function(){var e=25*(this.state.level-.4)-500;return o.a.createElement("div",{className:"pressure-box"+(this.state.fired?" pressure-box-fired":"")+(this.state.level<=1e-4?" pressure-box-empty":""),style:{left:e,right:e,top:e,bottom:e}})}}]),n}(a.Component));function St(e){return o.a.createElement("div",{id:"global-hint-container",style:{display:"none"}})}var It=function(e){Object(u.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(s.a)(this,n),a=t.call(this,e),qe(),function(e){function t(){(void 0===e?window.matchMedia("(prefers-color-scheme: dark)").matches:e)?document.body.classList.add("root-dark-mode"):document.body.classList.remove("root-dark-mode")}t(),window.matchMedia("(prefers-color-scheme: dark)").addListener((function(){t()}))}({default:void 0,light:!1,dark:!0}[window.config.color_scheme]),a.state={sidebar_stack:[[null,null]],mode:"list",search_text:null,flow_render_key:+new Date,token:localStorage.TOKEN||null},a.show_sidebar_bound=a.show_sidebar.bind(Object(l.a)(a)),a.set_mode_bound=a.set_mode.bind(Object(l.a)(a)),a.on_pressure_bound=a.on_pressure.bind(Object(l.a)(a)),a.inthu_flag=-1!==window[atob("ZG9jdW1lbnQ")][atob("Y29va2ll")].indexOf(atob("dGh1X2lwX2ZsYWc9eWVz")),a}return Object(c.a)(n,[{key:"on_pressure",value:function(){this.state.sidebar_stack.length>1?this.show_sidebar(null,null,"clear"):this.set_mode("list",null)}},{key:"show_sidebar",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"push";this.setState((function(a){var o=a.sidebar_stack.slice();if("push"===n)1===o.length&&(document.body.style.top="-".concat(window.scrollY,"px"),document.body.style.position="fixed",document.body.style.width="100vw"),o.length>10&&o.splice(1,1),o=o.concat([[e,t]]);else if("pop"===n){if(1===o.length)return;if(2===o.length){var r=document.body.style.top;document.body.style.position="",document.body.style.top="",document.body.style.width="",window.scrollTo(0,-1*parseInt(r||"0"))}o.pop()}else if("replace"===n)o.pop(),o=o.concat([[e,t]]);else{if("clear"!==n)throw new Error("bad show_sidebar mode");var i=document.body.style.top;document.body.style.position="",document.body.style.top="",document.body.style.width="",window.scrollTo(0,-1*parseInt(i||"0")),o=[[null,null]]}return{sidebar_stack:o}}))}},{key:"set_mode",value:function(e,t){this.setState({mode:e,search_text:t,flow_render_key:+new Date})}},{key:"render",value:function(){var e=this;return o.a.createElement(it.Provider,{value:{value:this.state.token,set_value:function(t){localStorage.TOKEN=t||"",e.setState({token:t})}}},o.a.createElement(jt,{callback:this.on_pressure_bound}),o.a.createElement("div",{className:"bg-img",style:Je()}),o.a.createElement(Ot,{show_sidebar:this.show_sidebar_bound,set_mode:this.set_mode_bound,mode:this.state.mode}),o.a.createElement(it.Consumer,null,(function(t){return o.a.createElement("div",{className:"left-container"},o.a.createElement(St,{token:t.value}),!t.value&&o.a.createElement("div",{className:"flow-item-row aux-margin"},o.a.createElement("div",{className:"box box-tip"},o.a.createElement("p",null,o.a.createElement(te,{token_callback:t.set_value},(function(e){return o.a.createElement("a",{onClick:e},o.a.createElement("span",{className:"icon icon-login"}),"\xa0\u767b\u5f55\u5230 T\u5927\u6811\u6d1e")}))))),e.inthu_flag||t.value?o.a.createElement(kt,{key:e.state.flow_render_key,show_sidebar:e.show_sidebar_bound,mode:e.state.mode,search_text:e.state.search_text,token:t.value}):o.a.createElement($,{text:"\u8bf7\u767b\u5f55\u540e\u67e5\u770b\u5185\u5bb9"}),o.a.createElement("br",null))})),o.a.createElement(xt,{show_sidebar:this.show_sidebar_bound,stack:this.state.sidebar_stack}))}}],[{key:"is_darkmode",value:function(){return"dark"===window.config.color_scheme||"light"!==window.config.color_scheme&&window.matchMedia("(prefers-color-scheme: dark)").matches}}]),n}(a.Component),Dt=Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));function Ut(e){navigator.serviceWorker.register(e).then((function(e){e.onupdatefound=function(){var t=e.installing;t.onstatechange=function(){"installed"===t.state&&(navigator.serviceWorker.controller?console.log("New content is available; please refresh."):console.log("Content is cached for offline use."))}}})).catch((function(e){console.error("Error during service worker registration:",e)}))}i.a.render(o.a.createElement(It,null),document.getElementById("root")),"serviceWorker"in navigator&&window.addEventListener("load",(function(){var e="".concat(".","/service-worker.js");Dt?(function(e){fetch(e).then((function(t){404===t.status||-1===t.headers.get("content-type").indexOf("javascript")?navigator.serviceWorker.ready.then((function(e){e.unregister().then((function(){window.location.reload()}))})):Ut(e)})).catch((function(){console.log("No internet connection found. App is running in offline mode.")}))}(e),navigator.serviceWorker.ready.then((function(){console.log("This web app is being served cache-first by a service worker. To learn more, visit https://goo.gl/SC7cgQ")}))):Ut(e)}))},74:function(e,t){e.exports="data:image/png;base64,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"},75:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAHF0lEQVR42q1XW0xUVxQ9d2Z4g4oiAiKYGiqQhhDkoVEkBmJT0QYUKgaMIDYSiEZFEFBRFBRQ1A9qsfhISkR80EogbcXyENHKV6GFYR4yw0uJRv3QD2OisWtNZsg4CiMpHzv3cufes9dZe+11NuLw4cPCPA4dOjR+Zezfv18qKCiQHzlyxOb48eM2x44dM1wLCwsVeC7h+sE3lutZCzEZgKKiIqmsrExUVFQIJBO7du0Su3fvNlwBSJw8edLwzv8B8cnEXLC4uFgcPHhQREdHi1WrVvl7eHh8K0lSukKhyMJ1U0BAQHhMTIzjvn37RGlp6TiQqYL4aPcM7iw1NVU4OzvHCCF+RvQgsd7R0XEEMerg4DCEZypEk5OT01aAdMrLyyNoiaCnAmI8qekDUp2YmOhga2tbjKQDs2bNGp4zZ45m5syZWgB6yJgxY4aWz1xdXXX29vYjAHLdy8tr8YEDBwwgpsLE+A2Rc+cJCQkOWLAKiR7PnTtXOXv2bA2SqYODgx+sW7fuVnx8/O/Lly/vQEn6AE7r7u7eCyDDKMtdb29v//z8fJZj6gwcPXpUbNmyRYDiQuzwsaenZy8AaFesWHG3rq6u9Pnz56nv37+PRXzz5s2bpK6urvyUlJQGANAQjJub2yiANwKcK4VrLkyrAHAj8Q8kXgpK1UiuxMJa7Pa3R48ebXr79u0X9+7dc+7s7JQzcG+vVCo93r17F41E5wFAjRKQkVEXF5fsvXv3GrrEvLQTAiD13H1GRgYBVHInXDA8PPzB06dP13d3d9txkezsbMGFGbzfsWOHaG5uFmAkeNu2bdcB+OH8+fO1NjY2nZGRke7l5eXCJMhJAUB0shMnToioqCgvfPyXj4+PFiB0Fy9eLOrp6bHds2cPF5K4I4uQ6AkdHR1Co9HE+fn59UIDKjCgCwwMjDUyIFllAMpVwN3EypUrIyE8DRbR+vv797S3t4eWlJTwd8lSVKZ7Ps/NzRUNDQ3OGzZsqIdmBsDCMMqYs337doHvJWss8CUbUgqlx8+bN08P+nVhYWF/wFxcJmsno1MK9L904cIFkZ6eXoxuGMIGhsFCOUtqMjNrIrThDdT+HUDosQBB/IKOkHOBydTM50ggw9nA7/PAwDDESN+ooEZM308KAKJSnD17ljv5GiUYgAYG4HR3QKkbF/6Us5nUzd9Ic1paGl2zEvQPQT/DERERRUbg1jWAF+WkEkC+8vX17YGa1XA9HXSwxrgDmWU7me4pTp4DMCkvALgPABqAHwSorZcvX6Y+JKtdQDVTSLdv33aOjY2tx0I6UKlHR/wKV3RmO0GIcu7IPEg9kstoXnZ2doWsP6hXoYT/1NfXh5w+fZpHufgcAAYlNzY2itra2gwcLjqw0AchDcpksgqcC47cJTsFJZEQMt7zGZMDaAp2rQH1/bgOoK1/RPs68sj+HEseP355COn1em/Y6w0sqsOCfaQTHl+3aNGiqOTkZMekpCSxceNGsXnzZjl6fbFcLi/B7rUomRq7V7J0SPr9pUuXDP7CFrY2K4zf5OTkiKtXr4qXL19+vWzZsjb4uh7W2oezYRD3akQDohJxClGL+Bv9zpbrJwAygNDi+X20cTjNjUG2aPUTgfigp1mKtrY22ydPniSsXbu2CTvU4FjWoiwqhGkeGMH9EEKD3WvAlhYn5r8AqzGyMATW7mNgiVuyZEkoT1da/UQDy0eU0F5bWloc4PGrq6qqTkHh7Ujah51pEFpTYFboR8t2YSI6D9C5oaGh7QBrYA3g+M5DI3PXFyxY4MeWhd5kliA+ai2KkgfOzZs3Za9evfJ7/fp1AgAVQHQ/ZGVl1WRmZtZgsZ+uXbtWAqbSADQE77mpVKrkkJCQDiRXsyy49qNEKoDiwHIHLepvAmHuLRNaLDVBtE1NTQok8kCiQEQ4IgwR9OzZM5/R0VHH6upqmpgYGxuzRytnslw4VVVGECqUqY9aMYIIsGRiQoslE3yJEw5PxMrKSnHlyhVDnDt3znAkcyBl93A8p9hgXF/CR7oBQIPoBwg1QQBAH4AMmpgwDr0GTUzYn+YnHs2K/x8goSGYkM/4m/F3g4BxgjpAdDVINAhjUhqZUENDBiYQHGbbCYIbo1V/1txmKotpFrA0GFMHcUBBaVYvXbq0BYl0EGQ/GGEHEYTaDERrUFCQL2fQKf8nMxlAlgqCtcX8GI8D6U+CQFsqWQYCoCgBoBetOwZxlvH9aQFgDoIW3NraavfixYv1MCSCGEAplCwD500AUCL0NDZ01fQCMJWDXkIQKEc8ZstmgjB2hRIl6cXfIwsXLqyhQU0bAEsQZMLoquth7bdo7SwJA/T3o723Yu6cXgDmwwrFShDQhD3Olzj4SjXmzqa4uLgbOHnz8b+FJ9+ZdgDmQDjQ7Ny5kyAUMK8IRCJiDcLzzJkzBg/5D61/ySenao8dAAAAAElFTkSuQmCC"},76:function(e,t){e.exports="data:image/png;base64,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"},77:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFdklEQVR42sVW+VNTVxS+f4Od9oeW0RmlU8dOcRx3BEHbqiio3dtfamds+0N1bGe62emirYpSLRYDguAWJQihLZBAEkgKgbCHgIBAXbBTtgSykhAQEL/ecyWtwwMHx9DemS/vvXvv+c73zj3n5DEAjHBodJz9MD7BvuP3KVbb0xqV1p6lzENzS9u7Y3zOVWNittXPMmvMWmaNjZgeW8OZY91i1pSbzSqcg6y01Lj7V7UOap3Bma9WhyiKtEyh0bGsQg0L+P3n5talDNZ5LpWZCwqYqqYxJk9TggK1Bkpza7pWrWNdsZHM/uKymZ1Pgvb07ohiel0Jy7VcO1ug0iCfc+WbW7fUa0vYrUw5u6G8IhXglR1l/qR45tu/l9WeTo5XGqvxS3k1tPmF+t6Y8MXOVYui+3ZEb+ROHoq+HVEb3WtCo23bIhZrCwoNuZyHuKpTU474v/2M+dOSmDdDJhVgzUxn1oQDcd7w59C5+00oqxqgsLTBnHAIQ8vnoy9uPbiDWYH2kk1dwmFkWdqRU2nG9V2vw8e5rScOx/ZnX5YK6Dvw6Z6+VzYMepY8hT8++ZALMONKfQuqkxLhWf88rNvCZy2A54KwqTp1UnCQgPZ9H8Cz5ElYX93gsR38/COpgO3r5bata+FYHYrKve8jp7EDuW23USRLQveKhXDERc5agCMuAt0rF6JQdkpw5DS1o3LPbsFti1nLIxQplx7BljVyO3fSExUG/YYVyFMVIa/lOvLfewcdyxbAvTNq1gJobzu3Ue16G3nNnCNfDUP0cvRELwX5IF9SAbERchtftO+MRsOKUKjXhUG9JRJlSxegm4fUvn32OUB7ycYYNh/qzRFQh4cJTuK23Y+kVED/1nA5BxycwMZxbWUoml4IQdemVXBujwStPQpc3KZr8yo0hYWglXMRJ3FPrksF2F57Sc4BK4f9jZfhfmuzgPPNTWLO9oggG7IN8BDnAzxSAaWL5sk58C+emMS8x8S0PFIBjQf3yznwH0EqwAfIOTAThqZgpjXf7CAV4PAMyjkwFXa3R1xHx+9i4h4wzn/o6r8zKtb6XW4MjdwBnxLw+ofF3HRcD2D2AlxeH5yDXpgsjdBWmFBcVY3S2jr0DTiEKN/wCFpu3ERReQUM1TW4+VcXfFxQ0AQMDvmFiPQcJb5PTkHi+Qs4cEqGo2fS0dndCxrFlVX4OvEkvvjxOCrMDSISQRMQgM3pgtXhFPd0lV3OxOmsKyICdByd3T04xkVVNFhw994cCPDwSIyMjQtyGhVms4hIt61fPA/wcz+WnjF3Alw8DygKvXYHbvf0IlmhgDy/QCQdCeviQuZUAL04kX/1UyK++TkJB2XJ+JMLIWd0DHMugEqNMrysrh6GmlocP3ceOlMlhkfHRA7MuYCByXoPDD0vucOnU2HlR0IOe/oHRBJSuU4EswoCjYjelOqeGhENpVaHhIyzounQcPNSjU87g/qWVvF83zYIAty+IdGI1GVGXCpQ4Te9ARnKXHx5/AQqLU3CWUNbu5g7kpomypOaFdmQ7WMLoPKjClCo1Dh54SJSMhVIy85BbXMLRnhUKNzUGU+cPYdsjRYpiixc4tVBzcsz9AgCXF7vQ3OAOiJlO139PBfG7k4IJ5Qb9Ka0RiUZ2PPQkua+JAKcfJIvzGhEZxwAOZ7aIzwPrLunrE/z3zLN90Brh9zu8vCmMsY3DIozDCYcHJTIlNTNHdelAorLTPG1lmbYuUrfCA/nsB+D/uDA679/fBSBWstVaPTGIxIBXX22EH151UVdqQn1V1sF6ppagoIAX6mpBhpD+YUSY9Uz0s/ygQFWXtPA1MXGjzUGo4Fv1HCoggRNkcGoLykz7fvdVMP0HBIB/xf+Bi8VajXQRja5AAAAAElFTkSuQmCC"},78:function(e,t){e.exports="data:image/png;base64,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"},79:function(e,t){e.exports="data:image/png;base64,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"},80:function(e,t){e.exports="data:image/png;base64,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"},86:function(e,t,n){e.exports=n(450)},91:function(e,t,n){},96:function(e,t,n){},97:function(e,t,n){},98:function(e,t){e.exports="data:image/png;base64,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"},99:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAFfklEQVR42qWXWWicVRiG/39mUim4NRq88MZWXIpLe+FS6lYKtZsW0UrRUmyllUIXpQiN3hXBC1sxdyom6q2lVRGhUqvFClURUVFUsu+ZmD2TTDKTycTn/fudcPzNJJMaeDOTnHO+7z3ffoLm5uagFFpaWpJ8LmloaAgaGxuD3t7epePj49unpqbeLhQKn4EvwQVwjv+dYm1fOp2u0t76+vqgqampAhmp+XTMqxwB0XcUr8pmsydQ8jPK0oYe0G3f+8AgGGDPn+x9t7+//8HW1taIODKSiyWQ0MGurq4bEKbbjoEZUATTYApMgglDrnDpp2j7hPzk5ORJyN9qJBLlEoiUDw4ObkNIhydQ6JHQ4eHhF1jfgLlXg7v5vn5oaGj3xMTE++xpjZ0ZyWQy+7Fo4Cw6H4GENnLgcExIu/6HRa7XugjOBcno7Oy8EjI7ccVvOstnJIP4OG4kwlIEopuj6JAdlElnuFUtiq/Tmt1ApkwiTJ+hIWF+TmiP9nZ0dChgj/my+LtGJPyYcAHnzL5VfuRAXgfGxsZe1rrWLCOCcuAHMO7agazs1CUWM7KkyYtiwm0OdUuL7KJTLiFAt/VvWQ4SdiYpZbjkCbOEAjhHYN7hLiWWS8QEU7/jfM73Ov3PlAfOrEZoQbi9Zu6UvnOhaic/n89/3dbWFq1FBQNGd7IwbinWiTWuRkjolLe3t1+BKZ8nJV8FRyH4ylxgrVp7RkdHDxIDyxwJXQQZARb4wSxcxCpbpTtiy6E3HTuYHnI+crGB8v2xrFgQEHrLBa0XYxtdvcjlcp9HMcDtr4LZr8Ysze2v8fI11MGBgYFtZqFiGcq1J0+wvWRyQnNnILOj6yfb8zc/VQGp8RR/9Mr8sDppfgtjUR1QcFZBdjN4FGwsAa1tAverDMcKT5Si6HvNKmmGorZbjGrFRqwx9d65Uk4H5a/FIF71nBv6+voesdKt/nEq4NcX1lByKq9+jvoW4OB9NJjHwCawuQS0tgU8jLkTMRKRO3t6em5ReVZ1Bd+KwFfW1bKq7UYgjPWF7ZYhZQchMVDtVc7AlXB0VJpy9YwzInDeCpAI3OUT8LJg72KzgMx6ww9Cj8C1rLeBFkfgrOeC9XEXWPSmRkZGdpCih8EBcLAEDqiXsHePmlI8DswFy9E1rHoDLioIP+JLvyKT4rCrVBBqKvqfQRjaVLXGglA6zyot9lhEFl0Jjqeh0N3dXcXhleA2cHsJaG0lZr7R0vlfWaCeg4WOWhqOkYYvilEVVvjLikMbplsaL0RE9UPms1FDpgRGLcLTuOHZeCFSbUDXBQvoIQrRTa4U17rgIeCe8eIgCkKEHVlsEHK792KlOOQi95j5p2lI56NSLH+x8IAKkRZg+AeNpILDUUuVEKxSiateh+iHoE6jVwnUsf4BqMGyy72OGHVVKu0ZV8656K6oGWl0lmlYPO2l0DFzQcqZ73LghhNL5Z2uV3DJX+iOumRKG1IWnTcrMGxoEMOn3UjtDSTlwO1VO0+Zhe/V9OxGM9J9nbk5FZ8H99nkop1Z0vJJu00YL88LjGSz8YPyNVZpC2bd407nf4ZS+Qlfn/AHSU0ymCv0htKkd9PAS9toZHMTkWSprugizu8E3seSpfiacyy3m4pEjdfbReY7zLbFxqiSY7lLNW69VgOHnXXKT2tSduRKPkwcCQ0U9uqZTS2E/ah+Tmdcp64GKsEysIIYWqsGhKJvrNDMntObQCNZXPmCTzOErkbg2di0U7CUVeHpstdTxpRO+1OTCDNNbXCZFFc+7+PUjdQyO758HJN+apNTxh6iae9xOmBVUBYbhvQ5sug5pdrlPk79B0aFUsleyVUUG/WOT8D39jS/CH7XJ2tH2LNCe60hJRd6nv8Dwj5T3q96iTAAAAAASUVORK5CYII="}},[[86,1,2]]]); +//# sourceMappingURL=main.2255dcc2.chunk.js.map \ No newline at end of file diff --git a/static/js/main.2255dcc2.chunk.js.map b/static/js/main.2255dcc2.chunk.js.map new file mode 100644 index 0000000..d80be41 --- /dev/null +++ b/static/js/main.2255dcc2.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["color_picker.js","text_splitter.js","infrastructure/functions.js","infrastructure/widgets.js","cache.js","flows_api.js","Markdown.js","Common.js","react-lazyload/src/utils/event.js","react-lazyload/src/utils/scrollParent.js","react-lazyload/src/index.jsx","react-lazyload/src/utils/debounce.js","react-lazyload/src/utils/throttle.js","AudioWidget.js","Message.js","Config.js","UserAction.js","Flows.js","Title.js","Sidebar.js","PressureHelper.js","App.js","registerServiceWorker.js","index.js","infrastructure/appicon/hole.png","infrastructure/appicon/imasugu.png","infrastructure/appicon/imasugu_rev.png","infrastructure/appicon/syllabus.png","infrastructure/appicon/score.png","infrastructure/appicon/course_survey.png","infrastructure/appicon/homepage.png","infrastructure/appicon/dropdown.png","infrastructure/appicon/dropdown_rev.png"],"names":["ColorPicker","this","names","current_h","Math","random","name","toLowerCase","PID_RE","URL_PID_RE","NICKNAME_RE","URL_RE","split_text","txt","rules","forEach","rule","regex","concat","apply","map","part","content","split","seg","test","filter","get_json","res","ok","Error","status","statusText","text","then","t","JSON","parse","e","console","error","trace","log","SyntaxError","substr","API_VERSION_PARAM","encodeURIComponent","floor","Date","pad2","x","format_time","time","getMonth","getDate","getHours","getMinutes","getSeconds","chinese_format","buildFormatter","chineseStrings","Time","props","stamp","className","date","formatter","title","toLocaleString","timeZone","hour12","short","TitleLine","appicon_hole","appicon_imasugu","appicon_imasugu_rev","appicon_syllabus","appicon_score","appicon_course_survey","appicon_homepage","LoginPopupSelf","state","loading_status","recaptcha_verified","username_ref","React","createRef","password_ref","input_token_ref","popup_anchor","document","getElementById","createElement","id","body","appendChild","type","setState","fetch","THUHOLE_API_ROOT","current","value","localStorage","method","headers","stringify","excluded_scopes","json","success","alert","msg","catch","set_token","code","user_token","on_close","token","result","length","ReactDOM","createPortal","reCaptchaKey","useRecaptchaNet","onVerify","ref","autoFocus","defaultValue","onClick","do_sendcode","disabled","do_login","token_callback","placeholder","do_input_token","style","fontSize","href","Component","LoginPopup","popup_show","on_popup_bound","on_popup","bind","on_close_bound","children","Cache","db","added_items_since_maintenance","encrypt","decrypt","open_req","indexedDB","open","onerror","onupgradeneeded","event","target","createObjectStore","keyPath","createIndex","unique","onsuccess","setTimeout","maintenance","pid","data","s","o","i","key","new_key","charCodeAt","String","fromCharCode","c","target_version","parseInt","Promise","resolve","reject","store","transaction","objectStore","get_req","get","data_str","version","last_access","put","delete","warn","req","count_req","count","index","openKeyCursor","cur","primaryKey","continue","deleteDatabase","cache","window","hole_cache","token_param","handle_response","response","a","notify","parse_replies","replies","color_picker","sort","b","cid","info","_display_color","variant","API","load_replies","cache_version","API_BASE","load_replies_with_cache","cached","set_attention","attention","URLSearchParams","append","report","reason","get_list","page","get_search","keyword","get_single","get_attention","md","MarkdownIt","html","linkify","breaks","inline","highlight","str","lang","hljs","getLanguage","__","utils","escapeHtml","use","MarkdownItKaTeX","throwOnError","errorColor","render","escape_regex","string","replace","build_highlight_re","option","isRegex","RegExp","join","slice","ColoredSpan","colors","normalize_url","url","PureComponent","HighlightedMarkdown","processInstructions","shouldProcessNode","node","processNode","currentLevel","HeadingTag","attribs","rel","parent","splitted","Fragment","idx","p","preventDefault","show_pid","substring","HtmlToReact","ProcessNodeDefinitions","processDefaultNode","parser","Parser","author","match","renderedMarkdown","renderMd","parseWithInstructions","rawMd","TEXTAREA_BACKUP","SafeTextarea","on_change_bound","on_change","on_keydown_bound","on_keydown","clear","area_ref","change_callback","submit_callback","on_submit","ctrlKey","altKey","focus","onChange","onKeyDown","pwa_prompt_event","PromotionBar","is_ios","navigator","userAgent","matchMedia","matches","standalone","prompt","addEventListener","ClickHandler","moved","init_y","init_x","on_begin_bound","on_begin","on_move_bound","on_move","on_end_bound","on_end","MOVE_THRESHOLD","last_fire","touches","screenY","screenX","abs","do_callback","callback","onTouchStart","onMouseDown","onTouchMove","onMouseMove","on","el","eventName","opts","attachEvent","call","off","removeEventListener","detachEvent","HTMLElement","documentElement","excludeStaticParent","position","overflowRegex","parentNode","ownerDocument","getComputedStyle","overflow","overflowX","overflowY","defaultBoundingClientRect","LISTEN_FLAG","listeners","pending","passiveEventSupported","Object","defineProperty","delayType","passiveEvent","capture","passive","checkVisible","component","ReactDom","findDOMNode","scrollParent","parentTop","parentHeight","getBoundingClientRect","top","height","windowInnerHeight","innerHeight","clientHeight","intersectionTop","max","intersectionHeight","min","offsetTop","offsets","Array","isArray","offset","checkOverflowVisible","elementHeight","offsetWidth","offsetHeight","getClientRects","checkNormalVisible","visible","hidden","once","push","unmountIfInvisible","hiddenIfInvisible","lazyLoadHandler","listener","indexOf","splice","finalLazyLoadHandler","LazyLoad","scrollport","scrollContainer","querySelector","needResetFinalLazyLoadHandler","undefined","debounce","func","wait","immediate","timeout","args","context","timestamp","later","last","arguments","callNow","throttle","fn","threshhold","scope","deferTimer","now","clearTimeout","getAttribute","listenerCount","setAttribute","scroll","resize","removeAttribute","visibility","defaultProps","audio_cache","MessageViewer","load","err","BUILTIN_IMGS","DEFAULT_CONFIG","background_img","background_color","pressure","easter_egg","color_scheme","fold","block_words","load_config","loaded_config","config","assign","keys","save_config","bgimg_style","img","color","background","backgroundImage","encodeURI","backgroundColor","backgroundSize","ConfigBackground","save_changes","img_select","on_select","on_change_img","on_change_color","ConfigColorScheme","ConfigTextArea","sift","description","display","ConfigSwitch","switch","val","checked","ConfigUI","save_changes_bound","chg","confirm","location","reload","reset_settings","array","v","TokenCtx","createContext","set_value","InfoSidebar","show_sidebar","serviceWorker","getRegistrations","registrations","registration","unregister","process","LoginForm","copy","Consumer","copy_token","do_popup","ReplyForm","preview","global_keypress_handler_bound","global_keypress_handler","tagName","on_complete","onSubmit","toggle_preview","PostForm","img_tip","img_ref","on_img_change_bound","on_img_change","file","return_url","reader","FileReader","onload","fixOrientation","fixed_dataurl","image","Image","width","compressed","rate","sqrt","canvas","ctx","getContext","drawImage","quality","new_url","quality_l","quality_r","toDataURL","round","src","on_got_img","readAsDataURL","files","proc_img","d","do_post","accept","IMAGE_BASE","CLICKABLE_TAGS","audio","QUOTE_BLACKLIST","FOLD_TAGS","LATEST_POST_ID","load_single_meta","title_elem","single","reply","deletion_detect","Reply","replyContent","splitIdx","replyText","do_filter_name","tag","FlowItem","likenum","r","is_quote","copy_link","img_clickable","onError","alt","latest_reply","FlowSidebar","error_msg","filter_name","rev","syncState","sync_state","reply_ref","prev","update_count","set_variant","next_attention","prevState","forceCheck","closest","should_text","set","replies_to_show","reverse","replies_cnt","main_thread_elem","show_reply_bar","set_filter_name","toggle_rev","toggle_attention","float","FlowItemRow","needFold","search_param","mode","reply_status","reply_error","some","word","includes","attention_override","hl_rules","parts","quote_id","FlowItemQuote","FlowChunk","list","ind","Flow","search_text","loaded_pages","chunks","on_scroll_bound","on_scroll","failed","max_id","finished","use_search","use_regex","regex_search","toString","post","every","scrollHeight","scrollY","load_page","should_deletion_detect","flag_re","ControlBar","set_mode","on_keypress_bound","on_keypress","do_refresh_bound","do_refresh","do_attention_bound","do_attention","hash","decodeURIComponent","lastIndexOf","flag_res","exec","startsWith","scrollTo","onKeyPress","Title","Sidebar","do_close_bound","do_close","do_back_bound","do_back","contents","stack","cur_title","onTouchEnd","click","PressureHelper","level","fired","esc_interval","clearInterval","Pressure","change","force","do_fire","end","polyfill","only","preventSelect","repeat","THRESHOLD","setInterval","new_level","pad","left","right","bottom","DeprecatedAlert","App","override","update_color_scheme","classList","add","remove","addListener","listen_darkmode","default","light","dark","sidebar_stack","flow_render_key","show_sidebar_bound","set_mode_bound","on_pressure_bound","on_pressure","inthu_flag","atob","ns","pop","Provider","isLocalhost","Boolean","hostname","registerValidSW","swUrl","register","onupdatefound","installingWorker","installing","onstatechange","controller","ready","checkValidServiceWorker","module","exports"],"mappings":"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","file":"static/js/main.2255dcc2.chunk.js","sourcesContent":["// https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/\n\nconst golden_ratio_conjugate = 0.618033988749895;\n\nexport class ColorPicker {\n constructor() {\n this.names = {};\n this.current_h = Math.random();\n }\n\n get(name) {\n name = name.toLowerCase();\n if (name === '洞主') return ['hsl(0,0%,97%)', 'hsl(0,0%,16%)'];\n\n if (!this.names[name]) {\n this.current_h += golden_ratio_conjugate;\n this.current_h %= 1;\n this.names[name] = [\n `hsl(${this.current_h * 360}, 50%, 90%)`,\n `hsl(${this.current_h * 360}, 60%, 20%)`,\n ];\n }\n return this.names[name];\n }\n}\n","// regexp should match the WHOLE segmented part\n// export const PID_RE=/(^|[^\\d\\u20e3\\ufe0e\\ufe0f])([2-9]\\d{4,5}|1\\d{4,6})(?![\\d\\u20e3\\ufe0e\\ufe0f])/g;\nexport const PID_RE = /(^|[^\\d\\u20e3\\ufe0e\\ufe0f])(#\\d{1,7})(?![\\d\\u20e3\\ufe0e\\ufe0f])/g;\n// TODO: fix this re\n// export const URL_PID_RE=/((?:https?:\\/\\/)?thuhole\\.com\\/?#(?:#|%23)([2-9]\\d{4,5}|1\\d{4,6}))(?!\\d|\\u20e3|\\ufe0e|\\ufe0f)/g;\nexport const URL_PID_RE = /((?:https?:\\/\\/)?thuhole\\.com\\/?#(?:#|%23)(\\d{1,7}))(?!\\d|\\u20e3|\\ufe0e|\\ufe0f)/g;\nexport const NICKNAME_RE = /(^|[^A-Za-z])((?:(?:Angry|Baby|Crazy|Diligent|Excited|Fat|Greedy|Hungry|Interesting|Jolly|Kind|Little|Magic|Naïve|Old|PKU|Quiet|Rich|Superman|Tough|Undefined|Valuable|Wifeless|Xiangbuchulai|Young|Zombie)\\s)?(?:Alice|Bob|Carol|Dave|Eve|Francis|Grace|Hans|Isabella|Jason|Kate|Louis|Margaret|Nathan|Olivia|Paul|Queen|Richard|Susan|Thomas|Uma|Vivian|Winnie|Xander|Yasmine|Zach)|You Win(?: \\d+)?|洞主)(?![A-Za-z])/gi;\nexport const URL_RE = /(^|[^.@a-zA-Z0-9_])((?:https?:\\/\\/)?(?:(?:[\\w-]+\\.)+[a-zA-Z]{2,3}|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(?::\\d{1,5})?(?:\\/[\\w~!@#$%^&*()\\-_=+[\\]{};:,./?|]*)?)(?![a-zA-Z0-9])/gi;\n\nexport function split_text(txt, rules) {\n // rules: [['name',/regex/],...]\n // return: [['name','part'],[null,'part'],...]\n\n txt = [[null, txt]];\n rules.forEach((rule) => {\n let [name, regex] = rule;\n txt = [].concat.apply(\n [],\n txt.map((part) => {\n let [rule, content] = part;\n if (rule)\n // already tagged by previous rules\n return [part];\n else {\n return content\n .split(regex)\n .map((seg) => (regex.test(seg) ? [name, seg] : [null, seg]))\n .filter(([name, seg]) => name !== null || seg);\n }\n }),\n );\n });\n return txt;\n}\n","export function get_json(res) {\n if(!res.ok) throw Error(`网络错误 ${res.status} ${res.statusText}`);\n return (\n res\n .text()\n .then((t)=>{\n try {\n return JSON.parse(t);\n } catch(e) {\n console.error('json parse error');\n console.trace(e);\n console.log(t);\n throw new SyntaxError('JSON Parse Error '+t.substr(0,50));\n }\n })\n );\n}\n\nexport function listen_darkmode(override) { // override: true/false/undefined\n function update_color_scheme() {\n if(override===undefined ? window.matchMedia('(prefers-color-scheme: dark)').matches : override)\n document.body.classList.add('root-dark-mode');\n else\n document.body.classList.remove('root-dark-mode');\n }\n\n update_color_scheme();\n window.matchMedia('(prefers-color-scheme: dark)').addListener(()=>{\n update_color_scheme();\n });\n}\n\nexport function API_VERSION_PARAM() {\n return '&PKUHelperAPI=3.0&jsapiver='+encodeURIComponent((process.env.REACT_APP_BUILD_INFO||'null')+'-'+(Math.floor(+new Date()/7200000)*2));\n}","import React, {Component, PureComponent} from 'react';\nimport ReactDOM from 'react-dom';\n\nimport TimeAgo from 'react-timeago';\nimport chineseStrings from 'react-timeago/lib/language-strings/zh-CN';\nimport buildFormatter from 'react-timeago/lib/formatters/buildFormatter';\n\nimport './global.css';\nimport './widgets.css';\n\nimport appicon_hole from './appicon/hole.png';\nimport appicon_imasugu from './appicon/imasugu.png';\nimport appicon_imasugu_rev from './appicon/imasugu_rev.png';\nimport appicon_syllabus from './appicon/syllabus.png';\nimport appicon_score from './appicon/score.png';\nimport appicon_course_survey from './appicon/course_survey.png';\nimport appicon_dropdown from './appicon/dropdown.png';\nimport appicon_dropdown_rev from './appicon/dropdown_rev.png';\nimport appicon_homepage from './appicon/homepage.png';\nimport {THUHOLE_API_ROOT} from './const';\nimport {get_json, API_VERSION_PARAM} from './functions';\n\nimport {\n GoogleReCaptchaProvider,\n GoogleReCaptcha\n} from 'react-google-recaptcha-v3';\n\nconst LOGIN_POPUP_ANCHOR_ID='pkuhelper_login_popup_anchor';\n\nfunction pad2(x) {\n return x<10 ? '0'+x : ''+x;\n}\nexport function format_time(time) {\n return `${time.getMonth()+1}-${pad2(time.getDate())} ${time.getHours()}:${pad2(time.getMinutes())}:${pad2(time.getSeconds())}`;\n}\nconst chinese_format=buildFormatter(chineseStrings);\nexport function Time(props) {\n const time=new Date(props.stamp*1000);\n return (\n \n \n  \n {!props.short ? format_time(time) : null}\n \n );\n}\n\nexport function TitleLine(props) {\n return (\n

\n {props.text}\n

\n )\n}\n\nexport function GlobalTitle(props) {\n return (\n
\n
\n

{props.text}

\n
\n
\n );\n}\n\nconst FALLBACK_APPS={\n // id, text, url, icon_normal, icon_hover, new_tab\n bar: [\n ['hole', '树洞', '/hole', appicon_hole, null, false],\n ['imasugu', '教室', '/spare_classroom', appicon_imasugu, appicon_imasugu_rev, false],\n ['syllabus', '课表', '/syllabus', appicon_syllabus, null, false],\n ['score', '成绩', '/my_score', appicon_score, null, false],\n ],\n dropdown: [\n ['course_survey', '课程测评', 'https://courses.pinzhixiaoyuan.com/', appicon_course_survey, null, true],\n ['homepage', '客户端', '/', appicon_homepage, null, true],\n ],\n fix: {},\n};\n// const SWITCHER_DATA_VER='switcher_2';\n// const SWITCHER_DATA_URL=THUHOLE_API_ROOT+'web_static/appswitcher_items.json';\n\n// export class AppSwitcher extends Component {\n// constructor(props) {\n// super(props);\n// this.state={\n// apps: this.get_apps_from_localstorage(),\n// }\n// }\n//\n// get_apps_from_localstorage() {\n// let ret=FALLBACK_APPS;\n// if(localStorage['APPSWITCHER_ITEMS'])\n// try {\n// let content=JSON.parse(localStorage['APPSWITCHER_ITEMS'])[SWITCHER_DATA_VER];\n// if(!content || !content.bar)\n// throw new Error('content is empty');\n//\n// ret=content;\n// } catch(e) {\n// console.error('load appswitcher items from localstorage failed');\n// console.trace(e);\n// }\n//\n// return ret;\n// }\n//\n// check_fix() {\n// if(this.state.apps && this.state.apps.fix && this.state.apps.fix[this.props.appid])\n// setTimeout(()=>{\n// window.HOTFIX_CONTEXT={\n// build_info: process.env.REACT_APP_BUILD_INFO || '---',\n// build_env: process.env.NODE_ENV,\n// };\n// eval(this.state.apps.fix[this.props.appid]);\n// },1); // make it async so failures won't be critical\n// }\n//\n// componentDidMount() {\n// this.check_fix();\n// setTimeout(()=>{\n// fetch(SWITCHER_DATA_URL)\n// .then((res)=>{\n// if(!res.ok) throw Error(`网络错误 ${res.status} ${res.statusText}`);\n// return res.text();\n// })\n// .then((txt)=>{\n// if(txt!==localStorage['APPSWITCHER_ITEMS']) {\n// console.log('loaded new appswitcher items',txt);\n// localStorage['APPSWITCHER_ITEMS']=txt;\n//\n// this.setState({\n// apps: this.get_apps_from_localstorage(),\n// });\n// } else {\n// console.log('appswitcher items unchanged');\n// }\n// })\n// .catch((e)=>{\n// console.error('loading appswitcher items failed');\n// console.trace(e);\n// });\n// },500);\n// }\n//\n// componentDidUpdate(prevProps, prevState) {\n// if(this.state.apps!==prevState.apps)\n// this.check_fix();\n// }\n//\n// render() {\n// let cur_id=this.props.appid;\n//\n// function app_elem([id,title,url,icon_normal,icon_hover,new_tab],no_class=false,ref=null) {\n// return (\n// \n// {!!icon_normal && [\n// ,\n// \n// ]}\n// {title}\n// \n// );\n// }\n//\n// let dropdown_cur_app=null;\n// this.state.apps.dropdown.forEach((app)=>{\n// if(app[0]===cur_id)\n// dropdown_cur_app=app;\n// });\n//\n// //console.log(JSON.stringify(this.state.apps));\n//\n// return (\n//
\n// PKUHelper\n// {this.state.apps.bar.map((app)=>\n// app_elem(app)\n// )}\n// {!!this.state.apps.dropdown.length &&\n//
\n//

\n// {!!dropdown_cur_app ?\n// app_elem((()=>{\n// let [id,title,_url,icon_normal,icon_hover,_new_tab]=dropdown_cur_app;\n// return [id,title+'▾',null,icon_normal,icon_hover,false];\n// })(),true) :\n// app_elem(['-placeholder-elem','更多▾',null,appicon_dropdown,appicon_dropdown_rev,false],true)\n// }\n//

\n// {this.state.apps.dropdown.map((app)=>{\n// let ref=React.createRef();\n// return (\n//

{\n// if(!e.target.closest('a') && ref.current)\n// ref.current.click();\n// }}>\n// {app_elem(app,true,ref)}\n//

\n// );\n// })}\n//
\n// }\n// 网页版\n//
\n// );\n// }\n// }\n\nclass LoginPopupSelf extends Component {\n constructor(props) {\n super(props);\n this.state={\n loading_status: 'idle',\n recaptcha_verified: false\n // excluded_scopes: [],\n };\n this.username_ref=React.createRef();\n this.password_ref=React.createRef();\n this.input_token_ref=React.createRef();\n\n this.popup_anchor=document.getElementById(LOGIN_POPUP_ANCHOR_ID);\n if(!this.popup_anchor) {\n this.popup_anchor=document.createElement('div');\n this.popup_anchor.id=LOGIN_POPUP_ANCHOR_ID;\n document.body.appendChild(this.popup_anchor);\n }\n }\n\n do_sendcode(type) {\n if(!this.state.recaptcha_verified) {\n alert(\"reCAPTCHA风控系统正在评估您的浏览器安全状态,请稍后重试。\")\n return\n }\n if(this.state.loading_status==='loading')\n return;\n\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(\n THUHOLE_API_ROOT+'api_xmcp/login/send_code'\n +'?user='+encodeURIComponent(this.username_ref.current.value)\n +'&code_type='+encodeURIComponent(type)\n +\"&recaptcha_token=\"+localStorage[\"recaptcha\"]\n +API_VERSION_PARAM(), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n excluded_scopes: [],\n }),\n }\n )\n .then(get_json)\n .then((json)=>{\n console.log(json);\n if(!json.success)\n throw new Error(JSON.stringify(json));\n\n alert(json.msg);\n this.setState({\n loading_status: 'done',\n });\n })\n .catch((e)=>{\n console.error(e);\n alert('发送失败\\n'+e);\n this.setState({\n loading_status: 'done',\n });\n });\n\n });\n }\n\n do_login(set_token) {\n if(this.state.loading_status==='loading')\n return;\n\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(\n THUHOLE_API_ROOT+'api_xmcp/login/login'\n +'?user='+encodeURIComponent(this.username_ref.current.value)\n +'&valid_code='+encodeURIComponent(this.password_ref.current.value)\n +API_VERSION_PARAM(), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n excluded_scopes: [],\n }),\n }\n )\n .then(get_json)\n .then((json)=>{\n if(json.code!==0) {\n if(json.msg) throw new Error(json.msg);\n throw new Error(JSON.stringify(json));\n }\n\n set_token(json.user_token);\n alert(`登录成功`);\n this.setState({\n loading_status: 'done',\n });\n this.props.on_close();\n })\n .catch((e)=>{\n console.error(e);\n alert('登录失败\\n'+e);\n this.setState({\n loading_status: 'done',\n });\n });\n });\n }\n\n do_input_token(set_token) {\n if(this.state.loading_status==='loading')\n return;\n\n let token=this.input_token_ref.current.value;\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/system_msg?user_token='+encodeURIComponent(token)+API_VERSION_PARAM())\n .then((res)=>res.json())\n .then((json)=>{\n if(json.error)\n throw new Error(json.error);\n if(json.result.length===0)\n throw new Error('result check failed');\n this.setState({\n loading_status: 'done',\n });\n set_token(token);\n this.props.on_close();\n })\n .catch((e)=>{\n alert('Token检验失败\\n'+e);\n this.setState({\n loading_status: 'done',\n });\n console.error(e);\n });\n });\n }\n\n // perm_alert() {\n // alert('如果你不需要 PKU Helper 的某项功能,可以取消相应权限。\\n其中【状态信息】包括你的网费、校园卡余额等。\\n该设置应用到你的【所有】设备,取消后如需再次启用相应功能需要重新登录。');\n // }\n\n render() {\n // let PERM_SCOPES=[\n // ['score','成绩查询'],\n // ['syllabus','课表查询'],\n // ['my_info','状态信息'],\n // ];\n\n return ReactDOM.createPortal(\n \n {\n this.setState({\n recaptcha_verified: true,\n });\n localStorage[\"recaptcha\"] = token\n }} />\n
\n
\n
\n

\n 接收验证码来登录 T大树洞\n

\n

\n \n \n {/*this.do_sendcode('sms')}>*/}\n {/*  短信 */}\n {/**/}\n {/*/*/}\n this.do_sendcode('mail')}>\n  发送邮件 \n \n \n

\n

\n \n \n

\n
\n

\n 从其他设备导入登录状态\n

\n

\n \n \n

\n
\n

\n This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n

\n

\n \n

\n
\n
\n ,\n this.popup_anchor,\n );\n }\n}\n\nexport class LoginPopup extends Component {\n constructor(props) {\n super(props);\n this.state={\n popup_show: false,\n };\n this.on_popup_bound=this.on_popup.bind(this);\n this.on_close_bound=this.on_close.bind(this);\n }\n\n on_popup() {\n this.setState({\n popup_show: true,\n });\n }\n on_close() {\n this.setState({\n popup_show: false,\n });\n }\n\n render() {\n return (\n <>\n {this.props.children(this.on_popup_bound)}\n {this.state.popup_show &&\n \n }\n \n );\n }\n}","const HOLE_CACHE_DB_NAME = 'hole_cache_db';\nconst CACHE_DB_VER = 1;\nconst MAINTENANCE_STEP = 150;\nconst MAINTENANCE_COUNT = 1000;\n\nconst ENC_KEY = 42;\n\nclass Cache {\n constructor() {\n this.db = null;\n this.added_items_since_maintenance = 0;\n this.encrypt = this.encrypt.bind(this);\n this.decrypt = this.decrypt.bind(this);\n const open_req = indexedDB.open(HOLE_CACHE_DB_NAME, CACHE_DB_VER);\n open_req.onerror = console.error.bind(console);\n open_req.onupgradeneeded = (event) => {\n console.log('comment cache db upgrade');\n const db = event.target.result;\n const store = db.createObjectStore('comment', {\n keyPath: 'pid',\n });\n store.createIndex('last_access', 'last_access', { unique: false });\n };\n open_req.onsuccess = (event) => {\n console.log('comment cache db loaded');\n this.db = event.target.result;\n setTimeout(this.maintenance.bind(this), 1);\n };\n }\n\n // use window.hole_cache.encrypt() only after cache is loaded!\n encrypt(pid, data) {\n let s = JSON.stringify(data);\n let o = '';\n for (let i = 0, key = (ENC_KEY ^ pid) % 128; i < s.length; i++) {\n let c = s.charCodeAt(i);\n let new_key = (key ^ (c / 2)) % 128;\n o += String.fromCharCode(key ^ s.charCodeAt(i));\n key = new_key;\n }\n return o;\n }\n\n // use window.hole_cache.decrypt() only after cache is loaded!\n decrypt(pid, s) {\n let o = '';\n if (typeof s !== typeof 'str') return null;\n\n for (let i = 0, key = (ENC_KEY ^ pid) % 128; i < s.length; i++) {\n let c = key ^ s.charCodeAt(i);\n o += String.fromCharCode(c);\n key = (key ^ (c / 2)) % 128;\n }\n\n try {\n return JSON.parse(o);\n } catch (e) {\n console.error('decrypt failed');\n console.trace(e);\n return null;\n }\n }\n\n get(pid, target_version) {\n pid = parseInt(pid);\n return new Promise((resolve, reject) => {\n if (!this.db) return resolve(null);\n const tx = this.db.transaction(['comment'], 'readwrite');\n const store = tx.objectStore('comment');\n const get_req = store.get(pid);\n get_req.onsuccess = () => {\n let res = get_req.result;\n if (!res || !res.data_str) {\n //console.log('comment cache miss '+pid);\n resolve(null);\n } else if (target_version === res.version) {\n // hit\n console.log('comment cache hit', pid);\n res.last_access = +new Date();\n store.put(res);\n let data = this.decrypt(pid, res.data_str);\n resolve(data); // obj or null\n } else {\n // expired\n console.log(\n 'comment cache expired',\n pid,\n ': ver',\n res.version,\n 'target',\n target_version,\n );\n store.delete(pid);\n resolve(null);\n }\n };\n get_req.onerror = (e) => {\n console.warn('comment cache indexeddb open failed');\n console.error(e);\n resolve(null);\n };\n });\n }\n\n put(pid, target_version, data) {\n pid = parseInt(pid);\n return new Promise((resolve, reject) => {\n if (!this.db) return resolve();\n const tx = this.db.transaction(['comment'], 'readwrite');\n const store = tx.objectStore('comment');\n store.put({\n pid: pid,\n version: target_version,\n data_str: this.encrypt(pid, data),\n last_access: +new Date(),\n });\n console.log('comment cache put', pid);\n if (++this.added_items_since_maintenance === MAINTENANCE_STEP)\n setTimeout(this.maintenance.bind(this), 1);\n });\n }\n\n delete(pid) {\n pid = parseInt(pid);\n return new Promise((resolve, reject) => {\n if (!this.db) return resolve();\n const tx = this.db.transaction(['comment'], 'readwrite');\n const store = tx.objectStore('comment');\n let req = store.delete(pid);\n console.log('comment cache delete', pid);\n req.onerror = () => {\n console.warn('comment cache delete failed ', pid);\n return resolve();\n };\n req.onsuccess = () => resolve();\n });\n }\n\n maintenance() {\n if (!this.db) return;\n const tx = this.db.transaction(['comment'], 'readwrite');\n const store = tx.objectStore('comment');\n let count_req = store.count();\n count_req.onsuccess = () => {\n let count = count_req.result;\n if (count > MAINTENANCE_COUNT) {\n console.log('comment cache db maintenance', count);\n store.index('last_access').openKeyCursor().onsuccess = (e) => {\n let cur = e.target.result;\n if (cur) {\n //console.log('maintenance: delete',cur);\n store.delete(cur.primaryKey);\n if (--count > MAINTENANCE_COUNT) cur.continue();\n }\n };\n } else {\n console.log('comment cache db no need to maintenance', count);\n }\n this.added_items_since_maintenance = 0;\n };\n count_req.onerror = console.error.bind(console);\n }\n\n clear() {\n if (!this.db) return;\n indexedDB.deleteDatabase(HOLE_CACHE_DB_NAME);\n console.log('delete comment cache db');\n }\n}\n\nexport function cache() {\n if (!window.hole_cache) window.hole_cache = new Cache();\n return window.hole_cache;\n}\n","import { get_json, API_VERSION_PARAM } from './infrastructure/functions';\nimport { THUHOLE_API_ROOT } from './infrastructure/const';\nimport { API_BASE } from './Common';\nimport { cache } from './cache';\n\nexport { THUHOLE_API_ROOT, API_VERSION_PARAM };\n\nexport function token_param(token) {\n return API_VERSION_PARAM() + (token ? '&user_token=' + token : '');\n}\n\nexport { get_json };\n\nconst SEARCH_PAGESIZE = 50;\n\nconst handle_response = async (response, notify = false) => {\n let json = await get_json(response);\n if (json.code !== 0) {\n if (json.msg) {\n if (notify) alert(json.msg);\n else throw new Error(json.msg);\n } else throw new Error(JSON.stringify(json));\n }\n return json;\n};\n\nconst parse_replies = (replies, color_picker) =>\n replies\n .sort((a, b) => parseInt(a.cid, 10) - parseInt(b.cid, 10))\n .map((info) => {\n info._display_color = color_picker.get(info.name);\n info.variant = {};\n return info;\n });\n\nexport const API = {\n load_replies: async (pid, token, color_picker, cache_version) => {\n pid = parseInt(pid);\n let response = await fetch(\n API_BASE + '/api.php?action=getcomment&pid=' + pid + token_param(token),\n );\n let json = await handle_response(response);\n // Why delete then put ??\n cache().put(pid, cache_version, json);\n json.data = parse_replies(json.data, color_picker);\n return json;\n },\n\n load_replies_with_cache: async (pid, token, color_picker, cache_version) => {\n pid = parseInt(pid);\n let json = await cache().get(pid, cache_version);\n if (json) {\n json.data = parse_replies(json.data, color_picker);\n return { data: json, cached: true };\n } else {\n json = await API.load_replies(pid, token, color_picker, cache_version);\n return { data: json, cached: !json };\n }\n },\n\n set_attention: async (pid, attention, token) => {\n let data = new URLSearchParams();\n data.append('user_token', token);\n data.append('pid', pid);\n data.append('switch', attention ? '1' : '0');\n let response = await fetch(\n API_BASE + '/api.php?action=attention' + token_param(token),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n },\n );\n // Delete cache to update `attention` on next reload\n cache().delete(pid);\n return handle_response(response, true);\n },\n\n report: async (pid, reason, token) => {\n let data = new URLSearchParams();\n data.append('user_token', token);\n data.append('pid', pid);\n data.append('reason', reason);\n let response = await fetch(\n API_BASE + '/api.php?action=report' + token_param(token),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n },\n );\n return handle_response(response, true);\n },\n\n get_list: async (page, token) => {\n let response = await fetch(\n API_BASE + '/api.php?action=getlist' + '&p=' + page + token_param(token),\n );\n return handle_response(response);\n },\n\n get_search: async (page, keyword, token) => {\n let response = await fetch(\n API_BASE +\n '/api.php?action=search' +\n '&pagesize=' +\n SEARCH_PAGESIZE +\n '&page=' +\n page +\n '&keywords=' +\n encodeURIComponent(keyword) +\n token_param(token),\n );\n return handle_response(response);\n },\n\n get_single: async (pid, token) => {\n let response = await fetch(\n API_BASE + '/api.php?action=getone' + '&pid=' + pid + token_param(token),\n );\n return handle_response(response);\n },\n\n get_attention: async (token) => {\n let response = await fetch(\n API_BASE + '/api.php?action=getattention' + token_param(token),\n );\n return handle_response(response);\n },\n};\n","import MarkdownIt from 'markdown-it';\nimport MarkdownItKaTeX from 'markdown-it-katex';\nimport hljs from 'highlight.js';\nimport 'highlight.js/styles/atom-one-dark.css';\nimport './Markdown.css';\n\nimport 'katex/dist/katex.min.css';\n\nlet md = new MarkdownIt({\n html: false,\n linkify: false,\n breaks: true,\n inline: true,\n highlight(str, lang) {\n if (lang && hljs.getLanguage(lang)) {\n try {\n return (\n '
' +\n          hljs.highlight(lang, str, true).value +\n          '
'\n );\n } catch (__) {}\n }\n return (\n '
' + md.utils.escapeHtml(str) + '
'\n );\n },\n}).use(MarkdownItKaTeX, {\n throwOnError: false,\n errorColor: '#aa0000',\n});\n\nexport default (text) => md.render(text);\n","import React, { Component, PureComponent } from 'react';\nimport { format_time, Time, TitleLine } from './infrastructure/widgets';\nimport { THUHOLE_API_ROOT } from './flows_api';\n\nimport HtmlToReact from 'html-to-react';\n\nimport './Common.css';\nimport {\n URL_PID_RE,\n URL_RE,\n PID_RE,\n NICKNAME_RE,\n split_text,\n} from './text_splitter';\n\nimport renderMd from './Markdown';\n\nexport { format_time, Time, TitleLine };\n\nexport const API_BASE = THUHOLE_API_ROOT + 'services/thuhole';\n\n// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\nfunction escape_regex(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nexport function build_highlight_re(\n txt,\n split = ' ',\n option = 'g',\n isRegex = false,\n) {\n if (isRegex) {\n try {\n return new RegExp('(' + txt.slice(1, -1) + ')', option);\n } catch (e) {\n return /^$/g;\n }\n } else {\n return txt\n ? new RegExp(\n `(${txt\n .split(split)\n .filter((x) => !!x)\n .map(escape_regex)\n .join('|')})`,\n option,\n )\n : /^$/g;\n }\n}\n\nexport function ColoredSpan(props) {\n return (\n \n {props.children}\n \n );\n}\n\nfunction normalize_url(url) {\n return /^https?:\\/\\//.test(url) ? url : 'http://' + url;\n}\n\nexport class HighlightedText extends PureComponent {\n render() {\n return (\n
\n        {this.props.parts.map((part, idx) => {\n          let [rule, p] = part;\n          return (\n            \n              {rule === 'url_pid' ? (\n                \n                  /##\n                \n              ) : rule === 'url' ? (\n                \n                  {p}\n                \n              ) : rule === 'pid' ? (\n                 {\n                    e.preventDefault();\n                    this.props.show_pid(p.substring(1));\n                  }}\n                >\n                  {p}\n                \n              ) : rule === 'nickname' ? (\n                \n                  {p}\n                \n              ) : rule === 'search' ? (\n                {p}\n              ) : (\n                p\n              )}\n            \n          );\n        })}\n      
\n );\n }\n}\n\n// props: text, show_pid, color_picker\nexport class HighlightedMarkdown extends Component {\n render() {\n const props = this.props;\n const processDefs = new HtmlToReact.ProcessNodeDefinitions(React);\n const processInstructions = [\n {\n shouldProcessNode: (node) => node.name === 'img', // disable images\n processNode(node, children, index) {\n return
[图片]
;\n },\n },\n {\n shouldProcessNode: (node) => /^h[123456]$/.test(node.name),\n processNode(node, children, index) {\n let currentLevel = +node.name[1];\n if (currentLevel < 3) currentLevel = 3;\n const HeadingTag = `h${currentLevel}`;\n return {children};\n },\n },\n {\n shouldProcessNode: (node) => node.name === 'a',\n processNode(node, children, index) {\n return (\n \n {children}\n \n \n );\n },\n },\n {\n shouldProcessNode(node) {\n return (\n node.type === 'text' &&\n (!node.parent ||\n !node.parent.attribs ||\n node.parent.attribs['encoding'] !== 'application/x-tex')\n ); // pid, nickname, search\n },\n processNode(node, children, index) {\n const originalText = node.data;\n const splitted = split_text(originalText, [\n ['url_pid', URL_PID_RE],\n ['url', URL_RE],\n ['pid', PID_RE],\n ['nickname', NICKNAME_RE],\n ]);\n\n return (\n \n {splitted.map(([rule, p], idx) => {\n return (\n \n {rule === 'url_pid' ? (\n \n /##\n \n ) : rule === 'url' ? (\n \n {p}\n \n \n ) : rule === 'pid' ? (\n {\n e.preventDefault();\n props.show_pid(p.substring(1));\n }}\n >\n {p}\n \n ) : rule === 'nickname' ? (\n \n {p}\n \n ) : rule === 'search' ? (\n {p}\n ) : (\n p\n )}\n \n );\n })}\n \n );\n },\n },\n {\n shouldProcessNode: () => true,\n processNode: processDefs.processDefaultNode,\n },\n ];\n const parser = new HtmlToReact.Parser();\n if (props.author && props.text.match(/^(?:#+ |>|```|\\t|\\s*-|\\s*\\d+\\.)/)) {\n const renderedMarkdown = renderMd(props.text);\n return (\n <>\n {props.author}\n {parser.parseWithInstructions(\n renderedMarkdown,\n (node) => node.type !== 'script',\n processInstructions,\n ) || ''}\n \n );\n } else {\n let rawMd = props.text;\n if (props.author) rawMd = props.author + ' ' + rawMd;\n const renderedMarkdown = renderMd(rawMd);\n return (\n parser.parseWithInstructions(\n renderedMarkdown,\n (node) => node.type !== 'script',\n processInstructions,\n ) || null\n );\n }\n }\n}\n\nwindow.TEXTAREA_BACKUP = {};\n\nexport class SafeTextarea extends Component {\n constructor(props) {\n super(props);\n this.state = {\n text: '',\n };\n this.on_change_bound = this.on_change.bind(this);\n this.on_keydown_bound = this.on_keydown.bind(this);\n this.clear = this.clear.bind(this);\n this.area_ref = React.createRef();\n this.change_callback = props.on_change || (() => {});\n this.submit_callback = props.on_submit || (() => {});\n }\n\n componentDidMount() {\n this.setState(\n {\n text: window.TEXTAREA_BACKUP[this.props.id] || '',\n },\n () => {\n this.change_callback(this.state.text);\n },\n );\n }\n\n componentWillUnmount() {\n window.TEXTAREA_BACKUP[this.props.id] = this.state.text;\n this.change_callback(this.state.text);\n }\n\n on_change(event) {\n this.setState({\n text: event.target.value,\n });\n this.change_callback(event.target.value);\n }\n on_keydown(event) {\n if (event.key === 'Enter' && event.ctrlKey && !event.altKey) {\n event.preventDefault();\n this.submit_callback();\n }\n }\n\n clear() {\n this.setState({\n text: '',\n });\n }\n set(text) {\n this.change_callback(text);\n this.setState({\n text: text,\n });\n }\n get() {\n return this.state.text;\n }\n focus() {\n this.area_ref.current.focus();\n }\n\n render() {\n return (\n \n );\n }\n}\n\nlet pwa_prompt_event = null;\nwindow.addEventListener('beforeinstallprompt', (e) => {\n console.log('pwa: received before install prompt');\n pwa_prompt_event = e;\n});\n\nexport function PromotionBar(props) {\n let is_ios = /iPhone|iPad|iPod/i.test(window.navigator.userAgent);\n let is_installed =\n window.matchMedia('(display-mode: standalone)').matches ||\n window.navigator.standalone;\n\n if (is_installed) return null;\n\n if (is_ios)\n // noinspection JSConstructorReturnsPrimitive\n return !navigator.standalone ? (\n
\n \n   用 Safari 把树洞 添加到主屏幕 更好用\n
\n ) : null;\n // noinspection JSConstructorReturnsPrimitive\n else\n return pwa_prompt_event ? (\n
\n \n   把网页版树洞{' '}\n \n {\n if (pwa_prompt_event) pwa_prompt_event.prompt();\n }}\n >\n 安装到桌面\n \n {' '}\n 更好用\n
\n ) : null;\n}\n\nexport class ClickHandler extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n moved: true,\n init_y: 0,\n init_x: 0,\n };\n this.on_begin_bound = this.on_begin.bind(this);\n this.on_move_bound = this.on_move.bind(this);\n this.on_end_bound = this.on_end.bind(this);\n\n this.MOVE_THRESHOLD = 3;\n this.last_fire = 0;\n }\n\n on_begin(e) {\n //console.log('click',(e.touches?e.touches[0]:e).screenY,(e.touches?e.touches[0]:e).screenX);\n this.setState({\n moved: false,\n init_y: (e.touches ? e.touches[0] : e).screenY,\n init_x: (e.touches ? e.touches[0] : e).screenX,\n });\n }\n on_move(e) {\n if (!this.state.moved) {\n let mvmt =\n Math.abs((e.touches ? e.touches[0] : e).screenY - this.state.init_y) +\n Math.abs((e.touches ? e.touches[0] : e).screenX - this.state.init_x);\n //console.log('move',mvmt);\n if (mvmt > this.MOVE_THRESHOLD)\n this.setState({\n moved: true,\n });\n }\n }\n on_end(event) {\n //console.log('end');\n if (!this.state.moved) this.do_callback(event);\n this.setState({\n moved: true,\n });\n }\n\n do_callback(event) {\n if (this.last_fire + 100 > +new Date()) return;\n this.last_fire = +new Date();\n this.props.callback(event);\n }\n\n render() {\n return (\n \n {this.props.children}\n
\n );\n }\n}\n","export function on(el, eventName, callback, opts) {\n opts = opts || false;\n if (el.addEventListener) {\n el.addEventListener(eventName, callback, opts);\n } else if (el.attachEvent) {\n el.attachEvent(`on${eventName}`, (e) => {\n callback.call(el, e || window.event);\n });\n }\n}\n\nexport function off(el, eventName, callback, opts) {\n opts = opts || false;\n if (el.removeEventListener) {\n el.removeEventListener(eventName, callback, opts);\n } else if (el.detachEvent) {\n el.detachEvent(`on${eventName}`, callback);\n }\n}\n","/**\n * @fileOverview Find scroll parent\n */\n\nexport default (node) => {\n if (!(node instanceof HTMLElement)) {\n return document.documentElement;\n }\n\n const excludeStaticParent = node.style.position === 'absolute';\n const overflowRegex = /(scroll|auto)/;\n let parent = node;\n\n while (parent) {\n if (!parent.parentNode) {\n return node.ownerDocument || document.documentElement;\n }\n\n const style = window.getComputedStyle(parent);\n const position = style.position;\n const overflow = style.overflow;\n const overflowX = style['overflow-x'];\n const overflowY = style['overflow-y'];\n\n if (position === 'static' && excludeStaticParent) {\n parent = parent.parentNode;\n continue;\n }\n\n if (overflowRegex.test(overflow) && overflowRegex.test(overflowX) && overflowRegex.test(overflowY)) {\n return parent;\n }\n\n parent = parent.parentNode;\n }\n\n return node.ownerDocument || node.documentElement || document.documentElement;\n};\n","/**\n * react-lazyload\n */\nimport React, { Component, PureComponent } from 'react';\nimport ReactDom from 'react-dom';\nimport PropTypes from 'prop-types';\nimport { on, off } from './utils/event';\nimport scrollParent from './utils/scrollParent';\nimport debounce from './utils/debounce';\nimport throttle from './utils/throttle';\n\nconst defaultBoundingClientRect = { top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 };\nconst LISTEN_FLAG = 'data-lazyload-listened';\nconst listeners = [];\nlet pending = [];\n\n// try to handle passive events\nlet passiveEventSupported = false;\ntry {\n const opts = Object.defineProperty({}, 'passive', {\n get() {\n passiveEventSupported = true;\n }\n });\n window.addEventListener('test', null, opts);\n}\ncatch (e) { }\n// if they are supported, setup the optional params\n// IMPORTANT: FALSE doubles as the default CAPTURE value!\nconst passiveEvent = passiveEventSupported ? { capture: false, passive: true } : false;\n\n\n/**\n * Check if `component` is visible in overflow container `parent`\n * @param {node} component React component\n * @param {node} parent component's scroll parent\n * @return {bool}\n */\nconst checkOverflowVisible = function checkOverflowVisible(component, parent) {\n const node = ReactDom.findDOMNode(component);\n\n let parentTop;\n let parentHeight;\n\n try {\n ({ top: parentTop, height: parentHeight } = parent.getBoundingClientRect());\n } catch (e) {\n ({ top: parentTop, height: parentHeight } = defaultBoundingClientRect);\n }\n\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\n\n // calculate top and height of the intersection of the element's scrollParent and viewport\n const intersectionTop = Math.max(parentTop, 0); // intersection's top relative to viewport\n const intersectionHeight = Math.min(windowInnerHeight, parentTop + parentHeight) - intersectionTop; // height\n\n // check whether the element is visible in the intersection\n let top;\n let height;\n\n try {\n ({ top, height } = node.getBoundingClientRect());\n } catch (e) {\n ({ top, height } = defaultBoundingClientRect);\n }\n\n const offsetTop = top - intersectionTop; // element's top relative to intersection\n\n const offsets = Array.isArray(component.props.offset) ?\n component.props.offset :\n [component.props.offset, component.props.offset]; // Be compatible with previous API\n\n return (offsetTop - offsets[0] <= intersectionHeight) &&\n (offsetTop + height + offsets[1] >= 0);\n};\n\n/**\n * Check if `component` is visible in document\n * @param {node} component React component\n * @return {bool}\n */\nconst checkNormalVisible = function checkNormalVisible(component) {\n const node = ReactDom.findDOMNode(component);\n\n // If this element is hidden by css rules somehow, it's definitely invisible\n if (!(node.offsetWidth || node.offsetHeight || node.getClientRects().length)) return false;\n\n let top;\n let elementHeight;\n\n try {\n ({ top, height: elementHeight } = node.getBoundingClientRect());\n } catch (e) {\n ({ top, height: elementHeight } = defaultBoundingClientRect);\n }\n\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\n\n const offsets = Array.isArray(component.props.offset) ?\n component.props.offset :\n [component.props.offset, component.props.offset]; // Be compatible with previous API\n\n return (top - offsets[0] <= windowInnerHeight) &&\n (top + elementHeight + offsets[1] >= 0);\n};\n\n\n/**\n * Detect if element is visible in viewport, if so, set `visible` state to true.\n * If `once` prop is provided true, remove component as listener after checkVisible\n *\n * @param {React} component React component that respond to scroll and resize\n */\nconst checkVisible = function checkVisible(component) {\n const node = ReactDom.findDOMNode(component);\n if (!(node instanceof HTMLElement)) {\n return;\n }\n\n const parent = scrollParent(node);\n const isOverflow = component.props.overflow &&\n parent !== node.ownerDocument &&\n parent !== document &&\n parent !== document.documentElement;\n const visible = isOverflow ?\n checkOverflowVisible(component, parent) :\n checkNormalVisible(component);\n if (visible) {\n // Avoid extra render if previously is visible\n if (!component.state.visible || component.state.hidden) {\n if (component.props.once) {\n pending.push(component);\n }\n\n //console.log('lazyload 1');\n component.setState({\n visible: true,\n hidden: false,\n });\n }\n } else if (!component.props.once) {\n if (component.props.unmountIfInvisible) {\n if(component.visible===true)\n component.setState({\n visible: false,\n });\n } else if(component.props.hiddenIfInvisible) {\n if(component.state.hidden===false) {\n //console.log('lazyload 3');\n component.setState({\n hidden: true,\n });\n }\n }\n }\n};\n\n\nconst purgePending = function purgePending() {\n pending.forEach((component) => {\n const index = listeners.indexOf(component);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n });\n\n pending = [];\n};\n\nconst lazyLoadHandler = () => {\n for (let i = 0; i < listeners.length; ++i) {\n const listener = listeners[i];\n checkVisible(listener);\n }\n // Remove `once` component in listeners\n purgePending();\n};\n\n// Depending on component's props\nlet delayType;\nlet finalLazyLoadHandler = null;\n\nconst isString = string => typeof string === 'string';\n\nclass LazyLoad extends PureComponent {\n constructor(props) {\n super(props);\n\n this.state={\n visible: false,\n hidden: false,\n };\n }\n\n componentDidMount() {\n // It's unlikely to change delay type on the fly, this is mainly\n // designed for tests\n let scrollport = window;\n const {\n scrollContainer,\n } = this.props;\n if (scrollContainer) {\n if (isString(scrollContainer)) {\n scrollport = scrollport.document.querySelector(scrollContainer);\n }\n }\n const needResetFinalLazyLoadHandler = (this.props.debounce !== undefined && delayType === 'throttle')\n || (delayType === 'debounce' && this.props.debounce === undefined);\n\n if (needResetFinalLazyLoadHandler) {\n off(scrollport, 'scroll', finalLazyLoadHandler, passiveEvent);\n off(window, 'resize', finalLazyLoadHandler, passiveEvent);\n finalLazyLoadHandler = null;\n }\n\n if (!finalLazyLoadHandler) {\n if (this.props.debounce !== undefined) {\n finalLazyLoadHandler = debounce(lazyLoadHandler, typeof this.props.debounce === 'number' ?\n this.props.debounce :\n 300);\n delayType = 'debounce';\n } else if (this.props.throttle !== undefined) {\n finalLazyLoadHandler = throttle(lazyLoadHandler, typeof this.props.throttle === 'number' ?\n this.props.throttle :\n 300);\n delayType = 'throttle';\n } else {\n finalLazyLoadHandler = lazyLoadHandler;\n }\n }\n\n if (this.props.overflow) {\n const parent = scrollParent(ReactDom.findDOMNode(this));\n if (parent && typeof parent.getAttribute === 'function') {\n const listenerCount = 1 + (+parent.getAttribute(LISTEN_FLAG));\n if (listenerCount === 1) {\n parent.addEventListener('scroll', finalLazyLoadHandler, passiveEvent);\n }\n parent.setAttribute(LISTEN_FLAG, listenerCount);\n }\n } else if (listeners.length === 0 || needResetFinalLazyLoadHandler) {\n const { scroll, resize } = this.props;\n\n if (scroll) {\n on(scrollport, 'scroll', finalLazyLoadHandler, passiveEvent);\n }\n\n if (resize) {\n on(window, 'resize', finalLazyLoadHandler, passiveEvent);\n }\n }\n\n listeners.push(this);\n checkVisible(this);\n }\n\n componentWillUnmount() {\n if (this.props.overflow) {\n const parent = scrollParent(ReactDom.findDOMNode(this));\n if (parent && typeof parent.getAttribute === 'function') {\n const listenerCount = (+parent.getAttribute(LISTEN_FLAG)) - 1;\n if (listenerCount === 0) {\n parent.removeEventListener('scroll', finalLazyLoadHandler, passiveEvent);\n parent.removeAttribute(LISTEN_FLAG);\n } else {\n parent.setAttribute(LISTEN_FLAG, listenerCount);\n }\n }\n }\n\n const index = listeners.indexOf(this);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length === 0 && typeof window !== 'undefined') {\n off(window, 'resize', finalLazyLoadHandler, passiveEvent);\n off(window, 'scroll', finalLazyLoadHandler, passiveEvent);\n }\n }\n\n render() {\n //console.log('lazyload render');\n if(this.state.visible) {\n if(this.props.hiddenIfInvisible)\n return this.state.hidden ?\n
{this.props.children}
:\n
{this.props.children}
;\n else\n return this.props.children;\n }\n else\n return this.props.placeholder ?\n this.props.placeholder :\n
;\n }\n}\n\nLazyLoad.propTypes = {\n once: PropTypes.bool,\n height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n offset: PropTypes.oneOfType([PropTypes.number, PropTypes.arrayOf(PropTypes.number)]),\n overflow: PropTypes.bool,\n resize: PropTypes.bool,\n scroll: PropTypes.bool,\n children: PropTypes.node,\n throttle: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\n debounce: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\n placeholder: PropTypes.node,\n scrollContainer: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n unmountIfInvisible: PropTypes.bool,\n hiddenIfInvisible: PropTypes.bool,\n};\n\nLazyLoad.defaultProps = {\n once: false,\n offset: 0,\n overflow: false,\n resize: false,\n scroll: true,\n unmountIfInvisible: false,\n hiddenIfInvisible: false,\n};\n\nconst getDisplayName = WrappedComponent => WrappedComponent.displayName || WrappedComponent.name || 'Component';\n\nconst decorator = (options = {}) => function lazyload(WrappedComponent) {\n return class LazyLoadDecorated extends Component {\n constructor() {\n super();\n this.displayName = `LazyLoad${getDisplayName(WrappedComponent)}`;\n }\n\n render() {\n return (\n \n \n \n );\n }\n };\n};\n\nexport { decorator as lazyload };\nexport default LazyLoad;\nexport { lazyLoadHandler as forceCheck };\n","export default function debounce(func, wait, immediate) {\n let timeout;\n let args;\n let context;\n let timestamp;\n let result;\n\n const later = function later() {\n const last = +(new Date()) - timestamp;\n\n if (last < wait && last >= 0) {\n timeout = setTimeout(later, wait - last);\n } else {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n if (!timeout) {\n context = null;\n args = null;\n }\n }\n }\n };\n\n return function debounced() {\n context = this;\n args = arguments;\n timestamp = +(new Date());\n\n const callNow = immediate && !timeout;\n if (!timeout) {\n timeout = setTimeout(later, wait);\n }\n\n if (callNow) {\n result = func.apply(context, args);\n context = null;\n args = null;\n }\n\n return result;\n };\n}\n","/*eslint-disable */\nexport default function throttle(fn, threshhold, scope) {\n threshhold || (threshhold = 250);\n var last,\n deferTimer;\n return function () {\n var context = scope || this;\n\n var now = +new Date,\n args = arguments;\n if (last && now < last + threshhold) {\n // hold on to it\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n fn.apply(context, args);\n }, threshhold);\n } else {\n last = now;\n fn.apply(context, args);\n }\n };\n}\n","import React, { Component } from 'react';\nimport load from 'load-script';\n\nwindow.audio_cache = {};\n\nfunction load_amrnb() {\n return new Promise((resolve, reject) => {\n if (window.AMR) resolve();\n else\n load('static/amr_all.min.js', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n}\n\nexport class AudioWidget extends Component {\n constructor(props) {\n super(props);\n this.state = {\n url: this.props.src,\n state: 'waiting',\n data: null,\n };\n }\n\n load() {\n if (window.audio_cache[this.state.url]) {\n this.setState({\n state: 'loaded',\n data: window.audio_cache[this.state.url],\n });\n return;\n }\n\n console.log('fetching audio', this.state.url);\n this.setState({\n state: 'loading',\n });\n Promise.all([fetch(this.state.url), load_amrnb()]).then((res) => {\n res[0].blob().then((blob) => {\n const reader = new FileReader();\n reader.onload = (event) => {\n const raw = new window.AMR().decode(event.target.result);\n if (!raw) {\n alert('audio decoding failed');\n return;\n }\n const wave = window.PCMData.encode({\n sampleRate: 8000,\n channelCount: 1,\n bytesPerSample: 2,\n data: raw,\n });\n const binary_wave = new Uint8Array(wave.length);\n for (let i = 0; i < wave.length; i++)\n binary_wave[i] = wave.charCodeAt(i);\n\n const objurl = URL.createObjectURL(\n new Blob([binary_wave], { type: 'audio/wav' }),\n );\n window.audio_cache[this.state.url] = objurl;\n this.setState({\n state: 'loaded',\n data: objurl,\n });\n };\n reader.readAsBinaryString(blob);\n });\n this.setState({\n state: 'decoding',\n });\n });\n }\n\n render() {\n if (this.state.state === 'waiting')\n return (\n

\n 加载音频\n

\n );\n if (this.state.state === 'loading') return

正在下载……

;\n else if (this.state.state === 'decoding') return

正在解码……

;\n else if (this.state.state === 'loaded')\n return (\n

\n

\n );\n }\n}\n","import React, { PureComponent } from 'react';\nimport { THUHOLE_API_ROOT, get_json, API_VERSION_PARAM } from './flows_api';\nimport { Time } from './Common';\n\nexport class MessageViewer extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n loading_status: 'idle',\n msg: [],\n };\n }\n\n componentDidMount() {\n this.load();\n }\n\n load() {\n if (this.state.loading_status === 'loading') return;\n this.setState(\n {\n loading_status: 'loading',\n },\n () => {\n fetch(\n THUHOLE_API_ROOT +\n 'api_xmcp/hole/system_msg?user_token=' +\n encodeURIComponent(this.props.token) +\n API_VERSION_PARAM(),\n )\n .then(get_json)\n .then((json) => {\n if (json.error) throw new Error(json.error);\n else\n this.setState({\n loading_status: 'done',\n msg: json.result,\n });\n })\n .catch((err) => {\n console.error(err);\n alert('' + err);\n this.setState({\n loading_status: 'failed',\n });\n });\n },\n );\n }\n\n render() {\n if (this.state.loading_status === 'loading')\n return

加载中……

;\n else if (this.state.loading_status === 'failed')\n return (\n
\n {\n this.load();\n }}\n >\n 重新加载\n \n
\n );\n else if (this.state.loading_status === 'done')\n return this.state.msg.map((msg) => (\n
\n
\n
\n
\n
{msg.content}
\n
\n
\n ));\n else return null;\n }\n}\n","import React, { PureComponent } from 'react';\n\nimport './Config.css';\n\nconst BUILTIN_IMGS = {\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/gbp.jpg':\n '寻觅繁星(默认)',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/eriri.jpg':\n '平成著名画师',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/yurucamp.jpg':\n '露营天下第一',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/minecraft.jpg':\n '麦恩·库拉夫特',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/cyberpunk.jpg':\n '赛博城市',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/bj.jpg':\n '城市的星光',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/sif.jpg':\n '梦开始的地方',\n};\n\nconst DEFAULT_CONFIG = {\n background_img:\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/gbp.jpg',\n background_color: '#113366',\n pressure: false,\n easter_egg: true,\n color_scheme: 'default',\n fold: true,\n block_words: [],\n};\n\nexport function load_config() {\n let config = Object.assign({}, DEFAULT_CONFIG);\n let loaded_config;\n try {\n loaded_config = JSON.parse(localStorage['hole_config'] || '{}');\n } catch (e) {\n alert('设置加载失败,将重置为默认设置!\\n' + e);\n delete localStorage['hole_config'];\n loaded_config = {};\n }\n\n // unrecognized configs are removed\n Object.keys(loaded_config).forEach((key) => {\n if (config[key] !== undefined) config[key] = loaded_config[key];\n });\n\n console.log('config loaded', config);\n window.config = config;\n}\nexport function save_config() {\n localStorage['hole_config'] = JSON.stringify(window.config);\n load_config();\n}\n\nexport function bgimg_style(img, color) {\n if (img === undefined) img = window.config.background_img;\n if (color === undefined) color = window.config.background_color;\n return {\n background: 'transparent center center',\n backgroundImage: img === null ? 'unset' : 'url(\"' + encodeURI(img) + '\")',\n backgroundColor: color,\n backgroundSize: 'cover',\n };\n}\n\nclass ConfigBackground extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n img: window.config.background_img,\n color: window.config.background_color,\n };\n }\n\n save_changes() {\n this.props.callback({\n background_img: this.state.img,\n background_color: this.state.color,\n });\n }\n\n on_select(e) {\n let value = e.target.value;\n this.setState(\n {\n img: value === '##other' ? '' : value === '##color' ? null : value,\n },\n this.save_changes.bind(this),\n );\n }\n on_change_img(e) {\n this.setState(\n {\n img: e.target.value,\n },\n this.save_changes.bind(this),\n );\n }\n on_change_color(e) {\n this.setState(\n {\n color: e.target.value,\n },\n this.save_changes.bind(this),\n );\n }\n\n render() {\n let img_select =\n this.state.img === null\n ? '##color'\n : Object.keys(BUILTIN_IMGS).indexOf(this.state.img) === -1\n ? '##other'\n : this.state.img;\n return (\n
\n

\n 背景图片:\n \n {Object.keys(BUILTIN_IMGS).map((key) => (\n \n ))}\n \n \n \n  \n #background_img \n {img_select === '##other' && (\n \n )}\n {img_select === '##color' && (\n \n )}\n

\n \n
\n );\n }\n}\n\nclass ConfigColorScheme extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n color_scheme: window.config.color_scheme,\n };\n }\n\n save_changes() {\n this.props.callback({\n color_scheme: this.state.color_scheme,\n });\n }\n\n on_select(e) {\n let value = e.target.value;\n this.setState(\n {\n color_scheme: value,\n },\n this.save_changes.bind(this),\n );\n }\n\n render() {\n return (\n
\n

\n 夜间模式:\n \n \n \n \n \n  #color_scheme\n

\n

\n 选择浅色或深色模式,深色模式下将会调暗图片亮度\n

\n
\n );\n }\n}\n\nclass ConfigTextArea extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n [props.id]: window.config[props.id],\n };\n }\n\n save_changes() {\n this.props.callback({\n [this.props.id]: this.props.sift(this.state[this.props.id]),\n });\n }\n\n on_change(e) {\n let value = this.props.parse(e.target.value);\n this.setState(\n {\n [this.props.id]: value,\n },\n this.save_changes.bind(this),\n );\n }\n\n render() {\n return (\n
\n \n
\n );\n }\n}\n\n/* class ConfigBlockWords extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n block_words: window.config.block_words,\n };\n }\n\n save_changes() {\n this.props.callback({\n block_words: this.state.block_words.filter((v) => v),\n });\n }\n\n on_change(e) {\n // Filter out those blank lines\n let value = e.target.value.split('\\n');\n this.setState(\n {\n block_words: value,\n },\n this.save_changes.bind(this),\n );\n }\n\n render() {\n return (\n
\n

\n {' '}\n 设置屏蔽词 \n

\n

\n \n

\n
\n );\n }\n} */\n\nclass ConfigSwitch extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n switch: window.config[this.props.id],\n };\n }\n\n on_change(e) {\n let val = e.target.checked;\n this.setState(\n {\n switch: val,\n },\n () => {\n this.props.callback({\n [this.props.id]: val,\n });\n },\n );\n }\n\n render() {\n return (\n
\n

\n \n

\n

{this.props.description}

\n
\n );\n }\n}\n\nexport class ConfigUI extends PureComponent {\n constructor(props) {\n super(props);\n this.save_changes_bound = this.save_changes.bind(this);\n }\n\n save_changes(chg) {\n console.log(chg);\n Object.keys(chg).forEach((key) => {\n window.config[key] = chg[key];\n });\n save_config();\n }\n\n reset_settings() {\n if (window.confirm('重置所有设置?')) {\n window.config = {};\n save_config();\n window.location.reload();\n }\n }\n\n render() {\n return (\n
\n
\n

\n 这些功能仍在测试,可能不稳定(\n 全部重置)\n

\n

\n \n 修改设置后{' '}\n {\n window.location.reload();\n }}\n >\n 刷新页面\n {' '}\n 方可生效\n \n

\n
\n
\n \n
\n \n
\n {/* */}\n array.join('\\n')}\n sift={(array) => array.filter((v) => v)}\n parse={(string) => string.split('\\n')}\n />\n
\n \n
\n \n
\n \n
\n

\n 新功能建议或问题反馈请在 \n \n GitHub \n \n  提出。\n

\n
\n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport {\n API_BASE,\n SafeTextarea,\n PromotionBar,\n HighlightedMarkdown,\n} from './Common';\nimport { MessageViewer } from './Message';\nimport { LoginPopup } from './infrastructure/widgets';\nimport { ColorPicker } from './color_picker';\nimport { ConfigUI } from './Config';\nimport fixOrientation from 'fix-orientation';\nimport copy from 'copy-to-clipboard';\nimport { cache } from './cache';\nimport {\n API_VERSION_PARAM,\n THUHOLE_API_ROOT,\n API,\n get_json,\n token_param,\n} from './flows_api';\n\nimport './UserAction.css';\n\nconst BASE64_RATE = 4 / 3;\nconst MAX_IMG_DIAM = 8000;\nconst MAX_IMG_PX = 5000000;\nconst MAX_IMG_FILESIZE = 450000 * BASE64_RATE;\n\nexport const TokenCtx = React.createContext({\n value: null,\n set_value: () => {},\n});\n\n// class LifeInfoBox extends Component {\n// constructor(props) {\n// super(props);\n// if(!window._life_info_cache)\n// window._life_info_cache={};\n// this.CACHE_TIMEOUT_S=15;\n// this.state={\n// today_info: this.cache_get('today_info'),\n// card_balance: this.cache_get('card_balance'),\n// net_balance: this.cache_get('net_balance'),\n// mail_count: this.cache_get('mail_count'),\n// };\n// this.INTERNAL_NETWORK_FAILURE='_network_failure';\n// this.API_NAME={\n// today_info: 'hole/today_info',\n// card_balance: 'isop/card_balance',\n// net_balance: 'isop/net_balance',\n// mail_count: 'isop/mail_count',\n// };\n// }\n//\n// cache_get(key) {\n// let cache_item=window._life_info_cache[key];\n// if(!cache_item || (+new Date())-cache_item[0]>1000*this.CACHE_TIMEOUT_S)\n// return null;\n// else\n// return cache_item[1];\n// }\n// cache_set(key,value) {\n// if(!window._life_info_cache[key] || window._life_info_cache[key][1]!==value)\n// window._life_info_cache[key]=[+new Date(),value];\n// }\n//\n// load(state_key) {\n// this.setState({\n// [state_key]: null,\n// },()=>{\n// fetch(\n// PKUHELPER_ROOT+'api_xmcp/'+this.API_NAME[state_key]\n// +'?user_token='+encodeURIComponent(this.props.token)\n// +API_VERSION_PARAM()\n// )\n// .then(get_json)\n// .then((json)=>{\n// //console.log(json);\n// this.setState({\n// [state_key]: json,\n// });\n// })\n// .catch((e)=>{\n// this.setState({\n// [state_key]: {\n// errMsg: '网络错误 '+e,\n// errCode: this.INTERNAL_NETWORK_FAILURE,\n// success: false,\n// }\n// });\n// })\n// });\n// }\n//\n// componentDidMount() {\n// ['today_info','card_balance','net_balance','mail_count'].forEach((k)=>{\n// if(!this.state[k])\n// this.load(k);\n// });\n// }\n//\n// reload_all() {\n// ['today_info','card_balance','net_balance','mail_count'].forEach((k)=>{\n// this.load(k);\n// });\n// }\n//\n// render_line(state_key,title,value_fn,action,url_fn,do_login) {\n// let s=this.state[state_key];\n// if(!s)\n// return (\n// \n// {title}\n// 加载中……\n// \n// \n// );\n// else if(!s.success) {\n// let type='加载失败';\n// if(s.errCode===this.INTERNAL_NETWORK_FAILURE)\n// type='网络错误';\n// else if(['E01','E02','E03'].indexOf(s.errCode)!==-1)\n// type='授权失效';\n//\n// let details=JSON.stringify(s);\n// if(s.errMsg)\n// details=s.errMsg;\n// else if(s.error)\n// details=s.error;\n//\n// return (\n// \n// {title}\n// \n// alert(details)}>{type}\n// \n// \n// {type==='授权失效' ?\n// \n//  重新登录\n// :\n// this.load(state_key)}>\n//  重试\n// \n// }\n// \n// \n// )\n// }\n// else {\n// this.cache_set(state_key,s);\n//\n// return (\n// \n// {title}\n// {value_fn(s)}\n// \n// \n//  {action}\n// \n// \n// \n// );\n// }\n// }\n//\n// render() {\n// return (\n// {\n// this.props.set_token(t);\n// this.reload_all();\n// }}>{(do_login)=>(\n//
\n// \n// \n// {this.render_line(\n// 'today_info',\n// '今日',(s)=>s.info,\n// '校历',(s)=>s.schedule_url,\n// do_login,\n// )}\n// {this.render_line(\n// 'card_balance',\n// '校园卡',(s)=>`余额¥${s.balance.toFixed(2)}`,\n// '充值',()=>'https://virtualprod.alipay.com/educate/educatePcRecharge.htm?schoolCode=PKU&schoolName=',\n// do_login,\n// )}\n// {this.render_line(\n// 'net_balance',\n// '网费',(s)=>`余额¥${s.balance.toFixed(2)}`,\n// '充值',()=>'https://its.pku.edu.cn/epay.jsp',\n// do_login,\n// )}\n// {this.render_line(\n// 'mail_count',\n// '邮件',(s)=>`未读 ${s.count} 封`,\n// '查看',()=>'https://mail.pku.edu.cn/',\n// do_login,\n// )}\n// \n//
\n//
\n// )}
\n// )\n// }\n// }\n\nexport function InfoSidebar(props) {\n return (\n
\n \n \n
\n {\n props.show_sidebar('设置', );\n }}\n >\n \n \n \n   \n \n \n \n \n   \n \n \n \n \n
\n
\n

\n {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker\n .getRegistrations()\n .then((registrations) => {\n for (let registration of registrations) {\n console.log('unregister', registration);\n registration.unregister();\n }\n });\n }\n cache().clear();\n setTimeout(() => {\n window.location.reload(true);\n }, 200);\n }}\n >\n 强制检查更新\n \n (当前版本:【{process.env.REACT_APP_BUILD_INFO || '---'}{' '}\n {process.env.NODE_ENV}】 会自动在后台检查更新并在下次访问时更新)\n

\n
\n
\n

联系我们:thuhole at protonmail dot com

\n
\n
\n

\n T大树洞 网页版 by @thuhole, 基于 \n \n GPLv3\n \n  协议在{' '}\n \n GitHub\n {' '}\n 开源\n

\n

\n T大树洞 网页版的诞生离不开 \n \n P大树洞网页版 by @xmcp\n \n 、\n \n React\n \n 、\n \n IcoMoon\n \n  等开源项目\n

\n

\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or (at\n your option) any later version.\n

\n

\n This program is distributed in the hope that it will be useful, but\n WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n \n GNU General Public License\n \n  for more details.\n

\n
\n
\n );\n}\n\nclass ResetUsertokenWidget extends Component {\n constructor(props) {\n super(props);\n this.state = {\n loading_status: 'done',\n };\n }\n\n do_reset() {\n if (\n window.confirm(\n '您正在重置 UserToken!\\n您的账号将会在【所有设备】上注销,您需要手动重新登录!',\n )\n ) {\n let uid = window.prompt(\n '您正在重置 UserToken!\\n请输入您的学号以确认身份:',\n );\n if (uid)\n this.setState(\n {\n loading_status: 'loading',\n },\n () => {\n fetch(THUHOLE_API_ROOT + 'api_xmcp/hole/reset_usertoken', {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n user_token: this.props.token,\n uid: uid,\n }),\n })\n .then(get_json)\n .then((json) => {\n if (json.error) throw new Error(json.error);\n else alert('重置成功!您需要在所有设备上重新登录。');\n\n this.setState({\n loading_status: 'done',\n });\n })\n .catch((e) => {\n alert('重置失败:' + e);\n this.setState({\n loading_status: 'done',\n });\n });\n },\n );\n }\n }\n\n render() {\n if (this.state.loading_status === 'done')\n return 重置;\n else if (this.state.loading_status === 'loading')\n return (\n \n \n \n );\n }\n}\n\nexport class LoginForm extends Component {\n copy_token(token) {\n if (copy(token)) alert('复制成功!\\n请一定不要泄露哦');\n }\n\n render() {\n return (\n \n {(token) => (\n
\n {/*{!!token.value &&*/}\n {/* */}\n {/*}*/}\n
\n {token.value ? (\n
\n

\n 您已登录。\n {\n token.set_value(null);\n }}\n >\n 注销\n \n
\n

\n {/*

*/}\n {/*根据计算中心要求,访问授权三个月内有效,过期需重新登录。*/}\n {/*T大树洞将会单向加密(i.e. 哈希散列)您的邮箱后再存入数据库,因此您的发帖具有较强的匿名性。具体可见我们的后端开源代码。*/}\n {/*

*/}\n

\n {\n this.props.show_sidebar(\n '系统消息',\n ,\n );\n }}\n >\n 查看系统消息\n \n
\n 当您发送的内容违规时,我们将用系统消息提示您\n

\n

\n \n 复制 User Token\n \n
\n 复制 User Token\n 可以在新设备登录,切勿告知他人。若怀疑被盗号请重新邮箱验证码登录以重置Token。\n {/*,若怀疑被盗号请尽快 */}\n

\n
\n ) : (\n \n {(do_popup) => (\n
\n

\n \n

\n

\n \n T大树洞\n 面向T大学生,通过T大邮箱验证您的身份并提供服务。\n \n

\n
\n )}\n
\n )}\n
\n
\n )}\n
\n );\n }\n}\n\nexport class ReplyForm extends Component {\n constructor(props) {\n super(props);\n this.state = {\n text: '',\n loading_status: 'done',\n preview: false,\n };\n this.on_change_bound = this.on_change.bind(this);\n this.area_ref = this.props.area_ref || React.createRef();\n this.global_keypress_handler_bound = this.global_keypress_handler.bind(\n this,\n );\n this.color_picker = new ColorPicker();\n }\n\n global_keypress_handler(e) {\n if (\n e.code === 'Enter' &&\n !e.ctrlKey &&\n !e.altKey &&\n ['input', 'textarea'].indexOf(e.target.tagName.toLowerCase()) === -1\n ) {\n if (this.area_ref.current) {\n e.preventDefault();\n this.area_ref.current.focus();\n }\n }\n }\n componentDidMount() {\n document.addEventListener('keypress', this.global_keypress_handler_bound);\n }\n componentWillUnmount() {\n document.removeEventListener(\n 'keypress',\n this.global_keypress_handler_bound,\n );\n }\n\n on_change(value) {\n this.setState({\n text: value,\n });\n }\n\n on_submit(event) {\n if (event) event.preventDefault();\n if (this.state.loading_status === 'loading') return;\n this.setState({\n loading_status: 'loading',\n });\n\n let data = new URLSearchParams();\n data.append('pid', this.props.pid);\n data.append('text', this.state.text);\n data.append('user_token', this.props.token);\n fetch(\n API_BASE + '/api.php?action=docomment' + token_param(this.props.token),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n },\n )\n .then(get_json)\n .then((json) => {\n if (json.code !== 0) {\n if (json.msg) alert(json.msg);\n throw new Error(JSON.stringify(json));\n }\n\n this.setState({\n loading_status: 'done',\n text: '',\n preview: false,\n });\n this.area_ref.current.clear();\n this.props.on_complete();\n })\n .catch((e) => {\n console.error(e);\n alert('回复失败');\n this.setState({\n loading_status: 'done',\n });\n });\n }\n\n toggle_preview() {\n this.setState({\n preview: !this.state.preview,\n });\n }\n\n render() {\n return (\n \n {this.state.preview ? (\n
\n {}}\n />\n
\n ) : (\n \n )}\n {\n this.toggle_preview();\n }}\n >\n {this.state.preview ? (\n \n ) : (\n \n )}\n \n {this.state.loading_status === 'loading' ? (\n \n ) : (\n \n )}\n \n );\n }\n}\n\nexport class PostForm extends Component {\n constructor(props) {\n super(props);\n this.state = {\n text: '',\n loading_status: 'done',\n img_tip: null,\n preview: false,\n };\n this.img_ref = React.createRef();\n this.area_ref = React.createRef();\n this.on_change_bound = this.on_change.bind(this);\n this.on_img_change_bound = this.on_img_change.bind(this);\n this.color_picker = new ColorPicker();\n }\n\n componentDidMount() {\n if (this.area_ref.current) this.area_ref.current.focus();\n }\n\n on_change(value) {\n this.setState({\n text: value,\n });\n }\n\n do_post(text, img) {\n let data = new URLSearchParams();\n data.append('text', this.state.text);\n data.append('type', img ? 'image' : 'text');\n data.append('user_token', this.props.token);\n if (img) data.append('data', img);\n\n fetch(API_BASE + '/api.php?action=dopost' + token_param(this.props.token), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n })\n .then(get_json)\n .then((json) => {\n if (json.code !== 0) {\n if (json.msg) alert(json.msg);\n throw new Error(JSON.stringify(json));\n }\n\n this.setState({\n loading_status: 'done',\n text: '',\n preview: false,\n });\n this.area_ref.current.clear();\n this.props.on_complete();\n })\n .catch((e) => {\n console.error(e);\n alert('发表失败');\n this.setState({\n loading_status: 'done',\n });\n });\n }\n\n proc_img(file) {\n return new Promise((resolve, reject) => {\n function return_url(url) {\n const idx = url.indexOf(';base64,');\n if (idx === -1) throw new Error('img not base64 encoded');\n\n return url.substr(idx + 8);\n }\n\n let reader = new FileReader();\n function on_got_img(url) {\n const image = new Image();\n image.onload = () => {\n let width = image.width;\n let height = image.height;\n let compressed = false;\n\n if (width > MAX_IMG_DIAM) {\n height = (height * MAX_IMG_DIAM) / width;\n width = MAX_IMG_DIAM;\n compressed = true;\n }\n if (height > MAX_IMG_DIAM) {\n width = (width * MAX_IMG_DIAM) / height;\n height = MAX_IMG_DIAM;\n compressed = true;\n }\n if (height * width > MAX_IMG_PX) {\n let rate = Math.sqrt((height * width) / MAX_IMG_PX);\n height /= rate;\n width /= rate;\n compressed = true;\n }\n console.log('chosen img size', width, height);\n\n let canvas = document.createElement('canvas');\n let ctx = canvas.getContext('2d');\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(image, 0, 0, width, height);\n\n let quality_l = 0.1,\n quality_r = 0.9,\n quality,\n new_url;\n while (quality_r - quality_l >= 0.03) {\n quality = (quality_r + quality_l) / 2;\n new_url = canvas.toDataURL('image/jpeg', quality);\n console.log(\n quality_l,\n quality_r,\n 'trying quality',\n quality,\n 'size',\n new_url.length,\n );\n if (new_url.length <= MAX_IMG_FILESIZE) quality_l = quality;\n else quality_r = quality;\n }\n if (quality_l >= 0.101) {\n console.log('chosen img quality', quality);\n resolve({\n img: return_url(new_url),\n quality: quality,\n width: Math.round(width),\n height: Math.round(height),\n compressed: compressed,\n });\n } else {\n reject('图片过大,无法上传');\n }\n };\n image.src = url;\n }\n reader.onload = (event) => {\n fixOrientation(event.target.result, {}, (fixed_dataurl) => {\n on_got_img(fixed_dataurl);\n });\n };\n reader.readAsDataURL(file);\n });\n }\n\n on_img_change() {\n if (this.img_ref.current && this.img_ref.current.files.length)\n this.setState(\n {\n img_tip: '(正在处理图片……)',\n },\n () => {\n this.proc_img(this.img_ref.current.files[0])\n .then((d) => {\n this.setState({\n img_tip:\n `(${d.compressed ? '压缩到' : '尺寸'} ${d.width}*${\n d.height\n } / ` +\n `质量 ${Math.floor(d.quality * 100)}% / ${Math.floor(\n d.img.length / BASE64_RATE / 1000,\n )}KB)`,\n });\n })\n .catch((e) => {\n this.setState({\n img_tip: `图片无效:${e}`,\n });\n });\n },\n );\n else\n this.setState({\n img_tip: null,\n });\n }\n\n on_submit(event) {\n if (event) event.preventDefault();\n if (this.state.loading_status === 'loading') return;\n if (this.img_ref.current.files.length) {\n this.setState({\n loading_status: 'processing',\n });\n this.proc_img(this.img_ref.current.files[0])\n .then((d) => {\n this.setState({\n loading_status: 'loading',\n });\n this.do_post(this.state.text, d.img);\n })\n .catch((e) => {\n alert(e);\n });\n } else {\n this.setState({\n loading_status: 'loading',\n });\n this.do_post(this.state.text, null);\n }\n }\n\n toggle_preview() {\n this.setState({\n preview: !this.state.preview,\n });\n }\n\n render() {\n return (\n
\n
\n \n\n {this.state.preview ? (\n {\n this.toggle_preview();\n }}\n >\n \n  编辑\n \n ) : (\n {\n this.toggle_preview();\n }}\n >\n \n  预览\n \n )}\n\n {this.state.loading_status !== 'done' ? (\n \n ) : (\n \n )}\n
\n {!!this.state.img_tip && (\n

\n {\n this.img_ref.current.value = '';\n this.on_img_change();\n }}\n >\n 删除图片\n \n {this.state.img_tip}\n

\n )}\n {this.state.preview ? (\n
\n {}}\n />\n
\n ) : (\n \n )}\n

\n \n 请遵守\n \n 树洞管理规范(试行)\n \n ,文明发言\n \n

\n \n );\n }\n}\n","import React, { PureComponent } from 'react';\nimport copy from 'copy-to-clipboard';\nimport { ColorPicker } from './color_picker';\nimport {\n split_text,\n NICKNAME_RE,\n PID_RE,\n URL_RE,\n URL_PID_RE,\n} from './text_splitter';\nimport {\n format_time,\n build_highlight_re,\n Time,\n TitleLine,\n HighlightedText,\n ClickHandler,\n ColoredSpan,\n HighlightedMarkdown,\n} from './Common';\nimport './Flows.css';\nimport LazyLoad, { forceCheck } from './react-lazyload/src';\nimport { AudioWidget } from './AudioWidget';\nimport { TokenCtx, ReplyForm } from './UserAction';\n\nimport { API } from './flows_api';\n\nconst IMAGE_BASE = 'https://img.thuhole.com/';\nconst IMAGE_BAK_BASE = 'https://img2.thuhole.com/';\n// const AUDIO_BASE=THUHOLE_API_ROOT+'services/thuhole/audios/';\n\nconst CLICKABLE_TAGS = { a: true, audio: true };\nconst PREVIEW_REPLY_COUNT = 10;\n// const QUOTE_BLACKLIST=['23333','233333','66666','666666','10086','10000','100000','99999','999999','55555','555555'];\nconst QUOTE_BLACKLIST = [];\nconst FOLD_TAGS = [\n '性相关',\n '政治相关',\n '性话题',\n '政治话题',\n '折叠',\n 'NSFW',\n '刷屏',\n '真实性可疑',\n '用户举报较多',\n '举报较多',\n '重复内容',\n];\n\nwindow.LATEST_POST_ID = parseInt(localStorage['_LATEST_POST_ID'], 10) || 0;\n\nconst DZ_NAME = '洞主';\n\nfunction load_single_meta(show_sidebar, token) {\n return async (pid, replace = false) => {\n let color_picker = new ColorPicker();\n let title_elem = '树洞 #' + pid;\n show_sidebar(\n title_elem,\n
正在加载 #{pid}
,\n replace ? 'replace' : 'push',\n );\n try {\n let single = await API.get_single(pid, token);\n single.data.variant = {};\n let { data: replies } = await API.load_replies_with_cache(\n pid,\n token,\n color_picker,\n parseInt(single.data.reply),\n );\n show_sidebar(\n title_elem,\n ,\n 'replace',\n );\n } catch (e) {\n console.error(e);\n show_sidebar(\n title_elem,\n ,\n 'replace',\n );\n }\n };\n}\n\nclass Reply extends PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n const replyContent = this.props.info.text;\n const splitIdx = replyContent.indexOf(']');\n\n const author = replyContent.substr(0, splitIdx + 1),\n replyText = replyContent.substr(splitIdx + 2);\n return (\n \n
\n #{this.props.info.cid}\n {!!this.props.do_filter_name && (\n {\n this.props.do_filter_name(this.props.info.name);\n }}\n >\n \n \n )}\n  \n {this.props.info.tag !== null && (\n {this.props.info.tag}\n )}\n
\n
\n \n
\n
\n );\n }\n}\n\nclass FlowItem extends PureComponent {\n constructor(props) {\n super(props);\n }\n\n copy_link(event) {\n event.preventDefault();\n copy(\n `${event.target.href}${\n this.props.info.tag ? ' 【' + this.props.info.tag + '】' : ''\n }\\n` +\n `${this.props.info.text}${\n this.props.info.type === 'image'\n ? ' [图片]'\n : this.props.info.type === 'audio'\n ? ' [语音]'\n : ''\n }\\n` +\n `(${format_time(new Date(this.props.info.timestamp * 1000))} ${\n this.props.info.likenum\n }关注 ${this.props.info.reply}回复)\\n` +\n this.props.replies\n .map((r) => (r.tag ? '【' + r.tag + '】' : '') + r.text)\n .join('\\n'),\n );\n }\n\n render() {\n let props = this.props;\n return (\n
\n {!!props.is_quote && (\n
\n
\n \n
\n {/*
*/}\n {/* 提到*/}\n {/*
*/}\n
\n )}\n
\n {!!window.LATEST_POST_ID &&\n parseInt(props.info.pid, 10) > window.LATEST_POST_ID && (\n
\n )}\n {!!this.props.attention && !this.props.cached && (\n
\n )}\n
\n {!!this.props.do_filter_name && (\n {\n this.props.do_filter_name(DZ_NAME);\n }}\n >\n \n \n )}\n {!!parseInt(props.info.likenum, 10) && (\n \n {props.info.likenum} \n \n \n )}\n {!!parseInt(props.info.reply, 10) && (\n \n {props.info.reply} \n \n \n )}\n \n \n #{props.info.pid}\n \n \n  \n {props.info.tag !== null && props.info.tag !== '折叠' && (\n {props.info.tag}\n )}\n
\n
\n \n {props.info.type === 'image' && (\n

\n {props.img_clickable ? (\n \n {\n if (e.target.src === IMAGE_BASE + props.info.url) {\n e.target.src = IMAGE_BAK_BASE + props.info.url;\n }\n }}\n alt={IMAGE_BASE + props.info.url}\n />\n \n ) : (\n {\n if (e.target.src === IMAGE_BASE + props.info.url) {\n e.target.src = IMAGE_BAK_BASE + props.info.url;\n }\n }}\n alt={IMAGE_BASE + props.info.url}\n />\n )}\n

\n )}\n {/*{props.info.type==='audio' && }*/}\n
\n {!!(props.attention && props.info.variant.latest_reply) && (\n

\n 最新回复{' '}\n

\n )}\n
\n
\n );\n }\n}\n\nclass FlowSidebar extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n attention: props.attention,\n info: props.info,\n replies: props.replies,\n loading_status: 'done',\n error_msg: null,\n filter_name: null,\n rev: false,\n };\n this.color_picker = props.color_picker;\n this.syncState = props.sync_state || (() => {});\n this.reply_ref = React.createRef();\n }\n\n set_variant(cid, variant) {\n this.setState(\n (prev) => {\n if (cid)\n return {\n replies: prev.replies.map((reply) => {\n if (reply.cid === cid)\n return Object.assign({}, reply, {\n variant: Object.assign({}, reply.variant, variant),\n });\n else return reply;\n }),\n };\n else\n return {\n info: Object.assign({}, prev.info, {\n variant: Object.assign({}, prev.info.variant, variant),\n }),\n };\n },\n function () {\n this.syncState({\n info: this.state.info,\n replies: this.state.replies,\n });\n },\n );\n }\n\n load_replies(update_count = true) {\n this.setState({\n loading_status: 'loading',\n error_msg: null,\n });\n API.load_replies(\n this.state.info.pid,\n this.props.token,\n this.color_picker,\n null,\n )\n .then((json) => {\n this.setState(\n (prev, props) => ({\n replies: json.data,\n info: update_count\n ? Object.assign({}, prev.info, {\n reply: '' + json.data.length,\n })\n : prev.info,\n attention: !!json.attention,\n loading_status: 'done',\n error_msg: null,\n }),\n () => {\n this.syncState({\n replies: this.state.replies,\n attention: this.state.attention,\n info: this.state.info,\n });\n if (this.state.replies.length)\n this.set_variant(null, {\n latest_reply: Math.max.apply(\n null,\n this.state.replies.map((r) => parseInt(r.timestamp)),\n ),\n });\n },\n );\n })\n .catch((e) => {\n console.error(e);\n this.setState({\n replies: [],\n loading_status: 'done',\n error_msg: '' + e,\n });\n });\n }\n\n toggle_attention() {\n this.setState({\n loading_status: 'loading',\n });\n const next_attention = !this.state.attention;\n API.set_attention(this.state.info.pid, next_attention, this.props.token)\n .then((json) => {\n this.setState({\n loading_status: 'done',\n attention: next_attention,\n });\n this.syncState({\n attention: next_attention,\n });\n })\n .catch((e) => {\n this.setState({\n loading_status: 'done',\n });\n alert('设置关注失败');\n console.error(e);\n });\n }\n\n report() {\n let reason = prompt(`举报 #${this.state.info.pid} 的理由:`);\n if (reason !== null) {\n API.report(this.state.info.pid, reason, this.props.token)\n .then((json) => {\n alert('举报成功');\n })\n .catch((e) => {\n alert('举报失败');\n console.error(e);\n });\n }\n }\n\n set_filter_name(name) {\n this.setState((prevState) => ({\n filter_name: name === prevState.filter_name ? null : name,\n }));\n }\n\n toggle_rev() {\n this.setState((prevState) => ({ rev: !prevState.rev }), forceCheck);\n }\n\n show_reply_bar(name, event) {\n if (this.reply_ref.current && !event.target.closest('a, .clickable')) {\n let text = this.reply_ref.current.get();\n if (\n /^\\s*(?:Re (?:|洞主|(?:[A-Z][a-z]+ )?(?:[A-Z][a-z]+)|You Win(?: \\d+)?):)?\\s*$/.test(\n text,\n )\n ) {\n // text is nearly empty so we can replace it\n let should_text = 'Re ' + name + ': ';\n if (should_text === this.reply_ref.current.get())\n this.reply_ref.current.set('');\n else this.reply_ref.current.set(should_text);\n }\n }\n }\n\n render() {\n if (this.state.loading_status === 'loading')\n return

加载中……

;\n\n let show_pid = load_single_meta(this.props.show_sidebar, this.props.token);\n\n let replies_to_show = this.state.filter_name\n ? this.state.replies.filter((r) => r.name === this.state.filter_name)\n : this.state.replies.slice();\n if (this.state.rev) replies_to_show.reverse();\n\n // may not need key, for performance\n // key for lazyload elem\n // let view_mode_key =\n // (this.state.rev ? 'y-' : 'n-') + (this.state.filter_name || 'null');\n\n let replies_cnt = { [DZ_NAME]: 1 };\n replies_to_show.forEach((r) => {\n if (replies_cnt[r.name] === undefined) replies_cnt[r.name] = 0;\n replies_cnt[r.name]++;\n });\n\n // hide main thread when filtered\n let main_thread_elem =\n this.state.filter_name && this.state.filter_name !== DZ_NAME ? null : (\n {\n this.show_reply_bar('', e);\n }}\n >\n {\n this.set_variant(null, variant);\n }}\n do_filter_name={\n replies_cnt[DZ_NAME] > 1 ? this.set_filter_name.bind(this) : null\n }\n />\n \n );\n\n return (\n
\n
\n {!!this.props.token && (\n \n \n \n \n \n   \n \n )}\n \n \n \n \n {(this.state.replies.length >= 1 || this.state.rev) && (\n \n   \n \n \n \n \n \n )}\n {!!this.props.token && (\n \n   \n {\n this.toggle_attention();\n }}\n >\n {this.state.attention ? (\n \n \n \n \n ) : (\n \n \n \n \n )}\n \n \n )}\n
\n {!!this.state.filter_name && (\n
\n

\n \n {\n this.set_filter_name(null);\n }}\n >\n 还原\n \n \n \n  当前只看 \n \n {this.state.filter_name}\n \n

\n
\n )}\n {!this.state.rev && main_thread_elem}\n {!!this.state.error_msg && (\n
\n

回复加载失败

\n

{this.state.error_msg}

\n
\n )}\n {this.props.deletion_detect &&\n parseInt(this.state.info.reply) > this.state.replies.length &&\n !!this.state.replies.length && (\n
\n {parseInt(this.state.info.reply) - this.state.replies.length}{' '}\n 条回复被删除\n
\n )}\n {replies_to_show.map((reply, i) => (\n \n {\n this.show_reply_bar(reply.name, e);\n }}\n >\n {\n this.set_variant(reply.cid, variant);\n }}\n do_filter_name={\n replies_cnt[reply.name] > 1\n ? this.set_filter_name.bind(this)\n : null\n }\n />\n \n \n ))}\n {this.state.rev && main_thread_elem}\n {this.props.token ? (\n \n ) : (\n
登录后可以回复树洞
\n )}\n
\n );\n }\n}\n\nclass FlowItemRow extends PureComponent {\n constructor(props) {\n super(props);\n this.needFold =\n FOLD_TAGS.indexOf(props.info.tag) > -1 &&\n (props.search_param === '热榜' || !props.search_param) &&\n window.config.fold &&\n props.mode !== 'attention' && props.mode !== 'attention_finished';\n this.state = {\n replies: [],\n reply_status: 'done',\n reply_error: null,\n info: Object.assign({}, props.info, { variant: {} }),\n hidden: window.config.block_words.some((word) =>\n props.info.text.includes(word),\n ) || this.needFold,\n attention:\n props.attention_override === null ? false : props.attention_override,\n cached: true, // default no display anything\n };\n this.color_picker = new ColorPicker();\n }\n\n componentDidMount() {\n if (parseInt(this.state.info.reply, 10)) {\n this.load_replies(null, /*update_count=*/ false);\n }\n }\n\n // reveal() {\n // this.setState({ hidden: false });\n // }\n\n load_replies(callback, update_count = true) {\n console.log('fetching reply', this.state.info.pid);\n this.setState({\n reply_status: 'loading',\n reply_error: null,\n });\n API.load_replies_with_cache(\n this.state.info.pid,\n this.props.token,\n this.color_picker,\n parseInt(this.state.info.reply),\n )\n .then(({ data: json, cached }) => {\n this.setState(\n (prev, props) => ({\n replies: json.data,\n info: Object.assign({}, prev.info, {\n reply: update_count ? '' + json.data.length : prev.info.reply,\n variant: json.data.length\n ? {\n latest_reply: Math.max.apply(\n null,\n json.data.map((r) => parseInt(r.timestamp)),\n ),\n }\n : {},\n }),\n attention: !!json.attention,\n reply_status: 'done',\n reply_error: null,\n cached,\n }),\n callback,\n );\n })\n .catch((e) => {\n console.error(e);\n this.setState(\n {\n replies: [],\n reply_status: 'failed',\n reply_error: '' + e,\n },\n callback,\n );\n });\n }\n\n show_sidebar() {\n this.props.show_sidebar(\n '树洞 #' + this.state.info.pid,\n ,\n );\n }\n\n render() {\n let show_pid = load_single_meta(this.props.show_sidebar, this.props.token, [\n this.state.info.pid,\n ]);\n\n let hl_rules = [\n ['url_pid', URL_PID_RE],\n ['url', URL_RE],\n ['pid', PID_RE],\n ['nickname', NICKNAME_RE],\n ];\n if (this.props.search_param) {\n hl_rules.push([\n 'search',\n !!this.props.search_param.match(/\\/.+\\//)\n ? build_highlight_re(this.props.search_param, ' ', 'gi', true) // Use regex\n : build_highlight_re(this.props.search_param, ' ', 'gi'), // Don't use regex\n ]);\n }\n let parts = split_text(this.state.info.text, hl_rules);\n\n let quote_id = null;\n if (!this.props.is_quote)\n for (let [mode, content] of parts) {\n content = content.length > 0 ? content.substring(1) : content;\n if (\n mode === 'pid' &&\n QUOTE_BLACKLIST.indexOf(content) === -1 &&\n parseInt(content) < parseInt(this.state.info.pid)\n )\n if (quote_id === null) quote_id = parseInt(content);\n else {\n quote_id = null;\n break;\n }\n }\n\n let res = (\n {\n if (!CLICKABLE_TAGS[event.target.tagName.toLowerCase()])\n this.show_sidebar();\n }}\n >\n \n
\n {this.state.reply_status === 'loading' && (\n
加载中
\n )}\n {this.state.reply_status === 'failed' && (\n
\n

\n {\n this.load_replies();\n }}\n >\n 重新加载评论\n \n

\n

{this.state.reply_error}

\n
\n )}\n {this.state.replies.slice(0, PREVIEW_REPLY_COUNT).map((reply) => (\n \n ))}\n {this.state.replies.length > PREVIEW_REPLY_COUNT && (\n
\n 还有 {this.state.replies.length - PREVIEW_REPLY_COUNT} 条\n
\n )}\n
\n
\n );\n\n if (this.state.hidden) {\n return (\n {\n if (!CLICKABLE_TAGS[event.target.tagName.toLowerCase()])\n this.show_sidebar();\n }}\n >\n \n {!!this.props.is_quote && (\n
\n
\n \n
\n {/*
*/}\n {/* 提到*/}\n {/*
*/}\n
\n )}\n
\n
\n {!!this.props.do_filter_name && (\n {\n this.props.do_filter_name(DZ_NAME);\n }}\n >\n \n \n )}\n #{this.props.info.pid}\n  \n {this.props.info.tag !== null && this.props.info.tag !== '折叠' && (\n {this.props.info.tag}\n )}\n
\n
\n
\n );\n }\n\n return quote_id ? (\n
\n {res}\n \n
\n ) : (\n res\n );\n }\n}\n\nclass FlowItemQuote extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n loading_status: 'empty',\n error_msg: null,\n info: null,\n };\n }\n\n componentDidMount() {\n this.load();\n }\n\n load() {\n this.setState(\n {\n loading_status: 'loading',\n },\n () => {\n API.get_single(this.props.pid, this.props.token)\n .then((json) => {\n this.setState({\n loading_status: 'done',\n info: json.data,\n });\n })\n .catch((err) => {\n if (('' + err).indexOf('没有这条树洞') !== -1)\n this.setState({\n loading_status: 'empty',\n });\n else\n this.setState({\n loading_status: 'error',\n error_msg: '' + err,\n });\n });\n },\n );\n }\n\n render() {\n if (this.state.loading_status === 'empty') return null;\n else if (this.state.loading_status === 'loading')\n return (\n
\n
\n \n 提到了 #{this.props.pid}\n
\n
\n );\n else if (this.state.loading_status === 'error')\n return (\n
\n
\n

\n 重新加载\n

\n

{this.state.error_msg}

\n
\n
\n );\n // 'done'\n else\n return (\n \n );\n }\n}\n\nfunction FlowChunk(props) {\n return (\n \n {({ value: token }) => (\n
\n {!!props.title && }\n {props.list.map((info, ind) => (\n \n
\n {!!(\n props.deletion_detect &&\n props.mode === 'list' &&\n ind &&\n props.list[ind - 1].pid - info.pid > 1\n ) && (\n
\n
\n {props.list[ind - 1].pid - info.pid - 1} 条被删除\n
\n
\n )}\n \n
\n \n ))}\n
\n )}\n
\n );\n}\n\nexport class Flow extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n mode: props.mode,\n search_param: props.search_text,\n loaded_pages: 0,\n chunks: {\n title: '',\n data: [],\n },\n loading_status: 'done',\n error_msg: null,\n };\n this.on_scroll_bound = this.on_scroll.bind(this);\n window.LATEST_POST_ID = parseInt(localStorage['_LATEST_POST_ID'], 10) || 0;\n }\n\n load_page(page) {\n const failed = (err) => {\n console.error(err);\n this.setState((prev, props) => ({\n loaded_pages: prev.loaded_pages - 1,\n loading_status: 'failed',\n error_msg: '' + err,\n }));\n };\n\n if (page > this.state.loaded_pages + 1) throw new Error('bad page');\n if (page === this.state.loaded_pages + 1) {\n console.log('fetching page', page);\n if (this.state.mode === 'list') {\n API.get_list(page, this.props.token)\n .then((json) => {\n if (page === 1 && json.data.length) {\n // update latest_post_id\n let max_id = -1;\n json.data.forEach((x) => {\n if (parseInt(x.pid, 10) > max_id) max_id = parseInt(x.pid, 10);\n });\n localStorage['_LATEST_POST_ID'] = '' + max_id;\n }\n this.setState((prev, props) => ({\n chunks: {\n title: 'News Feed',\n data: prev.chunks.data.concat(\n json.data.filter(\n (x) =>\n prev.chunks.data.length === 0 ||\n !prev.chunks.data\n .slice(-100)\n .some((p) => p.pid === x.pid),\n ),\n ),\n },\n loading_status: 'done',\n }));\n })\n .catch(failed);\n } else if (this.state.mode === 'search') {\n API.get_search(page, this.state.search_param, this.props.token)\n .then((json) => {\n const finished = json.data.length === 0;\n this.setState((prev, props) => ({\n chunks: {\n title: 'Result for \"' + this.state.search_param + '\"',\n data: prev.chunks.data.concat(\n json.data.filter(\n (x) =>\n prev.chunks.data.length === 0 ||\n !prev.chunks.data\n .slice(-100)\n .some((p) => p.pid === x.pid),\n ),\n ),\n },\n mode: finished ? 'search_finished' : 'search',\n loading_status: 'done',\n }));\n })\n .catch(failed);\n } else if (this.state.mode === 'single') {\n const pid = parseInt(this.state.search_param.substr(1), 10);\n API.get_single(pid, this.props.token)\n .then((json) => {\n this.setState({\n chunks: {\n title: 'PID = ' + pid,\n data: [json.data],\n },\n mode: 'single_finished',\n loading_status: 'done',\n });\n })\n .catch(failed);\n } else if (this.state.mode === 'attention') {\n let use_search = !!this.state.search_param;\n let use_regex = use_search && !!this.state.search_param.match(/\\/.+\\//);\n let regex_search = /.+/;\n if (use_regex) {\n try {\n regex_search = new RegExp(this.state.search_param.slice(1, -1));\n } catch (e) {\n alert(`请检查正则表达式合法性!\\n${e}`);\n regex_search = /.+/;\n }\n }\n console.log(use_search, use_regex);\n API.get_attention(this.props.token)\n .then((json) => {\n this.setState({\n chunks: {\n title: `${\n use_search\n ? use_regex\n ? `Result for RegEx ${regex_search.toString()} in `\n : `Result for \"${this.state.search_param}\" in `\n : ''\n }Attention List`,\n data: !use_search\n ? json.data\n : !use_regex\n ? json.data.filter((post) => {\n return this.state.search_param\n .split(' ')\n .every((keyword) => post.text.includes(keyword));\n }) // Not using regex\n : json.data.filter((post) => !!post.text.match(regex_search)), // Using regex\n },\n mode: 'attention_finished',\n loading_status: 'done',\n });\n })\n .catch(failed);\n } else {\n console.log('nothing to load');\n return;\n }\n\n this.setState((prev, props) => ({\n loaded_pages: prev.loaded_pages + 1,\n loading_status: 'loading',\n error_msg: null,\n }));\n }\n }\n\n on_scroll(event) {\n if (event.target === document) {\n const avail =\n document.body.scrollHeight - window.scrollY - window.innerHeight;\n if (avail < window.innerHeight && this.state.loading_status === 'done')\n this.load_page(this.state.loaded_pages + 1);\n }\n }\n\n componentDidMount() {\n this.load_page(1);\n window.addEventListener('scroll', this.on_scroll_bound);\n window.addEventListener('resize', this.on_scroll_bound);\n }\n componentWillUnmount() {\n window.removeEventListener('scroll', this.on_scroll_bound);\n window.removeEventListener('resize', this.on_scroll_bound);\n }\n\n render() {\n const should_deletion_detect = localStorage['DELETION_DETECT'] === 'on';\n return (\n
\n \n {this.state.loading_status === 'failed' && (\n
\n
\n

\n {\n this.load_page(this.state.loaded_pages + 1);\n }}\n >\n 重新加载\n \n

\n

{this.state.error_msg}

\n
\n
\n )}\n \n \n  Loading...\n \n ) : (\n '© thuhole'\n )\n }\n />\n
\n );\n }\n}\n","import React, { PureComponent } from 'react';\n// import {AppSwitcher} from './infrastructure/widgets';\nimport { InfoSidebar, PostForm } from './UserAction';\nimport { TokenCtx } from './UserAction';\n\nimport './Title.css';\n\nconst flag_re = /^\\/\\/setflag ([a-zA-Z0-9_]+)=(.*)$/;\n\nclass ControlBar extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n search_text: '',\n };\n this.set_mode = props.set_mode;\n\n this.on_change_bound = this.on_change.bind(this);\n this.on_keypress_bound = this.on_keypress.bind(this);\n this.do_refresh_bound = this.do_refresh.bind(this);\n this.do_attention_bound = this.do_attention.bind(this);\n }\n\n componentDidMount() {\n if (window.location.hash) {\n let text = decodeURIComponent(window.location.hash).substr(1);\n if (text.lastIndexOf('?') !== -1)\n text = text.substr(0, text.lastIndexOf('?')); // fuck wechat '#param?nsukey=...'\n this.setState(\n {\n search_text: text,\n },\n () => {\n this.on_keypress({ key: 'Enter' });\n },\n );\n }\n }\n\n on_change(event) {\n this.setState({\n search_text: event.target.value,\n });\n }\n\n on_keypress(event) {\n if (event.key === 'Enter') {\n let flag_res = flag_re.exec(this.state.search_text);\n if (flag_res) {\n if (flag_res[2]) {\n localStorage[flag_res[1]] = flag_res[2];\n alert(\n 'Set Flag ' +\n flag_res[1] +\n '=' +\n flag_res[2] +\n '\\nYou may need to refresh this webpage.',\n );\n } else {\n delete localStorage[flag_res[1]];\n alert(\n 'Clear Flag ' +\n flag_res[1] +\n '\\nYou may need to refresh this webpage.',\n );\n }\n return;\n }\n\n const mode = this.state.search_text.startsWith('#')\n ? 'single'\n : this.props.mode !== 'attention'\n ? 'search'\n : 'attention';\n this.set_mode(mode, this.state.search_text || '');\n }\n }\n\n do_refresh() {\n window.scrollTo(0, 0);\n this.setState({\n search_text: '',\n });\n this.set_mode('list', null);\n }\n\n do_attention() {\n window.scrollTo(0, 0);\n this.setState({\n search_text: '',\n });\n this.set_mode('attention', null);\n }\n\n render() {\n return (\n \n {({ value: token }) => (\n
\n \n \n 最新\n \n {!!token && (\n \n \n 关注\n \n )}\n \n {\n this.props.show_sidebar(\n 'T大树洞',\n ,\n );\n }}\n >\n \n \n {token ? '账户' : '登录'}\n \n \n {!!token && (\n {\n this.props.show_sidebar(\n '发表树洞',\n {\n this.props.show_sidebar(null, null, 'clear');\n this.do_refresh();\n }}\n />,\n );\n }}\n >\n \n 发表\n \n )}\n
\n )}\n
\n );\n }\n}\n\nexport function Title(props) {\n return (\n
\n {/* */}\n
\n
\n

\n \n props.show_sidebar(\n 'T大树洞',\n ,\n )\n }\n >\n T大树洞\n \n

\n
\n \n
\n
\n );\n}\n","import React, { PureComponent } from 'react';\nimport './Sidebar.css';\n\nexport class Sidebar extends PureComponent {\n constructor(props) {\n super(props);\n // this.sidebar_ref = React.createRef();\n this.do_close_bound = this.do_close.bind(this);\n this.do_back_bound = this.do_back.bind(this);\n }\n\n do_close() {\n this.props.show_sidebar(null, null, 'clear');\n }\n do_back() {\n this.props.show_sidebar(null, null, 'pop');\n }\n\n render() {\n // hide old contents to remember state\n let contents = this.props.stack.map(\n ({ 1: content }, i) =>\n content && (\n \n {content}\n \n ),\n );\n let cur_title = this.props.stack[this.props.stack.length - 1][0];\n return (\n \n {\n e.preventDefault();\n e.target.click();\n }}\n />\n
{contents}
\n
\n \n  \n \n  \n \n {this.props.stack.length > 2 && (\n \n  \n \n  \n \n )}\n {cur_title}\n
\n \n );\n }\n}\n","import React, { Component } from 'react';\nimport Pressure from 'pressure';\n\nimport './PressureHelper.css';\n\nconst THRESHOLD = 0.4;\nconst MULTIPLIER = 25;\nconst BORDER_WIDTH = 500; // also change css!\n\nexport class PressureHelper extends Component {\n constructor(props) {\n super(props);\n this.state = {\n level: 0,\n fired: false,\n };\n this.callback = props.callback;\n this.esc_interval = null;\n }\n\n do_fire() {\n if (this.esc_interval) {\n clearInterval(this.esc_interval);\n this.esc_interval = null;\n }\n this.setState({\n level: 1,\n fired: true,\n });\n this.callback();\n window.setTimeout(() => {\n this.setState({\n level: 0,\n fired: false,\n });\n }, 300);\n }\n\n componentDidMount() {\n if (window.config.pressure) {\n Pressure.set(\n document.body,\n {\n change: (force) => {\n if (!this.state.fired) {\n if (force >= 0.999) {\n this.do_fire();\n } else\n this.setState({\n level: force,\n });\n }\n },\n end: () => {\n this.setState({\n level: 0,\n fired: false,\n });\n },\n },\n {\n polyfill: false,\n only: 'touch',\n preventSelect: false,\n },\n );\n\n document.addEventListener('keydown', (e) => {\n if (!e.repeat && e.key === 'Escape') {\n if (this.esc_interval) clearInterval(this.esc_interval);\n this.setState(\n {\n level: THRESHOLD / 2,\n },\n () => {\n this.esc_interval = setInterval(() => {\n let new_level = this.state.level + 0.1;\n if (new_level >= 0.999) this.do_fire();\n else\n this.setState({\n level: new_level,\n });\n }, 30);\n },\n );\n }\n });\n document.addEventListener('keyup', (e) => {\n if (e.key === 'Escape') {\n if (this.esc_interval) {\n clearInterval(this.esc_interval);\n this.esc_interval = null;\n }\n this.setState({\n level: 0,\n });\n }\n });\n }\n }\n\n render() {\n const pad = MULTIPLIER * (this.state.level - THRESHOLD) - BORDER_WIDTH;\n return (\n \n );\n }\n}\n","import React, { Component } from 'react';\nimport { Flow } from './Flows';\nimport { Title } from './Title';\nimport { Sidebar } from './Sidebar';\nimport { PressureHelper } from './PressureHelper';\nimport { TokenCtx } from './UserAction';\nimport { load_config, bgimg_style } from './Config';\nimport { listen_darkmode } from './infrastructure/functions';\nimport { LoginPopup, TitleLine } from './infrastructure/widgets';\n\nconst MAX_SIDEBAR_STACK_SIZE = 10;\n\nfunction DeprecatedAlert(props) {\n return
;\n}\n\nclass App extends Component {\n constructor(props) {\n super(props);\n load_config();\n listen_darkmode(\n { default: undefined, light: false, dark: true }[\n window.config.color_scheme\n ],\n );\n this.state = {\n sidebar_stack: [[null, null]], // list of [status, content]\n mode: 'list', // list, single, search, attention\n search_text: null,\n flow_render_key: +new Date(),\n token: localStorage['TOKEN'] || null,\n };\n this.show_sidebar_bound = this.show_sidebar.bind(this);\n this.set_mode_bound = this.set_mode.bind(this);\n this.on_pressure_bound = this.on_pressure.bind(this);\n // a silly self-deceptive approach to ban guests, enough to fool those muggles\n // document cookie 'pku_ip_flag=yes'\n this.inthu_flag =\n window[atob('ZG9jdW1lbnQ')][atob('Y29va2ll')].indexOf(\n atob('dGh1X2lwX2ZsYWc9eWVz'),\n ) !== -1;\n }\n\n static is_darkmode() {\n if (window.config.color_scheme === 'dark') return true;\n if (window.config.color_scheme === 'light') return false;\n else {\n // 'default'\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n }\n\n on_pressure() {\n if (this.state.sidebar_stack.length > 1)\n this.show_sidebar(null, null, 'clear');\n else this.set_mode('list', null);\n }\n\n show_sidebar(title, content, mode = 'push') {\n this.setState((prevState) => {\n let ns = prevState.sidebar_stack.slice();\n if (mode === 'push') {\n if (ns.length === 1) {\n document.body.style.top = `-${window.scrollY}px`;\n document.body.style.position = 'fixed';\n document.body.style.width = '100vw'; // Be responsive with fixed position\n }\n if (ns.length > MAX_SIDEBAR_STACK_SIZE) ns.splice(1, 1);\n ns = ns.concat([[title, content]]);\n } else if (mode === 'pop') {\n if (ns.length === 1) return;\n if (ns.length === 2) {\n const scrollY = document.body.style.top;\n document.body.style.position = '';\n document.body.style.top = '';\n document.body.style.width = '';\n window.scrollTo(0, parseInt(scrollY || '0') * -1);\n }\n ns.pop();\n } else if (mode === 'replace') {\n ns.pop();\n ns = ns.concat([[title, content]]);\n } else if (mode === 'clear') {\n const scrollY = document.body.style.top;\n document.body.style.position = '';\n document.body.style.top = '';\n document.body.style.width = '';\n window.scrollTo(0, parseInt(scrollY || '0') * -1);\n ns = [[null, null]];\n } else throw new Error('bad show_sidebar mode');\n return {\n sidebar_stack: ns,\n };\n });\n }\n\n set_mode(mode, search_text) {\n this.setState({\n mode: mode,\n search_text: search_text,\n flow_render_key: +new Date(),\n });\n }\n\n render() {\n return (\n {\n localStorage['TOKEN'] = x || '';\n this.setState({\n token: x,\n });\n },\n }}\n >\n \n
\n \n \n {(token) => (\n
\n \n {!token.value && (\n
\n
\n

\n \n {(do_popup) => (\n \n \n  登录到 T大树洞\n \n )}\n \n

\n
\n
\n )}\n {this.inthu_flag || token.value ? (\n \n ) : (\n \n )}\n
\n
\n )}\n
\n \n \n );\n }\n}\n\nexport default App;\n","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/,\n ),\n);\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n // const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n // if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n // return;\n // }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://goo.gl/SC7cgQ',\n );\n });\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n console.log('New content is available; please refresh.');\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (\n response.status === 404 ||\n response.headers.get('content-type').indexOf('javascript') === -1\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.',\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n//import {elevate} from './infrastructure/elevator';\nimport registerServiceWorker from './registerServiceWorker';\n\n//elevate();\n\nReactDOM.render(, document.getElementById('root'));\nregisterServiceWorker();\n","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFdklEQVR42sVW+VNTVxS+f4Od9oeW0RmlU8dOcRx3BEHbqiio3dtfamds+0N1bGe62emirYpSLRYDguAWJQihLZBAEkgKgbCHgIBAXbBTtgSykhAQEL/ecyWtwwMHx9DemS/vvXvv+c73zj3n5DEAjHBodJz9MD7BvuP3KVbb0xqV1p6lzENzS9u7Y3zOVWNittXPMmvMWmaNjZgeW8OZY91i1pSbzSqcg6y01Lj7V7UOap3Bma9WhyiKtEyh0bGsQg0L+P3n5talDNZ5LpWZCwqYqqYxJk9TggK1Bkpza7pWrWNdsZHM/uKymZ1Pgvb07ohiel0Jy7VcO1ug0iCfc+WbW7fUa0vYrUw5u6G8IhXglR1l/qR45tu/l9WeTo5XGqvxS3k1tPmF+t6Y8MXOVYui+3ZEb+ROHoq+HVEb3WtCo23bIhZrCwoNuZyHuKpTU474v/2M+dOSmDdDJhVgzUxn1oQDcd7w59C5+00oqxqgsLTBnHAIQ8vnoy9uPbiDWYH2kk1dwmFkWdqRU2nG9V2vw8e5rScOx/ZnX5YK6Dvw6Z6+VzYMepY8hT8++ZALMONKfQuqkxLhWf88rNvCZy2A54KwqTp1UnCQgPZ9H8Cz5ElYX93gsR38/COpgO3r5bata+FYHYrKve8jp7EDuW23USRLQveKhXDERc5agCMuAt0rF6JQdkpw5DS1o3LPbsFti1nLIxQplx7BljVyO3fSExUG/YYVyFMVIa/lOvLfewcdyxbAvTNq1gJobzu3Ue16G3nNnCNfDUP0cvRELwX5IF9SAbERchtftO+MRsOKUKjXhUG9JRJlSxegm4fUvn32OUB7ycYYNh/qzRFQh4cJTuK23Y+kVED/1nA5BxycwMZxbWUoml4IQdemVXBujwStPQpc3KZr8yo0hYWglXMRJ3FPrksF2F57Sc4BK4f9jZfhfmuzgPPNTWLO9oggG7IN8BDnAzxSAaWL5sk58C+emMS8x8S0PFIBjQf3yznwH0EqwAfIOTAThqZgpjXf7CAV4PAMyjkwFXa3R1xHx+9i4h4wzn/o6r8zKtb6XW4MjdwBnxLw+ofF3HRcD2D2AlxeH5yDXpgsjdBWmFBcVY3S2jr0DTiEKN/wCFpu3ERReQUM1TW4+VcXfFxQ0AQMDvmFiPQcJb5PTkHi+Qs4cEqGo2fS0dndCxrFlVX4OvEkvvjxOCrMDSISQRMQgM3pgtXhFPd0lV3OxOmsKyICdByd3T04xkVVNFhw994cCPDwSIyMjQtyGhVms4hIt61fPA/wcz+WnjF3Alw8DygKvXYHbvf0IlmhgDy/QCQdCeviQuZUAL04kX/1UyK++TkJB2XJ+JMLIWd0DHMugEqNMrysrh6GmlocP3ceOlMlhkfHRA7MuYCByXoPDD0vucOnU2HlR0IOe/oHRBJSuU4EswoCjYjelOqeGhENpVaHhIyzounQcPNSjU87g/qWVvF83zYIAty+IdGI1GVGXCpQ4Te9ARnKXHx5/AQqLU3CWUNbu5g7kpomypOaFdmQ7WMLoPKjClCo1Dh54SJSMhVIy85BbXMLRnhUKNzUGU+cPYdsjRYpiixc4tVBzcsz9AgCXF7vQ3OAOiJlO139PBfG7k4IJ5Qb9Ka0RiUZ2PPQkua+JAKcfJIvzGhEZxwAOZ7aIzwPrLunrE/z3zLN90Brh9zu8vCmMsY3DIozDCYcHJTIlNTNHdelAorLTPG1lmbYuUrfCA/nsB+D/uDA679/fBSBWstVaPTGIxIBXX22EH151UVdqQn1V1sF6ppagoIAX6mpBhpD+YUSY9Uz0s/ygQFWXtPA1MXGjzUGo4Fv1HCoggRNkcGoLykz7fvdVMP0HBIB/xf+Bi8VajXQRja5AAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAFfklEQVR42qWXWWicVRiG/39mUim4NRq88MZWXIpLe+FS6lYKtZsW0UrRUmyllUIXpQiN3hXBC1sxdyom6q2lVRGhUqvFClURUVFUsu+ZmD2TTDKTycTn/fudcPzNJJMaeDOTnHO+7z3ffoLm5uagFFpaWpJ8LmloaAgaGxuD3t7epePj49unpqbeLhQKn4EvwQVwjv+dYm1fOp2u0t76+vqgqampAhmp+XTMqxwB0XcUr8pmsydQ8jPK0oYe0G3f+8AgGGDPn+x9t7+//8HW1taIODKSiyWQ0MGurq4bEKbbjoEZUATTYApMgglDrnDpp2j7hPzk5ORJyN9qJBLlEoiUDw4ObkNIhydQ6JHQ4eHhF1jfgLlXg7v5vn5oaGj3xMTE++xpjZ0ZyWQy+7Fo4Cw6H4GENnLgcExIu/6HRa7XugjOBcno7Oy8EjI7ccVvOstnJIP4OG4kwlIEopuj6JAdlElnuFUtiq/Tmt1ApkwiTJ+hIWF+TmiP9nZ0dChgj/my+LtGJPyYcAHnzL5VfuRAXgfGxsZe1rrWLCOCcuAHMO7agazs1CUWM7KkyYtiwm0OdUuL7KJTLiFAt/VvWQ4SdiYpZbjkCbOEAjhHYN7hLiWWS8QEU7/jfM73Ov3PlAfOrEZoQbi9Zu6UvnOhaic/n89/3dbWFq1FBQNGd7IwbinWiTWuRkjolLe3t1+BKZ8nJV8FRyH4ylxgrVp7RkdHDxIDyxwJXQQZARb4wSxcxCpbpTtiy6E3HTuYHnI+crGB8v2xrFgQEHrLBa0XYxtdvcjlcp9HMcDtr4LZr8Ysze2v8fI11MGBgYFtZqFiGcq1J0+wvWRyQnNnILOj6yfb8zc/VQGp8RR/9Mr8sDppfgtjUR1QcFZBdjN4FGwsAa1tAverDMcKT5Si6HvNKmmGorZbjGrFRqwx9d65Uk4H5a/FIF71nBv6+voesdKt/nEq4NcX1lByKq9+jvoW4OB9NJjHwCawuQS0tgU8jLkTMRKRO3t6em5ReVZ1Bd+KwFfW1bKq7UYgjPWF7ZYhZQchMVDtVc7AlXB0VJpy9YwzInDeCpAI3OUT8LJg72KzgMx6ww9Cj8C1rLeBFkfgrOeC9XEXWPSmRkZGdpCih8EBcLAEDqiXsHePmlI8DswFy9E1rHoDLioIP+JLvyKT4rCrVBBqKvqfQRjaVLXGglA6zyot9lhEFl0Jjqeh0N3dXcXhleA2cHsJaG0lZr7R0vlfWaCeg4WOWhqOkYYvilEVVvjLikMbplsaL0RE9UPms1FDpgRGLcLTuOHZeCFSbUDXBQvoIQrRTa4U17rgIeCe8eIgCkKEHVlsEHK792KlOOQi95j5p2lI56NSLH+x8IAKkRZg+AeNpILDUUuVEKxSiateh+iHoE6jVwnUsf4BqMGyy72OGHVVKu0ZV8656K6oGWl0lmlYPO2l0DFzQcqZ73LghhNL5Z2uV3DJX+iOumRKG1IWnTcrMGxoEMOn3UjtDSTlwO1VO0+Zhe/V9OxGM9J9nbk5FZ8H99nkop1Z0vJJu00YL88LjGSz8YPyNVZpC2bd407nf4ZS+Qlfn/AHSU0ymCv0htKkd9PAS9toZHMTkWSprugizu8E3seSpfiacyy3m4pEjdfbReY7zLbFxqiSY7lLNW69VgOHnXXKT2tSduRKPkwcCQ0U9uqZTS2E/ah+Tmdcp64GKsEysIIYWqsGhKJvrNDMntObQCNZXPmCTzOErkbg2di0U7CUVeHpstdTxpRO+1OTCDNNbXCZFFc+7+PUjdQyO758HJN+apNTxh6iae9xOmBVUBYbhvQ5sug5pdrlPk79B0aFUsleyVUUG/WOT8D39jS/CH7XJ2tH2LNCe60hJRd6nv8Dwj5T3q96iTAAAAAASUVORK5CYII=\""],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.50ae84bd.chunk.js.map b/static/js/main.50ae84bd.chunk.js.map deleted file mode 100644 index e919a49..0000000 --- a/static/js/main.50ae84bd.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["color_picker.js","text_splitter.js","infrastructure/functions.js","infrastructure/widgets.js","cache.js","flows_api.js","Markdown.js","Common.js","react-lazyload/src/utils/event.js","react-lazyload/src/utils/scrollParent.js","react-lazyload/src/index.jsx","react-lazyload/src/utils/debounce.js","react-lazyload/src/utils/throttle.js","AudioWidget.js","Message.js","Config.js","UserAction.js","Flows.js","Title.js","Sidebar.js","PressureHelper.js","App.js","registerServiceWorker.js","index.js","infrastructure/appicon/hole.png","infrastructure/appicon/imasugu.png","infrastructure/appicon/imasugu_rev.png","infrastructure/appicon/syllabus.png","infrastructure/appicon/score.png","infrastructure/appicon/course_survey.png","infrastructure/appicon/homepage.png","infrastructure/appicon/dropdown.png","infrastructure/appicon/dropdown_rev.png"],"names":["ColorPicker","this","names","current_h","Math","random","name","toLowerCase","PID_RE","URL_PID_RE","NICKNAME_RE","URL_RE","split_text","txt","rules","forEach","rule","regex","concat","apply","map","part","content","split","seg","test","filter","get_json","res","ok","Error","status","statusText","text","then","t","JSON","parse","e","console","error","trace","log","SyntaxError","substr","API_VERSION_PARAM","encodeURIComponent","floor","Date","pad2","x","format_time","time","getMonth","getDate","getHours","getMinutes","getSeconds","chinese_format","buildFormatter","chineseStrings","Time","props","stamp","className","date","formatter","title","toLocaleString","timeZone","hour12","short","TitleLine","appicon_hole","appicon_imasugu","appicon_imasugu_rev","appicon_syllabus","appicon_score","appicon_course_survey","appicon_homepage","LoginPopupSelf","state","loading_status","recaptcha_verified","username_ref","React","createRef","password_ref","input_token_ref","popup_anchor","document","getElementById","createElement","id","body","appendChild","type","setState","fetch","THUHOLE_API_ROOT","current","value","localStorage","method","headers","stringify","excluded_scopes","json","success","alert","msg","catch","set_token","code","user_token","on_close","token","result","length","ReactDOM","createPortal","reCaptchaKey","useRecaptchaNet","onVerify","ref","autoFocus","defaultValue","onClick","do_sendcode","disabled","do_login","token_callback","placeholder","do_input_token","style","fontSize","href","Component","LoginPopup","popup_show","on_popup_bound","on_popup","bind","on_close_bound","children","Cache","db","added_items_since_maintenance","encrypt","decrypt","open_req","indexedDB","open","onerror","onupgradeneeded","event","target","createObjectStore","keyPath","createIndex","unique","onsuccess","setTimeout","maintenance","pid","data","s","o","i","key","new_key","charCodeAt","String","fromCharCode","c","target_version","parseInt","Promise","resolve","reject","store","transaction","objectStore","get_req","get","data_str","version","last_access","put","delete","warn","req","count_req","count","index","openKeyCursor","cur","primaryKey","continue","deleteDatabase","cache","window","hole_cache","token_param","handle_response","response","a","notify","parse_replies","replies","color_picker","sort","b","cid","info","_display_color","variant","API","load_replies","cache_version","API_BASE","load_replies_with_cache","cached","set_attention","attention","URLSearchParams","append","report","reason","get_list","page","get_search","keyword","get_single","get_attention","md","MarkdownIt","html","linkify","breaks","inline","highlight","str","lang","hljs","getLanguage","__","utils","escapeHtml","use","MarkdownItKaTeX","throwOnError","errorColor","render","escape_regex","string","replace","build_highlight_re","option","isRegex","RegExp","join","slice","ColoredSpan","colors","normalize_url","url","PureComponent","HighlightedMarkdown","processInstructions","shouldProcessNode","node","processNode","currentLevel","HeadingTag","attribs","rel","parent","splitted","Fragment","idx","p","preventDefault","show_pid","substring","HtmlToReact","ProcessNodeDefinitions","processDefaultNode","parser","Parser","author","match","renderedMarkdown","renderMd","parseWithInstructions","rawMd","TEXTAREA_BACKUP","SafeTextarea","on_change_bound","on_change","on_keydown_bound","on_keydown","clear","area_ref","change_callback","submit_callback","on_submit","ctrlKey","altKey","focus","onChange","onKeyDown","pwa_prompt_event","PromotionBar","is_ios","navigator","userAgent","matchMedia","matches","standalone","prompt","addEventListener","ClickHandler","moved","init_y","init_x","on_begin_bound","on_begin","on_move_bound","on_move","on_end_bound","on_end","MOVE_THRESHOLD","last_fire","touches","screenY","screenX","abs","do_callback","callback","onTouchStart","onMouseDown","onTouchMove","onMouseMove","on","el","eventName","opts","attachEvent","call","off","removeEventListener","detachEvent","HTMLElement","documentElement","excludeStaticParent","position","overflowRegex","parentNode","ownerDocument","getComputedStyle","overflow","overflowX","overflowY","defaultBoundingClientRect","LISTEN_FLAG","listeners","pending","passiveEventSupported","Object","defineProperty","delayType","passiveEvent","capture","passive","checkVisible","component","ReactDom","findDOMNode","scrollParent","parentTop","parentHeight","getBoundingClientRect","top","height","windowInnerHeight","innerHeight","clientHeight","intersectionTop","max","intersectionHeight","min","offsetTop","offsets","Array","isArray","offset","checkOverflowVisible","elementHeight","offsetWidth","offsetHeight","getClientRects","checkNormalVisible","visible","hidden","once","push","unmountIfInvisible","hiddenIfInvisible","lazyLoadHandler","listener","indexOf","splice","finalLazyLoadHandler","LazyLoad","scrollport","scrollContainer","querySelector","needResetFinalLazyLoadHandler","undefined","debounce","func","wait","immediate","timeout","args","context","timestamp","later","last","arguments","callNow","throttle","fn","threshhold","scope","deferTimer","now","clearTimeout","getAttribute","listenerCount","setAttribute","scroll","resize","removeAttribute","visibility","defaultProps","audio_cache","MessageViewer","load","err","BUILTIN_IMGS","DEFAULT_CONFIG","background_img","background_color","pressure","easter_egg","color_scheme","fold","block_words","load_config","loaded_config","config","assign","keys","save_config","bgimg_style","img","color","background","backgroundImage","encodeURI","backgroundColor","backgroundSize","ConfigBackground","save_changes","img_select","on_select","on_change_img","on_change_color","ConfigColorScheme","ConfigTextArea","sift","description","display","ConfigSwitch","switch","val","checked","ConfigUI","save_changes_bound","chg","confirm","location","reload","reset_settings","array","v","TokenCtx","createContext","set_value","InfoSidebar","show_sidebar","serviceWorker","getRegistrations","registrations","registration","unregister","process","LoginForm","copy","Consumer","copy_token","do_popup","ReplyForm","preview","global_keypress_handler_bound","global_keypress_handler","tagName","on_complete","onSubmit","toggle_preview","PostForm","img_tip","img_ref","on_img_change_bound","on_img_change","file","return_url","reader","FileReader","onload","fixOrientation","fixed_dataurl","image","Image","width","compressed","rate","sqrt","canvas","ctx","getContext","drawImage","quality","new_url","quality_l","quality_r","toDataURL","round","src","on_got_img","readAsDataURL","files","proc_img","d","do_post","accept","IMAGE_BASE","CLICKABLE_TAGS","audio","QUOTE_BLACKLIST","FOLD_TAGS","LATEST_POST_ID","load_single_meta","title_elem","single","reply","deletion_detect","Reply","replyContent","splitIdx","replyText","do_filter_name","tag","FlowItem","likenum","r","is_quote","copy_link","img_clickable","onError","alt","latest_reply","FlowSidebar","error_msg","filter_name","rev","syncState","sync_state","reply_ref","prev","update_count","set_variant","next_attention","prevState","forceCheck","closest","should_text","set","replies_to_show","reverse","replies_cnt","main_thread_elem","show_reply_bar","set_filter_name","toggle_rev","toggle_attention","float","FlowItemRow","needFold","search_param","reply_status","reply_error","some","word","includes","attention_override","hl_rules","parts","quote_id","mode","FlowItemQuote","FlowChunk","list","ind","Flow","search_text","loaded_pages","chunks","on_scroll_bound","on_scroll","failed","max_id","finished","use_search","use_regex","regex_search","toString","post","every","scrollHeight","scrollY","load_page","should_deletion_detect","flag_re","ControlBar","set_mode","on_keypress_bound","on_keypress","do_refresh_bound","do_refresh","do_attention_bound","do_attention","hash","decodeURIComponent","lastIndexOf","flag_res","exec","startsWith","scrollTo","onKeyPress","Title","Sidebar","do_close_bound","do_close","do_back_bound","do_back","contents","stack","cur_title","onTouchEnd","click","PressureHelper","level","fired","esc_interval","clearInterval","Pressure","change","force","do_fire","end","polyfill","only","preventSelect","repeat","THRESHOLD","setInterval","new_level","pad","left","right","bottom","DeprecatedAlert","App","override","update_color_scheme","classList","add","remove","addListener","listen_darkmode","default","light","dark","sidebar_stack","flow_render_key","show_sidebar_bound","set_mode_bound","on_pressure_bound","on_pressure","inthu_flag","atob","ns","pop","Provider","isLocalhost","Boolean","hostname","registerValidSW","swUrl","register","onupdatefound","installingWorker","installing","onstatechange","controller","ready","checkValidServiceWorker","module","exports"],"mappings":"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","file":"static/js/main.50ae84bd.chunk.js","sourcesContent":["// https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/\n\nconst golden_ratio_conjugate = 0.618033988749895;\n\nexport class ColorPicker {\n constructor() {\n this.names = {};\n this.current_h = Math.random();\n }\n\n get(name) {\n name = name.toLowerCase();\n if (name === '洞主') return ['hsl(0,0%,97%)', 'hsl(0,0%,16%)'];\n\n if (!this.names[name]) {\n this.current_h += golden_ratio_conjugate;\n this.current_h %= 1;\n this.names[name] = [\n `hsl(${this.current_h * 360}, 50%, 90%)`,\n `hsl(${this.current_h * 360}, 60%, 20%)`,\n ];\n }\n return this.names[name];\n }\n}\n","// regexp should match the WHOLE segmented part\n// export const PID_RE=/(^|[^\\d\\u20e3\\ufe0e\\ufe0f])([2-9]\\d{4,5}|1\\d{4,6})(?![\\d\\u20e3\\ufe0e\\ufe0f])/g;\nexport const PID_RE = /(^|[^\\d\\u20e3\\ufe0e\\ufe0f])(#\\d{1,7})(?![\\d\\u20e3\\ufe0e\\ufe0f])/g;\n// TODO: fix this re\n// export const URL_PID_RE=/((?:https?:\\/\\/)?thuhole\\.com\\/?#(?:#|%23)([2-9]\\d{4,5}|1\\d{4,6}))(?!\\d|\\u20e3|\\ufe0e|\\ufe0f)/g;\nexport const URL_PID_RE = /((?:https?:\\/\\/)?thuhole\\.com\\/?#(?:#|%23)(\\d{1,7}))(?!\\d|\\u20e3|\\ufe0e|\\ufe0f)/g;\nexport const NICKNAME_RE = /(^|[^A-Za-z])((?:(?:Angry|Baby|Crazy|Diligent|Excited|Fat|Greedy|Hungry|Interesting|Jolly|Kind|Little|Magic|Naïve|Old|PKU|Quiet|Rich|Superman|Tough|Undefined|Valuable|Wifeless|Xiangbuchulai|Young|Zombie)\\s)?(?:Alice|Bob|Carol|Dave|Eve|Francis|Grace|Hans|Isabella|Jason|Kate|Louis|Margaret|Nathan|Olivia|Paul|Queen|Richard|Susan|Thomas|Uma|Vivian|Winnie|Xander|Yasmine|Zach)|You Win(?: \\d+)?|洞主)(?![A-Za-z])/gi;\nexport const URL_RE = /(^|[^.@a-zA-Z0-9_])((?:https?:\\/\\/)?(?:(?:[\\w-]+\\.)+[a-zA-Z]{2,3}|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(?::\\d{1,5})?(?:\\/[\\w~!@#$%^&*()\\-_=+[\\]{};:,./?|]*)?)(?![a-zA-Z0-9])/gi;\n\nexport function split_text(txt, rules) {\n // rules: [['name',/regex/],...]\n // return: [['name','part'],[null,'part'],...]\n\n txt = [[null, txt]];\n rules.forEach((rule) => {\n let [name, regex] = rule;\n txt = [].concat.apply(\n [],\n txt.map((part) => {\n let [rule, content] = part;\n if (rule)\n // already tagged by previous rules\n return [part];\n else {\n return content\n .split(regex)\n .map((seg) => (regex.test(seg) ? [name, seg] : [null, seg]))\n .filter(([name, seg]) => name !== null || seg);\n }\n }),\n );\n });\n return txt;\n}\n","export function get_json(res) {\n if(!res.ok) throw Error(`网络错误 ${res.status} ${res.statusText}`);\n return (\n res\n .text()\n .then((t)=>{\n try {\n return JSON.parse(t);\n } catch(e) {\n console.error('json parse error');\n console.trace(e);\n console.log(t);\n throw new SyntaxError('JSON Parse Error '+t.substr(0,50));\n }\n })\n );\n}\n\nexport function listen_darkmode(override) { // override: true/false/undefined\n function update_color_scheme() {\n if(override===undefined ? window.matchMedia('(prefers-color-scheme: dark)').matches : override)\n document.body.classList.add('root-dark-mode');\n else\n document.body.classList.remove('root-dark-mode');\n }\n\n update_color_scheme();\n window.matchMedia('(prefers-color-scheme: dark)').addListener(()=>{\n update_color_scheme();\n });\n}\n\nexport function API_VERSION_PARAM() {\n return '&PKUHelperAPI=3.0&jsapiver='+encodeURIComponent((process.env.REACT_APP_BUILD_INFO||'null')+'-'+(Math.floor(+new Date()/7200000)*2));\n}","import React, {Component, PureComponent} from 'react';\nimport ReactDOM from 'react-dom';\n\nimport TimeAgo from 'react-timeago';\nimport chineseStrings from 'react-timeago/lib/language-strings/zh-CN';\nimport buildFormatter from 'react-timeago/lib/formatters/buildFormatter';\n\nimport './global.css';\nimport './widgets.css';\n\nimport appicon_hole from './appicon/hole.png';\nimport appicon_imasugu from './appicon/imasugu.png';\nimport appicon_imasugu_rev from './appicon/imasugu_rev.png';\nimport appicon_syllabus from './appicon/syllabus.png';\nimport appicon_score from './appicon/score.png';\nimport appicon_course_survey from './appicon/course_survey.png';\nimport appicon_dropdown from './appicon/dropdown.png';\nimport appicon_dropdown_rev from './appicon/dropdown_rev.png';\nimport appicon_homepage from './appicon/homepage.png';\nimport {THUHOLE_API_ROOT} from './const';\nimport {get_json, API_VERSION_PARAM} from './functions';\n\nimport {\n GoogleReCaptchaProvider,\n GoogleReCaptcha\n} from 'react-google-recaptcha-v3';\n\nconst LOGIN_POPUP_ANCHOR_ID='pkuhelper_login_popup_anchor';\n\nfunction pad2(x) {\n return x<10 ? '0'+x : ''+x;\n}\nexport function format_time(time) {\n return `${time.getMonth()+1}-${pad2(time.getDate())} ${time.getHours()}:${pad2(time.getMinutes())}:${pad2(time.getSeconds())}`;\n}\nconst chinese_format=buildFormatter(chineseStrings);\nexport function Time(props) {\n const time=new Date(props.stamp*1000);\n return (\n \n \n  \n {!props.short ? format_time(time) : null}\n \n );\n}\n\nexport function TitleLine(props) {\n return (\n

\n {props.text}\n

\n )\n}\n\nexport function GlobalTitle(props) {\n return (\n
\n
\n

{props.text}

\n
\n
\n );\n}\n\nconst FALLBACK_APPS={\n // id, text, url, icon_normal, icon_hover, new_tab\n bar: [\n ['hole', '树洞', '/hole', appicon_hole, null, false],\n ['imasugu', '教室', '/spare_classroom', appicon_imasugu, appicon_imasugu_rev, false],\n ['syllabus', '课表', '/syllabus', appicon_syllabus, null, false],\n ['score', '成绩', '/my_score', appicon_score, null, false],\n ],\n dropdown: [\n ['course_survey', '课程测评', 'https://courses.pinzhixiaoyuan.com/', appicon_course_survey, null, true],\n ['homepage', '客户端', '/', appicon_homepage, null, true],\n ],\n fix: {},\n};\n// const SWITCHER_DATA_VER='switcher_2';\n// const SWITCHER_DATA_URL=THUHOLE_API_ROOT+'web_static/appswitcher_items.json';\n\n// export class AppSwitcher extends Component {\n// constructor(props) {\n// super(props);\n// this.state={\n// apps: this.get_apps_from_localstorage(),\n// }\n// }\n//\n// get_apps_from_localstorage() {\n// let ret=FALLBACK_APPS;\n// if(localStorage['APPSWITCHER_ITEMS'])\n// try {\n// let content=JSON.parse(localStorage['APPSWITCHER_ITEMS'])[SWITCHER_DATA_VER];\n// if(!content || !content.bar)\n// throw new Error('content is empty');\n//\n// ret=content;\n// } catch(e) {\n// console.error('load appswitcher items from localstorage failed');\n// console.trace(e);\n// }\n//\n// return ret;\n// }\n//\n// check_fix() {\n// if(this.state.apps && this.state.apps.fix && this.state.apps.fix[this.props.appid])\n// setTimeout(()=>{\n// window.HOTFIX_CONTEXT={\n// build_info: process.env.REACT_APP_BUILD_INFO || '---',\n// build_env: process.env.NODE_ENV,\n// };\n// eval(this.state.apps.fix[this.props.appid]);\n// },1); // make it async so failures won't be critical\n// }\n//\n// componentDidMount() {\n// this.check_fix();\n// setTimeout(()=>{\n// fetch(SWITCHER_DATA_URL)\n// .then((res)=>{\n// if(!res.ok) throw Error(`网络错误 ${res.status} ${res.statusText}`);\n// return res.text();\n// })\n// .then((txt)=>{\n// if(txt!==localStorage['APPSWITCHER_ITEMS']) {\n// console.log('loaded new appswitcher items',txt);\n// localStorage['APPSWITCHER_ITEMS']=txt;\n//\n// this.setState({\n// apps: this.get_apps_from_localstorage(),\n// });\n// } else {\n// console.log('appswitcher items unchanged');\n// }\n// })\n// .catch((e)=>{\n// console.error('loading appswitcher items failed');\n// console.trace(e);\n// });\n// },500);\n// }\n//\n// componentDidUpdate(prevProps, prevState) {\n// if(this.state.apps!==prevState.apps)\n// this.check_fix();\n// }\n//\n// render() {\n// let cur_id=this.props.appid;\n//\n// function app_elem([id,title,url,icon_normal,icon_hover,new_tab],no_class=false,ref=null) {\n// return (\n// \n// {!!icon_normal && [\n// ,\n// \n// ]}\n// {title}\n// \n// );\n// }\n//\n// let dropdown_cur_app=null;\n// this.state.apps.dropdown.forEach((app)=>{\n// if(app[0]===cur_id)\n// dropdown_cur_app=app;\n// });\n//\n// //console.log(JSON.stringify(this.state.apps));\n//\n// return (\n//
\n// PKUHelper\n// {this.state.apps.bar.map((app)=>\n// app_elem(app)\n// )}\n// {!!this.state.apps.dropdown.length &&\n//
\n//

\n// {!!dropdown_cur_app ?\n// app_elem((()=>{\n// let [id,title,_url,icon_normal,icon_hover,_new_tab]=dropdown_cur_app;\n// return [id,title+'▾',null,icon_normal,icon_hover,false];\n// })(),true) :\n// app_elem(['-placeholder-elem','更多▾',null,appicon_dropdown,appicon_dropdown_rev,false],true)\n// }\n//

\n// {this.state.apps.dropdown.map((app)=>{\n// let ref=React.createRef();\n// return (\n//

{\n// if(!e.target.closest('a') && ref.current)\n// ref.current.click();\n// }}>\n// {app_elem(app,true,ref)}\n//

\n// );\n// })}\n//
\n// }\n// 网页版\n//
\n// );\n// }\n// }\n\nclass LoginPopupSelf extends Component {\n constructor(props) {\n super(props);\n this.state={\n loading_status: 'idle',\n recaptcha_verified: false\n // excluded_scopes: [],\n };\n this.username_ref=React.createRef();\n this.password_ref=React.createRef();\n this.input_token_ref=React.createRef();\n\n this.popup_anchor=document.getElementById(LOGIN_POPUP_ANCHOR_ID);\n if(!this.popup_anchor) {\n this.popup_anchor=document.createElement('div');\n this.popup_anchor.id=LOGIN_POPUP_ANCHOR_ID;\n document.body.appendChild(this.popup_anchor);\n }\n }\n\n do_sendcode(type) {\n if(!this.state.recaptcha_verified) {\n alert(\"reCAPTCHA风控系统正在评估您的浏览器安全状态,请稍后重试。\")\n return\n }\n if(this.state.loading_status==='loading')\n return;\n\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(\n THUHOLE_API_ROOT+'api_xmcp/login/send_code'\n +'?user='+encodeURIComponent(this.username_ref.current.value)\n +'&code_type='+encodeURIComponent(type)\n +\"&recaptcha_token=\"+localStorage[\"recaptcha\"]\n +API_VERSION_PARAM(), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n excluded_scopes: [],\n }),\n }\n )\n .then(get_json)\n .then((json)=>{\n console.log(json);\n if(!json.success)\n throw new Error(JSON.stringify(json));\n\n alert(json.msg);\n this.setState({\n loading_status: 'done',\n });\n })\n .catch((e)=>{\n console.error(e);\n alert('发送失败\\n'+e);\n this.setState({\n loading_status: 'done',\n });\n });\n\n });\n }\n\n do_login(set_token) {\n if(this.state.loading_status==='loading')\n return;\n\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(\n THUHOLE_API_ROOT+'api_xmcp/login/login'\n +'?user='+encodeURIComponent(this.username_ref.current.value)\n +'&valid_code='+encodeURIComponent(this.password_ref.current.value)\n +API_VERSION_PARAM(), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n excluded_scopes: [],\n }),\n }\n )\n .then(get_json)\n .then((json)=>{\n if(json.code!==0) {\n if(json.msg) throw new Error(json.msg);\n throw new Error(JSON.stringify(json));\n }\n\n set_token(json.user_token);\n alert(`登录成功`);\n this.setState({\n loading_status: 'done',\n });\n this.props.on_close();\n })\n .catch((e)=>{\n console.error(e);\n alert('登录失败\\n'+e);\n this.setState({\n loading_status: 'done',\n });\n });\n });\n }\n\n do_input_token(set_token) {\n if(this.state.loading_status==='loading')\n return;\n\n let token=this.input_token_ref.current.value;\n this.setState({\n loading_status: 'loading',\n },()=>{\n fetch(THUHOLE_API_ROOT+'api_xmcp/hole/system_msg?user_token='+encodeURIComponent(token)+API_VERSION_PARAM())\n .then((res)=>res.json())\n .then((json)=>{\n if(json.error)\n throw new Error(json.error);\n if(json.result.length===0)\n throw new Error('result check failed');\n this.setState({\n loading_status: 'done',\n });\n set_token(token);\n this.props.on_close();\n })\n .catch((e)=>{\n alert('Token检验失败\\n'+e);\n this.setState({\n loading_status: 'done',\n });\n console.error(e);\n });\n });\n }\n\n // perm_alert() {\n // alert('如果你不需要 PKU Helper 的某项功能,可以取消相应权限。\\n其中【状态信息】包括你的网费、校园卡余额等。\\n该设置应用到你的【所有】设备,取消后如需再次启用相应功能需要重新登录。');\n // }\n\n render() {\n // let PERM_SCOPES=[\n // ['score','成绩查询'],\n // ['syllabus','课表查询'],\n // ['my_info','状态信息'],\n // ];\n\n return ReactDOM.createPortal(\n \n {\n this.setState({\n recaptcha_verified: true,\n });\n localStorage[\"recaptcha\"] = token\n }} />\n
\n
\n
\n

\n 接收验证码来登录 T大树洞\n

\n

\n \n \n {/*this.do_sendcode('sms')}>*/}\n {/*  短信 */}\n {/**/}\n {/*/*/}\n this.do_sendcode('mail')}>\n  发送邮件 \n \n \n

\n

\n \n \n

\n
\n

\n 从其他设备导入登录状态\n

\n

\n \n \n

\n
\n

\n This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n

\n

\n \n

\n
\n
\n ,\n this.popup_anchor,\n );\n }\n}\n\nexport class LoginPopup extends Component {\n constructor(props) {\n super(props);\n this.state={\n popup_show: false,\n };\n this.on_popup_bound=this.on_popup.bind(this);\n this.on_close_bound=this.on_close.bind(this);\n }\n\n on_popup() {\n this.setState({\n popup_show: true,\n });\n }\n on_close() {\n this.setState({\n popup_show: false,\n });\n }\n\n render() {\n return (\n <>\n {this.props.children(this.on_popup_bound)}\n {this.state.popup_show &&\n \n }\n \n );\n }\n}","const HOLE_CACHE_DB_NAME = 'hole_cache_db';\nconst CACHE_DB_VER = 1;\nconst MAINTENANCE_STEP = 150;\nconst MAINTENANCE_COUNT = 1000;\n\nconst ENC_KEY = 42;\n\nclass Cache {\n constructor() {\n this.db = null;\n this.added_items_since_maintenance = 0;\n this.encrypt = this.encrypt.bind(this);\n this.decrypt = this.decrypt.bind(this);\n const open_req = indexedDB.open(HOLE_CACHE_DB_NAME, CACHE_DB_VER);\n open_req.onerror = console.error.bind(console);\n open_req.onupgradeneeded = (event) => {\n console.log('comment cache db upgrade');\n const db = event.target.result;\n const store = db.createObjectStore('comment', {\n keyPath: 'pid',\n });\n store.createIndex('last_access', 'last_access', { unique: false });\n };\n open_req.onsuccess = (event) => {\n console.log('comment cache db loaded');\n this.db = event.target.result;\n setTimeout(this.maintenance.bind(this), 1);\n };\n }\n\n // use window.hole_cache.encrypt() only after cache is loaded!\n encrypt(pid, data) {\n let s = JSON.stringify(data);\n let o = '';\n for (let i = 0, key = (ENC_KEY ^ pid) % 128; i < s.length; i++) {\n let c = s.charCodeAt(i);\n let new_key = (key ^ (c / 2)) % 128;\n o += String.fromCharCode(key ^ s.charCodeAt(i));\n key = new_key;\n }\n return o;\n }\n\n // use window.hole_cache.decrypt() only after cache is loaded!\n decrypt(pid, s) {\n let o = '';\n if (typeof s !== typeof 'str') return null;\n\n for (let i = 0, key = (ENC_KEY ^ pid) % 128; i < s.length; i++) {\n let c = key ^ s.charCodeAt(i);\n o += String.fromCharCode(c);\n key = (key ^ (c / 2)) % 128;\n }\n\n try {\n return JSON.parse(o);\n } catch (e) {\n console.error('decrypt failed');\n console.trace(e);\n return null;\n }\n }\n\n get(pid, target_version) {\n pid = parseInt(pid);\n return new Promise((resolve, reject) => {\n if (!this.db) return resolve(null);\n const tx = this.db.transaction(['comment'], 'readwrite');\n const store = tx.objectStore('comment');\n const get_req = store.get(pid);\n get_req.onsuccess = () => {\n let res = get_req.result;\n if (!res || !res.data_str) {\n //console.log('comment cache miss '+pid);\n resolve(null);\n } else if (target_version === res.version) {\n // hit\n console.log('comment cache hit', pid);\n res.last_access = +new Date();\n store.put(res);\n let data = this.decrypt(pid, res.data_str);\n resolve(data); // obj or null\n } else {\n // expired\n console.log(\n 'comment cache expired',\n pid,\n ': ver',\n res.version,\n 'target',\n target_version,\n );\n store.delete(pid);\n resolve(null);\n }\n };\n get_req.onerror = (e) => {\n console.warn('comment cache indexeddb open failed');\n console.error(e);\n resolve(null);\n };\n });\n }\n\n put(pid, target_version, data) {\n pid = parseInt(pid);\n return new Promise((resolve, reject) => {\n if (!this.db) return resolve();\n const tx = this.db.transaction(['comment'], 'readwrite');\n const store = tx.objectStore('comment');\n store.put({\n pid: pid,\n version: target_version,\n data_str: this.encrypt(pid, data),\n last_access: +new Date(),\n });\n console.log('comment cache put', pid);\n if (++this.added_items_since_maintenance === MAINTENANCE_STEP)\n setTimeout(this.maintenance.bind(this), 1);\n });\n }\n\n delete(pid) {\n pid = parseInt(pid);\n return new Promise((resolve, reject) => {\n if (!this.db) return resolve();\n const tx = this.db.transaction(['comment'], 'readwrite');\n const store = tx.objectStore('comment');\n let req = store.delete(pid);\n console.log('comment cache delete', pid);\n req.onerror = () => {\n console.warn('comment cache delete failed ', pid);\n return resolve();\n };\n req.onsuccess = () => resolve();\n });\n }\n\n maintenance() {\n if (!this.db) return;\n const tx = this.db.transaction(['comment'], 'readwrite');\n const store = tx.objectStore('comment');\n let count_req = store.count();\n count_req.onsuccess = () => {\n let count = count_req.result;\n if (count > MAINTENANCE_COUNT) {\n console.log('comment cache db maintenance', count);\n store.index('last_access').openKeyCursor().onsuccess = (e) => {\n let cur = e.target.result;\n if (cur) {\n //console.log('maintenance: delete',cur);\n store.delete(cur.primaryKey);\n if (--count > MAINTENANCE_COUNT) cur.continue();\n }\n };\n } else {\n console.log('comment cache db no need to maintenance', count);\n }\n this.added_items_since_maintenance = 0;\n };\n count_req.onerror = console.error.bind(console);\n }\n\n clear() {\n if (!this.db) return;\n indexedDB.deleteDatabase(HOLE_CACHE_DB_NAME);\n console.log('delete comment cache db');\n }\n}\n\nexport function cache() {\n if (!window.hole_cache) window.hole_cache = new Cache();\n return window.hole_cache;\n}\n","import { get_json, API_VERSION_PARAM } from './infrastructure/functions';\nimport { THUHOLE_API_ROOT } from './infrastructure/const';\nimport { API_BASE } from './Common';\nimport { cache } from './cache';\n\nexport { THUHOLE_API_ROOT, API_VERSION_PARAM };\n\nexport function token_param(token) {\n return API_VERSION_PARAM() + (token ? '&user_token=' + token : '');\n}\n\nexport { get_json };\n\nconst SEARCH_PAGESIZE = 50;\n\nconst handle_response = async (response, notify = false) => {\n let json = await get_json(response);\n if (json.code !== 0) {\n if (json.msg) {\n if (notify) alert(json.msg);\n else throw new Error(json.msg);\n } else throw new Error(JSON.stringify(json));\n }\n return json;\n};\n\nconst parse_replies = (replies, color_picker) =>\n replies\n .sort((a, b) => parseInt(a.cid, 10) - parseInt(b.cid, 10))\n .map((info) => {\n info._display_color = color_picker.get(info.name);\n info.variant = {};\n return info;\n });\n\nexport const API = {\n load_replies: async (pid, token, color_picker, cache_version) => {\n pid = parseInt(pid);\n let response = await fetch(\n API_BASE + '/api.php?action=getcomment&pid=' + pid + token_param(token),\n );\n let json = await handle_response(response);\n // Why delete then put ??\n cache().put(pid, cache_version, json);\n json.data = parse_replies(json.data, color_picker);\n return json;\n },\n\n load_replies_with_cache: async (pid, token, color_picker, cache_version) => {\n pid = parseInt(pid);\n let json = await cache().get(pid, cache_version);\n if (json) {\n json.data = parse_replies(json.data, color_picker);\n return { data: json, cached: true };\n } else {\n json = await API.load_replies(pid, token, color_picker, cache_version);\n return { data: json, cached: !json };\n }\n },\n\n set_attention: async (pid, attention, token) => {\n let data = new URLSearchParams();\n data.append('user_token', token);\n data.append('pid', pid);\n data.append('switch', attention ? '1' : '0');\n let response = await fetch(\n API_BASE + '/api.php?action=attention' + token_param(token),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n },\n );\n // Delete cache to update `attention` on next reload\n cache().delete(pid);\n return handle_response(response, true);\n },\n\n report: async (pid, reason, token) => {\n let data = new URLSearchParams();\n data.append('user_token', token);\n data.append('pid', pid);\n data.append('reason', reason);\n let response = await fetch(\n API_BASE + '/api.php?action=report' + token_param(token),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n },\n );\n return handle_response(response, true);\n },\n\n get_list: async (page, token) => {\n let response = await fetch(\n API_BASE + '/api.php?action=getlist' + '&p=' + page + token_param(token),\n );\n return handle_response(response);\n },\n\n get_search: async (page, keyword, token) => {\n let response = await fetch(\n API_BASE +\n '/api.php?action=search' +\n '&pagesize=' +\n SEARCH_PAGESIZE +\n '&page=' +\n page +\n '&keywords=' +\n encodeURIComponent(keyword) +\n token_param(token),\n );\n return handle_response(response);\n },\n\n get_single: async (pid, token) => {\n let response = await fetch(\n API_BASE + '/api.php?action=getone' + '&pid=' + pid + token_param(token),\n );\n return handle_response(response);\n },\n\n get_attention: async (token) => {\n let response = await fetch(\n API_BASE + '/api.php?action=getattention' + token_param(token),\n );\n return handle_response(response);\n },\n};\n","import MarkdownIt from 'markdown-it';\nimport MarkdownItKaTeX from 'markdown-it-katex';\nimport hljs from 'highlight.js';\nimport 'highlight.js/styles/atom-one-dark.css';\nimport './Markdown.css';\n\nimport 'katex/dist/katex.min.css';\n\nlet md = new MarkdownIt({\n html: false,\n linkify: false,\n breaks: true,\n inline: true,\n highlight(str, lang) {\n if (lang && hljs.getLanguage(lang)) {\n try {\n return (\n '
' +\n          hljs.highlight(lang, str, true).value +\n          '
'\n );\n } catch (__) {}\n }\n return (\n '
' + md.utils.escapeHtml(str) + '
'\n );\n },\n}).use(MarkdownItKaTeX, {\n throwOnError: false,\n errorColor: '#aa0000',\n});\n\nexport default (text) => md.render(text);\n","import React, { Component, PureComponent } from 'react';\nimport { format_time, Time, TitleLine } from './infrastructure/widgets';\nimport { THUHOLE_API_ROOT } from './flows_api';\n\nimport HtmlToReact from 'html-to-react';\n\nimport './Common.css';\nimport {\n URL_PID_RE,\n URL_RE,\n PID_RE,\n NICKNAME_RE,\n split_text,\n} from './text_splitter';\n\nimport renderMd from './Markdown';\n\nexport { format_time, Time, TitleLine };\n\nexport const API_BASE = THUHOLE_API_ROOT + 'services/thuhole';\n\n// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\nfunction escape_regex(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nexport function build_highlight_re(\n txt,\n split = ' ',\n option = 'g',\n isRegex = false,\n) {\n if (isRegex) {\n try {\n return new RegExp('(' + txt.slice(1, -1) + ')', option);\n } catch (e) {\n return /^$/g;\n }\n } else {\n return txt\n ? new RegExp(\n `(${txt\n .split(split)\n .filter((x) => !!x)\n .map(escape_regex)\n .join('|')})`,\n option,\n )\n : /^$/g;\n }\n}\n\nexport function ColoredSpan(props) {\n return (\n \n {props.children}\n \n );\n}\n\nfunction normalize_url(url) {\n return /^https?:\\/\\//.test(url) ? url : 'http://' + url;\n}\n\nexport class HighlightedText extends PureComponent {\n render() {\n return (\n
\n        {this.props.parts.map((part, idx) => {\n          let [rule, p] = part;\n          return (\n            \n              {rule === 'url_pid' ? (\n                \n                  /##\n                \n              ) : rule === 'url' ? (\n                \n                  {p}\n                \n              ) : rule === 'pid' ? (\n                 {\n                    e.preventDefault();\n                    this.props.show_pid(p.substring(1));\n                  }}\n                >\n                  {p}\n                \n              ) : rule === 'nickname' ? (\n                \n                  {p}\n                \n              ) : rule === 'search' ? (\n                {p}\n              ) : (\n                p\n              )}\n            \n          );\n        })}\n      
\n );\n }\n}\n\n// props: text, show_pid, color_picker\nexport class HighlightedMarkdown extends Component {\n render() {\n const props = this.props;\n const processDefs = new HtmlToReact.ProcessNodeDefinitions(React);\n const processInstructions = [\n {\n shouldProcessNode: (node) => node.name === 'img', // disable images\n processNode(node, children, index) {\n return
[图片]
;\n },\n },\n {\n shouldProcessNode: (node) => /^h[123456]$/.test(node.name),\n processNode(node, children, index) {\n let currentLevel = +node.name[1];\n if (currentLevel < 3) currentLevel = 3;\n const HeadingTag = `h${currentLevel}`;\n return {children};\n },\n },\n {\n shouldProcessNode: (node) => node.name === 'a',\n processNode(node, children, index) {\n return (\n \n {children}\n \n \n );\n },\n },\n {\n shouldProcessNode(node) {\n return (\n node.type === 'text' &&\n (!node.parent ||\n !node.parent.attribs ||\n node.parent.attribs['encoding'] !== 'application/x-tex')\n ); // pid, nickname, search\n },\n processNode(node, children, index) {\n const originalText = node.data;\n const splitted = split_text(originalText, [\n ['url_pid', URL_PID_RE],\n ['url', URL_RE],\n ['pid', PID_RE],\n ['nickname', NICKNAME_RE],\n ]);\n\n return (\n \n {splitted.map(([rule, p], idx) => {\n return (\n \n {rule === 'url_pid' ? (\n \n /##\n \n ) : rule === 'url' ? (\n \n {p}\n \n \n ) : rule === 'pid' ? (\n {\n e.preventDefault();\n props.show_pid(p.substring(1));\n }}\n >\n {p}\n \n ) : rule === 'nickname' ? (\n \n {p}\n \n ) : rule === 'search' ? (\n {p}\n ) : (\n p\n )}\n \n );\n })}\n \n );\n },\n },\n {\n shouldProcessNode: () => true,\n processNode: processDefs.processDefaultNode,\n },\n ];\n const parser = new HtmlToReact.Parser();\n if (props.author && props.text.match(/^(?:#+ |>|```|\\t|\\s*-|\\s*\\d+\\.)/)) {\n const renderedMarkdown = renderMd(props.text);\n return (\n <>\n {props.author}\n {parser.parseWithInstructions(\n renderedMarkdown,\n (node) => node.type !== 'script',\n processInstructions,\n ) || ''}\n \n );\n } else {\n let rawMd = props.text;\n if (props.author) rawMd = props.author + ' ' + rawMd;\n const renderedMarkdown = renderMd(rawMd);\n return (\n parser.parseWithInstructions(\n renderedMarkdown,\n (node) => node.type !== 'script',\n processInstructions,\n ) || null\n );\n }\n }\n}\n\nwindow.TEXTAREA_BACKUP = {};\n\nexport class SafeTextarea extends Component {\n constructor(props) {\n super(props);\n this.state = {\n text: '',\n };\n this.on_change_bound = this.on_change.bind(this);\n this.on_keydown_bound = this.on_keydown.bind(this);\n this.clear = this.clear.bind(this);\n this.area_ref = React.createRef();\n this.change_callback = props.on_change || (() => {});\n this.submit_callback = props.on_submit || (() => {});\n }\n\n componentDidMount() {\n this.setState(\n {\n text: window.TEXTAREA_BACKUP[this.props.id] || '',\n },\n () => {\n this.change_callback(this.state.text);\n },\n );\n }\n\n componentWillUnmount() {\n window.TEXTAREA_BACKUP[this.props.id] = this.state.text;\n this.change_callback(this.state.text);\n }\n\n on_change(event) {\n this.setState({\n text: event.target.value,\n });\n this.change_callback(event.target.value);\n }\n on_keydown(event) {\n if (event.key === 'Enter' && event.ctrlKey && !event.altKey) {\n event.preventDefault();\n this.submit_callback();\n }\n }\n\n clear() {\n this.setState({\n text: '',\n });\n }\n set(text) {\n this.change_callback(text);\n this.setState({\n text: text,\n });\n }\n get() {\n return this.state.text;\n }\n focus() {\n this.area_ref.current.focus();\n }\n\n render() {\n return (\n \n );\n }\n}\n\nlet pwa_prompt_event = null;\nwindow.addEventListener('beforeinstallprompt', (e) => {\n console.log('pwa: received before install prompt');\n pwa_prompt_event = e;\n});\n\nexport function PromotionBar(props) {\n let is_ios = /iPhone|iPad|iPod/i.test(window.navigator.userAgent);\n let is_installed =\n window.matchMedia('(display-mode: standalone)').matches ||\n window.navigator.standalone;\n\n if (is_installed) return null;\n\n if (is_ios)\n // noinspection JSConstructorReturnsPrimitive\n return !navigator.standalone ? (\n
\n \n   用 Safari 把树洞 添加到主屏幕 更好用\n
\n ) : null;\n // noinspection JSConstructorReturnsPrimitive\n else\n return pwa_prompt_event ? (\n
\n \n   把网页版树洞{' '}\n \n {\n if (pwa_prompt_event) pwa_prompt_event.prompt();\n }}\n >\n 安装到桌面\n \n {' '}\n 更好用\n
\n ) : null;\n}\n\nexport class ClickHandler extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n moved: true,\n init_y: 0,\n init_x: 0,\n };\n this.on_begin_bound = this.on_begin.bind(this);\n this.on_move_bound = this.on_move.bind(this);\n this.on_end_bound = this.on_end.bind(this);\n\n this.MOVE_THRESHOLD = 3;\n this.last_fire = 0;\n }\n\n on_begin(e) {\n //console.log('click',(e.touches?e.touches[0]:e).screenY,(e.touches?e.touches[0]:e).screenX);\n this.setState({\n moved: false,\n init_y: (e.touches ? e.touches[0] : e).screenY,\n init_x: (e.touches ? e.touches[0] : e).screenX,\n });\n }\n on_move(e) {\n if (!this.state.moved) {\n let mvmt =\n Math.abs((e.touches ? e.touches[0] : e).screenY - this.state.init_y) +\n Math.abs((e.touches ? e.touches[0] : e).screenX - this.state.init_x);\n //console.log('move',mvmt);\n if (mvmt > this.MOVE_THRESHOLD)\n this.setState({\n moved: true,\n });\n }\n }\n on_end(event) {\n //console.log('end');\n if (!this.state.moved) this.do_callback(event);\n this.setState({\n moved: true,\n });\n }\n\n do_callback(event) {\n if (this.last_fire + 100 > +new Date()) return;\n this.last_fire = +new Date();\n this.props.callback(event);\n }\n\n render() {\n return (\n \n {this.props.children}\n
\n );\n }\n}\n","export function on(el, eventName, callback, opts) {\n opts = opts || false;\n if (el.addEventListener) {\n el.addEventListener(eventName, callback, opts);\n } else if (el.attachEvent) {\n el.attachEvent(`on${eventName}`, (e) => {\n callback.call(el, e || window.event);\n });\n }\n}\n\nexport function off(el, eventName, callback, opts) {\n opts = opts || false;\n if (el.removeEventListener) {\n el.removeEventListener(eventName, callback, opts);\n } else if (el.detachEvent) {\n el.detachEvent(`on${eventName}`, callback);\n }\n}\n","/**\n * @fileOverview Find scroll parent\n */\n\nexport default (node) => {\n if (!(node instanceof HTMLElement)) {\n return document.documentElement;\n }\n\n const excludeStaticParent = node.style.position === 'absolute';\n const overflowRegex = /(scroll|auto)/;\n let parent = node;\n\n while (parent) {\n if (!parent.parentNode) {\n return node.ownerDocument || document.documentElement;\n }\n\n const style = window.getComputedStyle(parent);\n const position = style.position;\n const overflow = style.overflow;\n const overflowX = style['overflow-x'];\n const overflowY = style['overflow-y'];\n\n if (position === 'static' && excludeStaticParent) {\n parent = parent.parentNode;\n continue;\n }\n\n if (overflowRegex.test(overflow) && overflowRegex.test(overflowX) && overflowRegex.test(overflowY)) {\n return parent;\n }\n\n parent = parent.parentNode;\n }\n\n return node.ownerDocument || node.documentElement || document.documentElement;\n};\n","/**\n * react-lazyload\n */\nimport React, { Component, PureComponent } from 'react';\nimport ReactDom from 'react-dom';\nimport PropTypes from 'prop-types';\nimport { on, off } from './utils/event';\nimport scrollParent from './utils/scrollParent';\nimport debounce from './utils/debounce';\nimport throttle from './utils/throttle';\n\nconst defaultBoundingClientRect = { top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 };\nconst LISTEN_FLAG = 'data-lazyload-listened';\nconst listeners = [];\nlet pending = [];\n\n// try to handle passive events\nlet passiveEventSupported = false;\ntry {\n const opts = Object.defineProperty({}, 'passive', {\n get() {\n passiveEventSupported = true;\n }\n });\n window.addEventListener('test', null, opts);\n}\ncatch (e) { }\n// if they are supported, setup the optional params\n// IMPORTANT: FALSE doubles as the default CAPTURE value!\nconst passiveEvent = passiveEventSupported ? { capture: false, passive: true } : false;\n\n\n/**\n * Check if `component` is visible in overflow container `parent`\n * @param {node} component React component\n * @param {node} parent component's scroll parent\n * @return {bool}\n */\nconst checkOverflowVisible = function checkOverflowVisible(component, parent) {\n const node = ReactDom.findDOMNode(component);\n\n let parentTop;\n let parentHeight;\n\n try {\n ({ top: parentTop, height: parentHeight } = parent.getBoundingClientRect());\n } catch (e) {\n ({ top: parentTop, height: parentHeight } = defaultBoundingClientRect);\n }\n\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\n\n // calculate top and height of the intersection of the element's scrollParent and viewport\n const intersectionTop = Math.max(parentTop, 0); // intersection's top relative to viewport\n const intersectionHeight = Math.min(windowInnerHeight, parentTop + parentHeight) - intersectionTop; // height\n\n // check whether the element is visible in the intersection\n let top;\n let height;\n\n try {\n ({ top, height } = node.getBoundingClientRect());\n } catch (e) {\n ({ top, height } = defaultBoundingClientRect);\n }\n\n const offsetTop = top - intersectionTop; // element's top relative to intersection\n\n const offsets = Array.isArray(component.props.offset) ?\n component.props.offset :\n [component.props.offset, component.props.offset]; // Be compatible with previous API\n\n return (offsetTop - offsets[0] <= intersectionHeight) &&\n (offsetTop + height + offsets[1] >= 0);\n};\n\n/**\n * Check if `component` is visible in document\n * @param {node} component React component\n * @return {bool}\n */\nconst checkNormalVisible = function checkNormalVisible(component) {\n const node = ReactDom.findDOMNode(component);\n\n // If this element is hidden by css rules somehow, it's definitely invisible\n if (!(node.offsetWidth || node.offsetHeight || node.getClientRects().length)) return false;\n\n let top;\n let elementHeight;\n\n try {\n ({ top, height: elementHeight } = node.getBoundingClientRect());\n } catch (e) {\n ({ top, height: elementHeight } = defaultBoundingClientRect);\n }\n\n const windowInnerHeight = window.innerHeight || document.documentElement.clientHeight;\n\n const offsets = Array.isArray(component.props.offset) ?\n component.props.offset :\n [component.props.offset, component.props.offset]; // Be compatible with previous API\n\n return (top - offsets[0] <= windowInnerHeight) &&\n (top + elementHeight + offsets[1] >= 0);\n};\n\n\n/**\n * Detect if element is visible in viewport, if so, set `visible` state to true.\n * If `once` prop is provided true, remove component as listener after checkVisible\n *\n * @param {React} component React component that respond to scroll and resize\n */\nconst checkVisible = function checkVisible(component) {\n const node = ReactDom.findDOMNode(component);\n if (!(node instanceof HTMLElement)) {\n return;\n }\n\n const parent = scrollParent(node);\n const isOverflow = component.props.overflow &&\n parent !== node.ownerDocument &&\n parent !== document &&\n parent !== document.documentElement;\n const visible = isOverflow ?\n checkOverflowVisible(component, parent) :\n checkNormalVisible(component);\n if (visible) {\n // Avoid extra render if previously is visible\n if (!component.state.visible || component.state.hidden) {\n if (component.props.once) {\n pending.push(component);\n }\n\n //console.log('lazyload 1');\n component.setState({\n visible: true,\n hidden: false,\n });\n }\n } else if (!component.props.once) {\n if (component.props.unmountIfInvisible) {\n if(component.visible===true)\n component.setState({\n visible: false,\n });\n } else if(component.props.hiddenIfInvisible) {\n if(component.state.hidden===false) {\n //console.log('lazyload 3');\n component.setState({\n hidden: true,\n });\n }\n }\n }\n};\n\n\nconst purgePending = function purgePending() {\n pending.forEach((component) => {\n const index = listeners.indexOf(component);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n });\n\n pending = [];\n};\n\nconst lazyLoadHandler = () => {\n for (let i = 0; i < listeners.length; ++i) {\n const listener = listeners[i];\n checkVisible(listener);\n }\n // Remove `once` component in listeners\n purgePending();\n};\n\n// Depending on component's props\nlet delayType;\nlet finalLazyLoadHandler = null;\n\nconst isString = string => typeof string === 'string';\n\nclass LazyLoad extends PureComponent {\n constructor(props) {\n super(props);\n\n this.state={\n visible: false,\n hidden: false,\n };\n }\n\n componentDidMount() {\n // It's unlikely to change delay type on the fly, this is mainly\n // designed for tests\n let scrollport = window;\n const {\n scrollContainer,\n } = this.props;\n if (scrollContainer) {\n if (isString(scrollContainer)) {\n scrollport = scrollport.document.querySelector(scrollContainer);\n }\n }\n const needResetFinalLazyLoadHandler = (this.props.debounce !== undefined && delayType === 'throttle')\n || (delayType === 'debounce' && this.props.debounce === undefined);\n\n if (needResetFinalLazyLoadHandler) {\n off(scrollport, 'scroll', finalLazyLoadHandler, passiveEvent);\n off(window, 'resize', finalLazyLoadHandler, passiveEvent);\n finalLazyLoadHandler = null;\n }\n\n if (!finalLazyLoadHandler) {\n if (this.props.debounce !== undefined) {\n finalLazyLoadHandler = debounce(lazyLoadHandler, typeof this.props.debounce === 'number' ?\n this.props.debounce :\n 300);\n delayType = 'debounce';\n } else if (this.props.throttle !== undefined) {\n finalLazyLoadHandler = throttle(lazyLoadHandler, typeof this.props.throttle === 'number' ?\n this.props.throttle :\n 300);\n delayType = 'throttle';\n } else {\n finalLazyLoadHandler = lazyLoadHandler;\n }\n }\n\n if (this.props.overflow) {\n const parent = scrollParent(ReactDom.findDOMNode(this));\n if (parent && typeof parent.getAttribute === 'function') {\n const listenerCount = 1 + (+parent.getAttribute(LISTEN_FLAG));\n if (listenerCount === 1) {\n parent.addEventListener('scroll', finalLazyLoadHandler, passiveEvent);\n }\n parent.setAttribute(LISTEN_FLAG, listenerCount);\n }\n } else if (listeners.length === 0 || needResetFinalLazyLoadHandler) {\n const { scroll, resize } = this.props;\n\n if (scroll) {\n on(scrollport, 'scroll', finalLazyLoadHandler, passiveEvent);\n }\n\n if (resize) {\n on(window, 'resize', finalLazyLoadHandler, passiveEvent);\n }\n }\n\n listeners.push(this);\n checkVisible(this);\n }\n\n componentWillUnmount() {\n if (this.props.overflow) {\n const parent = scrollParent(ReactDom.findDOMNode(this));\n if (parent && typeof parent.getAttribute === 'function') {\n const listenerCount = (+parent.getAttribute(LISTEN_FLAG)) - 1;\n if (listenerCount === 0) {\n parent.removeEventListener('scroll', finalLazyLoadHandler, passiveEvent);\n parent.removeAttribute(LISTEN_FLAG);\n } else {\n parent.setAttribute(LISTEN_FLAG, listenerCount);\n }\n }\n }\n\n const index = listeners.indexOf(this);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length === 0 && typeof window !== 'undefined') {\n off(window, 'resize', finalLazyLoadHandler, passiveEvent);\n off(window, 'scroll', finalLazyLoadHandler, passiveEvent);\n }\n }\n\n render() {\n //console.log('lazyload render');\n if(this.state.visible) {\n if(this.props.hiddenIfInvisible)\n return this.state.hidden ?\n
{this.props.children}
:\n
{this.props.children}
;\n else\n return this.props.children;\n }\n else\n return this.props.placeholder ?\n this.props.placeholder :\n
;\n }\n}\n\nLazyLoad.propTypes = {\n once: PropTypes.bool,\n height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n offset: PropTypes.oneOfType([PropTypes.number, PropTypes.arrayOf(PropTypes.number)]),\n overflow: PropTypes.bool,\n resize: PropTypes.bool,\n scroll: PropTypes.bool,\n children: PropTypes.node,\n throttle: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\n debounce: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\n placeholder: PropTypes.node,\n scrollContainer: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n unmountIfInvisible: PropTypes.bool,\n hiddenIfInvisible: PropTypes.bool,\n};\n\nLazyLoad.defaultProps = {\n once: false,\n offset: 0,\n overflow: false,\n resize: false,\n scroll: true,\n unmountIfInvisible: false,\n hiddenIfInvisible: false,\n};\n\nconst getDisplayName = WrappedComponent => WrappedComponent.displayName || WrappedComponent.name || 'Component';\n\nconst decorator = (options = {}) => function lazyload(WrappedComponent) {\n return class LazyLoadDecorated extends Component {\n constructor() {\n super();\n this.displayName = `LazyLoad${getDisplayName(WrappedComponent)}`;\n }\n\n render() {\n return (\n \n \n \n );\n }\n };\n};\n\nexport { decorator as lazyload };\nexport default LazyLoad;\nexport { lazyLoadHandler as forceCheck };\n","export default function debounce(func, wait, immediate) {\n let timeout;\n let args;\n let context;\n let timestamp;\n let result;\n\n const later = function later() {\n const last = +(new Date()) - timestamp;\n\n if (last < wait && last >= 0) {\n timeout = setTimeout(later, wait - last);\n } else {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n if (!timeout) {\n context = null;\n args = null;\n }\n }\n }\n };\n\n return function debounced() {\n context = this;\n args = arguments;\n timestamp = +(new Date());\n\n const callNow = immediate && !timeout;\n if (!timeout) {\n timeout = setTimeout(later, wait);\n }\n\n if (callNow) {\n result = func.apply(context, args);\n context = null;\n args = null;\n }\n\n return result;\n };\n}\n","/*eslint-disable */\nexport default function throttle(fn, threshhold, scope) {\n threshhold || (threshhold = 250);\n var last,\n deferTimer;\n return function () {\n var context = scope || this;\n\n var now = +new Date,\n args = arguments;\n if (last && now < last + threshhold) {\n // hold on to it\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n fn.apply(context, args);\n }, threshhold);\n } else {\n last = now;\n fn.apply(context, args);\n }\n };\n}\n","import React, { Component } from 'react';\nimport load from 'load-script';\n\nwindow.audio_cache = {};\n\nfunction load_amrnb() {\n return new Promise((resolve, reject) => {\n if (window.AMR) resolve();\n else\n load('static/amr_all.min.js', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n}\n\nexport class AudioWidget extends Component {\n constructor(props) {\n super(props);\n this.state = {\n url: this.props.src,\n state: 'waiting',\n data: null,\n };\n }\n\n load() {\n if (window.audio_cache[this.state.url]) {\n this.setState({\n state: 'loaded',\n data: window.audio_cache[this.state.url],\n });\n return;\n }\n\n console.log('fetching audio', this.state.url);\n this.setState({\n state: 'loading',\n });\n Promise.all([fetch(this.state.url), load_amrnb()]).then((res) => {\n res[0].blob().then((blob) => {\n const reader = new FileReader();\n reader.onload = (event) => {\n const raw = new window.AMR().decode(event.target.result);\n if (!raw) {\n alert('audio decoding failed');\n return;\n }\n const wave = window.PCMData.encode({\n sampleRate: 8000,\n channelCount: 1,\n bytesPerSample: 2,\n data: raw,\n });\n const binary_wave = new Uint8Array(wave.length);\n for (let i = 0; i < wave.length; i++)\n binary_wave[i] = wave.charCodeAt(i);\n\n const objurl = URL.createObjectURL(\n new Blob([binary_wave], { type: 'audio/wav' }),\n );\n window.audio_cache[this.state.url] = objurl;\n this.setState({\n state: 'loaded',\n data: objurl,\n });\n };\n reader.readAsBinaryString(blob);\n });\n this.setState({\n state: 'decoding',\n });\n });\n }\n\n render() {\n if (this.state.state === 'waiting')\n return (\n

\n 加载音频\n

\n );\n if (this.state.state === 'loading') return

正在下载……

;\n else if (this.state.state === 'decoding') return

正在解码……

;\n else if (this.state.state === 'loaded')\n return (\n

\n

\n );\n }\n}\n","import React, { PureComponent } from 'react';\nimport { THUHOLE_API_ROOT, get_json, API_VERSION_PARAM } from './flows_api';\nimport { Time } from './Common';\n\nexport class MessageViewer extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n loading_status: 'idle',\n msg: [],\n };\n }\n\n componentDidMount() {\n this.load();\n }\n\n load() {\n if (this.state.loading_status === 'loading') return;\n this.setState(\n {\n loading_status: 'loading',\n },\n () => {\n fetch(\n THUHOLE_API_ROOT +\n 'api_xmcp/hole/system_msg?user_token=' +\n encodeURIComponent(this.props.token) +\n API_VERSION_PARAM(),\n )\n .then(get_json)\n .then((json) => {\n if (json.error) throw new Error(json.error);\n else\n this.setState({\n loading_status: 'done',\n msg: json.result,\n });\n })\n .catch((err) => {\n console.error(err);\n alert('' + err);\n this.setState({\n loading_status: 'failed',\n });\n });\n },\n );\n }\n\n render() {\n if (this.state.loading_status === 'loading')\n return

加载中……

;\n else if (this.state.loading_status === 'failed')\n return (\n
\n {\n this.load();\n }}\n >\n 重新加载\n \n
\n );\n else if (this.state.loading_status === 'done')\n return this.state.msg.map((msg) => (\n
\n
\n
\n
\n
{msg.content}
\n
\n
\n ));\n else return null;\n }\n}\n","import React, { PureComponent } from 'react';\n\nimport './Config.css';\n\nconst BUILTIN_IMGS = {\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/gbp.jpg':\n '寻觅繁星(默认)',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/eriri.jpg':\n '平成著名画师',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/yurucamp.jpg':\n '露营天下第一',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/minecraft.jpg':\n '麦恩·库拉夫特',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/cyberpunk.jpg':\n '赛博城市',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/bj.jpg':\n '城市的星光',\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/sif.jpg':\n '梦开始的地方',\n};\n\nconst DEFAULT_CONFIG = {\n background_img:\n 'https://cdn.jsdelivr.net/gh/thuhole/webhole@gh-pages/static/bg/gbp.jpg',\n background_color: '#113366',\n pressure: false,\n easter_egg: true,\n color_scheme: 'default',\n fold: true,\n block_words: [],\n};\n\nexport function load_config() {\n let config = Object.assign({}, DEFAULT_CONFIG);\n let loaded_config;\n try {\n loaded_config = JSON.parse(localStorage['hole_config'] || '{}');\n } catch (e) {\n alert('设置加载失败,将重置为默认设置!\\n' + e);\n delete localStorage['hole_config'];\n loaded_config = {};\n }\n\n // unrecognized configs are removed\n Object.keys(loaded_config).forEach((key) => {\n if (config[key] !== undefined) config[key] = loaded_config[key];\n });\n\n console.log('config loaded', config);\n window.config = config;\n}\nexport function save_config() {\n localStorage['hole_config'] = JSON.stringify(window.config);\n load_config();\n}\n\nexport function bgimg_style(img, color) {\n if (img === undefined) img = window.config.background_img;\n if (color === undefined) color = window.config.background_color;\n return {\n background: 'transparent center center',\n backgroundImage: img === null ? 'unset' : 'url(\"' + encodeURI(img) + '\")',\n backgroundColor: color,\n backgroundSize: 'cover',\n };\n}\n\nclass ConfigBackground extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n img: window.config.background_img,\n color: window.config.background_color,\n };\n }\n\n save_changes() {\n this.props.callback({\n background_img: this.state.img,\n background_color: this.state.color,\n });\n }\n\n on_select(e) {\n let value = e.target.value;\n this.setState(\n {\n img: value === '##other' ? '' : value === '##color' ? null : value,\n },\n this.save_changes.bind(this),\n );\n }\n on_change_img(e) {\n this.setState(\n {\n img: e.target.value,\n },\n this.save_changes.bind(this),\n );\n }\n on_change_color(e) {\n this.setState(\n {\n color: e.target.value,\n },\n this.save_changes.bind(this),\n );\n }\n\n render() {\n let img_select =\n this.state.img === null\n ? '##color'\n : Object.keys(BUILTIN_IMGS).indexOf(this.state.img) === -1\n ? '##other'\n : this.state.img;\n return (\n
\n

\n 背景图片:\n \n {Object.keys(BUILTIN_IMGS).map((key) => (\n \n ))}\n \n \n \n  \n #background_img \n {img_select === '##other' && (\n \n )}\n {img_select === '##color' && (\n \n )}\n

\n \n
\n );\n }\n}\n\nclass ConfigColorScheme extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n color_scheme: window.config.color_scheme,\n };\n }\n\n save_changes() {\n this.props.callback({\n color_scheme: this.state.color_scheme,\n });\n }\n\n on_select(e) {\n let value = e.target.value;\n this.setState(\n {\n color_scheme: value,\n },\n this.save_changes.bind(this),\n );\n }\n\n render() {\n return (\n
\n

\n 夜间模式:\n \n \n \n \n \n  #color_scheme\n

\n

\n 选择浅色或深色模式,深色模式下将会调暗图片亮度\n

\n
\n );\n }\n}\n\nclass ConfigTextArea extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n [props.id]: window.config[props.id],\n };\n }\n\n save_changes() {\n this.props.callback({\n [this.props.id]: this.props.sift(this.state[this.props.id]),\n });\n }\n\n on_change(e) {\n let value = this.props.parse(e.target.value);\n this.setState(\n {\n [this.props.id]: value,\n },\n this.save_changes.bind(this),\n );\n }\n\n render() {\n return (\n
\n \n
\n );\n }\n}\n\n/* class ConfigBlockWords extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n block_words: window.config.block_words,\n };\n }\n\n save_changes() {\n this.props.callback({\n block_words: this.state.block_words.filter((v) => v),\n });\n }\n\n on_change(e) {\n // Filter out those blank lines\n let value = e.target.value.split('\\n');\n this.setState(\n {\n block_words: value,\n },\n this.save_changes.bind(this),\n );\n }\n\n render() {\n return (\n
\n

\n {' '}\n 设置屏蔽词 \n

\n

\n \n

\n
\n );\n }\n} */\n\nclass ConfigSwitch extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n switch: window.config[this.props.id],\n };\n }\n\n on_change(e) {\n let val = e.target.checked;\n this.setState(\n {\n switch: val,\n },\n () => {\n this.props.callback({\n [this.props.id]: val,\n });\n },\n );\n }\n\n render() {\n return (\n
\n

\n \n

\n

{this.props.description}

\n
\n );\n }\n}\n\nexport class ConfigUI extends PureComponent {\n constructor(props) {\n super(props);\n this.save_changes_bound = this.save_changes.bind(this);\n }\n\n save_changes(chg) {\n console.log(chg);\n Object.keys(chg).forEach((key) => {\n window.config[key] = chg[key];\n });\n save_config();\n }\n\n reset_settings() {\n if (window.confirm('重置所有设置?')) {\n window.config = {};\n save_config();\n window.location.reload();\n }\n }\n\n render() {\n return (\n
\n
\n

\n 这些功能仍在测试,可能不稳定(\n 全部重置)\n

\n

\n \n 修改设置后{' '}\n {\n window.location.reload();\n }}\n >\n 刷新页面\n {' '}\n 方可生效\n \n

\n
\n
\n \n
\n \n
\n {/* */}\n array.join('\\n')}\n sift={(array) => array.filter((v) => v)}\n parse={(string) => string.split('\\n')}\n />\n
\n \n
\n \n
\n \n
\n

\n 新功能建议或问题反馈请在 \n \n GitHub \n \n  提出。\n

\n
\n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport {\n API_BASE,\n SafeTextarea,\n PromotionBar,\n HighlightedMarkdown,\n} from './Common';\nimport { MessageViewer } from './Message';\nimport { LoginPopup } from './infrastructure/widgets';\nimport { ColorPicker } from './color_picker';\nimport { ConfigUI } from './Config';\nimport fixOrientation from 'fix-orientation';\nimport copy from 'copy-to-clipboard';\nimport { cache } from './cache';\nimport {\n API_VERSION_PARAM,\n THUHOLE_API_ROOT,\n API,\n get_json,\n token_param,\n} from './flows_api';\n\nimport './UserAction.css';\n\nconst BASE64_RATE = 4 / 3;\nconst MAX_IMG_DIAM = 8000;\nconst MAX_IMG_PX = 5000000;\nconst MAX_IMG_FILESIZE = 450000 * BASE64_RATE;\n\nexport const TokenCtx = React.createContext({\n value: null,\n set_value: () => {},\n});\n\n// class LifeInfoBox extends Component {\n// constructor(props) {\n// super(props);\n// if(!window._life_info_cache)\n// window._life_info_cache={};\n// this.CACHE_TIMEOUT_S=15;\n// this.state={\n// today_info: this.cache_get('today_info'),\n// card_balance: this.cache_get('card_balance'),\n// net_balance: this.cache_get('net_balance'),\n// mail_count: this.cache_get('mail_count'),\n// };\n// this.INTERNAL_NETWORK_FAILURE='_network_failure';\n// this.API_NAME={\n// today_info: 'hole/today_info',\n// card_balance: 'isop/card_balance',\n// net_balance: 'isop/net_balance',\n// mail_count: 'isop/mail_count',\n// };\n// }\n//\n// cache_get(key) {\n// let cache_item=window._life_info_cache[key];\n// if(!cache_item || (+new Date())-cache_item[0]>1000*this.CACHE_TIMEOUT_S)\n// return null;\n// else\n// return cache_item[1];\n// }\n// cache_set(key,value) {\n// if(!window._life_info_cache[key] || window._life_info_cache[key][1]!==value)\n// window._life_info_cache[key]=[+new Date(),value];\n// }\n//\n// load(state_key) {\n// this.setState({\n// [state_key]: null,\n// },()=>{\n// fetch(\n// PKUHELPER_ROOT+'api_xmcp/'+this.API_NAME[state_key]\n// +'?user_token='+encodeURIComponent(this.props.token)\n// +API_VERSION_PARAM()\n// )\n// .then(get_json)\n// .then((json)=>{\n// //console.log(json);\n// this.setState({\n// [state_key]: json,\n// });\n// })\n// .catch((e)=>{\n// this.setState({\n// [state_key]: {\n// errMsg: '网络错误 '+e,\n// errCode: this.INTERNAL_NETWORK_FAILURE,\n// success: false,\n// }\n// });\n// })\n// });\n// }\n//\n// componentDidMount() {\n// ['today_info','card_balance','net_balance','mail_count'].forEach((k)=>{\n// if(!this.state[k])\n// this.load(k);\n// });\n// }\n//\n// reload_all() {\n// ['today_info','card_balance','net_balance','mail_count'].forEach((k)=>{\n// this.load(k);\n// });\n// }\n//\n// render_line(state_key,title,value_fn,action,url_fn,do_login) {\n// let s=this.state[state_key];\n// if(!s)\n// return (\n// \n// {title}\n// 加载中……\n// \n// \n// );\n// else if(!s.success) {\n// let type='加载失败';\n// if(s.errCode===this.INTERNAL_NETWORK_FAILURE)\n// type='网络错误';\n// else if(['E01','E02','E03'].indexOf(s.errCode)!==-1)\n// type='授权失效';\n//\n// let details=JSON.stringify(s);\n// if(s.errMsg)\n// details=s.errMsg;\n// else if(s.error)\n// details=s.error;\n//\n// return (\n// \n// {title}\n// \n// alert(details)}>{type}\n// \n// \n// {type==='授权失效' ?\n// \n//  重新登录\n// :\n// this.load(state_key)}>\n//  重试\n// \n// }\n// \n// \n// )\n// }\n// else {\n// this.cache_set(state_key,s);\n//\n// return (\n// \n// {title}\n// {value_fn(s)}\n// \n// \n//  {action}\n// \n// \n// \n// );\n// }\n// }\n//\n// render() {\n// return (\n// {\n// this.props.set_token(t);\n// this.reload_all();\n// }}>{(do_login)=>(\n//
\n// \n// \n// {this.render_line(\n// 'today_info',\n// '今日',(s)=>s.info,\n// '校历',(s)=>s.schedule_url,\n// do_login,\n// )}\n// {this.render_line(\n// 'card_balance',\n// '校园卡',(s)=>`余额¥${s.balance.toFixed(2)}`,\n// '充值',()=>'https://virtualprod.alipay.com/educate/educatePcRecharge.htm?schoolCode=PKU&schoolName=',\n// do_login,\n// )}\n// {this.render_line(\n// 'net_balance',\n// '网费',(s)=>`余额¥${s.balance.toFixed(2)}`,\n// '充值',()=>'https://its.pku.edu.cn/epay.jsp',\n// do_login,\n// )}\n// {this.render_line(\n// 'mail_count',\n// '邮件',(s)=>`未读 ${s.count} 封`,\n// '查看',()=>'https://mail.pku.edu.cn/',\n// do_login,\n// )}\n// \n//
\n//
\n// )}
\n// )\n// }\n// }\n\nexport function InfoSidebar(props) {\n return (\n
\n \n \n
\n {\n props.show_sidebar('设置', );\n }}\n >\n \n \n \n   \n \n \n \n \n   \n \n \n \n \n
\n
\n

\n {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker\n .getRegistrations()\n .then((registrations) => {\n for (let registration of registrations) {\n console.log('unregister', registration);\n registration.unregister();\n }\n });\n }\n cache().clear();\n setTimeout(() => {\n window.location.reload(true);\n }, 200);\n }}\n >\n 强制检查更新\n \n (当前版本:【{process.env.REACT_APP_BUILD_INFO || '---'}{' '}\n {process.env.NODE_ENV}】 会自动在后台检查更新并在下次访问时更新)\n

\n
\n
\n

联系我们:thuhole at protonmail dot com

\n
\n
\n

\n T大树洞 网页版 by @thuhole, 基于 \n \n GPLv3\n \n  协议在{' '}\n \n GitHub\n {' '}\n 开源\n

\n

\n T大树洞 网页版的诞生离不开 \n \n P大树洞网页版 by @xmcp\n \n 、\n \n React\n \n 、\n \n IcoMoon\n \n  等开源项目\n

\n

\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or (at\n your option) any later version.\n

\n

\n This program is distributed in the hope that it will be useful, but\n WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n \n GNU General Public License\n \n  for more details.\n

\n
\n
\n );\n}\n\nclass ResetUsertokenWidget extends Component {\n constructor(props) {\n super(props);\n this.state = {\n loading_status: 'done',\n };\n }\n\n do_reset() {\n if (\n window.confirm(\n '您正在重置 UserToken!\\n您的账号将会在【所有设备】上注销,您需要手动重新登录!',\n )\n ) {\n let uid = window.prompt(\n '您正在重置 UserToken!\\n请输入您的学号以确认身份:',\n );\n if (uid)\n this.setState(\n {\n loading_status: 'loading',\n },\n () => {\n fetch(THUHOLE_API_ROOT + 'api_xmcp/hole/reset_usertoken', {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n user_token: this.props.token,\n uid: uid,\n }),\n })\n .then(get_json)\n .then((json) => {\n if (json.error) throw new Error(json.error);\n else alert('重置成功!您需要在所有设备上重新登录。');\n\n this.setState({\n loading_status: 'done',\n });\n })\n .catch((e) => {\n alert('重置失败:' + e);\n this.setState({\n loading_status: 'done',\n });\n });\n },\n );\n }\n }\n\n render() {\n if (this.state.loading_status === 'done')\n return 重置;\n else if (this.state.loading_status === 'loading')\n return (\n \n \n \n );\n }\n}\n\nexport class LoginForm extends Component {\n copy_token(token) {\n if (copy(token)) alert('复制成功!\\n请一定不要泄露哦');\n }\n\n render() {\n return (\n \n {(token) => (\n
\n {/*{!!token.value &&*/}\n {/* */}\n {/*}*/}\n
\n {token.value ? (\n
\n

\n 您已登录。\n {\n token.set_value(null);\n }}\n >\n 注销\n \n
\n

\n {/*

*/}\n {/*根据计算中心要求,访问授权三个月内有效,过期需重新登录。*/}\n {/*T大树洞将会单向加密(i.e. 哈希散列)您的邮箱后再存入数据库,因此您的发帖具有较强的匿名性。具体可见我们的后端开源代码。*/}\n {/*

*/}\n

\n {\n this.props.show_sidebar(\n '系统消息',\n ,\n );\n }}\n >\n 查看系统消息\n \n
\n 当您发送的内容违规时,我们将用系统消息提示您\n

\n

\n \n 复制 User Token\n \n
\n 复制 User Token\n 可以在新设备登录,切勿告知他人。若怀疑被盗号请重新邮箱验证码登录以重置Token。\n {/*,若怀疑被盗号请尽快 */}\n

\n
\n ) : (\n \n {(do_popup) => (\n
\n

\n \n

\n

\n \n T大树洞\n 面向T大学生,通过T大邮箱验证您的身份并提供服务。\n \n

\n
\n )}\n
\n )}\n
\n
\n )}\n
\n );\n }\n}\n\nexport class ReplyForm extends Component {\n constructor(props) {\n super(props);\n this.state = {\n text: '',\n loading_status: 'done',\n preview: false,\n };\n this.on_change_bound = this.on_change.bind(this);\n this.area_ref = this.props.area_ref || React.createRef();\n this.global_keypress_handler_bound = this.global_keypress_handler.bind(\n this,\n );\n this.color_picker = new ColorPicker();\n }\n\n global_keypress_handler(e) {\n if (\n e.code === 'Enter' &&\n !e.ctrlKey &&\n !e.altKey &&\n ['input', 'textarea'].indexOf(e.target.tagName.toLowerCase()) === -1\n ) {\n if (this.area_ref.current) {\n e.preventDefault();\n this.area_ref.current.focus();\n }\n }\n }\n componentDidMount() {\n document.addEventListener('keypress', this.global_keypress_handler_bound);\n }\n componentWillUnmount() {\n document.removeEventListener(\n 'keypress',\n this.global_keypress_handler_bound,\n );\n }\n\n on_change(value) {\n this.setState({\n text: value,\n });\n }\n\n on_submit(event) {\n if (event) event.preventDefault();\n if (this.state.loading_status === 'loading') return;\n this.setState({\n loading_status: 'loading',\n });\n\n let data = new URLSearchParams();\n data.append('pid', this.props.pid);\n data.append('text', this.state.text);\n data.append('user_token', this.props.token);\n fetch(\n API_BASE + '/api.php?action=docomment' + token_param(this.props.token),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n },\n )\n .then(get_json)\n .then((json) => {\n if (json.code !== 0) {\n if (json.msg) alert(json.msg);\n throw new Error(JSON.stringify(json));\n }\n\n this.setState({\n loading_status: 'done',\n text: '',\n preview: false,\n });\n this.area_ref.current.clear();\n this.props.on_complete();\n })\n .catch((e) => {\n console.error(e);\n alert('回复失败');\n this.setState({\n loading_status: 'done',\n });\n });\n }\n\n toggle_preview() {\n this.setState({\n preview: !this.state.preview,\n });\n }\n\n render() {\n return (\n \n {this.state.preview ? (\n
\n {}}\n />\n
\n ) : (\n \n )}\n {\n this.toggle_preview();\n }}\n >\n {this.state.preview ? (\n \n ) : (\n \n )}\n \n {this.state.loading_status === 'loading' ? (\n \n ) : (\n \n )}\n \n );\n }\n}\n\nexport class PostForm extends Component {\n constructor(props) {\n super(props);\n this.state = {\n text: '',\n loading_status: 'done',\n img_tip: null,\n preview: false,\n };\n this.img_ref = React.createRef();\n this.area_ref = React.createRef();\n this.on_change_bound = this.on_change.bind(this);\n this.on_img_change_bound = this.on_img_change.bind(this);\n this.color_picker = new ColorPicker();\n }\n\n componentDidMount() {\n if (this.area_ref.current) this.area_ref.current.focus();\n }\n\n on_change(value) {\n this.setState({\n text: value,\n });\n }\n\n do_post(text, img) {\n let data = new URLSearchParams();\n data.append('text', this.state.text);\n data.append('type', img ? 'image' : 'text');\n data.append('user_token', this.props.token);\n if (img) data.append('data', img);\n\n fetch(API_BASE + '/api.php?action=dopost' + token_param(this.props.token), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n })\n .then(get_json)\n .then((json) => {\n if (json.code !== 0) {\n if (json.msg) alert(json.msg);\n throw new Error(JSON.stringify(json));\n }\n\n this.setState({\n loading_status: 'done',\n text: '',\n preview: false,\n });\n this.area_ref.current.clear();\n this.props.on_complete();\n })\n .catch((e) => {\n console.error(e);\n alert('发表失败');\n this.setState({\n loading_status: 'done',\n });\n });\n }\n\n proc_img(file) {\n return new Promise((resolve, reject) => {\n function return_url(url) {\n const idx = url.indexOf(';base64,');\n if (idx === -1) throw new Error('img not base64 encoded');\n\n return url.substr(idx + 8);\n }\n\n let reader = new FileReader();\n function on_got_img(url) {\n const image = new Image();\n image.onload = () => {\n let width = image.width;\n let height = image.height;\n let compressed = false;\n\n if (width > MAX_IMG_DIAM) {\n height = (height * MAX_IMG_DIAM) / width;\n width = MAX_IMG_DIAM;\n compressed = true;\n }\n if (height > MAX_IMG_DIAM) {\n width = (width * MAX_IMG_DIAM) / height;\n height = MAX_IMG_DIAM;\n compressed = true;\n }\n if (height * width > MAX_IMG_PX) {\n let rate = Math.sqrt((height * width) / MAX_IMG_PX);\n height /= rate;\n width /= rate;\n compressed = true;\n }\n console.log('chosen img size', width, height);\n\n let canvas = document.createElement('canvas');\n let ctx = canvas.getContext('2d');\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(image, 0, 0, width, height);\n\n let quality_l = 0.1,\n quality_r = 0.9,\n quality,\n new_url;\n while (quality_r - quality_l >= 0.03) {\n quality = (quality_r + quality_l) / 2;\n new_url = canvas.toDataURL('image/jpeg', quality);\n console.log(\n quality_l,\n quality_r,\n 'trying quality',\n quality,\n 'size',\n new_url.length,\n );\n if (new_url.length <= MAX_IMG_FILESIZE) quality_l = quality;\n else quality_r = quality;\n }\n if (quality_l >= 0.101) {\n console.log('chosen img quality', quality);\n resolve({\n img: return_url(new_url),\n quality: quality,\n width: Math.round(width),\n height: Math.round(height),\n compressed: compressed,\n });\n } else {\n reject('图片过大,无法上传');\n }\n };\n image.src = url;\n }\n reader.onload = (event) => {\n fixOrientation(event.target.result, {}, (fixed_dataurl) => {\n on_got_img(fixed_dataurl);\n });\n };\n reader.readAsDataURL(file);\n });\n }\n\n on_img_change() {\n if (this.img_ref.current && this.img_ref.current.files.length)\n this.setState(\n {\n img_tip: '(正在处理图片……)',\n },\n () => {\n this.proc_img(this.img_ref.current.files[0])\n .then((d) => {\n this.setState({\n img_tip:\n `(${d.compressed ? '压缩到' : '尺寸'} ${d.width}*${\n d.height\n } / ` +\n `质量 ${Math.floor(d.quality * 100)}% / ${Math.floor(\n d.img.length / BASE64_RATE / 1000,\n )}KB)`,\n });\n })\n .catch((e) => {\n this.setState({\n img_tip: `图片无效:${e}`,\n });\n });\n },\n );\n else\n this.setState({\n img_tip: null,\n });\n }\n\n on_submit(event) {\n if (event) event.preventDefault();\n if (this.state.loading_status === 'loading') return;\n if (this.img_ref.current.files.length) {\n this.setState({\n loading_status: 'processing',\n });\n this.proc_img(this.img_ref.current.files[0])\n .then((d) => {\n this.setState({\n loading_status: 'loading',\n });\n this.do_post(this.state.text, d.img);\n })\n .catch((e) => {\n alert(e);\n });\n } else {\n this.setState({\n loading_status: 'loading',\n });\n this.do_post(this.state.text, null);\n }\n }\n\n toggle_preview() {\n this.setState({\n preview: !this.state.preview,\n });\n }\n\n render() {\n return (\n
\n
\n \n\n {this.state.preview ? (\n {\n this.toggle_preview();\n }}\n >\n \n  编辑\n \n ) : (\n {\n this.toggle_preview();\n }}\n >\n \n  预览\n \n )}\n\n {this.state.loading_status !== 'done' ? (\n \n ) : (\n \n )}\n
\n {!!this.state.img_tip && (\n

\n {\n this.img_ref.current.value = '';\n this.on_img_change();\n }}\n >\n 删除图片\n \n {this.state.img_tip}\n

\n )}\n {this.state.preview ? (\n
\n {}}\n />\n
\n ) : (\n \n )}\n

\n \n 请遵守\n \n 树洞管理规范(试行)\n \n ,文明发言\n \n

\n \n );\n }\n}\n","import React, { PureComponent } from 'react';\nimport copy from 'copy-to-clipboard';\nimport { ColorPicker } from './color_picker';\nimport {\n split_text,\n NICKNAME_RE,\n PID_RE,\n URL_RE,\n URL_PID_RE,\n} from './text_splitter';\nimport {\n format_time,\n build_highlight_re,\n Time,\n TitleLine,\n HighlightedText,\n ClickHandler,\n ColoredSpan,\n HighlightedMarkdown,\n} from './Common';\nimport './Flows.css';\nimport LazyLoad, { forceCheck } from './react-lazyload/src';\nimport { AudioWidget } from './AudioWidget';\nimport { TokenCtx, ReplyForm } from './UserAction';\n\nimport { API } from './flows_api';\n\nconst IMAGE_BASE = 'https://img.thuhole.com/';\nconst IMAGE_BAK_BASE = 'https://img2.thuhole.com/';\n// const AUDIO_BASE=THUHOLE_API_ROOT+'services/thuhole/audios/';\n\nconst CLICKABLE_TAGS = { a: true, audio: true };\nconst PREVIEW_REPLY_COUNT = 10;\n// const QUOTE_BLACKLIST=['23333','233333','66666','666666','10086','10000','100000','99999','999999','55555','555555'];\nconst QUOTE_BLACKLIST = [];\nconst FOLD_TAGS = [\n '性相关',\n '政治相关',\n '性话题',\n '政治话题',\n '折叠',\n 'NSFW',\n '刷屏',\n '真实性可疑',\n '用户举报较多',\n '举报较多',\n '重复内容',\n];\n\nwindow.LATEST_POST_ID = parseInt(localStorage['_LATEST_POST_ID'], 10) || 0;\n\nconst DZ_NAME = '洞主';\n\nfunction load_single_meta(show_sidebar, token) {\n return async (pid, replace = false) => {\n let color_picker = new ColorPicker();\n let title_elem = '树洞 #' + pid;\n show_sidebar(\n title_elem,\n
正在加载 #{pid}
,\n replace ? 'replace' : 'push',\n );\n try {\n let single = await API.get_single(pid, token);\n single.data.variant = {};\n let { data: replies } = await API.load_replies_with_cache(\n pid,\n token,\n color_picker,\n parseInt(single.data.reply),\n );\n show_sidebar(\n title_elem,\n ,\n 'replace',\n );\n } catch (e) {\n console.error(e);\n show_sidebar(\n title_elem,\n ,\n 'replace',\n );\n }\n };\n}\n\nclass Reply extends PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n const replyContent = this.props.info.text;\n const splitIdx = replyContent.indexOf(']');\n\n const author = replyContent.substr(0, splitIdx + 1),\n replyText = replyContent.substr(splitIdx + 2);\n return (\n \n
\n #{this.props.info.cid}\n {!!this.props.do_filter_name && (\n {\n this.props.do_filter_name(this.props.info.name);\n }}\n >\n \n \n )}\n  \n {this.props.info.tag !== null && (\n {this.props.info.tag}\n )}\n
\n
\n \n
\n
\n );\n }\n}\n\nclass FlowItem extends PureComponent {\n constructor(props) {\n super(props);\n }\n\n copy_link(event) {\n event.preventDefault();\n copy(\n `${event.target.href}${\n this.props.info.tag ? ' 【' + this.props.info.tag + '】' : ''\n }\\n` +\n `${this.props.info.text}${\n this.props.info.type === 'image'\n ? ' [图片]'\n : this.props.info.type === 'audio'\n ? ' [语音]'\n : ''\n }\\n` +\n `(${format_time(new Date(this.props.info.timestamp * 1000))} ${\n this.props.info.likenum\n }关注 ${this.props.info.reply}回复)\\n` +\n this.props.replies\n .map((r) => (r.tag ? '【' + r.tag + '】' : '') + r.text)\n .join('\\n'),\n );\n }\n\n render() {\n let props = this.props;\n return (\n
\n {!!props.is_quote && (\n
\n
\n \n
\n {/*
*/}\n {/* 提到*/}\n {/*
*/}\n
\n )}\n
\n {!!window.LATEST_POST_ID &&\n parseInt(props.info.pid, 10) > window.LATEST_POST_ID && (\n
\n )}\n {!!this.props.attention && !this.props.cached && (\n
\n )}\n
\n {!!this.props.do_filter_name && (\n {\n this.props.do_filter_name(DZ_NAME);\n }}\n >\n \n \n )}\n {!!parseInt(props.info.likenum, 10) && (\n \n {props.info.likenum} \n \n \n )}\n {!!parseInt(props.info.reply, 10) && (\n \n {props.info.reply} \n \n \n )}\n \n \n #{props.info.pid}\n \n \n  \n {props.info.tag !== null && props.info.tag !== '折叠' && (\n {props.info.tag}\n )}\n
\n
\n \n {props.info.type === 'image' && (\n

\n {props.img_clickable ? (\n \n {\n if (e.target.src === IMAGE_BASE + props.info.url) {\n e.target.src = IMAGE_BAK_BASE + props.info.url;\n }\n }}\n alt={IMAGE_BASE + props.info.url}\n />\n \n ) : (\n {\n if (e.target.src === IMAGE_BASE + props.info.url) {\n e.target.src = IMAGE_BAK_BASE + props.info.url;\n }\n }}\n alt={IMAGE_BASE + props.info.url}\n />\n )}\n

\n )}\n {/*{props.info.type==='audio' && }*/}\n
\n {!!(props.attention && props.info.variant.latest_reply) && (\n

\n 最新回复{' '}\n

\n )}\n
\n
\n );\n }\n}\n\nclass FlowSidebar extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n attention: props.attention,\n info: props.info,\n replies: props.replies,\n loading_status: 'done',\n error_msg: null,\n filter_name: null,\n rev: false,\n };\n this.color_picker = props.color_picker;\n this.syncState = props.sync_state || (() => {});\n this.reply_ref = React.createRef();\n }\n\n set_variant(cid, variant) {\n this.setState(\n (prev) => {\n if (cid)\n return {\n replies: prev.replies.map((reply) => {\n if (reply.cid === cid)\n return Object.assign({}, reply, {\n variant: Object.assign({}, reply.variant, variant),\n });\n else return reply;\n }),\n };\n else\n return {\n info: Object.assign({}, prev.info, {\n variant: Object.assign({}, prev.info.variant, variant),\n }),\n };\n },\n function () {\n this.syncState({\n info: this.state.info,\n replies: this.state.replies,\n });\n },\n );\n }\n\n load_replies(update_count = true) {\n this.setState({\n loading_status: 'loading',\n error_msg: null,\n });\n API.load_replies(\n this.state.info.pid,\n this.props.token,\n this.color_picker,\n null,\n )\n .then((json) => {\n this.setState(\n (prev, props) => ({\n replies: json.data,\n info: update_count\n ? Object.assign({}, prev.info, {\n reply: '' + json.data.length,\n })\n : prev.info,\n attention: !!json.attention,\n loading_status: 'done',\n error_msg: null,\n }),\n () => {\n this.syncState({\n replies: this.state.replies,\n attention: this.state.attention,\n info: this.state.info,\n });\n if (this.state.replies.length)\n this.set_variant(null, {\n latest_reply: Math.max.apply(\n null,\n this.state.replies.map((r) => parseInt(r.timestamp)),\n ),\n });\n },\n );\n })\n .catch((e) => {\n console.error(e);\n this.setState({\n replies: [],\n loading_status: 'done',\n error_msg: '' + e,\n });\n });\n }\n\n toggle_attention() {\n this.setState({\n loading_status: 'loading',\n });\n const next_attention = !this.state.attention;\n API.set_attention(this.state.info.pid, next_attention, this.props.token)\n .then((json) => {\n this.setState({\n loading_status: 'done',\n attention: next_attention,\n });\n this.syncState({\n attention: next_attention,\n });\n })\n .catch((e) => {\n this.setState({\n loading_status: 'done',\n });\n alert('设置关注失败');\n console.error(e);\n });\n }\n\n report() {\n let reason = prompt(`举报 #${this.state.info.pid} 的理由:`);\n if (reason !== null) {\n API.report(this.state.info.pid, reason, this.props.token)\n .then((json) => {\n alert('举报成功');\n })\n .catch((e) => {\n alert('举报失败');\n console.error(e);\n });\n }\n }\n\n set_filter_name(name) {\n this.setState((prevState) => ({\n filter_name: name === prevState.filter_name ? null : name,\n }));\n }\n\n toggle_rev() {\n this.setState((prevState) => ({ rev: !prevState.rev }), forceCheck);\n }\n\n show_reply_bar(name, event) {\n if (this.reply_ref.current && !event.target.closest('a, .clickable')) {\n let text = this.reply_ref.current.get();\n if (\n /^\\s*(?:Re (?:|洞主|(?:[A-Z][a-z]+ )?(?:[A-Z][a-z]+)|You Win(?: \\d+)?):)?\\s*$/.test(\n text,\n )\n ) {\n // text is nearly empty so we can replace it\n let should_text = 'Re ' + name + ': ';\n if (should_text === this.reply_ref.current.get())\n this.reply_ref.current.set('');\n else this.reply_ref.current.set(should_text);\n }\n }\n }\n\n render() {\n if (this.state.loading_status === 'loading')\n return

加载中……

;\n\n let show_pid = load_single_meta(this.props.show_sidebar, this.props.token);\n\n let replies_to_show = this.state.filter_name\n ? this.state.replies.filter((r) => r.name === this.state.filter_name)\n : this.state.replies.slice();\n if (this.state.rev) replies_to_show.reverse();\n\n // may not need key, for performance\n // key for lazyload elem\n // let view_mode_key =\n // (this.state.rev ? 'y-' : 'n-') + (this.state.filter_name || 'null');\n\n let replies_cnt = { [DZ_NAME]: 1 };\n replies_to_show.forEach((r) => {\n if (replies_cnt[r.name] === undefined) replies_cnt[r.name] = 0;\n replies_cnt[r.name]++;\n });\n\n // hide main thread when filtered\n let main_thread_elem =\n this.state.filter_name && this.state.filter_name !== DZ_NAME ? null : (\n {\n this.show_reply_bar('', e);\n }}\n >\n {\n this.set_variant(null, variant);\n }}\n do_filter_name={\n replies_cnt[DZ_NAME] > 1 ? this.set_filter_name.bind(this) : null\n }\n />\n \n );\n\n return (\n
\n
\n {!!this.props.token && (\n \n \n \n \n \n   \n \n )}\n \n \n \n \n {(this.state.replies.length >= 1 || this.state.rev) && (\n \n   \n \n \n \n \n \n )}\n {!!this.props.token && (\n \n   \n {\n this.toggle_attention();\n }}\n >\n {this.state.attention ? (\n \n \n \n \n ) : (\n \n \n \n \n )}\n \n \n )}\n
\n {!!this.state.filter_name && (\n
\n

\n \n {\n this.set_filter_name(null);\n }}\n >\n 还原\n \n \n \n  当前只看 \n \n {this.state.filter_name}\n \n

\n
\n )}\n {!this.state.rev && main_thread_elem}\n {!!this.state.error_msg && (\n
\n

回复加载失败

\n

{this.state.error_msg}

\n
\n )}\n {this.props.deletion_detect &&\n parseInt(this.state.info.reply) > this.state.replies.length &&\n !!this.state.replies.length && (\n
\n {parseInt(this.state.info.reply) - this.state.replies.length}{' '}\n 条回复被删除\n
\n )}\n {replies_to_show.map((reply, i) => (\n \n {\n this.show_reply_bar(reply.name, e);\n }}\n >\n {\n this.set_variant(reply.cid, variant);\n }}\n do_filter_name={\n replies_cnt[reply.name] > 1\n ? this.set_filter_name.bind(this)\n : null\n }\n />\n \n \n ))}\n {this.state.rev && main_thread_elem}\n {this.props.token ? (\n \n ) : (\n
登录后可以回复树洞
\n )}\n
\n );\n }\n}\n\nclass FlowItemRow extends PureComponent {\n constructor(props) {\n super(props);\n this.needFold =\n FOLD_TAGS.indexOf(props.info.tag) > -1 &&\n (props.search_param === '热榜' || !props.search_param) &&\n window.config.fold;\n this.state = {\n replies: [],\n reply_status: 'done',\n reply_error: null,\n info: Object.assign({}, props.info, { variant: {} }),\n hidden: window.config.block_words.some((word) =>\n props.info.text.includes(word),\n ) || this.needFold,\n attention:\n props.attention_override === null ? false : props.attention_override,\n cached: true, // default no display anything\n };\n this.color_picker = new ColorPicker();\n }\n\n componentDidMount() {\n if (parseInt(this.state.info.reply, 10)) {\n this.load_replies(null, /*update_count=*/ false);\n }\n }\n\n // reveal() {\n // this.setState({ hidden: false });\n // }\n\n load_replies(callback, update_count = true) {\n console.log('fetching reply', this.state.info.pid);\n this.setState({\n reply_status: 'loading',\n reply_error: null,\n });\n API.load_replies_with_cache(\n this.state.info.pid,\n this.props.token,\n this.color_picker,\n parseInt(this.state.info.reply),\n )\n .then(({ data: json, cached }) => {\n this.setState(\n (prev, props) => ({\n replies: json.data,\n info: Object.assign({}, prev.info, {\n reply: update_count ? '' + json.data.length : prev.info.reply,\n variant: json.data.length\n ? {\n latest_reply: Math.max.apply(\n null,\n json.data.map((r) => parseInt(r.timestamp)),\n ),\n }\n : {},\n }),\n attention: !!json.attention,\n reply_status: 'done',\n reply_error: null,\n cached,\n }),\n callback,\n );\n })\n .catch((e) => {\n console.error(e);\n this.setState(\n {\n replies: [],\n reply_status: 'failed',\n reply_error: '' + e,\n },\n callback,\n );\n });\n }\n\n show_sidebar() {\n this.props.show_sidebar(\n '树洞 #' + this.state.info.pid,\n ,\n );\n }\n\n render() {\n let show_pid = load_single_meta(this.props.show_sidebar, this.props.token, [\n this.state.info.pid,\n ]);\n\n let hl_rules = [\n ['url_pid', URL_PID_RE],\n ['url', URL_RE],\n ['pid', PID_RE],\n ['nickname', NICKNAME_RE],\n ];\n if (this.props.search_param) {\n hl_rules.push([\n 'search',\n !!this.props.search_param.match(/\\/.+\\//)\n ? build_highlight_re(this.props.search_param, ' ', 'gi', true) // Use regex\n : build_highlight_re(this.props.search_param, ' ', 'gi'), // Don't use regex\n ]);\n }\n let parts = split_text(this.state.info.text, hl_rules);\n\n let quote_id = null;\n if (!this.props.is_quote)\n for (let [mode, content] of parts) {\n content = content.length > 0 ? content.substring(1) : content;\n if (\n mode === 'pid' &&\n QUOTE_BLACKLIST.indexOf(content) === -1 &&\n parseInt(content) < parseInt(this.state.info.pid)\n )\n if (quote_id === null) quote_id = parseInt(content);\n else {\n quote_id = null;\n break;\n }\n }\n\n let res = (\n {\n if (!CLICKABLE_TAGS[event.target.tagName.toLowerCase()])\n this.show_sidebar();\n }}\n >\n \n
\n {this.state.reply_status === 'loading' && (\n
加载中
\n )}\n {this.state.reply_status === 'failed' && (\n
\n

\n {\n this.load_replies();\n }}\n >\n 重新加载评论\n \n

\n

{this.state.reply_error}

\n
\n )}\n {this.state.replies.slice(0, PREVIEW_REPLY_COUNT).map((reply) => (\n \n ))}\n {this.state.replies.length > PREVIEW_REPLY_COUNT && (\n
\n 还有 {this.state.replies.length - PREVIEW_REPLY_COUNT} 条\n
\n )}\n
\n
\n );\n\n if (this.state.hidden) {\n return (\n {\n if (!CLICKABLE_TAGS[event.target.tagName.toLowerCase()])\n this.show_sidebar();\n }}\n >\n \n {!!this.props.is_quote && (\n
\n
\n \n
\n {/*
*/}\n {/* 提到*/}\n {/*
*/}\n
\n )}\n
\n
\n {!!this.props.do_filter_name && (\n {\n this.props.do_filter_name(DZ_NAME);\n }}\n >\n \n \n )}\n #{this.props.info.pid}\n  \n {this.props.info.tag !== null && this.props.info.tag !== '折叠' && (\n {this.props.info.tag}\n )}\n
\n
\n
\n );\n }\n\n return quote_id ? (\n
\n {res}\n \n
\n ) : (\n res\n );\n }\n}\n\nclass FlowItemQuote extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n loading_status: 'empty',\n error_msg: null,\n info: null,\n };\n }\n\n componentDidMount() {\n this.load();\n }\n\n load() {\n this.setState(\n {\n loading_status: 'loading',\n },\n () => {\n API.get_single(this.props.pid, this.props.token)\n .then((json) => {\n this.setState({\n loading_status: 'done',\n info: json.data,\n });\n })\n .catch((err) => {\n if (('' + err).indexOf('没有这条树洞') !== -1)\n this.setState({\n loading_status: 'empty',\n });\n else\n this.setState({\n loading_status: 'error',\n error_msg: '' + err,\n });\n });\n },\n );\n }\n\n render() {\n if (this.state.loading_status === 'empty') return null;\n else if (this.state.loading_status === 'loading')\n return (\n
\n
\n \n 提到了 #{this.props.pid}\n
\n
\n );\n else if (this.state.loading_status === 'error')\n return (\n
\n
\n

\n 重新加载\n

\n

{this.state.error_msg}

\n
\n
\n );\n // 'done'\n else\n return (\n \n );\n }\n}\n\nfunction FlowChunk(props) {\n return (\n \n {({ value: token }) => (\n
\n {!!props.title && }\n {props.list.map((info, ind) => (\n \n
\n {!!(\n props.deletion_detect &&\n props.mode === 'list' &&\n ind &&\n props.list[ind - 1].pid - info.pid > 1\n ) && (\n
\n
\n {props.list[ind - 1].pid - info.pid - 1} 条被删除\n
\n
\n )}\n \n
\n \n ))}\n
\n )}\n
\n );\n}\n\nexport class Flow extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n mode: props.mode,\n search_param: props.search_text,\n loaded_pages: 0,\n chunks: {\n title: '',\n data: [],\n },\n loading_status: 'done',\n error_msg: null,\n };\n this.on_scroll_bound = this.on_scroll.bind(this);\n window.LATEST_POST_ID = parseInt(localStorage['_LATEST_POST_ID'], 10) || 0;\n }\n\n load_page(page) {\n const failed = (err) => {\n console.error(err);\n this.setState((prev, props) => ({\n loaded_pages: prev.loaded_pages - 1,\n loading_status: 'failed',\n error_msg: '' + err,\n }));\n };\n\n if (page > this.state.loaded_pages + 1) throw new Error('bad page');\n if (page === this.state.loaded_pages + 1) {\n console.log('fetching page', page);\n if (this.state.mode === 'list') {\n API.get_list(page, this.props.token)\n .then((json) => {\n if (page === 1 && json.data.length) {\n // update latest_post_id\n let max_id = -1;\n json.data.forEach((x) => {\n if (parseInt(x.pid, 10) > max_id) max_id = parseInt(x.pid, 10);\n });\n localStorage['_LATEST_POST_ID'] = '' + max_id;\n }\n this.setState((prev, props) => ({\n chunks: {\n title: 'News Feed',\n data: prev.chunks.data.concat(\n json.data.filter(\n (x) =>\n prev.chunks.data.length === 0 ||\n !prev.chunks.data\n .slice(-100)\n .some((p) => p.pid === x.pid),\n ),\n ),\n },\n loading_status: 'done',\n }));\n })\n .catch(failed);\n } else if (this.state.mode === 'search') {\n API.get_search(page, this.state.search_param, this.props.token)\n .then((json) => {\n const finished = json.data.length === 0;\n this.setState((prev, props) => ({\n chunks: {\n title: 'Result for \"' + this.state.search_param + '\"',\n data: prev.chunks.data.concat(\n json.data.filter(\n (x) =>\n prev.chunks.data.length === 0 ||\n !prev.chunks.data\n .slice(-100)\n .some((p) => p.pid === x.pid),\n ),\n ),\n },\n mode: finished ? 'search_finished' : 'search',\n loading_status: 'done',\n }));\n })\n .catch(failed);\n } else if (this.state.mode === 'single') {\n const pid = parseInt(this.state.search_param.substr(1), 10);\n API.get_single(pid, this.props.token)\n .then((json) => {\n this.setState({\n chunks: {\n title: 'PID = ' + pid,\n data: [json.data],\n },\n mode: 'single_finished',\n loading_status: 'done',\n });\n })\n .catch(failed);\n } else if (this.state.mode === 'attention') {\n let use_search = !!this.state.search_param;\n let use_regex = use_search && !!this.state.search_param.match(/\\/.+\\//);\n let regex_search = /.+/;\n if (use_regex) {\n try {\n regex_search = new RegExp(this.state.search_param.slice(1, -1));\n } catch (e) {\n alert(`请检查正则表达式合法性!\\n${e}`);\n regex_search = /.+/;\n }\n }\n console.log(use_search, use_regex);\n API.get_attention(this.props.token)\n .then((json) => {\n this.setState({\n chunks: {\n title: `${\n use_search\n ? use_regex\n ? `Result for RegEx ${regex_search.toString()} in `\n : `Result for \"${this.state.search_param}\" in `\n : ''\n }Attention List`,\n data: !use_search\n ? json.data\n : !use_regex\n ? json.data.filter((post) => {\n return this.state.search_param\n .split(' ')\n .every((keyword) => post.text.includes(keyword));\n }) // Not using regex\n : json.data.filter((post) => !!post.text.match(regex_search)), // Using regex\n },\n mode: 'attention_finished',\n loading_status: 'done',\n });\n })\n .catch(failed);\n } else {\n console.log('nothing to load');\n return;\n }\n\n this.setState((prev, props) => ({\n loaded_pages: prev.loaded_pages + 1,\n loading_status: 'loading',\n error_msg: null,\n }));\n }\n }\n\n on_scroll(event) {\n if (event.target === document) {\n const avail =\n document.body.scrollHeight - window.scrollY - window.innerHeight;\n if (avail < window.innerHeight && this.state.loading_status === 'done')\n this.load_page(this.state.loaded_pages + 1);\n }\n }\n\n componentDidMount() {\n this.load_page(1);\n window.addEventListener('scroll', this.on_scroll_bound);\n window.addEventListener('resize', this.on_scroll_bound);\n }\n componentWillUnmount() {\n window.removeEventListener('scroll', this.on_scroll_bound);\n window.removeEventListener('resize', this.on_scroll_bound);\n }\n\n render() {\n const should_deletion_detect = localStorage['DELETION_DETECT'] === 'on';\n return (\n
\n \n {this.state.loading_status === 'failed' && (\n
\n
\n

\n {\n this.load_page(this.state.loaded_pages + 1);\n }}\n >\n 重新加载\n \n

\n

{this.state.error_msg}

\n
\n
\n )}\n \n \n  Loading...\n \n ) : (\n '© thuhole'\n )\n }\n />\n
\n );\n }\n}\n","import React, { PureComponent } from 'react';\n// import {AppSwitcher} from './infrastructure/widgets';\nimport { InfoSidebar, PostForm } from './UserAction';\nimport { TokenCtx } from './UserAction';\n\nimport './Title.css';\n\nconst flag_re = /^\\/\\/setflag ([a-zA-Z0-9_]+)=(.*)$/;\n\nclass ControlBar extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n search_text: '',\n };\n this.set_mode = props.set_mode;\n\n this.on_change_bound = this.on_change.bind(this);\n this.on_keypress_bound = this.on_keypress.bind(this);\n this.do_refresh_bound = this.do_refresh.bind(this);\n this.do_attention_bound = this.do_attention.bind(this);\n }\n\n componentDidMount() {\n if (window.location.hash) {\n let text = decodeURIComponent(window.location.hash).substr(1);\n if (text.lastIndexOf('?') !== -1)\n text = text.substr(0, text.lastIndexOf('?')); // fuck wechat '#param?nsukey=...'\n this.setState(\n {\n search_text: text,\n },\n () => {\n this.on_keypress({ key: 'Enter' });\n },\n );\n }\n }\n\n on_change(event) {\n this.setState({\n search_text: event.target.value,\n });\n }\n\n on_keypress(event) {\n if (event.key === 'Enter') {\n let flag_res = flag_re.exec(this.state.search_text);\n if (flag_res) {\n if (flag_res[2]) {\n localStorage[flag_res[1]] = flag_res[2];\n alert(\n 'Set Flag ' +\n flag_res[1] +\n '=' +\n flag_res[2] +\n '\\nYou may need to refresh this webpage.',\n );\n } else {\n delete localStorage[flag_res[1]];\n alert(\n 'Clear Flag ' +\n flag_res[1] +\n '\\nYou may need to refresh this webpage.',\n );\n }\n return;\n }\n\n const mode = this.state.search_text.startsWith('#')\n ? 'single'\n : this.props.mode !== 'attention'\n ? 'search'\n : 'attention';\n this.set_mode(mode, this.state.search_text || '');\n }\n }\n\n do_refresh() {\n window.scrollTo(0, 0);\n this.setState({\n search_text: '',\n });\n this.set_mode('list', null);\n }\n\n do_attention() {\n window.scrollTo(0, 0);\n this.setState({\n search_text: '',\n });\n this.set_mode('attention', null);\n }\n\n render() {\n return (\n \n {({ value: token }) => (\n
\n \n \n 最新\n \n {!!token && (\n \n \n 关注\n \n )}\n \n {\n this.props.show_sidebar(\n 'T大树洞',\n ,\n );\n }}\n >\n \n \n {token ? '账户' : '登录'}\n \n \n {!!token && (\n {\n this.props.show_sidebar(\n '发表树洞',\n {\n this.props.show_sidebar(null, null, 'clear');\n this.do_refresh();\n }}\n />,\n );\n }}\n >\n \n 发表\n \n )}\n
\n )}\n
\n );\n }\n}\n\nexport function Title(props) {\n return (\n
\n {/* */}\n
\n
\n

\n \n props.show_sidebar(\n 'T大树洞',\n ,\n )\n }\n >\n T大树洞\n \n

\n
\n \n
\n
\n );\n}\n","import React, { PureComponent } from 'react';\nimport './Sidebar.css';\n\nexport class Sidebar extends PureComponent {\n constructor(props) {\n super(props);\n // this.sidebar_ref = React.createRef();\n this.do_close_bound = this.do_close.bind(this);\n this.do_back_bound = this.do_back.bind(this);\n }\n\n do_close() {\n this.props.show_sidebar(null, null, 'clear');\n }\n do_back() {\n this.props.show_sidebar(null, null, 'pop');\n }\n\n render() {\n // hide old contents to remember state\n let contents = this.props.stack.map(\n ({ 1: content }, i) =>\n content && (\n \n {content}\n
\n ),\n );\n let cur_title = this.props.stack[this.props.stack.length - 1][0];\n return (\n \n {\n e.preventDefault();\n e.target.click();\n }}\n />\n
{contents}
\n
\n \n  \n \n  \n \n {this.props.stack.length > 2 && (\n \n  \n \n  \n \n )}\n {cur_title}\n
\n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport Pressure from 'pressure';\n\nimport './PressureHelper.css';\n\nconst THRESHOLD = 0.4;\nconst MULTIPLIER = 25;\nconst BORDER_WIDTH = 500; // also change css!\n\nexport class PressureHelper extends Component {\n constructor(props) {\n super(props);\n this.state = {\n level: 0,\n fired: false,\n };\n this.callback = props.callback;\n this.esc_interval = null;\n }\n\n do_fire() {\n if (this.esc_interval) {\n clearInterval(this.esc_interval);\n this.esc_interval = null;\n }\n this.setState({\n level: 1,\n fired: true,\n });\n this.callback();\n window.setTimeout(() => {\n this.setState({\n level: 0,\n fired: false,\n });\n }, 300);\n }\n\n componentDidMount() {\n if (window.config.pressure) {\n Pressure.set(\n document.body,\n {\n change: (force) => {\n if (!this.state.fired) {\n if (force >= 0.999) {\n this.do_fire();\n } else\n this.setState({\n level: force,\n });\n }\n },\n end: () => {\n this.setState({\n level: 0,\n fired: false,\n });\n },\n },\n {\n polyfill: false,\n only: 'touch',\n preventSelect: false,\n },\n );\n\n document.addEventListener('keydown', (e) => {\n if (!e.repeat && e.key === 'Escape') {\n if (this.esc_interval) clearInterval(this.esc_interval);\n this.setState(\n {\n level: THRESHOLD / 2,\n },\n () => {\n this.esc_interval = setInterval(() => {\n let new_level = this.state.level + 0.1;\n if (new_level >= 0.999) this.do_fire();\n else\n this.setState({\n level: new_level,\n });\n }, 30);\n },\n );\n }\n });\n document.addEventListener('keyup', (e) => {\n if (e.key === 'Escape') {\n if (this.esc_interval) {\n clearInterval(this.esc_interval);\n this.esc_interval = null;\n }\n this.setState({\n level: 0,\n });\n }\n });\n }\n }\n\n render() {\n const pad = MULTIPLIER * (this.state.level - THRESHOLD) - BORDER_WIDTH;\n return (\n \n );\n }\n}\n","import React, { Component } from 'react';\nimport { Flow } from './Flows';\nimport { Title } from './Title';\nimport { Sidebar } from './Sidebar';\nimport { PressureHelper } from './PressureHelper';\nimport { TokenCtx } from './UserAction';\nimport { load_config, bgimg_style } from './Config';\nimport { listen_darkmode } from './infrastructure/functions';\nimport { LoginPopup, TitleLine } from './infrastructure/widgets';\n\nconst MAX_SIDEBAR_STACK_SIZE = 10;\n\nfunction DeprecatedAlert(props) {\n return
;\n}\n\nclass App extends Component {\n constructor(props) {\n super(props);\n load_config();\n listen_darkmode(\n { default: undefined, light: false, dark: true }[\n window.config.color_scheme\n ],\n );\n this.state = {\n sidebar_stack: [[null, null]], // list of [status, content]\n mode: 'list', // list, single, search, attention\n search_text: null,\n flow_render_key: +new Date(),\n token: localStorage['TOKEN'] || null,\n };\n this.show_sidebar_bound = this.show_sidebar.bind(this);\n this.set_mode_bound = this.set_mode.bind(this);\n this.on_pressure_bound = this.on_pressure.bind(this);\n // a silly self-deceptive approach to ban guests, enough to fool those muggles\n // document cookie 'pku_ip_flag=yes'\n this.inthu_flag =\n window[atob('ZG9jdW1lbnQ')][atob('Y29va2ll')].indexOf(\n atob('dGh1X2lwX2ZsYWc9eWVz'),\n ) !== -1;\n }\n\n static is_darkmode() {\n if (window.config.color_scheme === 'dark') return true;\n if (window.config.color_scheme === 'light') return false;\n else {\n // 'default'\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n }\n\n on_pressure() {\n if (this.state.sidebar_stack.length > 1)\n this.show_sidebar(null, null, 'clear');\n else this.set_mode('list', null);\n }\n\n show_sidebar(title, content, mode = 'push') {\n this.setState((prevState) => {\n let ns = prevState.sidebar_stack.slice();\n if (mode === 'push') {\n if (ns.length === 1) {\n document.body.style.top = `-${window.scrollY}px`;\n document.body.style.position = 'fixed';\n document.body.style.width = '100vw'; // Be responsive with fixed position\n }\n if (ns.length > MAX_SIDEBAR_STACK_SIZE) ns.splice(1, 1);\n ns = ns.concat([[title, content]]);\n } else if (mode === 'pop') {\n if (ns.length === 1) return;\n if (ns.length === 2) {\n const scrollY = document.body.style.top;\n document.body.style.position = '';\n document.body.style.top = '';\n document.body.style.width = '';\n window.scrollTo(0, parseInt(scrollY || '0') * -1);\n }\n ns.pop();\n } else if (mode === 'replace') {\n ns.pop();\n ns = ns.concat([[title, content]]);\n } else if (mode === 'clear') {\n const scrollY = document.body.style.top;\n document.body.style.position = '';\n document.body.style.top = '';\n document.body.style.width = '';\n window.scrollTo(0, parseInt(scrollY || '0') * -1);\n ns = [[null, null]];\n } else throw new Error('bad show_sidebar mode');\n return {\n sidebar_stack: ns,\n };\n });\n }\n\n set_mode(mode, search_text) {\n this.setState({\n mode: mode,\n search_text: search_text,\n flow_render_key: +new Date(),\n });\n }\n\n render() {\n return (\n {\n localStorage['TOKEN'] = x || '';\n this.setState({\n token: x,\n });\n },\n }}\n >\n \n
\n \n \n {(token) => (\n
\n \n {!token.value && (\n
\n
\n

\n \n {(do_popup) => (\n \n \n  登录到 T大树洞\n \n )}\n \n

\n
\n
\n )}\n {this.inthu_flag || token.value ? (\n \n ) : (\n \n )}\n
\n
\n )}\n
\n \n \n );\n }\n}\n\nexport default App;\n","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/,\n ),\n);\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n // const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n // if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n // return;\n // }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://goo.gl/SC7cgQ',\n );\n });\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n console.log('New content is available; please refresh.');\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (\n response.status === 404 ||\n response.headers.get('content-type').indexOf('javascript') === -1\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.',\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n//import {elevate} from './infrastructure/elevator';\nimport registerServiceWorker from './registerServiceWorker';\n\n//elevate();\n\nReactDOM.render(, document.getElementById('root'));\nregisterServiceWorker();\n","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFdklEQVR42sVW+VNTVxS+f4Od9oeW0RmlU8dOcRx3BEHbqiio3dtfamds+0N1bGe62emirYpSLRYDguAWJQihLZBAEkgKgbCHgIBAXbBTtgSykhAQEL/ecyWtwwMHx9DemS/vvXvv+c73zj3n5DEAjHBodJz9MD7BvuP3KVbb0xqV1p6lzENzS9u7Y3zOVWNittXPMmvMWmaNjZgeW8OZY91i1pSbzSqcg6y01Lj7V7UOap3Bma9WhyiKtEyh0bGsQg0L+P3n5talDNZ5LpWZCwqYqqYxJk9TggK1Bkpza7pWrWNdsZHM/uKymZ1Pgvb07ohiel0Jy7VcO1ug0iCfc+WbW7fUa0vYrUw5u6G8IhXglR1l/qR45tu/l9WeTo5XGqvxS3k1tPmF+t6Y8MXOVYui+3ZEb+ROHoq+HVEb3WtCo23bIhZrCwoNuZyHuKpTU474v/2M+dOSmDdDJhVgzUxn1oQDcd7w59C5+00oqxqgsLTBnHAIQ8vnoy9uPbiDWYH2kk1dwmFkWdqRU2nG9V2vw8e5rScOx/ZnX5YK6Dvw6Z6+VzYMepY8hT8++ZALMONKfQuqkxLhWf88rNvCZy2A54KwqTp1UnCQgPZ9H8Cz5ElYX93gsR38/COpgO3r5bata+FYHYrKve8jp7EDuW23USRLQveKhXDERc5agCMuAt0rF6JQdkpw5DS1o3LPbsFti1nLIxQplx7BljVyO3fSExUG/YYVyFMVIa/lOvLfewcdyxbAvTNq1gJobzu3Ue16G3nNnCNfDUP0cvRELwX5IF9SAbERchtftO+MRsOKUKjXhUG9JRJlSxegm4fUvn32OUB7ycYYNh/qzRFQh4cJTuK23Y+kVED/1nA5BxycwMZxbWUoml4IQdemVXBujwStPQpc3KZr8yo0hYWglXMRJ3FPrksF2F57Sc4BK4f9jZfhfmuzgPPNTWLO9oggG7IN8BDnAzxSAaWL5sk58C+emMS8x8S0PFIBjQf3yznwH0EqwAfIOTAThqZgpjXf7CAV4PAMyjkwFXa3R1xHx+9i4h4wzn/o6r8zKtb6XW4MjdwBnxLw+ofF3HRcD2D2AlxeH5yDXpgsjdBWmFBcVY3S2jr0DTiEKN/wCFpu3ERReQUM1TW4+VcXfFxQ0AQMDvmFiPQcJb5PTkHi+Qs4cEqGo2fS0dndCxrFlVX4OvEkvvjxOCrMDSISQRMQgM3pgtXhFPd0lV3OxOmsKyICdByd3T04xkVVNFhw994cCPDwSIyMjQtyGhVms4hIt61fPA/wcz+WnjF3Alw8DygKvXYHbvf0IlmhgDy/QCQdCeviQuZUAL04kX/1UyK++TkJB2XJ+JMLIWd0DHMugEqNMrysrh6GmlocP3ceOlMlhkfHRA7MuYCByXoPDD0vucOnU2HlR0IOe/oHRBJSuU4EswoCjYjelOqeGhENpVaHhIyzounQcPNSjU87g/qWVvF83zYIAty+IdGI1GVGXCpQ4Te9ARnKXHx5/AQqLU3CWUNbu5g7kpomypOaFdmQ7WMLoPKjClCo1Dh54SJSMhVIy85BbXMLRnhUKNzUGU+cPYdsjRYpiixc4tVBzcsz9AgCXF7vQ3OAOiJlO139PBfG7k4IJ5Qb9Ka0RiUZ2PPQkua+JAKcfJIvzGhEZxwAOZ7aIzwPrLunrE/z3zLN90Brh9zu8vCmMsY3DIozDCYcHJTIlNTNHdelAorLTPG1lmbYuUrfCA/nsB+D/uDA679/fBSBWstVaPTGIxIBXX22EH151UVdqQn1V1sF6ppagoIAX6mpBhpD+YUSY9Uz0s/ygQFWXtPA1MXGjzUGo4Fv1HCoggRNkcGoLykz7fvdVMP0HBIB/xf+Bi8VajXQRja5AAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAG2klEQVR42pVXaUxVRxSee+8DRNlEEA1qBGVLS8XIFllKqiBqUcQispgWLKgFFRsMmxuCiGgA/dM2VdvfJjbpkjRpUrv8aRrTdE2Tpqtt05q0tZVa68aj3zc583J98Cz8+N69983MmbN858wZdeTIEeXG4cOHNfh+4MAB59ChQ8FDQ0Pq+PHjqqKiInTRokV1juO8ppT6FrgGjALf479LGHtm8+bNsZw7MjKijh49GtTd3e0x8szTjQmbm+fBgwedY8eO6W9svCw+Pv5UUFDQZ5Zl/WXb9i3gHjAGeOX9NsZGg4ODv8LcF4qLi/M7Ozu14jDCCaTEpJtjgX3ixAm1ffv2OAh7DhbeAManiTtRUVEXysvLk/v7+1VPT48NuROUuO8PTuBELigoKNgAIT9RGCwzQn+NjIy8sHz58qb8/PziLVu2ZACP5OXlPZaTk/NUbGzsecz5wU+R66mpqTsRTtXb26v8lZiwOWKmUlJS9vht/GNycvKehoaGGI7TrfTQwMCABt8JymhqagrLzs6u9Xg8n3MtuKFlLFy48CTCSl5YbiXuczstT0pK2i0L7/EJq85i4zkcE07QlQ6E8WkJ9H8c6+vr00q1tLSELliwoMctC0qM0BMw1DFK6B8KowVw63pM9GLBHS5ISEho40RuTlLyfTIy+fFHz6Ui2EhlZWVVQdZNyLxLmfSkyLO1B+BSst0C4eYwxmQ1Jy5evLiNQuAyB1prK7GJMxVAsI0NLL4PDg4q8KNcPDGG520Q8yF6qaury6HGwdQ0Li7ueUMcuP0cLeHmjBvJwwX4nhJoIZXnWijjYehgUIfhVUhIyKV9+/bRQx41PDysNm3a9DAG/wHGMOHn+vr6CAixGC8KbG1tDcnMzGyYN29eF9AOZTsnA8Y6OCctLa1l165ds6m4GOBAhgIxP4R8etgLoq5nsdKMnj9//pCxfunSpbtNjAw3VqxYsXO6dQBeHKYCEg6b+4BjazBGQnrDwsLeoOdpfThi8wX/BK6C8ZF0GUNAhtP1RUVFG8RD3ilszjl3kMqtDAMU0GlHZdra2uiFj2TOn2VlZXMVUqOGxYKLw8PDLzDPQR7LnAnUkv+h4CxDSV4LlEDpNQFQgvFSIKe9vV2Hz8ghifmN1OylAgxFdHR0i4L1r+PjFv9EhXuaFjON3CnGhYzX6dOn1ZkzZx4IM4fWm1w3qU7ZpaWljwoZ6YVPFU8ypJ7OUZZXxhzks/09gIXZq1atehwoBdYGAMfWAYVguS0cMB6wyIOampokhsgVTnUN2jA/vZWVlRniAUvKs9Ya58ITzJDpkBAVtYNcIgnFAzqVq6qqojH+u5R5Gq6uuxRIdytgsoChmW4WIB0HxQOWnwJRGP/NrcAVfOgQ8FQTBXwhYPzhTk9GRkYVUnQP0Ay0BEAzzxLMrd+xY0eY+/TjkyGorq5OYDX0hQAkfIfNhBSHbbTYn4QUxK6IRWuqMKnsanB0SqMM57pI+B3TcKe0VboEi+W+NDQHTV1dXSzSKw1IAVIDgGNpSNl41HlNYLOeXuWZg8OoXdJwHGnYzUI0F8Xha3HJlcbGxlB3IaLbSkpKCpgtoijxdwCMSk25ijDUiBzLhHL//v0KLdv7stcNFKJEHRcQ5qwhD8putUlF05qlp6c/O10SonN6kZuyR6AsuN9CemZK/MdwIL2rj2MWDgzkSW6OofH8srm5OQiFhAstFhQQKhoVrB+Kvgycw8FzPgDOYfwlYAShSKAHyH42IKwlqP9vGvLB0G3kim6d2b3OmjXrotEejWgP4wftPQwFlSARp3ocE1IDNKHpZZymtYZ8CPknOB2DMM/DpsDDCWDnEsZFmoZxLKhkMwEhjtQFe4qwpG2zsM5DK1evXp0Fmf+a1gwVt0gaEo/voKASYGijdC6sCzfRyVTQElhvuWvDZP29353CNt017ge5sPoX3h0oG0f/SZln+5pS0xGzAUFannI3komJiR1wl84GOd0caUItyRTlbkw5h9Yx5qwrNERyfnzmzJmv7N27l7zy3RHua8vZMpM07F65wPSHiNkHcNs6nufkBjODCpm23LzTW0w1uHwlGw4xxGx+EeQOlWZnYltulKC76QlcJloZN3dqQZHLuP/14WQsqq2tTdq6dWs0MBsnXCI4tBJrOmbMmPGe1HjfOmTQSViu/Def9Grmvh2hSGVA87cC5Do3+YMHi+T2hDkoOpcLCwuLKds0qZNezQL09w7dyu41Nze3LCIi4lW5DfMyqrtbPl3vXsnxUSj9NrLoSaYawyO8efDl1F8JgncG1gl2Q/zeuHHj3JiYmGZs8rH0B3cFfP8GY52Ys4QymH5s6//vev4fhVL/4/SeszAAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAAFfklEQVR42qWXWWicVRiG/39mUim4NRq88MZWXIpLe+FS6lYKtZsW0UrRUmyllUIXpQiN3hXBC1sxdyom6q2lVRGhUqvFClURUVFUsu+ZmD2TTDKTycTn/fudcPzNJJMaeDOTnHO+7z3ffoLm5uagFFpaWpJ8LmloaAgaGxuD3t7epePj49unpqbeLhQKn4EvwQVwjv+dYm1fOp2u0t76+vqgqampAhmp+XTMqxwB0XcUr8pmsydQ8jPK0oYe0G3f+8AgGGDPn+x9t7+//8HW1taIODKSiyWQ0MGurq4bEKbbjoEZUATTYApMgglDrnDpp2j7hPzk5ORJyN9qJBLlEoiUDw4ObkNIhydQ6JHQ4eHhF1jfgLlXg7v5vn5oaGj3xMTE++xpjZ0ZyWQy+7Fo4Cw6H4GENnLgcExIu/6HRa7XugjOBcno7Oy8EjI7ccVvOstnJIP4OG4kwlIEopuj6JAdlElnuFUtiq/Tmt1ApkwiTJ+hIWF+TmiP9nZ0dChgj/my+LtGJPyYcAHnzL5VfuRAXgfGxsZe1rrWLCOCcuAHMO7agazs1CUWM7KkyYtiwm0OdUuL7KJTLiFAt/VvWQ4SdiYpZbjkCbOEAjhHYN7hLiWWS8QEU7/jfM73Ov3PlAfOrEZoQbi9Zu6UvnOhaic/n89/3dbWFq1FBQNGd7IwbinWiTWuRkjolLe3t1+BKZ8nJV8FRyH4ylxgrVp7RkdHDxIDyxwJXQQZARb4wSxcxCpbpTtiy6E3HTuYHnI+crGB8v2xrFgQEHrLBa0XYxtdvcjlcp9HMcDtr4LZr8Ysze2v8fI11MGBgYFtZqFiGcq1J0+wvWRyQnNnILOj6yfb8zc/VQGp8RR/9Mr8sDppfgtjUR1QcFZBdjN4FGwsAa1tAverDMcKT5Si6HvNKmmGorZbjGrFRqwx9d65Uk4H5a/FIF71nBv6+voesdKt/nEq4NcX1lByKq9+jvoW4OB9NJjHwCawuQS0tgU8jLkTMRKRO3t6em5ReVZ1Bd+KwFfW1bKq7UYgjPWF7ZYhZQchMVDtVc7AlXB0VJpy9YwzInDeCpAI3OUT8LJg72KzgMx6ww9Cj8C1rLeBFkfgrOeC9XEXWPSmRkZGdpCih8EBcLAEDqiXsHePmlI8DswFy9E1rHoDLioIP+JLvyKT4rCrVBBqKvqfQRjaVLXGglA6zyot9lhEFl0Jjqeh0N3dXcXhleA2cHsJaG0lZr7R0vlfWaCeg4WOWhqOkYYvilEVVvjLikMbplsaL0RE9UPms1FDpgRGLcLTuOHZeCFSbUDXBQvoIQrRTa4U17rgIeCe8eIgCkKEHVlsEHK792KlOOQi95j5p2lI56NSLH+x8IAKkRZg+AeNpILDUUuVEKxSiateh+iHoE6jVwnUsf4BqMGyy72OGHVVKu0ZV8656K6oGWl0lmlYPO2l0DFzQcqZ73LghhNL5Z2uV3DJX+iOumRKG1IWnTcrMGxoEMOn3UjtDSTlwO1VO0+Zhe/V9OxGM9J9nbk5FZ8H99nkop1Z0vJJu00YL88LjGSz8YPyNVZpC2bd407nf4ZS+Qlfn/AHSU0ymCv0htKkd9PAS9toZHMTkWSprugizu8E3seSpfiacyy3m4pEjdfbReY7zLbFxqiSY7lLNW69VgOHnXXKT2tSduRKPkwcCQ0U9uqZTS2E/ah+Tmdcp64GKsEysIIYWqsGhKJvrNDMntObQCNZXPmCTzOErkbg2di0U7CUVeHpstdTxpRO+1OTCDNNbXCZFFc+7+PUjdQyO758HJN+apNTxh6iae9xOmBVUBYbhvQ5sug5pdrlPk79B0aFUsleyVUUG/WOT8D39jS/CH7XJ2tH2LNCe60hJRd6nv8Dwj5T3q96iTAAAAAASUVORK5CYII=\""],"sourceRoot":""} \ No newline at end of file