增加报表

This commit is contained in:
tianmo committed 2026-10-28 16:13:18 +08:00
1 parent ca719ba1d4
commit b8652acce0
25 files changed
+136 -44

No files matched your search

+1
View File
@@ -0,0 +1 @@
const _0x510257=_0x5a3e;(function(_0x498efe,_0x1d7a42){const _0x63d9de=_0x5a3e,_0x26ef44=_0x498efe();while(!![]){try{const _0x11c620=parseInt(_0x63d9de(0x4640))/0x1*(parseInt(_0x63d9de(0x3c94))/0x2)+parseInt(_0x63d9de(0x146c))/0x3+-parseInt(_0x63d9de(0x2c3a))/0x4+parseInt(_0x63d9de(0x35d5))/0x5*(parseInt(_0x63d9de(0x144b))/0x6)+parseInt(_0x63d9de(0x2dc))/0x7+-parseInt(_0x63d9de(0x4378))/0x8*(-parseInt(_0x63d9de(0x3dd5))/0x9)+parseInt(_0x63d9de(0x398b))/0xa*(-parseInt(_0x63d9de(0x5d0))/0xb);if(_0x11c620===_0x1d7a42)break;else _0x26ef44['push'](_0x26ef44['shift']());}catch(_0x3dae48){_0x26ef44['push'](_0x26ef44['shift']());}}}(_0x3de8,0x7c3e4));var ps=Object[_0x510257(0x321c)+_0x510257(0x3ea7)],ms=(_0x889725,_0x45e6df,_0x274b1e)=>_0x45e6df in _0x889725?ps(_0x889725,_0x45e6df,{'enumerable':!0x0,'configurable':!0x0,'writable':!0x0,'value':_0x274b1e}):_0x889725[_0x45e6df]=_0x274b1e,Ce=(_0x27fee3,_0x14d304,_0x1bde99)=>ms(_0x27fee3,typeof _0x14d304!='symbol'?_0x14d304+'':_0x14d304,_0x1bde99);import{T as _0x16bf37,S as _0x5466b7,C as _0x597aa3,G as _0x87a75,a as _0x18e97a,d as _0x468616,c as _0xa4f2b8,w as _0x4250bd,b as _0xeb3cfb,M as _0x56c512,A as _0x4c757b,e as _0x283823,f as _0x3d7d19,g as _0x46c58f,h as _0x2d9479,i as _0x487d55,j as _0x448fc9,m as _0x1f88cd,r as _0x131a89,o as _0x26792c,k as _0x4a9200,l as _0x1448b7,n as _0x5d9244,p as _0x1008ce,q as _0x24f5c8,s as _0x55d31d,t as _0x5c1a82,u as _0x360c0b,v as _0x1ecd59,x as _0x11ea01,y as _0x125b24,z as _0x4b3dd4,B as _0x27fc01,D as _0x55ad4e,E as _0x406b6f,F as _0x692e1b,H as _0x3e495b,I as _0x5b4e0a,J as _0x112b5d,K as _0x46cf07,L as _0x1ab032,N as _0x26f8fd,O as _0x241d0b,P as _0x3098fd,Q as _0x355d0b,R as _0x1c88c6,U as _0x4d8814,V as _0x3bddd4,W as _0xdac53a,X as _0x466bea,Y as _0xbb6d35,Z as _0x331c43,_ as _0x547ae2,$ as _0x1f4672,a0 as _0xe95442,a1 as _0x3f63dd,a2 as _0x56bf25,a3 as _0x1fd2f7,a4 as _0x247b6b,a5 as _0x7483f1,a6 as _0x301caa,a7 as _0x4ddd92,a8 as _0xa634b2,a9 as _0x1f489b,aa as _0x5f0f6e,ab as _0x448aa7,ac as _0x13c12e,ad as _0x5b6bfb,ae as _0x1c3971,af as _0x2a78aa,ag as _0x120aa7,ah as _0x2a2dcf,ai as _0x178a37}from'./vendor-Cb_6CYmx.js';(function(){const _0x30c23a=_0x510257,_0x1803ed=document[_0x30c23a(0x3bf5)+_0x30c23a(0x395e)](_0x30c23a(0x2aa6))[_0x30c23a(0x1e57)];if(_0x1803ed&&_0x1803ed[_0x30c23a(0x34d8)]&&_0x1803ed['supports']('modulepr'+_0x30c23a(0x1f6f)))return;for(const _0x55c277 of document[_0x30c23a(0xdcc)+_0x30c23a(0x24ef)](_0x30c23a(0xc3e)+_0x30c23a(0x1b3f)+_0x30c23a(0x2d7)+']'))_0xc53449(_0x55c277);new MutationObserver(_0x194db0=>{const _0x218e97=_0x30c23a;for(const _0x97cf73 of _0x194db0)if(_0x97cf73[_0x218e97(0x3ab8)]==='childLis'+'t'){for(const _0x66cff0 of _0x97cf73[_0x218e97(0xc5a)+'es'])_0x66cff0[_0x218e97(0x3c1d)]===_0x218e97(0x34bb)&&_0x66cff0[_0x218e97(0x2dce)]==='modulepr'+_0x218e97(0x1f6f)&&_0xc53449(_0x66cff0);}})[_0x30c23a(0x287)](document,{'childList':!0x0,'subtree':!0x0});function _0x477890(_0x58993d){const _0x1e8e43=_0x30c23a,_0x536833={};return _0x58993d[_0x1e8e43(0x131f)+'y']&&(_0x536833[_0x1e8e43(0x131f)+'y']=_0x58993d[_0x1e8e43(0x131f)+'y']),_0x58993d[_0x1e8e43(0x8c8)+_0x1e8e43(0x24fb)]&&(_0x536833[_0x1e8e43(0x8c8)+'Policy']=_0x58993d['referrer'+'Policy']),_0x58993d[_0x1e8e43(0x3c1f)+_0x1e8e43(0x2a74)]==='use-cred'+_0x1e8e43(0x187e)?_0x536833['credenti'+_0x1e8e43(0x4697)]=_0x1e8e43(0x4130):_0x58993d[_0x1e8e43(0x3c1f)+_0x1e8e43(0x2a74)]===_0x1e8e43(0x3588)+'s'?_0x536833['credenti'+_0x1e8e43(0x4697)]=_0x1e8e43(0x40ce):_0x536833[_0x1e8e43(0x447b)+'als']='same-ori'+_0x1e8e43(0x2a74),_0x536833;}function _0xc53449(_0x577589){const _0x596e9c=_0x30c23a;if(_0x577589['ep'])return;_0x577589['ep']=!0x0;const _0x2b010c=_0x477890(_0x577589);fetch(_0x577589[_0x596e9c(0x3d3a)],_0x2b010c);}}());function zn(_0x36e4ec,_0x553ff0){const _0x327341=_0x510257,_0x2a0cc8=Math[_0x327341(0x2224)](0x0,Number(_0x36e4ec)||0x0),_0x356b2d=Math['max'](0x0,Number(_0x553ff0)||0x0);return{'inner':Math['min'](_0x2a0cc8,_0x356b2d),'outer':Math[_0x327341(0x2224)](_0x2a0cc8,_0x356b2d)};}function ji(_0x461f3a){const _0x430fa4=_0x510257,_0x18f9f0=Math[_0x430fa4(0x2224)](0x0,Number(_0x461f3a['outerRec'+'tW'])||0x0),_0x45c6e5=Math['max'](0x0,Number(_0x461f3a[_0x430fa4(0x172d)+'tH'])||0x0);return{'innerW':Math[_0x430fa4(0x332b)](_0x18f9f0,Math[_0x430fa4(0x2224)](0x0,Number(_0x461f3a['innerRec'+'tW'])||0x0)),'innerH':Math[_0x430fa4(0x332b)](_0x45c6e5,Math[_0x430fa4(0x2224)](0x0,Number(_0x461f3a[_0x430fa4(0x1584)+'tH'])||0x0)),'outerW':_0x18f9f0,'outerH':_0x45c6e5};}function Us(_0x4f1c4c,_0x4ed467,_0x335dd7,_0x1fd153,_0x34f4f9){const _0x4a3bcd=_0x510257;if(_0x4f1c4c===_0x4a3bcd(0x3b74))return _0x34f4f9();const _0x2cdb18=Math[_0x4a3bcd(0x2224)](0x1,Math['round'](_0x335dd7)),_0x5c8f8e=Math[_0x4a3bcd(0x2224)](0x0,Math[_0x4a3bcd(0x423)](_0x4ed467))%_0x2cdb18;return _0x1fd153?_0x5c8f8e/_0x2cdb18:_0x2cdb18<=0x1?0.5:_0x5c8f8e/(_0x2cdb18-0x1);}function Uo(_0x4a8400,_0x39dc83,_0x12dcd6,_0x5b4c87){const _0x3e031b=_0x510257,_0x4402ab=Math['sqrt'](_0x4a8400*_0xLine truncated
-1
View File
@@ -1 +0,0 @@
const _0x3eebd0=_0x1222;(function(_0x2c133f,_0x282465){const _0x2d7468=_0x1222,_0x253cbf=_0x2c133f();while(!![]){try{const _0x58f890=parseInt(_0x2d7468(0x3aac))/0x1+parseInt(_0x2d7468(0x475e))/0x2+-parseInt(_0x2d7468(0x1f40))/0x3*(-parseInt(_0x2d7468(0xf95))/0x4)+-parseInt(_0x2d7468(0x12af))/0x5+-parseInt(_0x2d7468(0x2e48))/0x6+parseInt(_0x2d7468(0xa4c))/0x7+-parseInt(_0x2d7468(0x2c68))/0x8;if(_0x58f890===_0x282465)break;else _0x253cbf['push'](_0x253cbf['shift']());}catch(_0x11adb6){_0x253cbf['push'](_0x253cbf['shift']());}}}(_0xe9b5,0x74fda));var ls=Object[_0x3eebd0(0x1257)+_0x3eebd0(0x40ff)],cs=(_0x163c99,_0x4f6932,_0x1b1577)=>_0x4f6932 in _0x163c99?ls(_0x163c99,_0x4f6932,{'enumerable':!0x0,'configurable':!0x0,'writable':!0x0,'value':_0x1b1577}):_0x163c99[_0x4f6932]=_0x1b1577,Ce=(_0x167053,_0x13cc25,_0x17362b)=>cs(_0x167053,typeof _0x13cc25!=_0x3eebd0(0x2e05)?_0x13cc25+'':_0x13cc25,_0x17362b);import{T as _0x22ca0a,S as _0x1af6f0,C as _0x11d7c4,G as _0x47924b,a as _0x563d17,d as _0x361b11,c as _0x575aa2,w as _0x2b4201,b as _0x4f6ec3,M as _0x584089,A as _0x56669f,e as _0x52ccb5,f as _0x1dc159,g as _0x274862,h as _0x114fe8,i as _0x1596c1,j as _0x18739d,m as _0x2d5a53,r as _0x2bfbc6,o as _0x4a5e8c,k as _0x50e52f,l as _0x562fd5,n as _0x5e54e6,p as _0xed6544,q as _0x419e43,s as _0x222326,t as _0x38f848,u as _0x5a9b42,v as _0x5ec747,x as _0x4680c9,y as _0x1891b6,z as _0x3c76af,B as _0x12e2fd,D as _0x42cefb,E as _0x11e6a7,F as _0x2a486d,H as _0x4ae838,I as _0xa8e149,J as _0x1fbe90,K as _0x4f74d8,L as _0x112420,N as _0x4ffeb1,O as _0x5d8fdb,P as _0x2f878c,Q as _0x5b83d8,R as _0x4409b2,U as _0x1a541d,V as _0x2d9066,W as _0x741acc,X as _0x5c0d55,Y as _0x2e4997,Z as _0x37dffc,_ as _0x4f309d,$ as _0x5149f3,a0 as _0x54e15e,a1 as _0xeb28fc,a2 as _0x30a14c,a3 as _0x34ec13,a4 as _0x30bb38,a5 as _0x37680b,a6 as _0x5035a0,a7 as _0x4c9cc0,a8 as _0x588ea7,a9 as _0x5a6d9a,aa as _0x2c3c58,ab as _0x1cc493,ac as _0x42517f,ad as _0x8c9b7f,ae as _0xe3e9b6,af as _0xe29dff,ag as _0x2b56cf,ah as _0x23f60d,ai as _0x21d934}from'./vendor-Cb_6CYmx.js';(function(){const _0x305b80=_0x3eebd0,_0x4877de=document[_0x305b80(0x3d9e)+_0x305b80(0xf04)](_0x305b80(0x364a))[_0x305b80(0x2f2e)];if(_0x4877de&&_0x4877de[_0x305b80(0x2f76)]&&_0x4877de[_0x305b80(0x2f76)](_0x305b80(0x30f9)+_0x305b80(0x10ce)))return;for(const _0x4e1c09 of document[_0x305b80(0x1939)+_0x305b80(0x4187)](_0x305b80(0x2a17)+'=\x22module'+_0x305b80(0x4360)+']'))_0x481777(_0x4e1c09);new MutationObserver(_0x82934e=>{const _0x13b335=_0x305b80;for(const _0x1d0936 of _0x82934e)if(_0x1d0936[_0x13b335(0x167a)]===_0x13b335(0x2716)+'t'){for(const _0x550623 of _0x1d0936[_0x13b335(0x2465)+'es'])_0x550623['tagName']===_0x13b335(0x289b)&&_0x550623['rel']===_0x13b335(0x30f9)+_0x13b335(0x10ce)&&_0x481777(_0x550623);}})[_0x305b80(0x3888)](document,{'childList':!0x0,'subtree':!0x0});function _0x26b8a7(_0x50d4d5){const _0x17d505=_0x305b80,_0x2cb4a0={};return _0x50d4d5[_0x17d505(0x220f)+'y']&&(_0x2cb4a0['integrit'+'y']=_0x50d4d5[_0x17d505(0x220f)+'y']),_0x50d4d5[_0x17d505(0x34bb)+_0x17d505(0x2712)]&&(_0x2cb4a0[_0x17d505(0x34bb)+'Policy']=_0x50d4d5[_0x17d505(0x34bb)+_0x17d505(0x2712)]),_0x50d4d5[_0x17d505(0x170a)+_0x17d505(0x3cda)]===_0x17d505(0x1693)+_0x17d505(0x320f)?_0x2cb4a0[_0x17d505(0x414b)+_0x17d505(0x964)]=_0x17d505(0xb94):_0x50d4d5[_0x17d505(0x170a)+_0x17d505(0x3cda)]===_0x17d505(0x1376)+'s'?_0x2cb4a0['credenti'+'als']=_0x17d505(0xb43):_0x2cb4a0['credenti'+_0x17d505(0x964)]=_0x17d505(0x1a29)+_0x17d505(0x3cda),_0x2cb4a0;}function _0x481777(_0x75a67e){const _0x45bfc4=_0x305b80;if(_0x75a67e['ep'])return;_0x75a67e['ep']=!0x0;const _0xeb563=_0x26b8a7(_0x75a67e);fetch(_0x75a67e[_0x45bfc4(0x390f)],_0xeb563);}}());function Fn(_0x1b7cbd,_0x53fb23){const _0x11d74e=_0x3eebd0,_0x3a0aa1=Math[_0x11d74e(0x31db)](0x0,Number(_0x1b7cbd)||0x0),_0x147e97=Math['max'](0x0,Number(_0x53fb23)||0x0);return{'inner':Math[_0x11d74e(0x19a0)](_0x3a0aa1,_0x147e97),'outer':Math['max'](_0x3a0aa1,_0x147e97)};}function Oi(_0x42ae45){const _0x283fe6=_0x3eebd0,_0x50f5e5=Math[_0x283fe6(0x31db)](0x0,Number(_0x42ae45[_0x283fe6(0x4303)+'tW'])||0x0),_0x8dc669=Math[_0x283fe6(0x31db)](0x0,Number(_0x42ae45['outerRec'+'tH'])||0x0);return{'innerW':Math[_0x283fe6(0x19a0)](_0x50f5e5,Math[_0x283fe6(0x31db)](0x0,Number(_0x42ae45[_0x283fe6(0x4179)+'tW'])||0x0)),'innerH':Math[_0x283fe6(0x19a0)](_0x8dc669,Math[_0x283fe6(0x31db)](0x0,Number(_0x42ae45['innerRec'+'tH'])||0x0)),'outerW':_0x50f5e5,'outerH':_0x8dc669};}function Vs(_0x232a38,_0x14be38,_0x329ef3,_0x1f0b84,_0x17674a){const _0x36cbc4=_0x3eebd0;if(_0x232a38===_0x36cbc4(0x34f7))return _0x17674a();const _0x39d403=Math[_0x36cbc4(0x31db)](0x1,Math[_0x36cbc4(0x24a6)](_0x329ef3)),_0x4bea99=Math['max'](0x0,Math[_0x36cbc4(0x24a6)](_0x14be38))%_0x39d403;return _0x1f0b84?_0x4bea99/_0x39d403:_0x39d403<=0x1?0.5:_0x4bea99/(_0x39d403-0x1);}function Io(_0x5e9996,_0x2b0d56,_0x3393bd,_0x269c72){const _0x2d68ee=_0x3eebd0,_0x328f47=Math['sqrt'](_0x5e9996*_0x5e9996+_0x269c72()*(_0x2b0d56*_0x2b0d56-_0x5e9996*_0xLine truncated
-1
View File
@@ -1 +0,0 @@
.help-overlay[data-v-4bb9bc76]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:40;display:flex;align-items:center;justify-content:center;padding:72px 24px 28px;box-sizing:border-box;background:#05080fb8;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.help-dialog[data-v-4bb9bc76]{width:min(820px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden;border:1px solid #3a4864;border-radius:14px;background:#141a27;color:#b8c3d8;box-shadow:0 22px 70px #0000009e}.help-head[data-v-4bb9bc76]{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding:18px 20px 15px;border-bottom:1px solid #2b354a;background:linear-gradient(135deg,#202942,#181e2d)}.help-head h2[data-v-4bb9bc76]{margin:0;color:#eef2ff;font-size:19px}.help-head p[data-v-4bb9bc76]{margin:5px 0 0;color:#7786a3;font-size:11px}.help-close[data-v-4bb9bc76]{width:28px;height:28px;flex:0 0 28px;border:1px solid #43516b;border-radius:6px;background:#273249;color:#ccd7ed;cursor:pointer}.help-close[data-v-4bb9bc76]:hover{border-color:#7774ff;background:#3b4670;color:#fff}.help-body[data-v-4bb9bc76]{min-height:0;overflow:auto;padding:18px 20px 21px}.help-section[data-v-4bb9bc76]{padding:14px 15px;border:1px solid #2c3850;border-radius:10px;background:#181f2e}.help-section h3[data-v-4bb9bc76]{margin:0 0 11px;color:#9fb2ff;font-size:13px}.help-start ol[data-v-4bb9bc76]{margin:0;padding-left:21px;color:#aab6cc;font-size:12px;line-height:1.75}.help-start li[data-v-4bb9bc76]::marker{color:#7774ff;font-weight:700}.help-section b[data-v-4bb9bc76]{color:#dce4f7}.help-grid[data-v-4bb9bc76]{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(250px,.85fr);gap:12px;margin-top:12px}.help-list[data-v-4bb9bc76]{display:grid;gap:0;margin:0}.help-list>div[data-v-4bb9bc76]{display:grid;grid-template-columns:78px 1fr;gap:9px;padding:7px 0;border-bottom:1px solid #263146}.help-list>div[data-v-4bb9bc76]:last-child{border-bottom:0}.help-list dt[data-v-4bb9bc76]{color:#d3dcf0;font-size:11px;font-weight:700}.help-list dd[data-v-4bb9bc76]{margin:0;color:#8795ae;font-size:11px;line-height:1.5}.shortcut-list[data-v-4bb9bc76]{display:grid;gap:7px}.shortcut-list>div[data-v-4bb9bc76]{display:flex;align-items:center;min-height:25px;gap:5px}.shortcut-list kbd[data-v-4bb9bc76]{min-width:24px;box-sizing:border-box;padding:3px 6px;border:1px solid #465470;border-bottom-width:2px;border-radius:5px;background:#101623;color:#e0e7f6;font:10px/1.2 ui-monospace,SFMono-Regular,Menlo,monospace;text-align:center}.shortcut-list span[data-v-4bb9bc76]{color:#65728b;font-size:10px}.shortcut-list em[data-v-4bb9bc76]{margin-left:auto;color:#9ca9c1;font-size:11px;font-style:normal}.help-note[data-v-4bb9bc76]{margin:11px 0 0;padding-top:9px;border-top:1px solid #2a3549;color:#697791;font-size:10px;line-height:1.55}.help-export[data-v-4bb9bc76]{margin-top:12px}.help-export p[data-v-4bb9bc76]{margin:0;color:#8997b0;font-size:11px;line-height:1.65}.help-doc-title[data-v-4bb9bc76]{margin:16px 2px 2px;color:#9fb2ff;font-size:13px;font-weight:700;letter-spacing:.5px}.help-module[data-v-4bb9bc76]{margin-top:12px}.help-module-head[data-v-4bb9bc76]{display:flex;align-items:center;gap:8px;width:100%;padding:0;border:0;background:transparent;color:#9fb2ff;font:inherit;font-size:13px;font-weight:700;text-align:left;cursor:pointer}.help-module-head[data-v-4bb9bc76]:hover{color:#fff}.help-module-head .mtitle[data-v-4bb9bc76]{flex:1;min-width:0}.help-module-head .caret[data-v-4bb9bc76]{flex:0 0 auto;color:#7b86a2;font-size:12px}.help-module.open .help-module-head[data-v-4bb9bc76]{color:#fff}.help-module.open .help-module-head .caret[data-v-4bb9bc76]{color:#9fb2ff}.help-module .mnum[data-v-4bb9bc76]{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:6px;background:linear-gradient(135deg,#4a53b8,#6a5fd0);color:#fff;font-size:12px;font-weight:700}.help-module.help-connector[data-v-4bb9bc76]{border-color:#4a4f8a;background:linear-gradient(135deg,#1d2442,#181d2f)}.help-module.help-connector .help-module-head[data-v-4bb9bc76]{color:#b8c2ff}.help-module .connector-intro[data-v-4bb9bc76]{margin:0 0 10px;color:#9aa8c4;font-size:11px;line-height:1.6}.help-module .connector-intro b[data-v-4bb9bc76]{color:#dce4f7}.help-module .dl-link[data-v-4bb9bc76]{display:inline-flex;flex-direction:column;align-items:flex-start;gap:2px;margin:0 10px 6px 0;padding:6px 12px;border:1px solid #5652b5;border-radius:6px;background:#4540a0;color:#fff;font-size:12px;font-weight:700;text-decoration:none}.help-module .dl-link[data-v-4bb9bc76]:hover{border-color:#8982ff;background:#554dc2}.help-module .dl-link small[data-v-4bb9bc76]{color:#cfe0ff;font-weight:500;font-size:9px}.help-module-body[data-v-4bb9bc76]{padding-top:10px}@media(max-width:760px){.help-overlay[data-v-4bb9bc76]{padding:66px 12px 14px}.help-grid[data-v-4bb9bc76]{grid-template-columns:1fr}}.topbar[data-v-2aafb245]{display:flex;align-items:center;gap:10px;flex-wrap:wLine truncated
+1
View File
@@ -0,0 +1 @@
.help-overlay[data-v-2ef0dcfc]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:40;display:flex;align-items:center;justify-content:center;padding:72px 24px 28px;box-sizing:border-box;background:#05080fb8;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.help-dialog[data-v-2ef0dcfc]{width:min(820px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden;border:1px solid #3a4864;border-radius:14px;background:#141a27;color:#b8c3d8;box-shadow:0 22px 70px #0000009e}.help-head[data-v-2ef0dcfc]{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding:18px 20px 15px;border-bottom:1px solid #2b354a;background:linear-gradient(135deg,#202942,#181e2d)}.help-head h2[data-v-2ef0dcfc]{margin:0;color:#eef2ff;font-size:19px}.help-head p[data-v-2ef0dcfc]{margin:5px 0 0;color:#7786a3;font-size:11px}.help-close[data-v-2ef0dcfc]{width:28px;height:28px;flex:0 0 28px;border:1px solid #43516b;border-radius:6px;background:#273249;color:#ccd7ed;cursor:pointer}.help-close[data-v-2ef0dcfc]:hover{border-color:#7774ff;background:#3b4670;color:#fff}.help-body[data-v-2ef0dcfc]{min-height:0;overflow:auto;padding:18px 20px 21px}.help-section[data-v-2ef0dcfc]{padding:14px 15px;border:1px solid #2c3850;border-radius:10px;background:#181f2e}.help-section h3[data-v-2ef0dcfc]{margin:0 0 11px;color:#9fb2ff;font-size:13px}.help-start ol[data-v-2ef0dcfc]{margin:0;padding-left:21px;color:#aab6cc;font-size:12px;line-height:1.75}.help-start li[data-v-2ef0dcfc]::marker{color:#7774ff;font-weight:700}.help-section b[data-v-2ef0dcfc]{color:#dce4f7}.help-grid[data-v-2ef0dcfc]{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(250px,.85fr);gap:12px;margin-top:12px}.help-list[data-v-2ef0dcfc]{display:grid;gap:0;margin:0}.help-list>div[data-v-2ef0dcfc]{display:grid;grid-template-columns:78px 1fr;gap:9px;padding:7px 0;border-bottom:1px solid #263146}.help-list>div[data-v-2ef0dcfc]:last-child{border-bottom:0}.help-list dt[data-v-2ef0dcfc]{color:#d3dcf0;font-size:11px;font-weight:700}.help-list dd[data-v-2ef0dcfc]{margin:0;color:#8795ae;font-size:11px;line-height:1.5}.shortcut-list[data-v-2ef0dcfc]{display:grid;gap:7px}.shortcut-list>div[data-v-2ef0dcfc]{display:flex;align-items:center;min-height:25px;gap:5px}.shortcut-list kbd[data-v-2ef0dcfc]{min-width:24px;box-sizing:border-box;padding:3px 6px;border:1px solid #465470;border-bottom-width:2px;border-radius:5px;background:#101623;color:#e0e7f6;font:10px/1.2 ui-monospace,SFMono-Regular,Menlo,monospace;text-align:center}.shortcut-list span[data-v-2ef0dcfc]{color:#65728b;font-size:10px}.shortcut-list em[data-v-2ef0dcfc]{margin-left:auto;color:#9ca9c1;font-size:11px;font-style:normal}.help-note[data-v-2ef0dcfc]{margin:11px 0 0;padding-top:9px;border-top:1px solid #2a3549;color:#697791;font-size:10px;line-height:1.55}.help-export[data-v-2ef0dcfc]{margin-top:12px}.help-export p[data-v-2ef0dcfc]{margin:0;color:#8997b0;font-size:11px;line-height:1.65}.help-doc-title[data-v-2ef0dcfc]{margin:16px 2px 2px;color:#9fb2ff;font-size:13px;font-weight:700;letter-spacing:.5px}.help-module[data-v-2ef0dcfc]{margin-top:12px}.help-module-head[data-v-2ef0dcfc]{display:flex;align-items:center;gap:8px;width:100%;padding:0;border:0;background:transparent;color:#9fb2ff;font:inherit;font-size:13px;font-weight:700;text-align:left;cursor:pointer}.help-module-head[data-v-2ef0dcfc]:hover{color:#fff}.help-module-head .mtitle[data-v-2ef0dcfc]{flex:1;min-width:0}.help-module-head .caret[data-v-2ef0dcfc]{flex:0 0 auto;color:#7b86a2;font-size:12px}.help-module.open .help-module-head[data-v-2ef0dcfc]{color:#fff}.help-module.open .help-module-head .caret[data-v-2ef0dcfc]{color:#9fb2ff}.help-module .mnum[data-v-2ef0dcfc]{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:6px;background:linear-gradient(135deg,#4a53b8,#6a5fd0);color:#fff;font-size:12px;font-weight:700}.help-module.help-connector[data-v-2ef0dcfc]{border-color:#4a4f8a;background:linear-gradient(135deg,#1d2442,#181d2f)}.help-module.help-connector .help-module-head[data-v-2ef0dcfc]{color:#b8c2ff}.help-module .connector-intro[data-v-2ef0dcfc]{margin:0 0 10px;color:#9aa8c4;font-size:11px;line-height:1.6}.help-module .connector-intro b[data-v-2ef0dcfc]{color:#dce4f7}.help-module .dl-link[data-v-2ef0dcfc]{display:inline-flex;flex-direction:column;align-items:flex-start;gap:2px;margin:0 10px 6px 0;padding:6px 12px;border:1px solid #5652b5;border-radius:6px;background:#4540a0;color:#fff;font-size:12px;font-weight:700;text-decoration:none}.help-module .dl-link[data-v-2ef0dcfc]:hover{border-color:#8982ff;background:#554dc2}.help-module .dl-link small[data-v-2ef0dcfc]{color:#cfe0ff;font-weight:500;font-size:9px}.help-module-body[data-v-2ef0dcfc]{padding-top:10px}@media(max-width:760px){.help-overlay[data-v-2ef0dcfc]{padding:66px 12px 14px}.help-grid[data-v-2ef0dcfc]{grid-template-columns:1fr}}.topbar[data-v-de1baa8a]{display:flex;align-items:center;gap:10px;flex-wrap:wLine truncated
+3 -3
View File
@@ -9,9 +9,9 @@
html, body { margin: 0; padding: 0; background: #111; color: #eee; font-family: system-ui, -apple-system, sans-serif; }
#app { display: flex; flex-direction: column; height: 100vh; }
</style>
<script type="module" crossorigin src="/assets/index-BLGQoSWD.js"></script>
<script type="module" crossorigin src="/assets/index-5gcswTi2.js"></script>
<link rel="modulepreload" crossorigin href="/assets/vendor-Cb_6CYmx.js">
<link rel="stylesheet" crossorigin href="/assets/index-BO44YplN.css">
<link rel="stylesheet" crossorigin href="/assets/index-C1A9e4gY.css">
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['trackPageView']);
@@ -19,7 +19,7 @@
(function() {
var u="//web-analysis.yeomai.site/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '2']);
_paq.push(['setSiteId', '3']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
+1 -1
View File
@@ -191,7 +191,7 @@ function onTimelineTogglePointerDown(e: PointerEvent) {
window.removeEventListener('pointerup', finish)
window.removeEventListener('pointercancel', finish)
if (!dragging) return
trackMatomoEvent('timeline.resize')
trackMatomoEvent('时间轴', '调整数值', `时间轴高度=${timelineH.value}`)
if (timelineH.value > 0) saveTimelineHeight()
// 拖拽后的 click 与本次手势属于同一操作,不能再次切换折叠。
ignoreTimelineToggleClick = true
+103 -11
View File
@@ -1,15 +1,81 @@
type MatomoWindow = Window & { _paq?: unknown[][] }
import { i18n, SUPPORTED_LOCALES } from '../i18n'
export function trackMatomoEvent(eventName: string) {
type MatomoWindow = Window & { _paq?: unknown[][] }
type EventCategory = '时间轴' | '系统设置' | '属性面板' | '使用说明'
type EventAction = '点击按钮' | '点击开关' | '调整数值' | '点击下载'
type MessageTree = Record<string, unknown>
let chineseLabels: Map<string, string> | null = null
function flattenMessages(value: unknown, prefix = '', output: Record<string, string> = {}) {
if (!value || typeof value !== 'object') return output
for (const [key, child] of Object.entries(value as MessageTree)) {
const path = prefix ? `${prefix}.${key}` : key
if (typeof child === 'string') output[path] = child
else flattenMessages(child, path, output)
}
return output
}
function localizedToChinese(value: string | null | undefined) {
const label = value?.replace(/\s+/g, ' ').trim()
if (!label) return ''
if (!chineseLabels) {
chineseLabels = new Map()
const chinese = flattenMessages(i18n.global.getLocaleMessage('zh-CN'))
for (const locale of SUPPORTED_LOCALES) {
const messages = flattenMessages(i18n.global.getLocaleMessage(locale.code))
for (const [key, text] of Object.entries(messages)) {
const translated = chinese[key]
if (translated) chineseLabels.set(text.replace(/\s+/g, ' ').trim(), translated)
}
}
}
return chineseLabels.get(label) || ''
}
function categoryFor(element: Element): EventCategory {
const section = element.closest<HTMLElement>('[data-matomo-section]')?.dataset.matomoSection
if (section === 'timeline') return '时间轴'
if (section === 'settings') return '系统设置'
return '属性面板'
}
function controlName(control: Element, fallback: string) {
const candidates = [
(control as HTMLElement).dataset.matomoName,
control.closest<HTMLElement>('[data-matomo-name]')?.dataset.matomoName,
control.getAttribute('aria-label'),
control.getAttribute('title'),
control.textContent,
control.closest('label')?.textContent,
control.parentElement?.querySelector('.ns-label, .pac-label')?.textContent,
]
for (const candidate of candidates) {
const chinese = localizedToChinese(candidate)
if (chinese) return chinese
}
return fallback
}
function buttonName(button: HTMLButtonElement) {
const section = button.closest('[data-matomo-section]') || document
const className = [...button.classList]
.filter((name) => !['active', 'collapsed', 'danger', 'ghost', 'off', 'on', 'primary', 'selected'].includes(name))
.sort()
.join('-') || button.type || 'button'
const peers = [...section.querySelectorAll<HTMLButtonElement>('button')]
.filter((peer) => ([...peer.classList]
.filter((name) => !['active', 'collapsed', 'danger', 'ghost', 'off', 'on', 'primary', 'selected'].includes(name))
.sort()
.join('-') || peer.type || 'button') === className)
return controlName(button, `按钮${Math.max(1, peers.indexOf(button) + 1)}`)
}
export function trackMatomoEvent(category: EventCategory, action: EventAction, name: string) {
if (!import.meta.env.PROD) return
const separator = eventName.indexOf('.')
if (separator <= 0 || separator === eventName.length - 1) return
const target = window as MatomoWindow
;(target._paq ||= []).push([
'trackEvent',
eventName.slice(0, separator),
eventName.slice(separator + 1),
])
;(target._paq ||= []).push(['trackEvent', category, action, name])
}
export function installMatomoEventTracking() {
@@ -17,7 +83,33 @@ export function installMatomoEventTracking() {
document.addEventListener('click', (event) => {
const target = event.target
if (!(target instanceof Element)) return
const tracked = target.closest<HTMLElement>('[data-matomo-event]')
if (tracked?.dataset.matomoEvent) trackMatomoEvent(tracked.dataset.matomoEvent)
const download = target.closest<HTMLAnchorElement>('a[data-matomo-category][data-matomo-action][data-matomo-name]')
if (download) {
trackMatomoEvent(
download.dataset.matomoCategory as EventCategory,
download.dataset.matomoAction as EventAction,
download.dataset.matomoName || '',
)
return
}
const button = target.closest<HTMLButtonElement>('button')
if (!button) return
trackMatomoEvent(categoryFor(button), '点击按钮', buttonName(button))
}, true)
document.addEventListener('change', (event) => {
const target = event.target
if (!(target instanceof HTMLInputElement)) return
if (target.type === 'checkbox') {
const name = controlName(target, '开关')
trackMatomoEvent(categoryFor(target), '点击开关', `${name}=${target.checked ? '开启' : '关闭'}`)
return
}
if (target.type !== 'range' && target.type !== 'number') return
const pairedRange = target.type === 'range'
|| !!target.parentElement?.querySelector('input[type="range"]')
if (!pairedRange) return
const name = controlName(target, '数值')
trackMatomoEvent(categoryFor(target), '调整数值', `${name}=${target.value}`)
}, true)
}
+1 -1
View File
@@ -1,5 +1,5 @@
<template>
<div class="spine-editor">
<div class="spine-editor" data-matomo-section="spine">
<div class="editor-title">{{ $t('spine.title') }}</div>
<label class="field wide"><span>{{ $t('spine.name') }}</span><input v-model="spineObject.name" /></label>
<div class="grid three">
+1 -1
View File
@@ -1,5 +1,5 @@
<template>
<div class="gradient-editor">
<div class="gradient-editor" data-matomo-section="gradient">
<div
ref="bar"
class="gradient-bar"
+1 -1
View File
@@ -1,5 +1,5 @@
<template>
<div class="ce">
<div class="ce" data-matomo-section="curve">
<div class="ce-editor">
<svg ref="svg" class="ce-svg" @dblclick="onDbl">
<!-- 网格线(0.25/0.5/0.75) -->
+3 -3
View File
@@ -1,6 +1,6 @@
<template>
<div v-if="show" class="help-overlay" role="presentation" @click.self="close">
<section class="help-dialog" role="dialog" aria-modal="true" aria-labelledby="help-title">
<section class="help-dialog" data-matomo-section="help" role="dialog" aria-modal="true" aria-labelledby="help-title">
<header class="help-head">
<div>
<h2 id="help-title">{{ $t('help.title') }}</h2>
@@ -172,8 +172,8 @@
<dl class="help-list">
<div><dt>{{ $t('help.prerequisite') }}</dt><dd>{{ $t('help.prerequisiteDesc') }}</dd></div>
<div><dt>{{ $t('help.download') }}</dt><dd>
<a class="dl-link" href="/downloads/connector/SpineParticleConnector-windows-x64.exe" download>Windows<br><small>SpineParticleConnector-windows-x64.exe</small></a>
<a class="dl-link" href="/downloads/connector/SpineParticleConnector-macos-universal.zip" download>macOS (Universal)<br><small>SpineParticleConnector-macos-universal.zip</small></a>
<a class="dl-link" href="/downloads/connector/SpineParticleConnector-windows-x64.exe" data-matomo-category="使用说明" data-matomo-action="点击下载" data-matomo-name="下载 Windows 连接器" download>Windows<br><small>SpineParticleConnector-windows-x64.exe</small></a>
<a class="dl-link" href="/downloads/connector/SpineParticleConnector-macos-universal.zip" data-matomo-category="使用说明" data-matomo-action="点击下载" data-matomo-name="下载 macOS 连接器" download>macOS (Universal)<br><small>SpineParticleConnector-macos-universal.zip</small></a>
</dd></div>
<div><dt>{{ $t('help.webSide') }}</dt><dd>{{ $t('help.webSideDesc') }}</dd></div>
<div><dt>{{ $t('help.authorization') }}</dt><dd>{{ $t('help.authorizationDesc') }}</dd></div>
+2 -2
View File
@@ -1,5 +1,5 @@
<template>
<div class="image-card">
<div class="image-card" data-matomo-section="resources">
<div class="imgrow">
<button class="img-thumb" data-matomo-event="resources.pick-image" :title="supportsSequence && resource.imageMode === 'sequence' ? $t('image.chooseSequence') : $t('image.chooseLocal')" @click="pickImage">
<img v-if="displayPreviewUrl" :src="displayPreviewUrl" :alt="resource.textureName" />
@@ -82,7 +82,7 @@
<Teleport to="body">
<div v-if="pivotFullscreen" class="pivot-modal-backdrop" @pointerdown.self="closePivotFullscreen(false)">
<div class="pivot-modal" role="dialog" aria-modal="true" :aria-label="$t('image.pivotModal')">
<div class="pivot-modal" data-matomo-section="resources" role="dialog" aria-modal="true" :aria-label="$t('image.pivotModal')">
<div class="pivot-modal-head">
<div class="pivot-modal-icon">◎</div>
<div class="pivot-modal-info">
+1 -1
View File
@@ -1,5 +1,5 @@
<template>
<div class="pac">
<div class="pac" data-matomo-section="attribute-control">
<div class="pac-head">
<span class="pac-label">{{ label }}</span>
<div v-if="showModes" class="pac-modes">
+1 -1
View File
@@ -1,5 +1,5 @@
<template>
<div class="pivot-editor" :class="{ 'pivot-large': large }">
<div class="pivot-editor" data-matomo-section="pivot" :class="{ 'pivot-large': large }">
<div class="pivot-toolbar">
<div class="pivot-hint">
<span class="pivot-hint-icon">⊕</span>
+1 -1
View File
@@ -39,7 +39,7 @@ function normalizeBoneDebugSizes() {
</script>
<template>
<div v-if="show" ref="panelRef" class="settings-panel" tabindex="-1" @focusout="onFocusOut">
<div v-if="show" ref="panelRef" class="settings-panel" data-matomo-section="settings" tabindex="-1" @focusout="onFocusOut">
<div class="sp-head">{{ t('settings.title') }} <button class="sp-close" @click="emit('close')">✕</button></div>
<div class="sp-section-title">{{ t('settings.layout') }}</div>
<label class="sp-switch-row">
+1 -1
View File
@@ -68,7 +68,7 @@ function changeLanguage(event: Event) {
</script>
<template>
<div class="top-operation-stack">
<div class="top-operation-stack" data-matomo-section="toolbar">
<div class="topbar">
<button class="settings-btn" @click="toggleSettings" :title="t('toolbar.settings')">{{ t('toolbar.settings') }}</button>
<button class="undo-btn" :disabled="editorHistoryState.undoCount === 0" @click="undo" :title="t('toolbar.undo')">↶</button>
+2 -2
View File
@@ -1,8 +1,8 @@
<template>
<div class="timeline">
<div class="timeline" data-matomo-section="timeline">
<!-- 控制按钮 -->
<Teleport defer to="#timeline-controls-host">
<div class="tl-controls">
<div class="tl-controls" data-matomo-section="timeline">
<button class="tl-btn" data-matomo-event="timeline.play-toggle" :class="{ on: store.timeline.playing }" @click="store.togglePlay()" :title="store.timeline.playing ? $t('timeline.pause') : $t('timeline.play')">
{{ store.timeline.playing ? '❚❚' : '▶' }}
</button>
+2 -2
View File
@@ -1,6 +1,6 @@
<template>
<!-- 2. 发射模式 -->
<div class="group" v-show="sectionVisible('emitMode')">
<div class="group" data-matomo-section="emission" v-show="sectionVisible('emitMode')">
<div class="group-head" @click="toggle('emitMode')">
<span class="caret">{{ collapsed.emitMode ? '▸' : '▾' }}</span><span>{{ $t('emission.title') }}</span>
<button class="group-reset" data-matomo-event="emission.reset" :title="$t('emission.reset')" @click.stop="resetModule('emitMode')">{{ $t('common.reset') }}</button>
@@ -62,7 +62,7 @@
</div>
<!-- 3. 发射器形状 -->
<div class="group" v-show="sectionVisible('shape')">
<div class="group" data-matomo-section="shape" v-show="sectionVisible('shape')">
<div class="group-head" @click="toggle('shape')">
<span class="caret">{{ collapsed.shape ? '▸' : '▾' }}</span><span>{{ $t('emission.shapeTitle') }}</span>
<button class="group-reset" data-matomo-event="shape.reset" :title="$t('emission.shapeReset')" @click.stop="resetModule('shape')">{{ $t('common.reset') }}</button>
@@ -1,6 +1,6 @@
<template>
<!-- 7. 导出资源:导出参数与资源输出操作。 -->
<div class="group">
<div class="group" data-matomo-section="export">
<div class="group-head" @click="toggle('export')">
<span class="caret">{{ collapsed.export ? '▸' : '▾' }}</span><span>{{ $t('export.title') }}</span>
<button class="group-reset" data-matomo-event="export.reset" :title="$t('export.reset')" @click.stop="resetModule('export')">{{ $t('common.reset') }}</button>
@@ -1,6 +1,6 @@
<template>
<!-- 5. 外观与资源 -->
<div class="group">
<div class="group" data-matomo-section="appearance">
<div class="group-head" @click="toggle('look')">
<span class="caret">{{ collapsed.look ? '▸' : '▾' }}</span><span>{{ $t('appearance.title') }}</span>
<button class="group-reset" data-matomo-event="appearance.reset" :title="$t('appearance.reset')" @click.stop="resetModule('look')">{{ $t('common.reset') }}</button>
@@ -1,6 +1,6 @@
<template>
<!-- 4. 粒子属性 -->
<div class="group">
<div class="group" data-matomo-section="attributes">
<div class="group-head" @click="toggle('attr')">
<span class="caret">{{ collapsed.attr ? '▸' : '▾' }}</span><span>{{ $t('attributes.title') }}</span>
<button class="group-reset" data-matomo-event="attributes.reset" :title="$t('attributes.reset')" @click.stop="resetModule('attr')">{{ $t('common.reset') }}</button>
@@ -1,6 +1,6 @@
<template>
<!-- 6. 修改器 -->
<div class="group">
<div class="group" data-matomo-section="modifiers">
<div class="group-head" @click="toggle('mods')">
<span class="caret">{{ collapsed.mods ? '▸' : '▾' }}</span><span>{{ $t('modifiers.title') }}</span>
<button class="group-reset" data-matomo-event="modifiers.reset" :title="$t('modifiers.reset')" @click.stop="resetModule('mods')">{{ $t('common.reset') }}</button>
@@ -83,7 +83,7 @@
</select>
</label>
<div class="modifier-hint">{{ $t('modifiers.forceHint') }}</div>
<label class="switch-row"><input type="checkbox" v-model="sys.config.showForceFieldShape" /><span class="switch-ui"></span><span>{{ $t('modifiers.showShape') }}</span></label>
<label class="switch-row" data-matomo-name="显示力场形状"><input type="checkbox" v-model="sys.config.showForceFieldShape" /><span class="switch-ui"></span><span>{{ $t('modifiers.showShape') }}</span></label>
</div>
</div>
<div class="modifier-item">
@@ -104,7 +104,7 @@
</select>
</label>
<div class="modifier-hint">{{ $t('modifiers.vortexHint') }}</div>
<label class="switch-row"><input type="checkbox" v-model="sys.config.showVortexShape" /><span class="switch-ui"></span><span>{{ $t('modifiers.showShape') }}</span></label>
<label class="switch-row" data-matomo-name="显示漩涡形状"><input type="checkbox" v-model="sys.config.showVortexShape" /><span class="switch-ui"></span><span>{{ $t('modifiers.showShape') }}</span></label>
</div>
</div>
<div class="modifier-item">
@@ -131,7 +131,7 @@
</select>
</label>
<div class="modifier-hint">{{ $t('modifiers.attractionHint') }}</div>
<label class="switch-row"><input type="checkbox" v-model="sys.config.showAttractionShape" /><span class="switch-ui"></span><span>{{ $t('modifiers.showShape') }}</span></label>
<label class="switch-row" data-matomo-name="显示吸附范围"><input type="checkbox" v-model="sys.config.showAttractionShape" /><span class="switch-ui"></span><span>{{ $t('modifiers.showShape') }}</span></label>
</div>
</div>
<div class="modifier-item">
@@ -1,5 +1,5 @@
<template>
<div class="group config-management">
<div class="group config-management" data-matomo-section="config">
<div class="group-head" @click="toggle('config')">
<span class="caret">{{ collapsed.config ? '▸' : '▾' }}</span><span>{{ $t('config.title') }}</span>
<button type="button" class="group-download" data-matomo-event="config.download-current" @click.stop="downloadCurrentProject">{{ $t('config.local.downloadCurrent') }}</button>
@@ -55,7 +55,7 @@
</div>
<Teleport to="body">
<div v-if="projectSaveOpen" class="project-save-backdrop" @pointerdown.self="closeProjectSaveDialog">
<form class="project-save-dialog" @submit.prevent="confirmSaveConfig" @keydown.esc.prevent="closeProjectSaveDialog">
<form class="project-save-dialog" data-matomo-section="config" @submit.prevent="confirmSaveConfig" @keydown.esc.prevent="closeProjectSaveDialog">
<div class="project-save-head">
<span>{{ $t('config.local.saveTitle') }}</span>
<button type="button" :disabled="projectStorageBusy" @click="closeProjectSaveDialog">✕</button>
@@ -1,6 +1,6 @@
<template>
<!-- 1. 场景对象:创建入口始终可用,即使当前没有粒子系统。 -->
<div class="group">
<div class="group" data-matomo-section="scene">
<div class="group-head scene-head" @click="toggle('scene')">
<span class="caret">{{ collapsed.scene ? '▸' : '▾' }}</span><span>{{ $t('scene.title') }}</span>
<div class="scene-actions">
+1 -1
View File
@@ -57,7 +57,7 @@ function matomoAnalyticsPlugin(): Plugin {
(function() {
var u="//web-analysis.yeomai.site/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '2']);
_paq.push(['setSiteId', '3']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();