Compare commits
1439 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
9a57758425 | 5 years ago |
|
|
64a911333f | 5 years ago |
|
|
300c482314 | 5 years ago |
|
|
ad456600ed | 5 years ago |
|
|
a5a9104e77 | 5 years ago |
|
|
9140e3392d | 5 years ago |
|
|
06b6ca01f1 | 5 years ago |
|
|
1c45aa35a3 | 5 years ago |
|
|
c3fd99a692 | 5 years ago |
|
|
122e5ca082 | 5 years ago |
|
|
088eea918b | 5 years ago |
|
|
e4fd3a0e93 | 5 years ago |
|
|
af770ebeb8 | 5 years ago |
|
|
1cc436b779 | 5 years ago |
|
|
b2f09f89b5 | 5 years ago |
|
|
e9274d6e30 | 5 years ago |
|
|
eca5ca3f32 | 5 years ago |
|
|
bda7383bc8 | 5 years ago |
|
|
7562a3d697 | 5 years ago |
|
|
954d827934 | 5 years ago |
|
|
e7899435fe | 5 years ago |
|
|
93edb4aca0 | 5 years ago |
|
|
c9ddc9d5d0 | 5 years ago |
|
|
0bcb7669e7 | 6 years ago |
|
|
89b7e026c3 | 6 years ago |
|
|
ba0dfe5d9b | 6 years ago |
|
|
57eb9fc150 | 6 years ago |
|
|
e0800f89df | 6 years ago |
|
|
b26b3bb960 | 6 years ago |
|
|
2d8e32c61b | 6 years ago |
|
|
41133dffd2 | 6 years ago |
|
|
a1ec20423c | 6 years ago |
|
|
e3ebfdfba4 | 6 years ago |
|
|
43cd137fff | 6 years ago |
|
|
a697ce0be9 | 6 years ago |
|
|
b75500eff4 | 6 years ago |
|
|
3f4425d9db | 6 years ago |
|
|
f8c82add03 | 6 years ago |
|
|
a78a6465b0 | 6 years ago |
|
|
ae7d450827 | 6 years ago |
|
|
c908ae5210 | 6 years ago |
|
|
ea688f3942 | 6 years ago |
|
|
8a39b0e171 | 6 years ago |
|
|
5c06fed370 | 6 years ago |
|
|
035f3f53a2 | 6 years ago |
|
|
17430ded93 | 6 years ago |
|
|
b8e62f0c55 | 6 years ago |
|
|
e800756163 | 6 years ago |
|
|
0190fdaf3d | 6 years ago |
|
|
0db579da97 | 6 years ago |
|
|
e5cf0d4684 | 6 years ago |
|
|
a2f213492e | 6 years ago |
|
|
a9f32a475f | 6 years ago |
|
|
cb9934f67a | 6 years ago |
|
|
e7140262f2 | 6 years ago |
|
|
a9bcc70a2b | 6 years ago |
|
|
2936d73911 | 6 years ago |
|
|
df4a403473 | 6 years ago |
|
|
d993b8442a | 6 years ago |
|
|
5aab1fb00b | 6 years ago |
|
|
9b292304d3 | 6 years ago |
|
|
1d936742a7 | 6 years ago |
|
|
5156e23a09 | 6 years ago |
|
|
93b28cdd84 | 6 years ago |
|
|
3da449b8a4 | 7 years ago |
|
|
eb2a4699d4 | 7 years ago |
|
|
e01ebef2cf | 7 years ago |
|
|
c3919da2c2 | 7 years ago |
|
|
d5fe3edb15 | 7 years ago |
|
|
f332cd9f68 | 7 years ago |
|
|
d6471b3556 | 7 years ago |
|
|
0da9645d91 | 7 years ago |
|
|
6e9f23c940 | 7 years ago |
|
|
04a9d00a5e | 7 years ago |
|
|
1ddb822509 | 7 years ago |
|
|
0807d71704 | 7 years ago |
|
|
d5f75e84d8 | 7 years ago |
|
|
901c325eab | 7 years ago |
|
|
dbe6218926 | 7 years ago |
|
|
732d0e84d8 | 7 years ago |
|
|
ab303d3c17 | 7 years ago |
|
|
1f1429c47a | 7 years ago |
|
|
5c3661b69c | 7 years ago |
|
|
3f2916ed05 | 7 years ago |
|
|
fa795dd446 | 7 years ago |
|
|
26aedcc5f9 | 7 years ago |
|
|
054935d025 | 7 years ago |
|
|
62fc318e89 | 7 years ago |
|
|
6bba6c4f85 | 7 years ago |
|
|
fb94c85df1 | 7 years ago |
|
|
3cc56afe63 | 7 years ago |
|
|
9789182b2c | 7 years ago |
|
|
4d7109bf99 | 7 years ago |
|
|
130db1f351 | 7 years ago |
|
|
2045397084 | 7 years ago |
|
|
9494da7195 | 7 years ago |
|
|
94fdd3b587 | 7 years ago |
|
|
d7a96081f5 | 7 years ago |
|
|
521430115a | 7 years ago |
|
|
acfb1a6310 | 7 years ago |
|
|
de56cfe351 | 7 years ago |
|
|
5ed6a9703c | 7 years ago |
|
|
f94f0010b6 | 7 years ago |
|
|
9a6b1c2c9c | 7 years ago |
|
|
0f7c82a2d9 | 7 years ago |
|
|
b71eed544f | 7 years ago |
|
|
68e8d96b57 | 7 years ago |
|
|
073500ca81 | 7 years ago |
|
|
494cd9e95c | 7 years ago |
|
|
ae894fb571 | 7 years ago |
|
|
60da12b0ef | 7 years ago |
|
|
5e86922100 | 7 years ago |
|
|
6dcc90c639 | 7 years ago |
|
|
45be8d04e3 | 7 years ago |
|
|
9bbfed8d37 | 7 years ago |
|
|
5b1287d2de | 7 years ago |
|
|
886664abd4 | 7 years ago |
|
|
495dddc389 | 7 years ago |
|
|
b822ae72d9 | 7 years ago |
|
|
742fba96f0 | 7 years ago |
|
|
8eb17934b0 | 7 years ago |
|
|
605368a6e2 | 7 years ago |
|
|
52246a5250 | 7 years ago |
|
|
3ce484688a | 7 years ago |
|
|
ec7accc32c | 7 years ago |
|
|
495c2bc916 | 7 years ago |
|
|
62a7d8f30f | 7 years ago |
|
|
c6e29be792 | 7 years ago |
|
|
fc0bb7a35c | 7 years ago |
|
|
77a7b8febe | 7 years ago |
|
|
7c63d2b03d | 7 years ago |
|
|
136c434b4d | 7 years ago |
|
|
efa0085a67 | 7 years ago |
|
|
9432e3b6eb | 7 years ago |
|
|
7c73664fc8 | 7 years ago |
|
|
228e326111 | 7 years ago |
|
|
6b8be2ca43 | 7 years ago |
|
|
2256552899 | 7 years ago |
|
|
cb2ab59297 | 7 years ago |
|
|
934d497ef5 | 7 years ago |
|
|
e02360f096 | 7 years ago |
|
|
d42abee957 | 7 years ago |
|
|
956b79816b | 7 years ago |
|
|
7328a46086 | 7 years ago |
|
|
8ed8666e77 | 7 years ago |
|
|
db7feed9c5 | 7 years ago |
|
|
6699e5c56f | 7 years ago |
|
|
017c167ea9 | 7 years ago |
|
|
f075f96c58 | 7 years ago |
|
|
7f3122c5fd | 7 years ago |
|
|
be19816f33 | 7 years ago |
|
|
1221431f44 | 7 years ago |
|
|
12a471c3c5 | 7 years ago |
|
|
cc0bed69bf | 7 years ago |
|
|
0f5a155e4f | 7 years ago |
|
|
66ec464b66 | 7 years ago |
|
|
943d1084d4 | 7 years ago |
|
|
bb29ad2c34 | 7 years ago |
|
|
b724a6356a | 7 years ago |
|
|
0ae91ed00f | 7 years ago |
|
|
a7753fd356 | 7 years ago |
|
|
a0c72fc302 | 7 years ago |
|
|
28d50f2347 | 7 years ago |
|
|
3795b99fc5 | 7 years ago |
|
|
4b4db46663 | 7 years ago |
|
|
637c0e42f1 | 7 years ago |
|
|
73891f217d | 7 years ago |
|
|
e6b1648f53 | 7 years ago |
|
|
b53d1be672 | 7 years ago |
|
|
d22981dfbe | 8 years ago |
|
|
5c3e8c6863 | 8 years ago |
|
|
a68f7a7899 | 8 years ago |
|
|
322d689f8b | 8 years ago |
|
|
9693ea9e96 | 8 years ago |
|
|
fbf3f1f263 | 8 years ago |
|
|
3f8794dd89 | 8 years ago |
|
|
4284a57b4e | 8 years ago |
|
|
e1173fc0fd | 8 years ago |
|
|
18490b9bf8 | 8 years ago |
|
|
2714193b73 | 8 years ago |
|
|
1930844e68 | 8 years ago |
|
|
297c2a3b35 | 8 years ago |
|
|
46669115dc | 8 years ago |
|
|
18ecb90bd0 | 8 years ago |
|
|
c1bbf7b199 | 8 years ago |
|
|
925b3bdcc9 | 8 years ago |
|
|
94e4bdd9d6 | 8 years ago |
|
|
8da0dcd84f | 8 years ago |
|
|
d1afcd2e9e | 8 years ago |
|
|
cd4fc2596e | 8 years ago |
|
|
00e62b48be | 8 years ago |
|
|
bd7e864950 | 8 years ago |
|
|
abfe7a8037 | 8 years ago |
|
|
ffcd211dcc | 8 years ago |
|
|
2d97fafbe8 | 8 years ago |
|
|
aba697f2f0 | 8 years ago |
|
|
4564ee3b6d | 8 years ago |
|
|
e768b78b73 | 8 years ago |
|
|
b1d51861e5 | 8 years ago |
|
|
14bcb5ed56 | 8 years ago |
|
|
9fa2777589 | 8 years ago |
|
|
41bec3b53e | 8 years ago |
|
|
6958c4ed26 | 8 years ago |
|
|
b793312143 | 8 years ago |
|
|
b986ff5565 | 8 years ago |
|
|
97bb075cf1 | 8 years ago |
|
|
18aa29860c | 8 years ago |
|
|
fc80b2c581 | 8 years ago |
|
|
4f1c7dd671 | 8 years ago |
|
|
72b89e83e6 | 8 years ago |
|
|
89aed08b4f | 8 years ago |
|
|
a3812d52be | 8 years ago |
|
|
a7eeb40e13 | 8 years ago |
|
|
fe995d2bc8 | 8 years ago |
|
|
762de2aecd | 8 years ago |
|
|
98e012599c | 8 years ago |
|
|
06436c61fc | 8 years ago |
|
|
b627b62f6c | 8 years ago |
|
|
7a1cb53c04 | 8 years ago |
|
|
f45361fa56 | 8 years ago |
|
|
31cc15ca6c | 8 years ago |
|
|
dd5a3a807c | 8 years ago |
|
|
455155c635 | 8 years ago |
|
|
872975656c | 8 years ago |
|
|
62d06792f1 | 8 years ago |
|
|
fde72e4f2a | 8 years ago |
|
|
d4d97d018c | 8 years ago |
|
|
eb3a43a71c | 8 years ago |
|
|
1225405d8e | 8 years ago |
|
|
5b86e2901e | 8 years ago |
|
|
2c2f0f8f03 | 8 years ago |
|
|
5dd6564b6a | 8 years ago |
|
|
fbfce62582 | 8 years ago |
|
|
8741f7ee8e | 8 years ago |
|
|
13451a3a4f | 8 years ago |
|
|
9fd6bdfddd | 8 years ago |
|
|
7c0fd0c9b3 | 8 years ago |
|
|
591483d07e | 8 years ago |
|
|
9d95bbe9b6 | 8 years ago |
|
|
9b9d7e586f | 8 years ago |
|
|
3935b8417b | 8 years ago |
|
|
d9251ce00b | 8 years ago |
|
|
d2a0de861b | 8 years ago |
|
|
24289831c2 | 8 years ago |
|
|
707fd92307 | 8 years ago |
|
|
c8c8430993 | 8 years ago |
|
|
8fa12d8d7e | 8 years ago |
|
|
a976bd0d22 | 8 years ago |
|
|
d825b5562e | 8 years ago |
|
|
747748c9ba | 8 years ago |
|
|
4b368c407b | 8 years ago |
|
|
b6d47f9e86 | 8 years ago |
|
|
a52ea23121 | 8 years ago |
|
|
6e119fbaaf | 8 years ago |
|
|
8e48dd18ba | 8 years ago |
|
|
b4ce23f15e | 8 years ago |
|
|
1470cf12bc | 8 years ago |
|
|
702fbba914 | 8 years ago |
|
|
08a0cdc218 | 8 years ago |
|
|
45ed6a7e25 | 8 years ago |
|
|
f35b230c37 | 8 years ago |
|
|
fb4e07f107 | 8 years ago |
|
|
429af12aa2 | 8 years ago |
|
|
4947019dbb | 8 years ago |
|
|
2f0f038668 | 8 years ago |
|
|
51a68683f8 | 8 years ago |
|
|
4e00e6e3b0 | 8 years ago |
|
|
860e9185cd | 8 years ago |
|
|
21c9480965 | 8 years ago |
|
|
858ee6df69 | 8 years ago |
|
|
335709bc50 | 8 years ago |
|
|
55b9f1c645 | 8 years ago |
|
|
a88a301d81 | 8 years ago |
|
|
91cbd94ba7 | 8 years ago |
|
|
749e8d5cc4 | 8 years ago |
|
|
1a5d7e400d | 8 years ago |
|
|
b5c377ec73 | 8 years ago |
|
|
931a44ee9d | 8 years ago |
|
|
01216b9520 | 8 years ago |
|
|
82ed807bd2 | 8 years ago |
|
|
ebfe08e0a2 | 8 years ago |
|
|
b963ccb778 | 8 years ago |
|
|
c2a46c5da4 | 8 years ago |
|
|
d0a41e09d0 | 8 years ago |
|
|
c90ce95f59 | 8 years ago |
|
|
00df01f633 | 8 years ago |
|
|
081dbf8541 | 8 years ago |
|
|
e9e5aa295c | 8 years ago |
|
|
b8c4eadc7a | 8 years ago |
|
|
7b88cef36d | 8 years ago |
|
|
4ea5334275 | 8 years ago |
|
|
3e4e1d9def | 8 years ago |
|
|
2cf4a57bf4 | 8 years ago |
|
|
bf4f3e71d3 | 8 years ago |
|
|
1867635e0d | 8 years ago |
|
|
6207e35a1e | 8 years ago |
|
|
44a1f6da0d | 8 years ago |
|
|
6abc89dfd5 | 8 years ago |
|
|
b8c0089a1a | 8 years ago |
|
|
1be2f40eae | 8 years ago |
|
|
a9799b70bc | 8 years ago |
|
|
785b430263 | 8 years ago |
|
|
aafb85c6c6 | 8 years ago |
|
|
eeb890000b | 8 years ago |
|
|
6485c2e035 | 8 years ago |
|
|
c89a4cfe5e | 8 years ago |
|
|
08275aa527 | 8 years ago |
|
|
328f9695d8 | 8 years ago |
|
|
7dac50008a | 8 years ago |
|
|
f680fc004c | 8 years ago |
|
|
c3957d3979 | 8 years ago |
|
|
a8ac21ced0 | 8 years ago |
|
|
3435f4f444 | 8 years ago |
|
|
1228ee55d6 | 8 years ago |
|
|
93d827c63a | 8 years ago |
|
|
2aeb7696c3 | 8 years ago |
|
|
e8772404c7 | 8 years ago |
|
|
f1d0e7a3b1 | 8 years ago |
|
|
d766209ab5 | 8 years ago |
|
|
b2e760f40d | 8 years ago |
|
|
ed8556a9fe | 8 years ago |
|
|
533d24b4be | 8 years ago |
|
|
6e273545a4 | 8 years ago |
|
|
c5f90a9cae | 8 years ago |
|
|
32819b5cca | 8 years ago |
|
|
cfaed1e490 | 8 years ago |
|
|
171552370a | 8 years ago |
|
|
2a2685ff84 | 8 years ago |
|
|
6df5e5212c | 8 years ago |
|
|
35ddcc80eb | 8 years ago |
|
|
60cd27c347 | 8 years ago |
|
|
62f48a15ff | 8 years ago |
|
|
821e45751a | 8 years ago |
|
|
b870757e94 | 8 years ago |
|
|
6ecea191b4 | 8 years ago |
|
|
2d14874d69 | 8 years ago |
|
|
c96fbb4d5c | 8 years ago |
|
|
1b1d3ad728 | 8 years ago |
|
|
deeb211c5d | 8 years ago |
|
|
52139a9137 | 8 years ago |
|
|
6d85d53868 | 8 years ago |
|
|
aef92a21ef | 8 years ago |
|
|
204aaae213 | 8 years ago |
|
|
2b02690b93 | 8 years ago |
|
|
c1494d719a | 8 years ago |
|
|
af94a80c59 | 8 years ago |
|
|
19c32608f3 | 8 years ago |
|
|
dba034fd90 | 8 years ago |
|
|
2c262d1198 | 8 years ago |
|
|
9d1b89a0c1 | 8 years ago |
|
|
36e7c874cd | 8 years ago |
|
|
748891a094 | 8 years ago |
|
|
3a6f550223 | 8 years ago |
|
|
12630e8a8a | 8 years ago |
|
|
f459f67e72 | 8 years ago |
|
|
6581071b01 | 8 years ago |
|
|
eebf2c7d32 | 8 years ago |
|
|
157045924b | 8 years ago |
|
|
c1325d06b7 | 8 years ago |
|
|
fc24d902ad | 8 years ago |
|
|
dd14e13db9 | 8 years ago |
|
|
298dac337c | 8 years ago |
|
|
9724cb0013 | 8 years ago |
|
|
c82fab635c | 8 years ago |
|
|
b35aa272d5 | 8 years ago |
|
|
23cefde335 | 8 years ago |
|
|
111d44b7cb | 8 years ago |
|
|
43630426ff | 8 years ago |
|
|
613bab0a9d | 8 years ago |
|
|
3b77c0732e | 8 years ago |
|
|
4b5cd19396 | 8 years ago |
|
|
8e073579f6 | 8 years ago |
|
|
05a312f6d0 | 8 years ago |
|
|
2016e28ee5 | 8 years ago |
|
|
dfb4127583 | 8 years ago |
|
|
8608b29ded | 8 years ago |
|
|
72a9fbf267 | 8 years ago |
|
|
e30f189a19 | 8 years ago |
|
|
c4c0d450fd | 8 years ago |
|
|
ff5789d4ac | 8 years ago |
|
|
1e9f728a3b | 8 years ago |
|
|
b7127541a3 | 8 years ago |
|
|
038b047116 | 8 years ago |
|
|
73c8da05b7 | 8 years ago |
|
|
8615f3b804 | 8 years ago |
|
|
fa2658cd2b | 8 years ago |
|
|
16eceedbf5 | 8 years ago |
|
|
776fda15a0 | 8 years ago |
|
|
a5a69c2fdf | 8 years ago |
|
|
da20f49c59 | 8 years ago |
|
|
cadd9c751d | 8 years ago |
|
|
c983d47c8e | 8 years ago |
|
|
91db7e4a84 | 8 years ago |
|
|
e278a7d4e3 | 8 years ago |
|
|
a90e5cc7b4 | 8 years ago |
|
|
5c340e85e8 | 8 years ago |
|
|
3ff2926871 | 8 years ago |
|
|
8660d35dcf | 8 years ago |
|
|
25128992b1 | 8 years ago |
|
|
3059d15c17 | 8 years ago |
|
|
f80c8b8141 | 8 years ago |
|
|
23047bc23c | 8 years ago |
|
|
3292b030ce | 8 years ago |
|
|
9e2dd8108c | 8 years ago |
|
|
6e15dba281 | 8 years ago |
|
|
4b32e8b4d3 | 8 years ago |
|
|
6a10411f6a | 8 years ago |
|
|
a38a8d9c59 | 8 years ago |
|
|
ebac131247 | 8 years ago |
|
|
6f8a30c0e3 | 8 years ago |
|
|
67e7c8a5bf | 8 years ago |
|
|
c05f9fe9c9 | 8 years ago |
|
|
3f8168ce0b | 8 years ago |
|
|
773fe2da59 | 8 years ago |
|
|
a4ad3a4ea9 | 8 years ago |
|
|
39b2f1ddac | 8 years ago |
|
|
d048ba15cb | 8 years ago |
|
|
0207c91312 | 8 years ago |
|
|
6aa8c856cf | 8 years ago |
|
|
03120f8dd9 | 8 years ago |
|
|
fa95f964de | 8 years ago |
|
|
29a59808ab | 8 years ago |
|
|
43df802cff | 8 years ago |
|
|
db30e572db | 8 years ago |
|
|
9d43f929bc | 8 years ago |
|
|
b5d94c708d | 8 years ago |
|
|
357b44c265 | 8 years ago |
|
|
6f7d793abd | 8 years ago |
|
|
ad9d591b16 | 8 years ago |
|
|
ec5faf04f8 | 8 years ago |
|
|
c095b722fc | 8 years ago |
|
|
040812d813 | 8 years ago |
|
|
5b8bcb1a9a | 8 years ago |
|
|
28d2f0b66e | 8 years ago |
|
|
65d62ec379 | 8 years ago |
|
|
e9968713e4 | 8 years ago |
|
|
c090fa175e | 8 years ago |
|
|
537f8ef79a | 8 years ago |
|
|
07eb60abc6 | 8 years ago |
|
|
f2bb21f129 | 8 years ago |
|
|
9d6d27ae21 | 8 years ago |
|
|
b4112d5641 | 8 years ago |
|
|
2ddde65a57 | 8 years ago |
|
|
706fa4fca4 | 8 years ago |
|
|
a4d2ca6935 | 8 years ago |
|
|
d9cd957f4d | 8 years ago |
|
|
ac7870280a | 8 years ago |
|
|
6e729c517d | 8 years ago |
|
|
0cd3073134 | 8 years ago |
|
|
284b26abf4 | 8 years ago |
|
|
113cd638f5 | 8 years ago |
|
|
3755655239 | 8 years ago |
|
|
040b2a3d7f | 8 years ago |
|
|
2f2fea617b | 8 years ago |
|
|
1825b65d4c | 8 years ago |
|
|
0a43c6fedd | 8 years ago |
|
|
170a665d4a | 8 years ago |
|
|
11a47c189c | 8 years ago |
|
|
d3e789f5da | 8 years ago |
|
|
068ffe6c9a | 8 years ago |
|
|
a36042b5ce | 8 years ago |
|
|
d9bfbb5525 | 8 years ago |
|
|
cacdb07a6e | 8 years ago |
|
|
396f4fc78e | 8 years ago |
|
|
9adc29318e | 8 years ago |
|
|
d4c0c1747b | 8 years ago |
|
|
e6a0379e54 | 8 years ago |
|
|
5a070388ae | 8 years ago |
|
|
53c786e73c | 8 years ago |
|
|
6ca45c66b8 | 8 years ago |
|
|
06d7612bf5 | 8 years ago |
|
|
ca9229e40c | 8 years ago |
|
|
f2a20688c6 | 8 years ago |
|
|
3f07dd4094 | 8 years ago |
|
|
f8a4630095 | 8 years ago |
|
|
ef7b831a82 | 8 years ago |
|
|
083cf4bf46 | 8 years ago |
|
|
61ae0d2bee | 8 years ago |
|
|
8deb398675 | 8 years ago |
|
|
878d4fa6d5 | 8 years ago |
|
|
7c5a4b6e71 | 8 years ago |
|
|
054d3a5b2b | 8 years ago |
|
|
d0a91d5f50 | 8 years ago |
|
|
364d2985db | 8 years ago |
|
|
d7cb45c237 | 8 years ago |
|
|
a699567a61 | 8 years ago |
|
|
dd1cb33626 | 8 years ago |
|
|
b1f53a6d09 | 8 years ago |
|
|
c4718246ea | 8 years ago |
|
|
0b8291c329 | 8 years ago |
|
|
cdffe16b98 | 8 years ago |
|
|
c2f9d10f71 | 8 years ago |
|
|
e8136cb667 | 8 years ago |
|
|
9fd92d2245 | 8 years ago |
|
|
6460e5893c | 8 years ago |
|
|
48eb207fa5 | 8 years ago |
|
|
76639f528a | 8 years ago |
|
|
88912170fc | 8 years ago |
|
|
507c33dc0e | 8 years ago |
|
|
404d740305 | 8 years ago |
|
|
a15f1fa92e | 8 years ago |
|
|
ef09f42af8 | 8 years ago |
|
|
bc1ac63af0 | 8 years ago |
|
|
5ddffa6c00 | 8 years ago |
|
|
e23276b83a | 8 years ago |
|
|
2692e866dd | 8 years ago |
|
|
70b4eb0877 | 8 years ago |
|
|
97957b7bc3 | 8 years ago |
|
|
9c634ebd45 | 8 years ago |
|
|
ffc44db085 | 8 years ago |
|
|
00d9f0c003 | 8 years ago |
|
|
540436fe7f | 8 years ago |
|
|
b8121aae79 | 8 years ago |
|
|
f2d7d32d1e | 8 years ago |
|
|
6de0f2b9b9 | 8 years ago |
|
|
9672465292 | 8 years ago |
|
|
893b885b5a | 8 years ago |
|
|
acf318d83c | 8 years ago |
|
|
84aa1fd0e6 | 8 years ago |
|
|
71fd4427cc | 8 years ago |
|
|
08f93ae95a | 8 years ago |
|
|
c374ce60c3 | 8 years ago |
|
|
9eda7bf59c | 8 years ago |
|
|
f36735a6b4 | 8 years ago |
|
|
bb84ffaf87 | 8 years ago |
|
|
2fa62e12a1 | 8 years ago |
|
|
b92e03eff6 | 8 years ago |
|
|
406f6473b6 | 8 years ago |
|
|
5ea59ab7c4 | 8 years ago |
|
|
f8a54005bf | 8 years ago |
|
|
b58d09cf02 | 8 years ago |
|
|
2388af05e1 | 8 years ago |
|
|
c3f4f18115 | 8 years ago |
|
|
37ce825dc1 | 8 years ago |
|
|
10972a55df | 9 years ago |
|
|
be2ab1bdca | 9 years ago |
|
|
dc6a80a77d | 9 years ago |
|
|
d7b3841f93 | 9 years ago |
|
|
08ecc1a241 | 9 years ago |
|
|
fa7b0777f3 | 9 years ago |
|
|
68b8baef34 | 9 years ago |
|
|
275899fd29 | 9 years ago |
|
|
df548f1db9 | 9 years ago |
|
|
6da5e5e5b2 | 9 years ago |
|
|
ea16b28e65 | 9 years ago |
|
|
839c185f5e | 9 years ago |
|
|
c74174a3c4 | 9 years ago |
|
|
3df27ffbdf | 9 years ago |
|
|
f2bb7df1db | 9 years ago |
|
|
4135a490ff | 9 years ago |
|
|
3bff9d2aae | 9 years ago |
|
|
cb482d3651 | 9 years ago |
|
|
7730994a79 | 9 years ago |
|
|
930b6dd820 | 9 years ago |
|
|
4765db4d86 | 9 years ago |
|
|
27dea59284 | 9 years ago |
|
|
da8cc90ab4 | 9 years ago |
|
|
754e8213cf | 9 years ago |
|
|
69a9cd66d1 | 9 years ago |
|
|
6781a98fd6 | 9 years ago |
|
|
5922c3fcde | 9 years ago |
|
|
840bf9564d | 9 years ago |
|
|
27f9925fd1 | 9 years ago |
|
|
3b48d64ec3 | 9 years ago |
|
|
57022a410f | 9 years ago |
|
|
7b0cb1b729 | 9 years ago |
|
|
b07972c526 | 9 years ago |
|
|
35e9417e8f | 9 years ago |
|
|
ef172bcf81 | 9 years ago |
|
|
40cc80371b | 9 years ago |
|
|
29f0171291 | 9 years ago |
|
|
12a6978748 | 9 years ago |
|
|
e8bcc4ca9f | 9 years ago |
|
|
5f77d89db6 | 9 years ago |
|
|
09abdc1b9f | 9 years ago |
|
|
6e8ebd8253 | 9 years ago |
|
|
276a1dfa1b | 9 years ago |
|
|
d361ee33fc | 9 years ago |
|
|
96012c6956 | 9 years ago |
|
|
3df7ee9cb1 | 9 years ago |
|
|
89c5f02d76 | 9 years ago |
|
|
3e5afa025a | 9 years ago |
|
|
8835aceb35 | 9 years ago |
|
|
ce97268895 | 9 years ago |
|
|
85255cf195 | 9 years ago |
|
|
9a99a06cd4 | 9 years ago |
|
|
ad4b9b7b00 | 9 years ago |
|
|
b1618632f0 | 9 years ago |
|
|
e0251f55cd | 9 years ago |
|
|
97509f6d03 | 9 years ago |
|
|
585802510a | 9 years ago |
|
|
c2d7096500 | 9 years ago |
|
|
a1e84f4978 | 9 years ago |
|
|
357753dc48 | 9 years ago |
|
|
da992312f3 | 9 years ago |
|
|
076382caf3 | 9 years ago |
|
|
4b8345bb94 | 9 years ago |
|
|
48d9a0fd26 | 9 years ago |
|
|
1c27c01ac5 | 9 years ago |
|
|
33f2dc27d3 | 9 years ago |
|
|
cc7be90de4 | 9 years ago |
|
|
8828c4d5cb | 9 years ago |
|
|
bf7acf678a | 9 years ago |
|
|
a4fb878b08 | 9 years ago |
|
|
09004e0d1e | 9 years ago |
|
|
4ccb9bd0d4 | 9 years ago |
|
|
e68d9bd76e | 9 years ago |
|
|
e451e70fe0 | 9 years ago |
|
|
b3941f8a33 | 9 years ago |
|
|
3b5b572f36 | 9 years ago |
|
|
70910fd2aa | 9 years ago |
|
|
af5afd12f2 | 9 years ago |
|
|
fb3a259e41 | 9 years ago |
|
|
978c145180 | 9 years ago |
|
|
3c539f0ec8 | 10 years ago |
|
|
fdc9c38f1a | 10 years ago |
|
|
e21f87a5f6 | 10 years ago |
|
|
52ae23c598 | 10 years ago |
|
|
e6bebd4775 | 10 years ago |
|
|
83b342d4e4 | 10 years ago |
|
|
6df6794f7a | 10 years ago |
|
|
d586c125a6 | 10 years ago |
|
|
8464e3d594 | 10 years ago |
|
|
9a26274b11 | 10 years ago |
|
|
2ef2505507 | 10 years ago |
|
|
5bb96c1b74 | 10 years ago |
|
|
cf4bb059f9 | 10 years ago |
|
|
12ebb136ba | 10 years ago |
|
|
941d710247 | 10 years ago |
|
|
a429b71665 | 10 years ago |
|
|
7f632afe29 | 10 years ago |
|
|
c978b2c5e9 | 10 years ago |
|
|
144a557ddb | 10 years ago |
|
|
09cf683e1a | 10 years ago |
|
|
73646ed7ce | 10 years ago |
|
|
5fe51be814 | 10 years ago |
|
|
4336c5c7c4 | 10 years ago |
|
|
93f963bc6c | 10 years ago |
|
|
8f7f184837 | 10 years ago |
|
|
2bbf72d9ab | 10 years ago |
|
|
6b0e438cb5 | 10 years ago |
|
|
2e3e1ddb5a | 10 years ago |
|
|
61b3978a5d | 10 years ago |
|
|
ddaa4d13fe | 10 years ago |
|
|
c0821da875 | 10 years ago |
|
|
65924d1be8 | 10 years ago |
|
|
0031a47721 | 10 years ago |
|
|
17cc720dc1 | 10 years ago |
|
|
adfc3b2a50 | 10 years ago |
|
|
44c1ddd00a | 10 years ago |
|
|
e9e1f7e631 | 10 years ago |
|
|
4f63e079bc | 10 years ago |
|
|
f3b98c9f9c | 10 years ago |
|
|
fa740a797d | 10 years ago |
|
|
fb1bd28460 | 10 years ago |
|
|
c9f7cc1855 | 10 years ago |
|
|
3150395375 | 10 years ago |
|
|
e206e62a02 | 10 years ago |
|
|
fbe58341e4 | 10 years ago |
|
|
02a6fffcff | 10 years ago |
|
|
1229edd1ea | 10 years ago |
|
|
87e85fa0da | 10 years ago |
|
|
9cfc2ff6f8 | 10 years ago |
|
|
8200c07a7f | 10 years ago |
|
|
1d08de94fd | 10 years ago |
|
|
2b74a784df | 10 years ago |
|
|
2da268f2ad | 10 years ago |
|
|
fc1662e742 | 10 years ago |
|
|
b56790799a | 10 years ago |
|
|
88c9440359 | 10 years ago |
|
|
9170fc4b96 | 10 years ago |
|
|
43e2bf7453 | 10 years ago |
|
|
9b1dda2c45 | 10 years ago |
|
|
93d28a8e38 | 10 years ago |
|
|
deecee477d | 10 years ago |
|
|
f4dd0254aa | 10 years ago |
|
|
1df054d844 | 10 years ago |
|
|
6eaa85eee1 | 10 years ago |
|
|
72c9429d74 | 10 years ago |
|
|
8c6413bfe2 | 10 years ago |
|
|
7d941d873d | 10 years ago |
|
|
d5e7bc8800 | 10 years ago |
|
|
96ffb97a34 | 10 years ago |
|
|
025446fac1 | 10 years ago |
|
|
15dc2dc1e9 | 10 years ago |
|
|
c668d4c17a | 10 years ago |
|
|
8c6b94e213 | 10 years ago |
|
|
ef2c07e067 | 10 years ago |
|
|
158eb0f45e | 10 years ago |
|
|
8d8f4b22d4 | 10 years ago |
|
|
364c79d9ee | 10 years ago |
|
|
6c0c62cc13 | 10 years ago |
|
|
b279c85afc | 10 years ago |
|
|
d82b455b4e | 10 years ago |
|
|
ad9fe2a8ee | 10 years ago |
|
|
4f80239b4b | 10 years ago |
|
|
66a710359f | 10 years ago |
|
|
3eedfd6fbb | 10 years ago |
|
|
cf5143e876 | 10 years ago |
|
|
6fdbf9dd94 | 10 years ago |
|
|
7d4e569bd6 | 10 years ago |
|
|
3c1419ad3b | 10 years ago |
|
|
50189a450f | 10 years ago |
|
|
2d7ffc639e | 10 years ago |
|
|
16f986860e | 10 years ago |
|
|
c03d38a5c6 | 10 years ago |
|
|
e18782672d | 10 years ago |
|
|
3b7130c525 | 10 years ago |
|
|
e25d748aa4 | 10 years ago |
|
|
f3876463d3 | 10 years ago |
|
|
9e4e4943f3 | 11 years ago |
|
|
7bc684f2b8 | 11 years ago |
|
|
99225e1688 | 11 years ago |
|
|
12c5acd287 | 11 years ago |
|
|
2224ece1a5 | 11 years ago |
|
|
7b651310b4 | 11 years ago |
|
|
85220191c2 | 11 years ago |
|
|
471c314bed | 11 years ago |
|
|
9bda70293f | 11 years ago |
|
|
cfbce5297a | 11 years ago |
|
|
0dcf068b56 | 11 years ago |
|
|
ae0fdc8d10 | 11 years ago |
|
|
98c51dbff4 | 11 years ago |
|
|
a8ceaa5dfb | 11 years ago |
|
|
a914c01ea9 | 11 years ago |
|
|
479b454307 | 11 years ago |
|
|
d265619145 | 11 years ago |
|
|
ff36607354 | 11 years ago |
|
|
51d18b4c47 | 11 years ago |
|
|
77b0dd8233 | 11 years ago |
|
|
9cd5e959aa | 11 years ago |
|
|
6c24fe8e2a | 11 years ago |
|
|
bf7762ba0f | 11 years ago |
|
|
1f4ba9dda9 | 11 years ago |
|
|
c8765697e1 | 11 years ago |
|
|
fac3e5d055 | 11 years ago |
|
|
ee95ccca36 | 11 years ago |
|
|
fb5cac0455 | 11 years ago |
|
|
e088e9cf70 | 11 years ago |
|
|
d333eb96ea | 11 years ago |
|
|
e543517500 | 11 years ago |
|
|
3c41bfcb12 | 11 years ago |
|
|
20e294884a | 11 years ago |
|
|
2b230b85e1 | 11 years ago |
|
|
3591ca42f6 | 11 years ago |
|
|
f7a9ba851d | 11 years ago |
|
|
3d3673f163 | 11 years ago |
|
|
07ba0a0a4b | 11 years ago |
|
|
22d5f9b052 | 11 years ago |
|
|
a7329ef71d | 11 years ago |
|
|
5e8de220e4 | 11 years ago |
|
|
0cb267a081 | 11 years ago |
|
|
a1f8e9599e | 11 years ago |
|
|
c8a461a815 | 11 years ago |
|
|
cd760f33cb | 11 years ago |
|
|
d6a48df601 | 11 years ago |
|
|
fd4a7579f1 | 11 years ago |
|
|
49ac2574b8 | 11 years ago |
|
|
ef68842b80 | 11 years ago |
|
|
5997dec5d1 | 11 years ago |
|
|
a2e5fd671e | 11 years ago |
|
|
6f842724be | 11 years ago |
|
|
32333a440a | 11 years ago |
|
|
a1ff628a57 | 11 years ago |
|
|
bbfef4f6cf | 11 years ago |
|
|
9f51e49725 | 11 years ago |
|
|
f24e9a907f | 11 years ago |
|
|
cef90f0b20 | 11 years ago |
|
|
9b45f27792 | 11 years ago |
|
|
b20d44e36c | 11 years ago |
|
|
dd657f31ae | 11 years ago |
|
|
f81933fb59 | 11 years ago |
|
|
caeb0973d4 | 11 years ago |
|
|
bba94c0787 | 11 years ago |
|
|
0d6c28642c | 11 years ago |
|
|
685bec0647 | 11 years ago |
|
|
23aa1e79cb | 11 years ago |
|
|
8063ea1e67 | 11 years ago |
|
|
e927581336 | 11 years ago |
|
|
33708938da | 11 years ago |
|
|
855833c978 | 11 years ago |
|
|
36cb60fe30 | 11 years ago |
|
|
779c9a6c36 | 11 years ago |
|
|
98ad80de31 | 11 years ago |
|
|
303291fe09 | 11 years ago |
|
|
cbc0337110 | 11 years ago |
|
|
04354e3e90 | 11 years ago |
|
|
d7b6be4567 | 11 years ago |
|
|
2129490a92 | 11 years ago |
|
|
1f9c4adc37 | 11 years ago |
|
|
f138b90e04 | 11 years ago |
|
|
262661347b | 11 years ago |
|
|
05d8c51580 | 11 years ago |
|
|
9aebda7913 | 11 years ago |
|
|
0d92dd7e5b | 11 years ago |
|
|
714c02232a | 11 years ago |
|
|
1aa8b4fc1e | 11 years ago |
|
|
d03434cc43 | 11 years ago |
|
|
6369d37567 | 11 years ago |
|
|
446b5a0a81 | 11 years ago |
|
|
02760abbf0 | 11 years ago |
|
|
20bd54c56b | 11 years ago |
|
|
a58dba5c27 | 11 years ago |
|
|
f3c5815848 | 11 years ago |
|
|
cc6eae5555 | 11 years ago |
|
|
aea695bf8b | 11 years ago |
|
|
0528676c7a | 11 years ago |
|
|
4ab8f52b44 | 11 years ago |
|
|
40e1ed6e3b | 11 years ago |
|
|
b5e71ace47 | 11 years ago |
|
|
276d48a00c | 11 years ago |
|
|
568ad296a3 | 11 years ago |
|
|
ae701d9aff | 11 years ago |
|
|
6f4257bb2a | 11 years ago |
|
|
0c1293b573 | 11 years ago |
|
|
18720c8939 | 11 years ago |
|
|
ea2a949ae0 | 11 years ago |
|
|
3b5fd4fe12 | 11 years ago |
|
|
32d8b7093e | 11 years ago |
|
|
bd462a40f9 | 11 years ago |
|
|
a88171bff7 | 11 years ago |
|
|
9de479ddbc | 11 years ago |
|
|
6c6e27d83c | 11 years ago |
|
|
8adcdb3d2e | 11 years ago |
|
|
637237a1d5 | 11 years ago |
|
|
6911b0c581 | 11 years ago |
|
|
73ed896a85 | 11 years ago |
|
|
535a46db37 | 11 years ago |
|
|
b41cc1ff28 | 11 years ago |
|
|
2f075c71e2 | 11 years ago |
|
|
438a7dca0a | 11 years ago |
|
|
83cc6053eb | 11 years ago |
|
|
4ba4d55e6b | 11 years ago |
|
|
4d4837924c | 11 years ago |
|
|
b65fd71012 | 11 years ago |
|
|
9d245c0510 | 11 years ago |
|
|
7dcfdf9e08 | 11 years ago |
|
|
c8f162d0bb | 11 years ago |
|
|
8aaadb8fc0 | 11 years ago |
|
|
257334b4c2 | 11 years ago |
|
|
3d3160efdf | 11 years ago |
|
|
9afbbae8cf | 11 years ago |
|
|
c4699d06a1 | 11 years ago |
|
|
84399071f5 | 11 years ago |
|
|
9a40eb17a0 | 11 years ago |
|
|
3384a7614a | 11 years ago |
|
|
6bc728f8b8 | 11 years ago |
|
|
57de4fdf14 | 11 years ago |
|
|
ea1b442e13 | 11 years ago |
|
|
29f769fe19 | 11 years ago |
|
|
1cc471bd39 | 11 years ago |
|
|
5155b87ca9 | 11 years ago |
|
|
486183cbe6 | 11 years ago |
|
|
8c506d4d73 | 11 years ago |
|
|
04f160efba | 11 years ago |
|
|
8fcecdbde8 | 11 years ago |
|
|
4f2ecc710d | 11 years ago |
|
|
186c649984 | 11 years ago |
|
|
eec9c79467 | 11 years ago |
|
|
0abc5ff08b | 11 years ago |
|
|
551febbb26 | 11 years ago |
|
|
654821f101 | 11 years ago |
|
|
52540c1a9a | 11 years ago |
|
|
3849a3d4d9 | 11 years ago |
|
|
1e1ec2e92c | 11 years ago |
|
|
05089dc370 | 11 years ago |
|
|
1d2954c39c | 11 years ago |
|
|
2cd6961ed4 | 11 years ago |
|
|
7d3ff66560 | 11 years ago |
|
|
a313e4653d | 11 years ago |
|
|
8f2b473928 | 11 years ago |
|
|
4142551c13 | 11 years ago |
|
|
f8c38177e2 | 11 years ago |
|
|
0211bcec64 | 11 years ago |
|
|
e025afe8ea | 11 years ago |
|
|
7c8a8cdf64 | 11 years ago |
|
|
af57d6d9e7 | 11 years ago |
|
|
1d8243583c | 11 years ago |
|
|
1901b9c6e8 | 11 years ago |
|
|
6f786635f4 | 11 years ago |
|
|
b518ab5573 | 11 years ago |
|
|
89a2610ab1 | 11 years ago |
|
|
13c03d802d | 11 years ago |
|
|
4a86eb0525 | 11 years ago |
|
|
c18db8cc7f | 11 years ago |
|
|
a49340b57a | 11 years ago |
|
|
4ad7c65362 | 11 years ago |
|
|
33b5ac1a57 | 11 years ago |
|
|
5b513a005f | 11 years ago |
|
|
b4254db51c | 11 years ago |
|
|
31b785bcf7 | 11 years ago |
|
|
2207c16a15 | 11 years ago |
|
|
b7e5a7bd44 | 11 years ago |
|
|
818a3db9e4 | 11 years ago |
|
|
fb639870df | 11 years ago |
|
|
d32137ced0 | 11 years ago |
|
|
622d0a7e9d | 11 years ago |
|
|
3fe5d48c05 | 11 years ago |
|
|
dac3bab44f | 11 years ago |
|
|
b4fb58891d | 11 years ago |
|
|
4e76965155 | 11 years ago |
|
|
be3e86e055 | 11 years ago |
|
|
d47d8bf0bf | 11 years ago |
|
|
44f1a61c42 | 11 years ago |
|
|
cd13d2870b | 11 years ago |
|
|
ddaa948cf4 | 11 years ago |
|
|
e751a5403b | 11 years ago |
|
|
0e77cbd15d | 11 years ago |
|
|
1583a3edc6 | 11 years ago |
|
|
dbe14694c8 | 11 years ago |
|
|
eb42375215 | 11 years ago |
|
|
c472e23c7d | 11 years ago |
|
|
f4807b6b29 | 11 years ago |
|
|
37331b1ef2 | 11 years ago |
|
|
b01964db9b | 11 years ago |
|
|
171fef784e | 11 years ago |
|
|
f815223f27 | 11 years ago |
|
|
1c05281183 | 11 years ago |
|
|
1f4ff9c809 | 11 years ago |
|
|
8ae33e9c12 | 11 years ago |
|
|
7cd060a15f | 11 years ago |
|
|
cb29f10173 | 11 years ago |
|
|
c0bfb00be8 | 11 years ago |
|
|
c1314e496b | 11 years ago |
|
|
595de33e83 | 11 years ago |
|
|
5106c4bc44 | 11 years ago |
|
|
764b1a0b7a | 11 years ago |
|
|
0b1ddfa17b | 11 years ago |
|
|
5f177a2e30 | 11 years ago |
|
|
2d4431fe0c | 11 years ago |
|
|
9340975606 | 11 years ago |
|
|
322a5d3207 | 11 years ago |
|
|
99be819a0d | 11 years ago |
|
|
64e468b7d5 | 11 years ago |
|
|
d3161bd5d9 | 11 years ago |
|
|
cb5cbda062 | 11 years ago |
|
|
68f55f6a3e | 11 years ago |
|
|
a15d4df48e | 11 years ago |
|
|
fb994c6831 | 11 years ago |
|
|
b66cd2ca0f | 11 years ago |
|
|
14f71e35d8 | 11 years ago |
|
|
dfb1de3c91 | 11 years ago |
|
|
adfd5a3fe7 | 11 years ago |
|
|
4708427c0f | 11 years ago |
|
|
be33b5c3f0 | 11 years ago |
|
|
1a2adf08a7 | 11 years ago |
|
|
288402dc3a | 11 years ago |
|
|
9b46b2c6c1 | 11 years ago |
|
|
121d4d5022 | 11 years ago |
|
|
f3f461e94c | 11 years ago |
|
|
d7418c9c45 | 11 years ago |
|
|
e90ea2c3ef | 11 years ago |
|
|
b2c9dda8be | 11 years ago |
|
|
b95f974586 | 11 years ago |
|
|
b6cee9dc3d | 11 years ago |
|
|
6e40b641a2 | 11 years ago |
|
|
3de061b92b | 11 years ago |
|
|
5bef16d88d | 11 years ago |
|
|
dd90ff1c57 | 11 years ago |
|
|
4fffc97954 | 11 years ago |
|
|
4d8f908022 | 11 years ago |
|
|
7c5cf28c33 | 11 years ago |
|
|
301e707e6b | 11 years ago |
|
|
c6d89dab64 | 11 years ago |
|
|
8102f3467e | 11 years ago |
|
|
a14f487488 | 11 years ago |
|
|
3607286a3e | 11 years ago |
|
|
4f825399f6 | 11 years ago |
|
|
0a736dc270 | 11 years ago |
|
|
a0b86f7d25 | 11 years ago |
|
|
882d1d9425 | 11 years ago |
|
|
d8bbe9a501 | 11 years ago |
|
|
3ec2c29ef0 | 11 years ago |
|
|
ca8330d4f0 | 11 years ago |
|
|
dbbd13a8d5 | 11 years ago |
|
|
ed43097de8 | 11 years ago |
|
|
a179821f3d | 11 years ago |
|
|
eb70156b90 | 11 years ago |
|
|
b93759e2f9 | 11 years ago |
|
|
687e9d84a9 | 11 years ago |
|
|
e38cd3c7f1 | 11 years ago |
|
|
28923771dc | 11 years ago |
|
|
1629accdb8 | 11 years ago |
|
|
8f9be95a08 | 11 years ago |
|
|
0124096789 | 11 years ago |
|
|
2643125f66 | 11 years ago |
|
|
aa80edc171 | 11 years ago |
|
|
8474fce1bc | 11 years ago |
|
|
365593a389 | 11 years ago |
|
|
1bfe037de6 | 11 years ago |
|
|
cba6d2346e | 11 years ago |
|
|
b5c47c898e | 11 years ago |
|
|
fffec145b9 | 11 years ago |
|
|
539826310b | 11 years ago |
|
|
f3d62969ee | 11 years ago |
|
|
0b81faebee | 11 years ago |
|
|
16ff5db8f4 | 11 years ago |
|
|
c9a8c8d6df | 11 years ago |
|
|
651fa9c16a | 11 years ago |
|
|
96454afb20 | 11 years ago |
|
|
f5c675e8b8 | 11 years ago |
|
|
64e3310a36 | 11 years ago |
|
|
ef9301276c | 11 years ago |
|
|
6c4428ff73 | 11 years ago |
|
|
6952156891 | 11 years ago |
|
|
42e84760dc | 11 years ago |
|
|
21c8bfa537 | 11 years ago |
|
|
e965b1eef7 | 11 years ago |
|
|
dc5761164b | 11 years ago |
|
|
29aa1d393d | 11 years ago |
|
|
dee9c4706f | 11 years ago |
|
|
b843ddfd70 | 11 years ago |
|
|
33af8467b8 | 11 years ago |
|
|
223240bba0 | 11 years ago |
|
|
bace1708f9 | 11 years ago |
|
|
178bded97f | 11 years ago |
|
|
8f7d7d233b | 11 years ago |
|
|
e0eaf97eb4 | 11 years ago |
|
|
8db990daa3 | 11 years ago |
|
|
1ee1bd052a | 11 years ago |
|
|
f4a7378ff2 | 11 years ago |
|
|
97ae38c584 | 11 years ago |
|
|
a61e73d212 | 11 years ago |
|
|
6d8554da76 | 11 years ago |
|
|
24f1ef515f | 11 years ago |
|
|
56d4cf6a6a | 11 years ago |
|
|
26e80a8c5c | 11 years ago |
|
|
cfa4b7ebe5 | 11 years ago |
|
|
05b835dd73 | 11 years ago |
|
|
a3c4df4e00 | 11 years ago |
|
|
c64e26deea | 11 years ago |
|
|
3e71ee90c6 | 11 years ago |
|
|
db6ed71060 | 11 years ago |
|
|
f9ca8d5040 | 11 years ago |
|
|
0241870671 | 11 years ago |
|
|
86e852a722 | 11 years ago |
|
|
859482fff2 | 11 years ago |
|
|
ab556945f3 | 11 years ago |
|
|
8a1b6d806e | 11 years ago |
|
|
3bd9eee897 | 11 years ago |
|
|
d1a5a1856f | 11 years ago |
|
|
1c64aa4af4 | 11 years ago |
|
|
e90bc19420 | 11 years ago |
|
|
5a422a681d | 11 years ago |
|
|
09d605fa04 | 11 years ago |
|
|
6151b10bd8 | 11 years ago |
|
|
00e081f3fe | 11 years ago |
|
|
89fe48ae66 | 11 years ago |
|
|
7a5d174aa4 | 11 years ago |
|
|
648e5e2d67 | 11 years ago |
|
|
bc9c9ca2d9 | 11 years ago |
|
|
f1e9bc363e | 11 years ago |
|
|
71b0c22c9d | 11 years ago |
|
|
ec337b61af | 11 years ago |
|
|
2a2fa8da75 | 11 years ago |
|
|
a3b2edf65e | 11 years ago |
|
|
4f8c0e65e6 | 11 years ago |
|
|
488be6ef3e | 11 years ago |
|
|
749c723d57 | 11 years ago |
|
|
84a0bbf18e | 11 years ago |
|
|
0769160b34 | 11 years ago |
|
|
c2af79c996 | 11 years ago |
|
|
6b4a9a1962 | 11 years ago |
|
|
4833012ae3 | 11 years ago |
|
|
85eded970b | 11 years ago |
|
|
dd25e64134 | 11 years ago |
|
|
3ce0d0aded | 11 years ago |
|
|
feea508a8e | 11 years ago |
|
|
fb2cb5c41c | 11 years ago |
|
|
6eaa7e02b8 | 11 years ago |
|
|
f17ad2f1a5 | 11 years ago |
|
|
4e1b938f25 | 11 years ago |
|
|
e0d742b040 | 11 years ago |
|
|
f432dfa856 | 11 years ago |
|
|
7348d11871 | 11 years ago |
|
|
e2105c395e | 11 years ago |
|
|
055c398916 | 11 years ago |
|
|
e724d1a9e2 | 11 years ago |
|
|
a6b4e3dee0 | 11 years ago |
|
|
cba32c8eb4 | 11 years ago |
|
|
54868d149a | 11 years ago |
|
|
08403a44f8 | 11 years ago |
|
|
bbfcb4eea9 | 11 years ago |
|
|
aff7501596 | 11 years ago |
|
|
10f364c153 | 11 years ago |
|
|
c80280bd2d | 11 years ago |
|
|
c9b1298344 | 11 years ago |
|
|
c6e3b5a81b | 11 years ago |
|
|
3e43478e13 | 11 years ago |
|
|
829f80e1da | 11 years ago |
|
|
618502354f | 11 years ago |
|
|
e2c0beb663 | 11 years ago |
|
|
3dc8e88c75 | 11 years ago |
|
|
9cb78c2575 | 11 years ago |
|
|
7c69a427c2 | 11 years ago |
|
|
799aafbcd4 | 11 years ago |
|
|
e98b514a51 | 11 years ago |
|
|
db49291fa6 | 11 years ago |
|
|
2fbca2cc09 | 11 years ago |
|
|
afaf6aff9b | 11 years ago |
|
|
0fbaf41d09 | 11 years ago |
|
|
4b3d6716ff | 11 years ago |
|
|
f196d31a2f | 11 years ago |
|
|
995236c6a9 | 11 years ago |
|
|
a7f15f0b71 | 11 years ago |
|
|
a6acb50892 | 11 years ago |
|
|
5f92ce4599 | 11 years ago |
|
|
1a1d1b1c4b | 11 years ago |
|
|
3e39e1bd9f | 11 years ago |
|
|
e70bf61206 | 11 years ago |
|
|
1ae15f1a61 | 11 years ago |
|
|
747f6f9955 | 11 years ago |
|
|
e96e535f3d | 11 years ago |
|
|
dd6f3cc4b3 | 11 years ago |
|
|
8f0cf1d340 | 11 years ago |
|
|
cc85464eb5 | 11 years ago |
|
|
e4688ecf22 | 11 years ago |
|
|
2b365ec4c1 | 11 years ago |
|
|
15df6b8e4f | 11 years ago |
|
|
6812ed591a | 11 years ago |
|
|
cce2e85eeb | 11 years ago |
|
|
0397ea0eac | 11 years ago |
|
|
ab0b1936b4 | 11 years ago |
|
|
ad19bae5e1 | 11 years ago |
|
|
2f7be81668 | 11 years ago |
|
|
839c6300b8 | 11 years ago |
|
|
8b01ed93ed | 11 years ago |
|
|
2750dac88c | 11 years ago |
|
|
691c261118 | 11 years ago |
|
|
ee210ad15c | 11 years ago |
|
|
91ad0d65a8 | 11 years ago |
|
|
8af9d7f361 | 11 years ago |
|
|
8c9382d4db | 11 years ago |
|
|
9aaee014d4 | 11 years ago |
|
|
9317615bc7 | 11 years ago |
|
|
3646ecbeb2 | 11 years ago |
|
|
e9b3b5bcd2 | 11 years ago |
|
|
24bc4c9f47 | 11 years ago |
|
|
dced33ca44 | 11 years ago |
|
|
bc199316be | 11 years ago |
|
|
41f3579461 | 11 years ago |
|
|
05f174ab97 | 11 years ago |
|
|
ac201e2f8e | 11 years ago |
|
|
3b5826fe75 | 11 years ago |
|
|
24163694f4 | 11 years ago |
|
|
efb4b98986 | 11 years ago |
|
|
beb70b8343 | 11 years ago |
|
|
a26c893339 | 11 years ago |
|
|
73dc3ba2b0 | 11 years ago |
|
|
231afb565a | 11 years ago |
|
|
75ac4b979e | 11 years ago |
|
|
22bad6201e | 11 years ago |
|
|
822d78be1b | 11 years ago |
|
|
c5546e322f | 11 years ago |
|
|
fd3e24713f | 11 years ago |
|
|
d3223766c8 | 11 years ago |
|
|
7243aedf17 | 11 years ago |
|
|
b1acfb08e6 | 11 years ago |
|
|
7b5ea26f28 | 11 years ago |
|
|
df2ffce8aa | 11 years ago |
|
|
1b66ce8b40 | 11 years ago |
|
|
0f629c9df8 | 11 years ago |
|
|
a6dfe3f416 | 11 years ago |
|
|
1e6f29e64e | 11 years ago |
|
|
052f296181 | 11 years ago |
|
|
eecc860be7 | 11 years ago |
|
|
65cecfe263 | 11 years ago |
|
|
45cd3305d1 | 11 years ago |
|
|
cd52352995 | 11 years ago |
|
|
92838e16d3 | 11 years ago |
|
|
ae66f96570 | 11 years ago |
|
|
6250109a78 | 11 years ago |
|
|
f482164601 | 11 years ago |
|
|
c46d25874d | 11 years ago |
|
|
46883756e5 | 11 years ago |
|
|
f51bb42fa4 | 11 years ago |
|
|
de1f643510 | 11 years ago |
|
|
f570bc7f48 | 11 years ago |
|
|
6571a0700f | 11 years ago |
|
|
9f4e9d48da | 11 years ago |
|
|
40b191e9f4 | 11 years ago |
|
|
de2f0bb292 | 11 years ago |
|
|
1b71f8bba3 | 11 years ago |
|
|
08f87c72bb | 11 years ago |
|
|
54d264646a | 11 years ago |
|
|
6faa9e85c2 | 11 years ago |
|
|
afe6a29c36 | 11 years ago |
|
|
0579c1bcaa | 11 years ago |
|
|
d66b8aa329 | 11 years ago |
|
|
12ca303901 | 11 years ago |
|
|
0fd304947c | 11 years ago |
|
|
500213f479 | 11 years ago |
|
|
33c052e397 | 11 years ago |
|
|
4f7070cf5d | 11 years ago |
|
|
7f422ae479 | 11 years ago |
|
|
38a1cce634 | 11 years ago |
|
|
5ab3550697 | 11 years ago |
|
|
7310e1eaa0 | 11 years ago |
|
|
c5517fa6b4 | 11 years ago |
|
|
c1cfdc61da | 11 years ago |
|
|
13eb2edb59 | 11 years ago |
|
|
031f6a90ee | 11 years ago |
|
|
1ab6e08f71 | 11 years ago |
|
|
0369bf4b6a | 11 years ago |
|
|
5cac2aea84 | 11 years ago |
|
|
73945064ed | 11 years ago |
|
|
56bac7a565 | 11 years ago |
|
|
6123cc8e15 | 11 years ago |
|
|
6c06436452 | 11 years ago |
|
|
4090805223 | 11 years ago |
|
|
ff7c9e96ae | 11 years ago |
|
|
37a9f4d762 | 11 years ago |
|
|
81c710c360 | 11 years ago |
|
|
a9b91ee0b6 | 11 years ago |
|
|
29d2cdc015 | 11 years ago |
|
|
8e5850423c | 11 years ago |
|
|
94a47e7d4d | 11 years ago |
|
|
ae36081605 | 11 years ago |
|
|
19ddf588fb | 11 years ago |
|
|
ed67045360 | 11 years ago |
|
|
a5d051de3f | 11 years ago |
|
|
7ef116e85b | 11 years ago |
|
|
33ffb83f23 | 11 years ago |
|
|
daede90cc7 | 11 years ago |
|
|
72a3819c08 | 11 years ago |
|
|
32ad9420de | 11 years ago |
|
|
86cae37cb6 | 11 years ago |
|
|
d789ffa442 | 11 years ago |
|
|
1807c74580 | 11 years ago |
|
|
4c12408b1e | 11 years ago |
|
|
09123d6971 | 11 years ago |
|
|
d6d7f9347a | 11 years ago |
|
|
5bc14936d5 | 11 years ago |
|
|
e260b19702 | 11 years ago |
|
|
5cd1285ee5 | 11 years ago |
|
|
e54c09da8a | 11 years ago |
|
|
e6e3868080 | 11 years ago |
|
|
9f23b45651 | 11 years ago |
|
|
686403af38 | 11 years ago |
|
|
358ec2c644 | 11 years ago |
|
|
da0e62dff6 | 11 years ago |
|
|
25caa9241c | 11 years ago |
|
|
2216b7f32e | 11 years ago |
|
|
db83931fb7 | 11 years ago |
|
|
cd08ad9782 | 11 years ago |
|
|
9bb22b65ec | 11 years ago |
|
|
dd60a74e3f | 11 years ago |
|
|
987acfef65 | 11 years ago |
|
|
5ff7909497 | 11 years ago |
|
|
170f164288 | 11 years ago |
|
|
4599486290 | 11 years ago |
|
|
db772dea22 | 11 years ago |
|
|
894921e23f | 11 years ago |
|
|
bd0b1638db | 11 years ago |
|
|
9172fcd049 | 11 years ago |
|
|
3d40e0b2aa | 11 years ago |
|
|
5ec2e067df | 11 years ago |
|
|
ba47f39c47 | 11 years ago |
|
|
9c00fbfb3b | 11 years ago |
|
|
06398e8065 | 11 years ago |
|
|
a036152cc7 | 11 years ago |
|
|
3d61e80d1c | 11 years ago |
|
|
61fb46a87f | 11 years ago |
|
|
b626b71b90 | 11 years ago |
|
|
247f85c9e2 | 11 years ago |
|
|
0feefd6659 | 11 years ago |
|
|
33e6728468 | 11 years ago |
|
|
03af075a64 | 11 years ago |
|
|
ef30ab4c2d | 11 years ago |
|
|
abb13424b4 | 11 years ago |
|
|
d9c9627758 | 11 years ago |
|
|
8f0172467a | 11 years ago |
|
|
aebfb15aa2 | 11 years ago |
|
|
a39572448d | 11 years ago |
|
|
08247fb5dd | 11 years ago |
|
|
1a38523875 | 11 years ago |
|
|
0bc67a8819 | 11 years ago |
|
|
d150eb6d1c | 11 years ago |
|
|
ed1e23cfb1 | 11 years ago |
|
|
192053ae99 | 11 years ago |
|
|
4df265b15f | 11 years ago |
|
|
bc980a3522 | 11 years ago |
|
|
9313a7f16b | 11 years ago |
|
|
c56d3ca717 | 11 years ago |
|
|
f514bf0835 | 11 years ago |
|
|
5d08b448b0 | 11 years ago |
|
|
34e1df3218 | 11 years ago |
|
|
4072264fa8 | 11 years ago |
|
|
a04a788eea | 11 years ago |
|
|
ef67930454 | 11 years ago |
|
|
01df7aa50a | 11 years ago |
|
|
88feb450cc | 11 years ago |
|
|
12fcc2d4f3 | 11 years ago |
|
|
ce549b283a | 11 years ago |
|
|
607c977da2 | 11 years ago |
|
|
49f6504f58 | 11 years ago |
|
|
415857c55b | 11 years ago |
|
|
58c546ae08 | 11 years ago |
|
|
6ef4821b73 | 11 years ago |
|
|
d1f5a78ca2 | 11 years ago |
|
|
df27e666a7 | 11 years ago |
|
|
390733affe | 11 years ago |
|
|
04a2486ca9 | 11 years ago |
|
|
58793e4d7c | 11 years ago |
|
|
806d89e443 | 11 years ago |
|
|
193b469ffe | 11 years ago |
|
|
b5e7c9cd03 | 11 years ago |
|
|
ca8d24fb08 | 11 years ago |
|
|
754aa6cd8b | 11 years ago |
|
|
6123bff635 | 11 years ago |
|
|
b66683a581 | 11 years ago |
|
|
184aec1409 | 11 years ago |
|
|
a0de897608 | 11 years ago |
|
|
d50594e7eb | 11 years ago |
|
|
529258de44 | 11 years ago |
|
|
f4a853c611 | 11 years ago |
|
|
14950c0c5f | 11 years ago |
|
|
847f86f947 | 11 years ago |
|
|
c04c4ad4ab | 11 years ago |
|
|
42d69aba2d | 11 years ago |
|
|
706a51c211 | 11 years ago |
|
|
c752853031 | 11 years ago |
|
|
ed30222601 | 11 years ago |
|
|
2a108917b5 | 11 years ago |
|
|
ce9acac0ae | 11 years ago |
|
|
9515769fb5 | 11 years ago |
|
|
dccbbb3879 | 11 years ago |
|
|
c168d050f0 | 11 years ago |
|
|
6d5361cebc | 11 years ago |
|
|
97ca80d8bc | 11 years ago |
|
|
ec6ad5ab80 | 11 years ago |
|
|
e9accabf13 | 11 years ago |
|
|
0f7ce05de2 | 11 years ago |
|
|
ff6c553fb2 | 11 years ago |
|
|
b9a1cab269 | 11 years ago |
|
|
2730d5954b | 11 years ago |
|
|
eb22ee51b3 | 11 years ago |
|
|
2310d01835 | 11 years ago |
|
|
a2e45a024f | 11 years ago |
|
|
2c209ab8d3 | 11 years ago |
|
|
8436f11e5a | 11 years ago |
|
|
789bfe09f6 | 11 years ago |
|
|
0a0c011960 | 11 years ago |
|
|
aa1f793963 | 11 years ago |
|
|
d09bbb3e1e | 11 years ago |
|
|
fccb781950 | 11 years ago |
|
|
bd5492654f | 11 years ago |
|
|
c3178cd442 | 11 years ago |
|
|
8eb76e880c | 11 years ago |
|
|
29eabd44fd | 11 years ago |
|
|
872a478f91 | 11 years ago |
|
|
3d535c6c69 | 11 years ago |
|
|
bda4dba902 | 11 years ago |
|
|
ceb18d4629 | 11 years ago |
|
|
c0b1565131 | 11 years ago |
|
|
31f9683d9f | 11 years ago |
|
|
1be99cf58e | 11 years ago |
|
|
816dca2f33 | 11 years ago |
|
|
9981c25286 | 11 years ago |
|
|
be7668767f | 11 years ago |
|
|
35ed9cd853 | 11 years ago |
|
|
63aa4be9f7 | 11 years ago |
|
|
5d311f144b | 11 years ago |
|
|
056e68da66 | 11 years ago |
|
|
9fa4e2b106 | 11 years ago |
|
|
86441e399a | 11 years ago |
|
|
e7542cda41 | 11 years ago |
|
|
615ac8608c | 11 years ago |
|
|
b63c5fd9b2 | 11 years ago |
|
|
d2ed6778c5 | 11 years ago |
|
|
9f5a327ec8 | 11 years ago |
|
|
e8b8ca5861 | 11 years ago |
|
|
01f7cea94f | 11 years ago |
|
|
146a796240 | 11 years ago |
|
|
991c237404 | 11 years ago |
|
|
30a2bff2ba | 11 years ago |
|
|
7b90a9ab6a | 11 years ago |
|
|
c75ac0cf57 | 11 years ago |
|
|
3bf0624dc5 | 11 years ago |
|
|
7085beb66a | 11 years ago |
|
|
09bec60d43 | 11 years ago |
|
|
b1bc91f070 | 11 years ago |
|
|
0770930c6c | 11 years ago |
|
|
531a6cda3e | 11 years ago |
|
|
0174955287 | 11 years ago |
|
|
fb5d93d207 | 11 years ago |
|
|
b68ba6d728 | 11 years ago |
|
|
dec25f57be | 11 years ago |
|
|
5fe8c04539 | 11 years ago |
|
|
eab0827e9f | 11 years ago |
|
|
f0063372c5 | 11 years ago |
|
|
5777dc0b15 | 11 years ago |
|
|
baa8e86fd4 | 11 years ago |
|
|
b62fb94a00 | 11 years ago |
|
|
44533d77eb | 11 years ago |
|
|
e39b36beda | 11 years ago |
|
|
36233c7325 | 11 years ago |
|
|
0a8c37f46a | 11 years ago |
|
|
2b346a3f46 | 11 years ago |
|
|
10a684faa6 | 11 years ago |
|
|
ee361ae37f | 11 years ago |
|
|
a31351c6f9 | 11 years ago |
|
|
bf5b6c4517 | 11 years ago |
|
|
9a93c2375c | 11 years ago |
|
|
6375aaaccc | 11 years ago |
|
|
cf02253cdd | 11 years ago |
|
|
dbac4f742c | 11 years ago |
|
|
11a0b89574 | 11 years ago |
|
|
dc3de2a3ca | 11 years ago |
|
|
782d066fd9 | 11 years ago |
|
|
df915bbf6c | 11 years ago |
|
|
40bc8087e5 | 11 years ago |
|
|
50dca35543 | 11 years ago |
|
|
67d6782b73 | 11 years ago |
|
|
238e6c3536 | 11 years ago |
|
|
0832eaef6d | 11 years ago |
|
|
f2ca052aca | 11 years ago |
|
|
10b708aee9 | 11 years ago |
|
|
5d8bae3da2 | 11 years ago |
|
|
82642f1fad | 11 years ago |
|
|
fe478610bd | 11 years ago |
|
|
977f94a50a | 11 years ago |
|
|
d01ab961b8 | 11 years ago |
|
|
ce6305210c | 11 years ago |
|
|
5f3dc76b32 | 11 years ago |
|
|
5e19edaab7 | 11 years ago |
|
|
5ba8f58094 | 11 years ago |
|
|
7429a491d7 | 11 years ago |
|
|
2962bd19e2 | 11 years ago |
|
|
4aab150af3 | 11 years ago |
|
|
0e23caeec4 | 11 years ago |
|
|
3524c12924 | 11 years ago |
|
|
f0a58ad06f | 11 years ago |
|
|
bde5c82a3d | 11 years ago |
|
|
e2e4eb56fb | 11 years ago |
|
|
cc316dcda7 | 11 years ago |
|
|
3edd9eabc6 | 11 years ago |
|
|
6f8f0295a8 | 11 years ago |
|
|
40d8c4ecef | 11 years ago |
@ -0,0 +1,29 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Browser (please complete the following information):**
|
||||
- OS: [e.g. MacOS, Linux]
|
||||
- Browser [e.g. Firefox]
|
||||
- Version [e.g. 80.0.1]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
@ -0,0 +1,17 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
@ -1 +1 @@
|
||||
dist/
|
||||
dist/build/
|
||||
|
||||
@ -0,0 +1,20 @@
|
||||
{
|
||||
"browser": true,
|
||||
"devel": true,
|
||||
"eqeqeq": true,
|
||||
"esversion": 8,
|
||||
"globals": {
|
||||
"browser": false,
|
||||
"self": false,
|
||||
"chrome": false,
|
||||
"log": false,
|
||||
"webext": false,
|
||||
"vAPI": false,
|
||||
"µMatrix": false
|
||||
},
|
||||
"laxbreak": true,
|
||||
"strict": "global",
|
||||
"undef": true,
|
||||
"unused": true,
|
||||
"validthis": true
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
sudo: false
|
||||
env:
|
||||
matrix:
|
||||
- BROWSER=chromium EXT=zip
|
||||
- BROWSER=firefox EXT=xpi
|
||||
script: "./tools/make-${BROWSER}.sh ${TRAVIS_TAG}"
|
||||
deploy:
|
||||
provider: releases
|
||||
prerelease: true
|
||||
api_key:
|
||||
secure: eQgPAHH6PKu2dLK+NafxwLl66t0cyW5x5NZFquOwsNMal5nsfof7lyXj2F0Q0vUpGeI21MOipBI8UGv5oXPoiXnr0fhEbEBz65C9vypK61WkDCQVGVeZVNGQwSXUm6gD2EzpPgTCIs52+7dKCDJ3stXzdimOiOTYs4WMNKKarFM=
|
||||
file: dist/build/uMatrix_${TRAVIS_TAG}.${BROWSER}.${EXT}
|
||||
skip_cleanup: true
|
||||
on:
|
||||
repo: gorhill/uMatrix
|
||||
tags: true
|
||||
all_branches: true
|
||||
@ -0,0 +1,4 @@
|
||||
### Submitting issues
|
||||
|
||||
Submit on <https://github.com/geekprojects/nuTensor/issues>.
|
||||
|
||||
@ -1,13 +0,0 @@
|
||||
7cfcd2a79bd510bd9944fb2601fcd701 assets/umatrix/hosts-files.json
|
||||
188ce926323d816ae9d7d5ebbb567862 assets/umatrix/blacklist.txt
|
||||
672d5a95be662327692ff16bde2b8452 assets/thirdparties/mirror1.malwaredomains.com/files/immortal_domains.txt
|
||||
7f0443f3dcc9abfd47cfbc95ce824ddb assets/thirdparties/mirror1.malwaredomains.com/files/README.md
|
||||
d6ceced54f3f997a5b1839ceaaa98cef assets/thirdparties/mirror1.malwaredomains.com/files/justdomains
|
||||
067470524601341099c78a847f3726aa assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat
|
||||
1da7664601ca18f3806ca0af3d9cf123 assets/thirdparties/someonewhocares.org/hosts/hosts
|
||||
70b2d63b4c632d5bc4c8ce910fc05d79 assets/thirdparties/winhelp2002.mvps.org/hosts.txt
|
||||
042419405031f0fcfac3735bf4f05e21 assets/thirdparties/www.malwaredomainlist.com/hostslist/README.md
|
||||
883ed5daa447f23a1132c8a099382054 assets/thirdparties/www.malwaredomainlist.com/hostslist/hosts.txt
|
||||
95687a05b77dea3be8bdb975fbb0f61f assets/thirdparties/hosts-file.net/ad-servers
|
||||
10dca881b4d883df0755cb06896650f2 assets/thirdparties/pgl.yoyo.org/as/serverlist
|
||||
5b8e13b618c68293430913029118781a assets/thirdparties/pgl.yoyo.org/as/README.md
|
||||
@ -1,3 +0,0 @@
|
||||
<http://www.malwaredomains.com/?page_id=1508>:
|
||||
|
||||
"This malware block lists provided here are for free for noncommercial use as part of the fight against malware."
|
||||
@ -1,4 +0,0 @@
|
||||
<http://pgl.yoyo.org/as/index.php>:
|
||||
|
||||
Site does encourage use of the list, and nowhere could I find terms and
|
||||
conditions to use the list. Assuming it can be used freely.
|
||||
@ -1,3 +0,0 @@
|
||||
<http://www.malwaredomainlist.com/>:
|
||||
|
||||
"Our list can be used for free by anyone. Feel free to use it."
|
||||
@ -1,61 +0,0 @@
|
||||
# Blacklist maintained by HTTP Switchboard
|
||||
# For those domain names which are not found in other blacklists
|
||||
|
||||
2mdn.net # "2mdn.net is a domain used by Doubleclick which is an advertising company..."
|
||||
aad73c550c.se # Related to adrotator.se which is itself blacklisted
|
||||
acxiom-online.com # Wikipedia: "Acxiom Corporation is a marketing technology and services company".
|
||||
adextent.com # "We are an advertising technology company - we build technologies that improve ads performance"
|
||||
adgear.com # "AdGear is an online advertising technologies company based in Montreal, Canada"
|
||||
adnxs.com # "Adnxs.com is run by AppNexus, a company that provides technology, data and analytics to help companies buy and sell online display advertising" (Ref.: http://www.theguardian.com/technology/2012/apr/23/adnxs-tracking-trackers-cookies-web-monitoring)
|
||||
adobetag.com # "Adobe Announces Adobe Tag Manager for the Online Marketing Suite"
|
||||
aimatch.com # "Ad Server, SAS® Intelligent Advertising for Publishers"
|
||||
analytics.edgesuite.net
|
||||
atedra.com # "Atedra est un réseau de publicité Internet francophone au Canada"
|
||||
axf8.net # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
|
||||
betrad.com # "Evidon: Home | Online Marketing Intelligence, Web Analytics, Privacy" (which also publishes "Ghostery" add-on..)
|
||||
bizographics.com # "Business Audience Marketing"
|
||||
bkrtx.com
|
||||
|
||||
# "Imagine Having The Power To Turn Abandoning Visitors Into Customers"
|
||||
# "The BounceX software is tracking all the cursor movements of every visitor in real-time" (yikes!)
|
||||
bounceexchange.com
|
||||
|
||||
clicktale.com # "See absolutely everything your visitors do on your webpage ... See their every mouse move, click and keystroke"
|
||||
clicktale.net # Redirect to `clicktale.com`
|
||||
crosspixel.net # (cookies, localStorage) "leading provider of high performance audience data and information for the real-time advertising industry"
|
||||
crsspxl.com # Related to crosspixel.net
|
||||
datarating.com # see https://github.com/gorhill/httpswitchboard/issues/343
|
||||
displaymarketplace.com
|
||||
erovinmo.com # No info whatsoever from site itself can be found = naughty corner. Ironically spotted at "http://www.technologyreview.com/news/519336/bruce-schneier-nsa-spying-is-making-us-less-safe/" (also: http://www.mywot.com/en/scorecard/erovinmo.com)
|
||||
exelator.com # "domain used by eXelate Media which is an advertising company that is part of a network of sites, cookies, and other technologies used to track you" (Ref.: http://www.donottrackplus.com/trackers/exelator.com.php)
|
||||
everestjs.net # related to `everesttech.net`
|
||||
everesttech.net # "search engine marketing (SEM) solutions", pixel image on the page, looks like tracking to me. Spotted @ `http://www.homedepot.ca/` (search worked fine when blocking this hostname)
|
||||
eyereturn.com # "eyeReturn Marketing is the only end-to-end digital advertising platform in the market"
|
||||
gigya.com # "The tools you need to connect with consumers, harness rich data, and make marketing relevant"
|
||||
inmuiads.info #
|
||||
janrainbackplane.com # "Easily visualize, segment and update customer profiles to enable true personalized marketing"
|
||||
krxd.net # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
|
||||
lijit.com # "We provide online advertising services, audience analytics"
|
||||
llnwd.net # http://en.wikipedia.org/wiki/Limelight_Networks
|
||||
lduhtrp.net
|
||||
mathtag.com # "domain used by MediaMath to place cookies, on behalf of its customers, on the computers of visitors to our selected customer's websites and who may view our customer's display advertisements"
|
||||
mxpnl.com #
|
||||
moatads.com # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
|
||||
mookie1.com # "Specializing in online digital advertising, search marketing"
|
||||
msads.net # Sounds like ads, and no home web page...
|
||||
omtrdc.net # Redirect to Omniture
|
||||
outbrain.com # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
|
||||
panoramtech.net # As seen in a screenshot at http://arstechnica.com/security/2014/01/malware-vendors-buy-chrome-extensions-to-send-adware-filled-updates/
|
||||
parsely.com # http://en.wikipedia.org/wiki/Parse.ly
|
||||
peer39.net # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
|
||||
pub2srv.com # "This url is used by ad network Propeller Ads Media for ad serving"
|
||||
servebom.com # no home page, seen as 'tracking.servebom.com': good enough for this list
|
||||
|
||||
# These have "tracking" in domain name...
|
||||
tracking.tomsguide.com
|
||||
tracking.tomshardware.com
|
||||
tracking.tomshardware.co.uk
|
||||
|
||||
wunderloop.net # https://www.eff.org/deeplinks/2013/06/third-party-resources-nsa-leaks
|
||||
yceml.net
|
||||
|
||||
@ -0,0 +1,192 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import datetime
|
||||
import json
|
||||
import jwt
|
||||
import os
|
||||
import re
|
||||
import requests
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
import zipfile
|
||||
|
||||
from distutils.version import StrictVersion
|
||||
from string import Template
|
||||
|
||||
# - Download target (raw) uMatrix.chromium.zip from GitHub
|
||||
# - This is referred to as "raw" package
|
||||
# - This will fail if not a dev build
|
||||
# - Upload uMatrix.chromium.zip to Chrome store
|
||||
# - Publish uMatrix.chromium.zip to Chrome store
|
||||
|
||||
# Find path to project root
|
||||
projdir = os.path.split(os.path.abspath(__file__))[0]
|
||||
while not os.path.isdir(os.path.join(projdir, '.git')):
|
||||
projdir = os.path.normpath(os.path.join(projdir, '..'))
|
||||
|
||||
# We need a version string to work with
|
||||
if len(sys.argv) >= 2 and sys.argv[1]:
|
||||
version = sys.argv[1]
|
||||
else:
|
||||
version = input('Github release version: ')
|
||||
version.strip()
|
||||
if not re.search('^\d+\.\d+\.\d+(b|rc)\d+$', version):
|
||||
print('Error: Invalid version string.')
|
||||
exit(1)
|
||||
|
||||
cs_extension_id = 'eckgcipdkhcfghnmincccnhpdmnbefki'
|
||||
tmpdir = tempfile.TemporaryDirectory()
|
||||
raw_zip_filename = 'uMatrix_'+ version + '.chromium.zip'
|
||||
raw_zip_filepath = os.path.join(tmpdir.name, raw_zip_filename)
|
||||
github_owner = 'gorhill'
|
||||
github_repo = 'uMatrix'
|
||||
|
||||
# Load/save auth secrets
|
||||
# The build directory is excluded from git
|
||||
ubo_secrets = dict()
|
||||
ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets')
|
||||
if os.path.isfile(ubo_secrets_filename):
|
||||
with open(ubo_secrets_filename) as f:
|
||||
ubo_secrets = json.load(f)
|
||||
|
||||
def input_secret(prompt, token):
|
||||
if token in ubo_secrets:
|
||||
prompt += ' ✔'
|
||||
prompt += ': '
|
||||
value = input(prompt).strip()
|
||||
if len(value) == 0:
|
||||
if token not in ubo_secrets:
|
||||
print('Token error:', token)
|
||||
exit(1)
|
||||
value = ubo_secrets[token]
|
||||
elif token not in ubo_secrets or value != ubo_secrets[token]:
|
||||
ubo_secrets[token] = value
|
||||
exists = os.path.isfile(ubo_secrets_filename)
|
||||
with open(ubo_secrets_filename, 'w') as f:
|
||||
json.dump(ubo_secrets, f, indent=2)
|
||||
if not exists:
|
||||
os.chmod(ubo_secrets_filename, 0o600)
|
||||
return value
|
||||
|
||||
|
||||
# GitHub API token
|
||||
github_token = input_secret('Github token', 'github_token')
|
||||
github_auth = 'token ' + github_token
|
||||
|
||||
#
|
||||
# Get metadata from GitHub about the release
|
||||
#
|
||||
|
||||
# https://developer.github.com/v3/repos/releases/#get-a-single-release
|
||||
print('Downloading release info from GitHub...')
|
||||
release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, version)
|
||||
headers = { 'Authorization': github_auth, }
|
||||
response = requests.get(release_info_url, headers=headers)
|
||||
if response.status_code != 200:
|
||||
print('Error: Release not found: {0}'.format(response.status_code))
|
||||
exit(1)
|
||||
release_info = response.json()
|
||||
|
||||
#
|
||||
# Extract URL to raw package from metadata
|
||||
#
|
||||
|
||||
# Find url for uMatrix.chromium.zip
|
||||
raw_zip_url = ''
|
||||
for asset in release_info['assets']:
|
||||
if asset['name'] == raw_zip_filename:
|
||||
raw_zip_url = asset['url']
|
||||
if len(raw_zip_url) == 0:
|
||||
print('Error: Release asset URL not found')
|
||||
exit(1)
|
||||
|
||||
#
|
||||
# Download raw package from GitHub
|
||||
#
|
||||
|
||||
# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
|
||||
print('Downloading raw zip package from GitHub...')
|
||||
headers = {
|
||||
'Authorization': github_auth,
|
||||
'Accept': 'application/octet-stream',
|
||||
}
|
||||
response = requests.get(raw_zip_url, headers=headers)
|
||||
# Redirections are transparently handled:
|
||||
# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history
|
||||
if response.status_code != 200:
|
||||
print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code))
|
||||
exit(1)
|
||||
with open(raw_zip_filepath, 'wb') as f:
|
||||
f.write(response.content)
|
||||
print('Downloaded raw package saved as {0}'.format(raw_zip_filepath))
|
||||
|
||||
#
|
||||
# Upload to Chrome store
|
||||
#
|
||||
|
||||
# Auth tokens
|
||||
cs_id = input_secret('Chrome store id', 'cs_id')
|
||||
cs_secret = input_secret('Chrome store secret', 'cs_secret')
|
||||
cs_refresh = input_secret('Chrome store refresh token', 'cs_refresh')
|
||||
|
||||
print('Uploading to Chrome store...')
|
||||
with open(raw_zip_filepath, 'rb') as f:
|
||||
print('Generating access token...')
|
||||
auth_url = 'https://accounts.google.com/o/oauth2/token'
|
||||
auth_payload = {
|
||||
'client_id': cs_id,
|
||||
'client_secret': cs_secret,
|
||||
'grant_type': 'refresh_token',
|
||||
'refresh_token': cs_refresh,
|
||||
}
|
||||
auth_response = requests.post(auth_url, data=auth_payload)
|
||||
if auth_response.status_code != 200:
|
||||
print('Error: Auth failed -- server error {0}'.format(auth_response.status_code))
|
||||
print(auth_response.text)
|
||||
exit(1)
|
||||
response_dict = auth_response.json()
|
||||
if 'access_token' not in response_dict:
|
||||
print('Error: Auth failed -- no access token')
|
||||
exit(1)
|
||||
# Prepare access token
|
||||
cs_auth = 'Bearer ' + response_dict['access_token']
|
||||
headers = {
|
||||
'Authorization': cs_auth,
|
||||
'x-goog-api-version': '2',
|
||||
}
|
||||
# Upload
|
||||
print('Uploading package...')
|
||||
upload_url = 'https://www.googleapis.com/upload/chromewebstore/v1.1/items/{0}'.format(cs_extension_id)
|
||||
upload_response = requests.put(upload_url, headers=headers, data=f)
|
||||
f.close()
|
||||
if upload_response.status_code != 200:
|
||||
print('Upload failed -- server error {0}'.format(upload_response.status_code))
|
||||
print(upload_response.text)
|
||||
exit(1)
|
||||
response_dict = upload_response.json();
|
||||
if 'uploadState' not in response_dict or response_dict['uploadState'] != 'SUCCESS':
|
||||
print('Upload failed -- server error {0}'.format(response_dict['uploadState']))
|
||||
exit(1)
|
||||
print('Upload succeeded.')
|
||||
# Publish
|
||||
print('Publishing package...')
|
||||
publish_url = 'https://www.googleapis.com/chromewebstore/v1.1/items/{0}/publish'.format(cs_extension_id)
|
||||
headers = {
|
||||
'Authorization': cs_auth,
|
||||
'x-goog-api-version': '2',
|
||||
'Content-Length': '0',
|
||||
}
|
||||
publish_response = requests.post(publish_url, headers=headers)
|
||||
if publish_response.status_code != 200:
|
||||
print('Error: Chrome store publishing failed -- server error {0}'.format(publish_response.status_code))
|
||||
exit(1)
|
||||
response_dict = publish_response.json();
|
||||
if 'status' not in response_dict or response_dict['status'][0] != 'OK':
|
||||
print('Publishing failed -- server error {0}'.format(response_dict['status']))
|
||||
exit(1)
|
||||
print('Publishing succeeded.')
|
||||
|
||||
print('All done.')
|
||||
@ -0,0 +1,321 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import datetime
|
||||
import json
|
||||
import jwt
|
||||
import os
|
||||
import re
|
||||
import requests
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
import zipfile
|
||||
|
||||
from distutils.version import LooseVersion
|
||||
from string import Template
|
||||
|
||||
# - Download target (raw) nuTensor.firefox.xpi from GitHub
|
||||
# - This is referred to as "raw" package
|
||||
# - This will fail if not a dev build
|
||||
# - Modify raw package to make it self-hosted
|
||||
# - This is referred to as "unsigned" package
|
||||
# - Ask AMO to sign nuTensor.firefox.xpi
|
||||
# - Generate JWT to be used for communication with server
|
||||
# - Upload unsigned package to AMO
|
||||
# - Wait for a valid download URL for signed package
|
||||
# - Download signed package as nuTensor.firefox.signed.xpi
|
||||
# - This is referred to as "signed" package
|
||||
# - Upload nuTensor.firefox.signed.xpi to GitHub
|
||||
# - Remove nuTensor.firefox.xpi from GitHub
|
||||
# - Modify updates.json to point to new version
|
||||
# - Commit changes to repo
|
||||
|
||||
# Find path to project root
|
||||
projdir = os.path.split(os.path.abspath(__file__))[0]
|
||||
while not os.path.isdir(os.path.join(projdir, '.git')):
|
||||
projdir = os.path.normpath(os.path.join(projdir, '..'))
|
||||
# Check that found project root is valid
|
||||
version_filepath = os.path.join(projdir, 'dist', 'version')
|
||||
if not os.path.isfile(version_filepath):
|
||||
print('Version file not found.')
|
||||
exit(1)
|
||||
|
||||
# We need a version string to work with
|
||||
if len(sys.argv) >= 2 and sys.argv[1]:
|
||||
tag_version = sys.argv[1]
|
||||
else:
|
||||
tag_version = input('Github release version: ')
|
||||
tag_version.strip()
|
||||
match = re.search('^(\d+\.\d+\.\d+)(?:(b|rc)(\d+))?$', tag_version)
|
||||
if not match:
|
||||
print('Error: Invalid version string.')
|
||||
exit(1)
|
||||
ext_version = match.group(1);
|
||||
if match.group(2):
|
||||
revision = int(match.group(3))
|
||||
if match.group(2) == 'rc':
|
||||
revision += 100;
|
||||
ext_version += '.' + str(revision)
|
||||
|
||||
extension_id = 'nuTensor@geekprojects.com'
|
||||
tmpdir = tempfile.TemporaryDirectory()
|
||||
raw_xpi_filename = 'nuTensor_' + tag_version + '.firefox.xpi'
|
||||
raw_xpi_filepath = os.path.join(tmpdir.name, raw_xpi_filename)
|
||||
unsigned_xpi_filepath = os.path.join(tmpdir.name, 'nuTensor.firefox.unsigned.xpi')
|
||||
signed_xpi_filename = 'nuTensor_' + tag_version + '.firefox.signed.xpi'
|
||||
signed_xpi_filepath = os.path.join(tmpdir.name, signed_xpi_filename)
|
||||
github_owner = 'geekprojects'
|
||||
github_repo = 'nuTensor'
|
||||
|
||||
# Load/save auth secrets
|
||||
# The build directory is excluded from git
|
||||
ubo_secrets = dict()
|
||||
ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets')
|
||||
if os.path.isfile(ubo_secrets_filename):
|
||||
with open(ubo_secrets_filename) as f:
|
||||
ubo_secrets = json.load(f)
|
||||
|
||||
def input_secret(prompt, token):
|
||||
if token in ubo_secrets:
|
||||
prompt += ' ✔'
|
||||
prompt += ': '
|
||||
value = input(prompt).strip()
|
||||
if len(value) == 0:
|
||||
if token not in ubo_secrets:
|
||||
print('Token error:', token)
|
||||
exit(1)
|
||||
value = ubo_secrets[token]
|
||||
elif token not in ubo_secrets or value != ubo_secrets[token]:
|
||||
ubo_secrets[token] = value
|
||||
exists = os.path.isfile(ubo_secrets_filename)
|
||||
with open(ubo_secrets_filename, 'w') as f:
|
||||
json.dump(ubo_secrets, f, indent=2)
|
||||
if not exists:
|
||||
os.chmod(ubo_secrets_filename, 0o600)
|
||||
return value
|
||||
|
||||
# GitHub API token
|
||||
github_token = input_secret('Github token', 'github_token')
|
||||
github_auth = 'token ' + github_token
|
||||
|
||||
#
|
||||
# Get metadata from GitHub about the release
|
||||
#
|
||||
|
||||
# https://developer.github.com/v3/repos/releases/#get-a-single-release
|
||||
print('Downloading release info from GitHub...')
|
||||
release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, tag_version)
|
||||
headers = { 'Authorization': github_auth, }
|
||||
response = requests.get(release_info_url, headers=headers)
|
||||
if response.status_code != 200:
|
||||
print('Error: Release not found: {0}'.format(response.status_code))
|
||||
exit(1)
|
||||
release_info = response.json()
|
||||
|
||||
#
|
||||
# Extract URL to raw package from metadata
|
||||
#
|
||||
|
||||
# Find url for nuTensor.firefox.xpi
|
||||
raw_xpi_url = ''
|
||||
for asset in release_info['assets']:
|
||||
if asset['name'] == signed_xpi_filename:
|
||||
print('Error: Found existing signed self-hosted package.')
|
||||
exit(1)
|
||||
if asset['name'] == raw_xpi_filename:
|
||||
raw_xpi_url = asset['url']
|
||||
if len(raw_xpi_url) == 0:
|
||||
print('Error: Release asset URL not found')
|
||||
exit(1)
|
||||
|
||||
#
|
||||
# Download raw package from GitHub
|
||||
#
|
||||
|
||||
# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
|
||||
print('Downloading raw xpi package from GitHub...')
|
||||
headers = {
|
||||
'Authorization': github_auth,
|
||||
'Accept': 'application/octet-stream',
|
||||
}
|
||||
response = requests.get(raw_xpi_url, headers=headers)
|
||||
# Redirections are transparently handled:
|
||||
# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history
|
||||
if response.status_code != 200:
|
||||
print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code))
|
||||
exit(1)
|
||||
with open(raw_xpi_filepath, 'wb') as f:
|
||||
f.write(response.content)
|
||||
print('Downloaded raw package saved as {0}'.format(raw_xpi_filepath))
|
||||
|
||||
#
|
||||
# Convert the package to a self-hosted one: add `update_url` to the manifest
|
||||
#
|
||||
|
||||
print('Converting raw xpi package into self-hosted xpi package...')
|
||||
with zipfile.ZipFile(raw_xpi_filepath, 'r') as zipin:
|
||||
with zipfile.ZipFile(unsigned_xpi_filepath, 'w') as zipout:
|
||||
for item in zipin.infolist():
|
||||
data = zipin.read(item.filename)
|
||||
if item.filename == 'manifest.json':
|
||||
manifest = json.loads(bytes.decode(data))
|
||||
manifest['browser_specific_settings']['gecko']['update_url'] = 'https://raw.githubusercontent.com/{0}/{1}/master/dist/firefox/updates.json'.format(github_owner, github_repo)
|
||||
data = json.dumps(manifest, indent=2, separators=(',', ': '), sort_keys=True).encode()
|
||||
zipout.writestr(item, data)
|
||||
|
||||
#
|
||||
# Ask AMO to sign the self-hosted package
|
||||
# - https://developer.mozilla.org/en-US/Add-ons/Distribution#Distributing_your_add-on
|
||||
# - https://pyjwt.readthedocs.io/en/latest/usage.html
|
||||
# - https://addons-server.readthedocs.io/en/latest/topics/api/auth.html
|
||||
# - https://addons-server.readthedocs.io/en/latest/topics/api/signing.html
|
||||
#
|
||||
|
||||
amo_api_key = ''
|
||||
amo_secret = ''
|
||||
|
||||
def get_jwt_auth():
|
||||
global amo_api_key
|
||||
if amo_api_key == '':
|
||||
amo_api_key = input_secret('AMO API key', 'amo_api_key')
|
||||
global amo_secret
|
||||
if amo_secret == '':
|
||||
amo_secret = input_secret('AMO API secret', 'amo_secret')
|
||||
amo_nonce = os.urandom(8).hex()
|
||||
jwt_payload = {
|
||||
'iss': amo_api_key,
|
||||
'jti': amo_nonce,
|
||||
'iat': datetime.datetime.utcnow(),
|
||||
'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=15),
|
||||
}
|
||||
return 'JWT ' + jwt.encode(jwt_payload, amo_secret).decode()
|
||||
|
||||
print('Ask AMO to sign self-hosted xpi package...')
|
||||
with open(unsigned_xpi_filepath, 'rb') as f:
|
||||
# https://blog.mozilla.org/addons/2019/11/11/security-improvements-in-amo-upload-tools/
|
||||
# "We recommend allowing up to 15 minutes."
|
||||
interval = 60 # check every 60 seconds
|
||||
countdown = 15 * 60 / interval # for at most 15 minutes
|
||||
headers = { 'Authorization': get_jwt_auth(), }
|
||||
data = { 'channel': 'unlisted' }
|
||||
files = { 'upload': f, }
|
||||
signing_url = 'https://addons.mozilla.org/api/v3/addons/{0}/versions/{1}/'.format(extension_id, ext_version)
|
||||
print('Submitting package to be signed...')
|
||||
response = requests.put(signing_url, headers=headers, data=data, files=files)
|
||||
if response.status_code != 202:
|
||||
print('Error: Creating new version failed -- server error {0}'.format(response.status_code))
|
||||
print(response.text)
|
||||
exit(1)
|
||||
print('Request for signing self-hosted xpi package succeeded.')
|
||||
signing_request_response = response.json();
|
||||
f.close()
|
||||
print('Waiting for AMO to process the request to sign the self-hosted xpi package...')
|
||||
# Wait for signed package to be ready
|
||||
signing_check_url = signing_request_response['url']
|
||||
while True:
|
||||
sys.stdout.write('.')
|
||||
sys.stdout.flush()
|
||||
time.sleep(interval)
|
||||
countdown -= 1
|
||||
if countdown <= 0:
|
||||
print('Error: AMO signing timed out')
|
||||
exit(1)
|
||||
headers = { 'Authorization': get_jwt_auth(), }
|
||||
response = requests.get(signing_check_url, headers=headers)
|
||||
if response.status_code != 200:
|
||||
print('Error: AMO signing failed -- server error {0}'.format(response.status_code))
|
||||
print(response.text)
|
||||
exit(1)
|
||||
signing_check_response = response.json()
|
||||
if not signing_check_response['processed']:
|
||||
continue
|
||||
if not signing_check_response['valid']:
|
||||
print('Error: AMO validation failed')
|
||||
print(response.text)
|
||||
exit(1)
|
||||
if not signing_check_response['files'] or len(signing_check_response['files']) == 0:
|
||||
continue
|
||||
if not signing_check_response['files'][0]['signed']:
|
||||
continue
|
||||
if not signing_check_response['files'][0]['download_url']:
|
||||
print('Error: AMO signing failed')
|
||||
print(response.text)
|
||||
exit(1)
|
||||
print('\r')
|
||||
print('Self-hosted xpi package successfully signed.')
|
||||
download_url = signing_check_response['files'][0]['download_url']
|
||||
print('Downloading signed self-hosted xpi package from {0}...'.format(download_url))
|
||||
response = requests.get(download_url, headers=headers)
|
||||
if response.status_code != 200:
|
||||
print('Error: Download signed package failed -- server error {0}'.format(response.status_code))
|
||||
print(response.text)
|
||||
exit(1)
|
||||
with open(signed_xpi_filepath, 'wb') as f:
|
||||
f.write(response.content)
|
||||
f.close()
|
||||
print('Signed self-hosted xpi package downloaded.')
|
||||
break
|
||||
|
||||
#
|
||||
# Upload signed package to GitHub
|
||||
#
|
||||
|
||||
# https://developer.github.com/v3/repos/releases/#upload-a-release-asset
|
||||
print('Uploading signed self-hosted xpi package to GitHub...')
|
||||
with open(signed_xpi_filepath, 'rb') as f:
|
||||
url = release_info['upload_url'].replace('{?name,label}', '?name=' + signed_xpi_filename)
|
||||
headers = {
|
||||
'Authorization': github_auth,
|
||||
'Content-Type': 'application/zip',
|
||||
}
|
||||
response = requests.post(url, headers=headers, data=f.read())
|
||||
if response.status_code != 201:
|
||||
print('Error: Upload signed package failed -- server error: {0}'.format(response.status_code))
|
||||
exit(1)
|
||||
|
||||
#
|
||||
# Remove raw package from GitHub
|
||||
#
|
||||
|
||||
# https://developer.github.com/v3/repos/releases/#delete-a-release-asset
|
||||
print('Remove raw xpi package from GitHub...')
|
||||
headers = { 'Authorization': github_auth, }
|
||||
response = requests.delete(raw_xpi_url, headers=headers)
|
||||
if response.status_code != 204:
|
||||
print('Error: Deletion of raw package failed -- server error: {0}'.format(response.status_code))
|
||||
|
||||
#
|
||||
# Update updates.json to point to new package -- but only if just-signed
|
||||
# package is higher version than current one.
|
||||
#
|
||||
|
||||
print('Update GitHub to point to newly signed self-hosted xpi package...')
|
||||
updates_json_filepath = os.path.join(projdir, 'dist', 'firefox', 'updates.json')
|
||||
with open(updates_json_filepath) as f:
|
||||
updates_json = json.load(f)
|
||||
f.close()
|
||||
previous_version = updates_json['addons'][extension_id]['updates'][0]['version']
|
||||
if LooseVersion(ext_version) > LooseVersion(previous_version):
|
||||
with open(os.path.join(projdir, 'dist', 'firefox', 'updates.template.json')) as f:
|
||||
template_json = Template(f.read())
|
||||
f.close()
|
||||
updates_json = template_json.substitute(ext_version=ext_version, tag_version=tag_version)
|
||||
with open(updates_json_filepath, 'w') as f:
|
||||
f.write(updates_json)
|
||||
f.close()
|
||||
# Automatically git add/commit if needed.
|
||||
# - Stage the changed file
|
||||
r = subprocess.run(['git', 'status', '-s', updates_json_filepath], stdout=subprocess.PIPE)
|
||||
rout = bytes.decode(r.stdout).strip()
|
||||
if len(rout) >= 2 and rout[1] == 'M':
|
||||
subprocess.run(['git', 'add', updates_json_filepath])
|
||||
# - Commit the staged file
|
||||
r = subprocess.run(['git', 'status', '-s', updates_json_filepath], stdout=subprocess.PIPE)
|
||||
rout = bytes.decode(r.stdout).strip()
|
||||
if len(rout) >= 2 and rout[0] == 'M':
|
||||
subprocess.run(['git', 'commit', '-m', 'Make Firefox dev build auto-update', updates_json_filepath])
|
||||
subprocess.run(['git', 'push', 'origin', 'HEAD'])
|
||||
|
||||
print('All done.')
|
||||
@ -0,0 +1,14 @@
|
||||
{
|
||||
"addons": {
|
||||
"nuTensor@geekprojects.com": {
|
||||
"updates": [
|
||||
{
|
||||
"version": "1.4.1.6",
|
||||
"browser_specific_settings": { "gecko": { "strict_min_version": "56" } },
|
||||
"update_info_url": "https://github.com/geekprojects/nuTensor/releases/tag/1.4.1b6",
|
||||
"update_link": "https://github.com/geekprojects/nuTensor/releases/download/1.4.1b6/nuTensor_1.4.1b6.firefox.signed.xpi"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
{
|
||||
"addons": {
|
||||
"nuTensor@geekprojects.com": {
|
||||
"updates": [
|
||||
{
|
||||
"version": "$ext_version",
|
||||
"browser_specific_settings": { "gecko": { "strict_min_version": "56" } },
|
||||
"update_info_url": "https://github.com/geekprojects/nuTensor/releases/tag/$tag_version",
|
||||
"update_link": "https://github.com/geekprojects/nuTensor/releases/download/$tag_version/nuTensor_$tag_version.firefox.signed.xpi"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
1.5.0.0
|
||||
@ -0,0 +1,39 @@
|
||||
## Building nuTensor
|
||||
|
||||
### Requirements
|
||||
|
||||
Tools:
|
||||
* bash
|
||||
* python 3
|
||||
|
||||
You will need both this nuTensor and the nuAssets repositories. These should both be placed in the same directory:
|
||||
```
|
||||
git clone https://github.com/geekprojects/nuAssets.git
|
||||
git clone https://github.com/geekprojects/nuTensor.git
|
||||
cd nuTensor
|
||||
```
|
||||
|
||||
### Packaging
|
||||
You can now run the scripts that package everything up.
|
||||
These are bash scripts. They have only been tested on Linux and MacOS.
|
||||
|
||||
#### For Firefox
|
||||
```
|
||||
tools/make-firefox.sh all
|
||||
```
|
||||
|
||||
#### For Chrome/Chromium (Not yet tested)
|
||||
```
|
||||
tools/make-chromium.sh all
|
||||
```
|
||||
|
||||
#### For Opera (Not yet tested)
|
||||
```
|
||||
tools/make-opera.sh
|
||||
```
|
||||
|
||||
The installation package should now be found in dist/build/
|
||||
|
||||
### Installing
|
||||
|
||||
Follow the instructions in [README.md](README.md) to install it.
|
||||
@ -1,26 +0,0 @@
|
||||
## INSTALL
|
||||
|
||||
### Manual installation
|
||||
|
||||
- Download and unzip `uMatrix.chromium-{version}.zip` ([latest release desirable](https://github.com/gorhill/uMatrix/releases)).
|
||||
- Rename the unzipped directory to `uMatrix` (if it is different)
|
||||
- When you later update manually, replace the **content** of the `uMatrix` folder with the **content** of the latest zipped version.
|
||||
- This will ensure that all the extension settings will be preserved
|
||||
- As long as the extension loads **from same folder path from which it was originally installed**, all your settings will be preserved.
|
||||
- Go to chromium/chrome *Extensions*.
|
||||
- Click to check *Developer mode*.
|
||||
- Click *Load unpacked extension...*.
|
||||
- In the file selector dialog:
|
||||
- Select the directory `uMatrix` which was created above.
|
||||
- Click *Open*.
|
||||
|
||||
The extension will now be available in your chromium/chromium-based browser.
|
||||
|
||||
Remember that you have to update manually also. For some users, updating manually is actually an advantage because:
|
||||
- You can update when **you** want
|
||||
- If ever a new version sucks, you can easily just re-installed the previous one
|
||||
|
||||
### Vendor stores
|
||||
|
||||
- Opera store (coming)
|
||||
- Chrome store (coming)
|
||||
@ -1,8 +1,8 @@
|
||||
### This is µMatrix's manifesto
|
||||
### This is uMatrix's manifesto
|
||||
|
||||
1. The **user decides** what web content is acceptable or not in their browser.
|
||||
|
||||
That is all.
|
||||
|
||||
The purpose of _µMatrix_ is to give the user the means for informed
|
||||
The purpose of _uMatrix_ is to give the user the means for informed
|
||||
consent and informed dissent.
|
||||
|
||||
@ -0,0 +1,37 @@
|
||||
## INSTALL
|
||||
|
||||
#### Chromium
|
||||
|
||||
- Download and unzip `nuTensor.chromium.zip` ([latest release desirable](https://github.com/geekprojects/nuTensor/releases)).
|
||||
- Rename the unzipped directory to `nuTensor`
|
||||
- When you later update manually, replace the **content** of the `nuTensor` folder with the **content** of the latest zipped version.
|
||||
- This will ensure that all the extension settings will be preserved
|
||||
- As long as the extension loads **from same folder path from which it was originally installed**, all your settings will be preserved.
|
||||
- Go to chromium/chrome *Extensions*.
|
||||
- Click to check *Developer mode*.
|
||||
- Click *Load unpacked extension...*.
|
||||
- In the file selector dialog:
|
||||
- Select the directory `nuTensor` which was created above.
|
||||
- Click *Open*.
|
||||
|
||||
The extension will now be available in your chromium/chromium-based browser.
|
||||
|
||||
Remember that you have to update manually also. For some users, updating manually is actually an advantage because:
|
||||
- You can update when **you** want
|
||||
- If ever a new version sucks, you can easily just re-install the previous one
|
||||
|
||||
#### Firefox
|
||||
|
||||
Although nuTensor is a restartless addon, I found that **installing** a newer version over an older one often will glitch the installation. These steps always worked fine:
|
||||
|
||||
- Download `nuTensor.firefox.xpi` ([latest release desirable](https://github.com/geekprojects/nuTensor/releases)).
|
||||
- Uninstall current nuTensor if already installed
|
||||
- Quit Firefox completely
|
||||
- Launch Firefox
|
||||
- Drag and drop the previously downloaded `nuTensor.firefox.xpi` into Firefox
|
||||
|
||||
nuTensor settings are kept intact even after you uninstall the addon.
|
||||
|
||||
On Linux, the settings are saved in a SQlite file located at `~/.mozilla/firefox/[profile name]/extension-data/nuTensor.sqlite`.
|
||||
|
||||
On Windows, the settings are saved in a SQlite file located at `%APPDATA%\Mozilla\Firefox\Profiles\[profile name]\extension-data\nuTensor.sqlite`.
|
||||
@ -1,93 +0,0 @@
|
||||
µMatrix: A point-and-click matrix-based firewall, with many privacy-enhancing tools. For advanced users.
|
||||
|
||||
µMatrix put you in full control of where your browser is allowed to connect, what type of data it is allowed to download, and what it is allowed to execute. Nobody else decides for you: You choose. You are in full control of your privacy.
|
||||
|
||||
Out of the box, µMatrix works in relax block-all/allow-exceptionally mode, meaning web sites which require 3rd-party scripts are likely to be "broken". With two clicks, µMatrix can be set to work in allow-all/block-exceptionally mode, which generally will not break web sites. See https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views for more details on this topic.
|
||||
|
||||
Regarding the myth that "Chromium-based browsers can't reliably block javascript", see: https://github.com/gorhill/httpswitchboard/wiki/Blocking-javascript-execution-reliably-in-Chromium-based-browsers. Summary: Yes, javascript can be blocked reliably in Chromium.
|
||||
|
||||
* See ALL the remote connections, failed or attempted, depending on whether they were blocked or allowed (you decide).
|
||||
|
||||
* A single-click to whitelist/blacklist one or multiple classes of requests according to the destination and type of data (a blocked request will NEVER leave your browser).
|
||||
|
||||
* Efficient blacklisting: cookies won't leave your browser, javascript won't execute, plugins won't play, tracking pixels won't download, etc.
|
||||
|
||||
* You do not have to solely rely on just one particular curated blacklist (arguably with many missing entries) outside which nothing else can be blocked: You are in full control.
|
||||
|
||||
* Ease of use: µMatrix lets you easily whitelist/blacklist net requests which originate from within a web page according to a point-and-click matrix:
|
||||
|
||||
- domain names (left column)
|
||||
* from very specific
|
||||
* to very generic
|
||||
|
||||
- type of requests (top row)
|
||||
* cookies
|
||||
* CSS-related resources (stylesheets and web fonts)
|
||||
* images
|
||||
* plugins
|
||||
* scripts
|
||||
* XHR (requests made by scripts)
|
||||
* frames
|
||||
* others
|
||||
|
||||
You can blacklist/whitelist a single cell, an entire row, a group of rows, an entire column, or the whole matrix with just one click.
|
||||
|
||||
µMatrix's filtering engine uses precedence logic to evaluate what is blocked/allowed according to which cells are blacklisted/whitelisted. For example, this allows you to whitelist a whole page with one click, without having to repeatedly whitelist whatever new data appear on the page.
|
||||
|
||||
All rules are scoped. For example, you can block `facebook.com` and `facebook.net` everywhere except when visiting a page on `www.facebook.com`. This way Facebook won't be able to build a profile of your browsing habits.
|
||||
|
||||
The goal of this extension is to make the allowing or blocking of web sites, wholly or partly, as straightforward as possible, so as to encourage users to care about their privacy.
|
||||
|
||||
The extension comes with 3rd-party hosts files totaling over 58,000 distinct hostnames (lists can be selectively disabled/enabled according to your choice).
|
||||
|
||||
Ultimately, you can choose however you browse the net:
|
||||
|
||||
* Blacklist all by default, and whitelist as needed (default mode).
|
||||
|
||||
* Whitelist all by default, and blacklist as needed.
|
||||
|
||||
Either way, you still benefit from the preset blacklists so that at least you get basic protection from trackers, malware sites, etc. Or you can disable all of these preset blacklists.
|
||||
|
||||
Your choice.
|
||||
|
||||
Randomly assembled documentation: https://github.com/gorhill/uMatrix/wiki
|
||||
|
||||
=====
|
||||
|
||||
FEEDBACK:
|
||||
|
||||
For any question/issue you might have, use the "Send Feedback" button on the right, in order for me to be able to answer readily. I can't answer directly to reviews, but I will be more than happy to answer you directly in the feedback section.
|
||||
|
||||
=====
|
||||
|
||||
BUGS, ISSUES, SUGEGSTIONS:
|
||||
|
||||
https://github.com/gorhill/uMatrix/issues
|
||||
|
||||
You are very welcomed to contribute your views on open issues and suggestions, various arguments for/against help me in deciding what is needed to improve the extension.
|
||||
|
||||
Ease of use is the primary goal. I've seen users give up on Firefox's NoScript because it gets too much in the way according to them, so rather than blame these users for poor security habits, I prefer to blame developers and this project is a tentative to address the issues which cause some users to give up on basic security.
|
||||
|
||||
This extension is also useful to understand what the web page in your browser is doing, often without your knowledge. You have full ability to see and decide with whom a web page communicates, and to restrict these communications to specific classes of objects within the web page.
|
||||
|
||||
The number which appear in the extension icon correspond to the total number of distinct requests attempted (successfully or not depending on whether these were allowed or blocked) by the web page.
|
||||
|
||||
Simply click on the appropriate entry in the matrix in order to white-, black- or graylist a component. Graylisting means the blocked or allowed status will be inherited from another cell with higher precedence in the matrix.
|
||||
|
||||
Red square = effectively blacklisted, i.e. requests are prevented from reaching their intended destination:
|
||||
* Dark red square: the domain name and/or type of request is specifically blacklisted.
|
||||
* Faded red square: the blacklist status is inherited because the entry is graylisted.
|
||||
|
||||
Green square = effectively whitelisted, i.e. requests are allowed to reach their intended destination:
|
||||
* Dark green square: the domain name and/or type of request is specifically whitelisted.
|
||||
* Faded green square: the whitelist status is inherited because the entry is graylisted.
|
||||
|
||||
The top-left cell in the matrix, the "all" cell, represents the default global setting, which allows you to choose whether allowing or blocking everything is the default behavior. Some prefer to allow everything while blocking exceptionally. My personal preference is of course the reverse, blocking everything and allowing exceptionally.
|
||||
|
||||
This extension is also useful if you wish to speed up your browsing, by globally blocking all requests for images as an example.
|
||||
|
||||
=====
|
||||
|
||||
SOURCE CODE: https://github.com/gorhill/uMatrix (GPLv3)
|
||||
|
||||
CHANGE LOG: https://github.com/gorhill/uMatrix/releases
|
||||
@ -1,93 +0,0 @@
|
||||
µMatrix: A point-and-click matrix-based firewall, with many privacy-enhancing tools. For advanced users.
|
||||
|
||||
µMatrix put you in full control of where your browser is allowed to connect, what type of data it is allowed to download, and what it is allowed to execute. Nobody else decides for you: You choose. You are in full control of your privacy.
|
||||
|
||||
Out of the box, µMatrix works in relax block-all/allow-exceptionally mode, meaning web sites which require 3rd-party scripts are likely to be "broken". With two clicks, µMatrix can be set to work in allow-all/block-exceptionally mode, which generally will not break web sites. See https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views for more details on this topic.
|
||||
|
||||
Regarding the myth that "Chromium-based browsers can't reliably block javascript", see: https://github.com/gorhill/httpswitchboard/wiki/Blocking-javascript-execution-reliably-in-Chromium-based-browsers. Summary: Yes, javascript can be blocked reliably in Chromium.
|
||||
|
||||
* See ALL the remote connections, failed or attempted, depending on whether they were blocked or allowed (you decide).
|
||||
|
||||
* A single-click to whitelist/blacklist one or multiple classes of requests according to the destination and type of data (a blocked request will NEVER leave your browser).
|
||||
|
||||
* Efficient blacklisting: cookies won't leave your browser, javascript won't execute, plugins won't play, tracking pixels won't download, etc.
|
||||
|
||||
* You do not have to solely rely on just one particular curated blacklist (arguably with many missing entries) outside which nothing else can be blocked: You are in full control.
|
||||
|
||||
* Ease of use: µMatrix lets you easily whitelist/blacklist net requests which originate from within a web page according to a point-and-click matrix:
|
||||
|
||||
- domain names (left column)
|
||||
* from very specific
|
||||
* to very generic
|
||||
|
||||
- type of requests (top row)
|
||||
* cookies
|
||||
* CSS-related resources (stylesheets and web fonts)
|
||||
* images
|
||||
* plugins
|
||||
* scripts
|
||||
* XHR (requests made by scripts)
|
||||
* frames
|
||||
* others
|
||||
|
||||
You can blacklist/whitelist a single cell, an entire row, a group of rows, an entire column, or the whole matrix with just one click.
|
||||
|
||||
µMatrix's filtering engine uses precedence logic to evaluate what is blocked/allowed according to which cells are blacklisted/whitelisted. For example, this allows you to whitelist a whole page with one click, without having to repeatedly whitelist whatever new data appear on the page.
|
||||
|
||||
All rules are scoped. For example, you can block `facebook.com` and `facebook.net` everywhere except when visiting a page on `www.facebook.com`. This way Facebook won't be able to build a profile of your browsing habits.
|
||||
|
||||
The goal of this extension is to make the allowing or blocking of web sites, wholly or partly, as straightforward as possible, so as to encourage users to care about their privacy.
|
||||
|
||||
The extension comes with 3rd-party hosts files totaling over 58,000 distinct hostnames (lists can be selectively disabled/enabled according to your choice).
|
||||
|
||||
Ultimately, you can choose however you browse the net:
|
||||
|
||||
* Blacklist all by default, and whitelist as needed (default mode).
|
||||
|
||||
* Whitelist all by default, and blacklist as needed.
|
||||
|
||||
Either way, you still benefit from the preset blacklists so that at least you get basic protection from trackers, malware sites, etc. Or you can disable all of these preset blacklists.
|
||||
|
||||
Your choice.
|
||||
|
||||
Randomly assembled documentation: https://github.com/gorhill/uMatrix/wiki
|
||||
|
||||
=====
|
||||
|
||||
FEEDBACK:
|
||||
|
||||
For any question/issue you might have, use the "Send Feedback" button on the right, in order for me to be able to answer readily. I can't answer directly to reviews, but I will be more than happy to answer you directly in the feedback section.
|
||||
|
||||
=====
|
||||
|
||||
BUGS, ISSUES, SUGEGSTIONS:
|
||||
|
||||
https://github.com/gorhill/uMatrix/issues
|
||||
|
||||
You are very welcomed to contribute your views on open issues and suggestions, various arguments for/against help me in deciding what is needed to improve the extension.
|
||||
|
||||
Ease of use is the primary goal. I've seen users give up on Firefox's NoScript because it gets too much in the way according to them, so rather than blame these users for poor security habits, I prefer to blame developers and this project is a tentative to address the issues which cause some users to give up on basic security.
|
||||
|
||||
This extension is also useful to understand what the web page in your browser is doing, often without your knowledge. You have full ability to see and decide with whom a web page communicates, and to restrict these communications to specific classes of objects within the web page.
|
||||
|
||||
The number which appear in the extension icon correspond to the total number of distinct requests attempted (successfully or not depending on whether these were allowed or blocked) by the web page.
|
||||
|
||||
Simply click on the appropriate entry in the matrix in order to white-, black- or graylist a component. Graylisting means the blocked or allowed status will be inherited from another cell with higher precedence in the matrix.
|
||||
|
||||
Red square = effectively blacklisted, i.e. requests are prevented from reaching their intended destination:
|
||||
* Dark red square: the domain name and/or type of request is specifically blacklisted.
|
||||
* Faded red square: the blacklist status is inherited because the entry is graylisted.
|
||||
|
||||
Green square = effectively whitelisted, i.e. requests are allowed to reach their intended destination:
|
||||
* Dark green square: the domain name and/or type of request is specifically whitelisted.
|
||||
* Faded green square: the whitelist status is inherited because the entry is graylisted.
|
||||
|
||||
The top-left cell in the matrix, the "all" cell, represents the default global setting, which allows you to choose whether allowing or blocking everything is the default behavior. Some prefer to allow everything while blocking exceptionally. My personal preference is of course the reverse, blocking everything and allowing exceptionally.
|
||||
|
||||
This extension is also useful if you wish to speed up your browsing, by globally blocking all requests for images as an example.
|
||||
|
||||
=====
|
||||
|
||||
SOURCE CODE: https://github.com/gorhill/uMatrix (GPLv3)
|
||||
|
||||
CHANGE LOG: https://github.com/gorhill/uMatrix/releases
|
||||
@ -1,93 +1,93 @@
|
||||
µMatrix: A point-and-click matrix-based firewall, with many privacy-enhancing tools. For advanced users.
|
||||
µMatrix: Firewall tunjuk-dan-klik berbasis matriks, dengan banyak perkakas privasi yang ditingkatkan. Untuk pengguna tingkat lanjut.
|
||||
|
||||
µMatrix put you in full control of where your browser is allowed to connect, what type of data it is allowed to download, and what it is allowed to execute. Nobody else decides for you: You choose. You are in full control of your privacy.
|
||||
µMatrix memberi anda kontrol penuh ke mana peramban anda diizinkan terhubung, tipe data apa yang diizinkan untuk diunduh, dan apa yang diizinkan untuk dieksekusi. Tidak seorangpun memutuskan untuk anda: Anda yang memilih. Anda mengontrol penuh privasi anda sendiri.
|
||||
|
||||
Out of the box, µMatrix works in relax block-all/allow-exceptionally mode, meaning web sites which require 3rd-party scripts are likely to be "broken". With two clicks, µMatrix can be set to work in allow-all/block-exceptionally mode, which generally will not break web sites. See https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views for more details on this topic.
|
||||
Secara bawaan, µMatrix bekerja dalam mode blokir-semua/izinkan-sebagian yang agak ketat, artinya situs web yang membutuhkan skrip pihak ketiga besar kemungkinan menjadi "rusak". Dengan dua klik, µMatrix dapat diatur untuk bekerja dalam mode izinkan-semua/blokir-sebagian, yang pada umumnya tidak akan membuat rusak situs web. Lihat https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views untuk penjelasan lebih rinci perihal topik ini.
|
||||
|
||||
Regarding the myth that "Chromium-based browsers can't reliably block javascript", see: https://github.com/gorhill/httpswitchboard/wiki/Blocking-javascript-execution-reliably-in-Chromium-based-browsers. Summary: Yes, javascript can be blocked reliably in Chromium.
|
||||
Mengenai mitos "Peramban barbasis Chromium tidak dapat dengan handal memblokir JavaScript", lihat: https://github.com/gorhill/httpswitchboard/wiki/Blocking-javascript-execution-reliably-in-Chromium-based-browsers. Ringkasnya: Ya, JavaScript dapat diblokir dengan handal di Chromium.
|
||||
|
||||
* See ALL the remote connections, failed or attempted, depending on whether they were blocked or allowed (you decide).
|
||||
* Lihat SEMUA koneksi asing, yang gagal atau mencoba, tergantung dari apakah mereka diblokir atau diizinkan (anda putuskan).
|
||||
|
||||
* A single-click to whitelist/blacklist one or multiple classes of requests according to the destination and type of data (a blocked request will NEVER leave your browser).
|
||||
* Sekali klik untuk mendaftar-putih/hitamkan satu atau banyak kelas permintaan menurut destinasi dan jenis data (permintaan yang diblokir TIDAK AKAN PERNAH meninggalkan peramban anda).
|
||||
|
||||
* Efficient blacklisting: cookies won't leave your browser, javascript won't execute, plugins won't play, tracking pixels won't download, etc.
|
||||
* Pendaftar-hitaman yang efisien: kuki tidak akan meninggalkan peramban anda, JavaScript tidak akan dieksekusi, plugin tidak akan berjalan, piksel pelacakan tidak akan diunduh, dll.
|
||||
|
||||
* You do not have to solely rely on just one particular curated blacklist (arguably with many missing entries) outside which nothing else can be blocked: You are in full control.
|
||||
* Anda tidak harus bergantung hanya pada daftar-hitam tertentu saja (dengan alasan banyak entri yang hilang) selain tidak ada lagi yang dapat diblokir: Anda dalam kontrol penuh.
|
||||
|
||||
* Ease of use: µMatrix lets you easily whitelist/blacklist net requests which originate from within a web page according to a point-and-click matrix:
|
||||
* Mudah dalam penggunaan: µMatrix memungkinkan anda dengan mudah mendaftar-putih/hitamkan permintaan jaringan yang berasal dari halaman web menurut matriks tunjuk-dan-klik:
|
||||
|
||||
- domain names (left column)
|
||||
* from very specific
|
||||
* to very generic
|
||||
- nama ranah (kolom kiri)
|
||||
* dari sangat spesifik
|
||||
* ke sangat umum
|
||||
|
||||
- type of requests (top row)
|
||||
* cookies
|
||||
* CSS-related resources (stylesheets and web fonts)
|
||||
* images
|
||||
* plugins
|
||||
* scripts
|
||||
* XHR (requests made by scripts)
|
||||
* frames
|
||||
* others
|
||||
- jenis permintaan (baris atas)
|
||||
* kuki
|
||||
* sumber daya terkait CSS (stylesheet dan fon web)
|
||||
* gambar
|
||||
* plugin
|
||||
* skrip
|
||||
* XHR (permintaan yang dibuat oleh skrip)
|
||||
* frame
|
||||
* lainnya
|
||||
|
||||
You can blacklist/whitelist a single cell, an entire row, a group of rows, an entire column, or the whole matrix with just one click.
|
||||
Anda dapat mendaftar-hitam/putihkan satu sel, seluruh baris, satu grup dari baris, seluruh kolom, atau seluruh matriks hanya dengan satu klik.
|
||||
|
||||
µMatrix's filtering engine uses precedence logic to evaluate what is blocked/allowed according to which cells are blacklisted/whitelisted. For example, this allows you to whitelist a whole page with one click, without having to repeatedly whitelist whatever new data appear on the page.
|
||||
Mesin penyaringan µMatrix menggunakan logika tinggi untuk mengevaluasi apa yang diblokir/diizinkan sesuai dengan sel mana yang di daftar-hitam/putih. Sebagai contoh, hal ini memungkinkan anda mendaftar-putihkan seluruh halaman dengan satu klik, tanpa perlu berulang-ulang mendaftar-putihkan setiap data baru yang muncul di halaman.
|
||||
|
||||
All rules are scoped. For example, you can block `facebook.com` and `facebook.net` everywhere except when visiting a page on `www.facebook.com`. This way Facebook won't be able to build a profile of your browsing habits.
|
||||
Mencakup semua aturan. Sebagai contoh, anda dapat memblokir `facebook.com` dan `facebook.net` di manapun kecuali ketika mengunjungi sebuah halaman di `www.facebook.com`. Dengan cara ini Facebook tidak akan bisa membangun profil mengenai kebiasaan penjelajahan anda.
|
||||
|
||||
The goal of this extension is to make the allowing or blocking of web sites, wholly or partly, as straightforward as possible, so as to encourage users to care about their privacy.
|
||||
Tujuan dari ekstensi ini adalah untuk mengizinkan atau memblokir situs web, sepenuhnya atau sebagian, sesederhana mungkin, sehingga mendorong para pengguna untuk lebih peduli tentang privasi mereka.
|
||||
|
||||
The extension comes with 3rd-party hosts files totaling over 58,000 distinct hostnames (lists can be selectively disabled/enabled according to your choice).
|
||||
Ekstensi ini hadir bersama berkas hos pihak ketiga dengan total lebih dari 58,000 nama hos yang berbeda (daftar dapat secara selektif dinonaktif/aktifkan sesuai dengan pilihan anda).
|
||||
|
||||
Ultimately, you can choose however you browse the net:
|
||||
Pada akhirnya, Anda dapat memilih bagaimana anda ingin menjelajah internet:
|
||||
|
||||
* Blacklist all by default, and whitelist as needed (default mode).
|
||||
* Daftar-hitamkan semua secara baku, dan daftar-putihkan sesuai kebutuhan (mode bawaan).
|
||||
|
||||
* Whitelist all by default, and blacklist as needed.
|
||||
* Daftar-putihkan semua secara baku, dan daftar-hitamkan sesuai kebutuhan.
|
||||
|
||||
Either way, you still benefit from the preset blacklists so that at least you get basic protection from trackers, malware sites, etc. Or you can disable all of these preset blacklists.
|
||||
Dengan cara manapun, anda masih diuntungkan dari aturan bawaan daftar-hitam sehingga paling tidak anda tetap mendapatkan perlindungan mendasar dari pelacak, situs malware, dll. Atau anda dapat menonaktifkan semua aturan bawaan daftar-hitam ini.
|
||||
|
||||
Your choice.
|
||||
Terserah anda.
|
||||
|
||||
Randomly assembled documentation: https://github.com/gorhill/uMatrix/wiki
|
||||
Himpunan acak dokumentasi: https://github.com/gorhill/uMatrix/wiki
|
||||
|
||||
=====
|
||||
|
||||
FEEDBACK:
|
||||
UMPAN BALIK:
|
||||
|
||||
For any question/issue you might have, use the "Send Feedback" button on the right, in order for me to be able to answer readily. I can't answer directly to reviews, but I will be more than happy to answer you directly in the feedback section.
|
||||
Jika ada pertanyaan/masalah yang mungkin ingin anda sampaikan, gunakan tombol "Kirim Umpan Balik" di sebelah kanan, agar saya dapat menjawab dengan mudah. Saya tidak dapat menjawab secara langsung untuk ulasan, tapi saya akan lebih dari senang untuk menjawab anda secara langsung di bagian umpan balik.
|
||||
|
||||
=====
|
||||
|
||||
BUGS, ISSUES, SUGEGSTIONS:
|
||||
KUTU, MASALAH, SARAN:
|
||||
|
||||
https://github.com/gorhill/uMatrix/issues
|
||||
|
||||
You are very welcomed to contribute your views on open issues and suggestions, various arguments for/against help me in deciding what is needed to improve the extension.
|
||||
Anda sangat diharapkan untuk berkontribusi mengenai pandangan anda mengenai masalah yang ada dan saran/masukan, argumen apapun baik membangun/kontra membantu saya memutuskan apa yang diperlukan untuk memperbaiki ekstensi ini.
|
||||
|
||||
Ease of use is the primary goal. I've seen users give up on Firefox's NoScript because it gets too much in the way according to them, so rather than blame these users for poor security habits, I prefer to blame developers and this project is a tentative to address the issues which cause some users to give up on basic security.
|
||||
Mudah dalam penggunaan adalah tujuan utama. Saya melihat banyak pengguna menyerah menggunakan NoScript pada Firefox karena menurut mereka semakin banyak gangguan yang terjadi, jadi dari pada menyalahkan para pengguna atas kebiasaan keamanan yang buruk, saya memilih menyalahkan pengembang dan proyek ini adalah eksperimen untuk mengatasi masalah yang menyebabkan beberapa pengguna menyerah pada keamanan dasar.
|
||||
|
||||
This extension is also useful to understand what the web page in your browser is doing, often without your knowledge. You have full ability to see and decide with whom a web page communicates, and to restrict these communications to specific classes of objects within the web page.
|
||||
Ekstensi ini juga bermanfaat untuk memahami apa yang halaman web lakukan di dalam peramban anda, yang seringkali tanpa sepengetahuan anda. Anda memiliki kewenangan penuh untuk melihat dan memutuskan dengan siapa sebuah halaman web berkomunikasi, dan membatasi komunikasi tersebut hanya untuk kelas obyek spesifik di dalam halaman web.
|
||||
|
||||
The number which appear in the extension icon correspond to the total number of distinct requests attempted (successfully or not depending on whether these were allowed or blocked) by the web page.
|
||||
Angka yang muncul pada ikon ekstensi berhubungan dengan jumlah total percobaan permintaan yang berbeda (sukses atau tidak tergantung pada apakah permintaan tersebut diizinkan atau diblokir) oleh halaman web.
|
||||
|
||||
Simply click on the appropriate entry in the matrix in order to white-, black- or graylist a component. Graylisting means the blocked or allowed status will be inherited from another cell with higher precedence in the matrix.
|
||||
Cukup klik pada entri yang sesuai dalam matriks untuk memutihkan, menghitamkan, mengabu-abukan sebuah komponen. Mendaftar-abukan berarti status diblokir atau diizinkan akan diturunkan dari sel lainnya dengan urutan prioritas yang lebih tinggi dalam matriks.
|
||||
|
||||
Red square = effectively blacklisted, i.e. requests are prevented from reaching their intended destination:
|
||||
* Dark red square: the domain name and/or type of request is specifically blacklisted.
|
||||
* Faded red square: the blacklist status is inherited because the entry is graylisted.
|
||||
Persegi merah = didaftar-hitamkan secara efektif, contoh. permintaan dicegah untuk mencapai destinasi yang dinginkan:
|
||||
* Persegi merah gelap: nama ranah dan/atau jenis permintaan secara spesifik didaftar-hitamkan.
|
||||
* Persegi merah pudar: status daftar-hitam adalah turunan karena entri berada di daftar abu-abu.
|
||||
|
||||
Green square = effectively whitelisted, i.e. requests are allowed to reach their intended destination:
|
||||
* Dark green square: the domain name and/or type of request is specifically whitelisted.
|
||||
* Faded green square: the whitelist status is inherited because the entry is graylisted.
|
||||
Persegi hijau = didaftar-putihkan secara efektif, contoh. permintaan diizinkan untuk mencapai destinasi yang diinginkan:
|
||||
* Persegi hijau gelap: nama ranah dan/atau jenis permintaan secara spesifik didaftar-putihkan.
|
||||
* Persegi hijau pudar: status daftar-putih adalah turunan karena entri berada di daftar abu-abu.
|
||||
|
||||
The top-left cell in the matrix, the "all" cell, represents the default global setting, which allows you to choose whether allowing or blocking everything is the default behavior. Some prefer to allow everything while blocking exceptionally. My personal preference is of course the reverse, blocking everything and allowing exceptionally.
|
||||
Sel kiri atas dalam matriks, sel "semua", mewakili pengaturan baku secara global, yang memungkinkan anda memilih apakah mengizinkan atau memblokir semuanya sebagai perilaku/tindakan baku. Beberapa memilih mengizinkan semuanya sambil memblokir sebagian. Preferensi personal saya adalah tentu saja kebalikannya, memblokir semuanya dan mengizinkan sebagian.
|
||||
|
||||
This extension is also useful if you wish to speed up your browsing, by globally blocking all requests for images as an example.
|
||||
Ekstensi ini juga berguna jika anda ingin mempercepat penjelajahan anda, sebagai contoh dengan secara global memblokir semua permintaan untuk gambar.
|
||||
|
||||
=====
|
||||
|
||||
SOURCE CODE: https://github.com/gorhill/uMatrix (GPLv3)
|
||||
KODE SUMBER: https://github.com/gorhill/uMatrix (GPLv3)
|
||||
|
||||
CHANGE LOG: https://github.com/gorhill/uMatrix/releases
|
||||
CATATAN PERUBAHAN: https://github.com/gorhill/uMatrix/releases
|
||||
|
||||
@ -1,93 +1,93 @@
|
||||
µMatrix: A point-and-click matrix-based firewall, with many privacy-enhancing tools. For advanced users.
|
||||
uMatrix: un firewall a matrice del tipo punta e clicca, con molte funzionalità a salvaguardia della privacy. Per utenti avanzati.
|
||||
|
||||
µMatrix put you in full control of where your browser is allowed to connect, what type of data it is allowed to download, and what it is allowed to execute. Nobody else decides for you: You choose. You are in full control of your privacy.
|
||||
uMatrix permette il pieno controllo delle connessioni del browser, del tipo di dati che può scaricare e di cosa può eseguire. Nessun'altro decide per te: Tu scegli. Solo tu hai il controllo completo della tua privacy.
|
||||
|
||||
Out of the box, µMatrix works in relax block-all/allow-exceptionally mode, meaning web sites which require 3rd-party scripts are likely to be "broken". With two clicks, µMatrix can be set to work in allow-all/block-exceptionally mode, which generally will not break web sites. See https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views for more details on this topic.
|
||||
In configurazione standard, uMatrix funziona in modalità blocca-tutto/permetti-eccezionalmente, vale a dire che i siti che richiedono script di terze parti, facilmente risulteranno incompleti o con errori. Con solo un paio di click, uMatrix può essere configurato in modalità permetti-tutto/blocca-eccezionalmente, che generalmente non causa problemi nel caricamento dei siti. Vedere https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views per ulteriori dettagli.
|
||||
|
||||
Regarding the myth that "Chromium-based browsers can't reliably block javascript", see: https://github.com/gorhill/httpswitchboard/wiki/Blocking-javascript-execution-reliably-in-Chromium-based-browsers. Summary: Yes, javascript can be blocked reliably in Chromium.
|
||||
Riguardo il mito che i browser basati su Chromium non possano bloccare efficacemente javascript, vedere: https://github.com/gorhill/httpswitchboard/wiki/Blocking-javascript-execution-reliably-in-Chromium-based-browsers. In sostanza: Si, javascript può essere efficacemente bloccato in Chromium.
|
||||
|
||||
* See ALL the remote connections, failed or attempted, depending on whether they were blocked or allowed (you decide).
|
||||
*Vedi TUTTE le connessioni remote, se fallite o tentate, dipendendo se siano bloccate o permesse (tu decidi).
|
||||
|
||||
* A single-click to whitelist/blacklist one or multiple classes of requests according to the destination and type of data (a blocked request will NEVER leave your browser).
|
||||
* Un singolo click per permettere/bloccare una o più categorie di richieste, in funzione della destinazione e del tipo di dati (una richiesta bloccata non lascerà MAI il tuo browser).
|
||||
|
||||
* Efficient blacklisting: cookies won't leave your browser, javascript won't execute, plugins won't play, tracking pixels won't download, etc.
|
||||
* Controllo efficiente: i cookies non lasceranno il tuo browser, javascript non verrà eseguito, i plug-in non verranno attivati, pixel di tracking non saranno scaricati, ecc.
|
||||
|
||||
* You do not have to solely rely on just one particular curated blacklist (arguably with many missing entries) outside which nothing else can be blocked: You are in full control.
|
||||
* Tu non devi unicamente affidarti ad una singola lista nera (presumibilmente con molte voci mancanti) al di fuori della quale niente altro può essere bloccato: Tu hai il pieno controllo.
|
||||
|
||||
* Ease of use: µMatrix lets you easily whitelist/blacklist net requests which originate from within a web page according to a point-and-click matrix:
|
||||
* Semplicità d'uso: uMatrix consente di permettere/bloccare le richieste originate da una pagina web secondo uno schema a matrice, punta e clicca:
|
||||
|
||||
- domain names (left column)
|
||||
* from very specific
|
||||
* to very generic
|
||||
- nome del dominio (colonna di sinistra)
|
||||
* dal molto specifico
|
||||
* al molto generico
|
||||
|
||||
- type of requests (top row)
|
||||
- tipo di richiesta (riga in alto)
|
||||
* cookies
|
||||
* CSS-related resources (stylesheets and web fonts)
|
||||
* images
|
||||
* risorse tipo CSS (stili e caratteri)
|
||||
* immagini
|
||||
* plugins
|
||||
* scripts
|
||||
* XHR (requests made by scripts)
|
||||
* frames
|
||||
* others
|
||||
* XHR (richieste fatte dagli script)
|
||||
* riquadri
|
||||
* altro
|
||||
|
||||
You can blacklist/whitelist a single cell, an entire row, a group of rows, an entire column, or the whole matrix with just one click.
|
||||
Tu puoi permettere/bloccare una singola cella, una intera riga, un gruppo di righe, una intera colonna o l'intera matrice, con solo un click.
|
||||
|
||||
µMatrix's filtering engine uses precedence logic to evaluate what is blocked/allowed according to which cells are blacklisted/whitelisted. For example, this allows you to whitelist a whole page with one click, without having to repeatedly whitelist whatever new data appear on the page.
|
||||
Il sistema di filtri di uMatrix utilizza una logica di priorità per valutare cosa viene bloccato/permesso, secondo le celle che sono in black o white list. Per esempio, questo permette di mettere in white list una pagina intera con un click, senza alcun bisogno di consentire qualunque nuovo elemento che appare sulla pagina.
|
||||
|
||||
All rules are scoped. For example, you can block `facebook.com` and `facebook.net` everywhere except when visiting a page on `www.facebook.com`. This way Facebook won't be able to build a profile of your browsing habits.
|
||||
Tutte le regole hanno un loro specifico campo di applicazione. Per esempio, si può bloccare 'facebook.com' e 'facebook.net' ovunque eccetto quando si visita una pagina su 'www.facebook.com'. in questo modo Facebook non è in grado di costruire un profilo delle abitudini di navigazione.
|
||||
|
||||
The goal of this extension is to make the allowing or blocking of web sites, wholly or partly, as straightforward as possible, so as to encourage users to care about their privacy.
|
||||
Lo scopo di questa estensione è rendere il più immediato possibile il blocco o meno, parziale o totale di siti web, incoraggiando gli utenti a tutelare la propria privacy.
|
||||
|
||||
The extension comes with 3rd-party hosts files totaling over 58,000 distinct hostnames (lists can be selectively disabled/enabled according to your choice).
|
||||
L'estensione contiene host file di terze parti, per un totale di oltre 58.000 distinti hostname (le liste possono essere disabilitate/abilitate secondo le proprie preferenze).
|
||||
|
||||
Ultimately, you can choose however you browse the net:
|
||||
In conclusione, ognuno può decidere come navigare su Internet:
|
||||
|
||||
* Blacklist all by default, and whitelist as needed (default mode).
|
||||
*Mettere tutto in blacklist e consentire elementi secondo necessità (modalità di default).
|
||||
|
||||
* Whitelist all by default, and blacklist as needed.
|
||||
*Consentire tutto di default e bloccare elementi secondo necessità.
|
||||
|
||||
Either way, you still benefit from the preset blacklists so that at least you get basic protection from trackers, malware sites, etc. Or you can disable all of these preset blacklists.
|
||||
In entrambe le modalità, rimane il beneficio della protezione delle blacklist standard, che forniscono una difesa di base nei confronti di tracker, siti di malware, ecc. Oppure si possono disabilitare tutte queste blacklist standard.
|
||||
|
||||
Your choice.
|
||||
La scelta è tua.
|
||||
|
||||
Randomly assembled documentation: https://github.com/gorhill/uMatrix/wiki
|
||||
Documentazione disponibile: https://github.com/gorhill/uMatrix/wiki
|
||||
|
||||
=====
|
||||
|
||||
FEEDBACK:
|
||||
Feedback:
|
||||
|
||||
For any question/issue you might have, use the "Send Feedback" button on the right, in order for me to be able to answer readily. I can't answer directly to reviews, but I will be more than happy to answer you directly in the feedback section.
|
||||
Per qualunque dubbio o domanda, usare il pulsante sulla destra "Invia Feedback". Risponderò prontamente. Non posso rispondere direttamente ai pareri, ma sarò lieto di rispondere direttamente nella sezione dei feedback.
|
||||
|
||||
=====
|
||||
|
||||
BUGS, ISSUES, SUGEGSTIONS:
|
||||
Bachi, problemi, consigli:
|
||||
|
||||
https://github.com/gorhill/uMatrix/issues
|
||||
|
||||
You are very welcomed to contribute your views on open issues and suggestions, various arguments for/against help me in deciding what is needed to improve the extension.
|
||||
Chiunque può contribuire al lavoro, con suggerimenti, segnalazione di problemi, argomentazioni pro/contro, per aiutarmi a decidere quali migliorie fare nell'estensione.
|
||||
|
||||
Ease of use is the primary goal. I've seen users give up on Firefox's NoScript because it gets too much in the way according to them, so rather than blame these users for poor security habits, I prefer to blame developers and this project is a tentative to address the issues which cause some users to give up on basic security.
|
||||
La facilità di utilizzo è il primo obiettivo. Ho visto utilizzatori rinunciare ad usare NoScript per Firefox perché complesso, quindi invece di accusare questi utilizzatori di avere abitudini non sicure, preferisco accusare gli sviluppatori e questo progetto vuole essere un tentativo di risolvere quei problemi che hanno determinato la rinuncia ad impiegare una sicurezza di base.
|
||||
|
||||
This extension is also useful to understand what the web page in your browser is doing, often without your knowledge. You have full ability to see and decide with whom a web page communicates, and to restrict these communications to specific classes of objects within the web page.
|
||||
Questa estensione è anche utile per capire cosa una pagina web fa effettivamente nel browser, spesso senza la vostra conoscenza. Voi avete la piena abilità di vedere e decidere con chi la pagina web comunica e restringere queste comunicazioni a specifiche classi di oggetti all'interno della pagina.
|
||||
|
||||
The number which appear in the extension icon correspond to the total number of distinct requests attempted (successfully or not depending on whether these were allowed or blocked) by the web page.
|
||||
Il numero che appare nella nell'icona dell'estensione corrisponde al numero complessivo di distinte richieste tentate (con successo o meno, dipendendo se queste siano permesse o bloccate) dalla pagina web.
|
||||
|
||||
Simply click on the appropriate entry in the matrix in order to white-, black- or graylist a component. Graylisting means the blocked or allowed status will be inherited from another cell with higher precedence in the matrix.
|
||||
Semplicente fare click nella appropriata cella della matrice per permettere mettere un elemento in white-, black- o grey list. La lista grigia (Graylisting) significa che lo stato di bloccato o permesso viene ereditato da un'altra cella con più alta priorità nella matrice.
|
||||
|
||||
Red square = effectively blacklisted, i.e. requests are prevented from reaching their intended destination:
|
||||
* Dark red square: the domain name and/or type of request is specifically blacklisted.
|
||||
* Faded red square: the blacklist status is inherited because the entry is graylisted.
|
||||
Cella rossa = effettivamente bloccata, cioè alle richieste viene impedito di raggiungere la loro destinazione.
|
||||
* Cella rosso scuro: il dominio o il tipo di richiesta è specificamente bloccata.
|
||||
* Cella rossa opaca: lo stato di blocco (blacklist) è ereditato perchè l'elemento è in grey list.
|
||||
|
||||
Green square = effectively whitelisted, i.e. requests are allowed to reach their intended destination:
|
||||
* Dark green square: the domain name and/or type of request is specifically whitelisted.
|
||||
* Faded green square: the whitelist status is inherited because the entry is graylisted.
|
||||
Cella verde = effettivamente permesso, cioè alle richieste è permesso raggiungere la loro destinazione:
|
||||
* Cella verde scuro: il dominio e/o il tipo di richiesta è specificamente permessa (whitelist).
|
||||
* Cella vedre opaca: lo stato di permesso è ereditato perchè l'elemento è in grey list.
|
||||
|
||||
The top-left cell in the matrix, the "all" cell, represents the default global setting, which allows you to choose whether allowing or blocking everything is the default behavior. Some prefer to allow everything while blocking exceptionally. My personal preference is of course the reverse, blocking everything and allowing exceptionally.
|
||||
La cella in alto a sinistra nella matrice, la cella "tutto", rappresenta il setting globale di default, che permette di scegliere se permettere o bloccare tutto. Alcuni preferiscono permettere tutto e bloccare in casi specifici. La mia preferenza personale è naturalmente il contrario, bloccare tutto e permettere in casi specifici.
|
||||
|
||||
This extension is also useful if you wish to speed up your browsing, by globally blocking all requests for images as an example.
|
||||
Questa estensione è inoltre utile se volete accelerare la vostra navigazione, bloccando tutte le richieste delle immagini, per esempio.
|
||||
|
||||
=====
|
||||
|
||||
SOURCE CODE: https://github.com/gorhill/uMatrix (GPLv3)
|
||||
CODICE SORGENTE: https://github.com/gorhill/uMatrix (GPLv3)
|
||||
|
||||
CHANGE LOG: https://github.com/gorhill/uMatrix/releases
|
||||
|
||||
@ -1,93 +1,93 @@
|
||||
µMatrix: A point-and-click matrix-based firewall, with many privacy-enhancing tools. For advanced users.
|
||||
Uma firewall point & click baseada numa matriz, com funcionalidade para reforçar a privacidade de cada um. Para utilizadores avançados.
|
||||
|
||||
µMatrix put you in full control of where your browser is allowed to connect, what type of data it is allowed to download, and what it is allowed to execute. Nobody else decides for you: You choose. You are in full control of your privacy.
|
||||
uMatrix coloca-o no controlo de onde o seu browser se pode conectar, que tipo de dados podem ser transferidos, e o que pode ser executado. Ninguém decide por si: Você escolhe. Você tem controlo total sob a sua privacidade.
|
||||
|
||||
Out of the box, µMatrix works in relax block-all/allow-exceptionally mode, meaning web sites which require 3rd-party scripts are likely to be "broken". With two clicks, µMatrix can be set to work in allow-all/block-exceptionally mode, which generally will not break web sites. See https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views for more details on this topic.
|
||||
Fora da caixa, uMatrix funciona numa configuração relaxada "bloqueia-tudo/permite-excepcionalmente", o que quer dizer que web sites que necessitem scripts de terceiros poderão não estar funcionais. Com dois clicks, o uMatrix pode ser configurado para funcionar em modo "permite-tudo/bloqueia-excepcionalmente", o que geralmente não cria problemas em nenhuma página web. Ver https://github.com/gorhill/httpswitchboard/wiki/How-to-use-HTTP-Switchboard:-Two-opposing-views para mais detalhes sobre este tópico.
|
||||
|
||||
Regarding the myth that "Chromium-based browsers can't reliably block javascript", see: https://github.com/gorhill/httpswitchboard/wiki/Blocking-javascript-execution-reliably-in-Chromium-based-browsers. Summary: Yes, javascript can be blocked reliably in Chromium.
|
||||
Sobre do mito que "browser baseados em Chromium não conseguem bloquear JavaScript fielmente", ver: https://github.com/gorhill/httpswitchboard/wiki/Blocking-javascript-execution-reliably-in-Chromium-based-browsers. Sumário: Sim, JavaScript pode ser bloqueado com seguração no Chromium.
|
||||
|
||||
* See ALL the remote connections, failed or attempted, depending on whether they were blocked or allowed (you decide).
|
||||
* Ver TODAS as conexões remotas, falhadas ou tentadas, dependendo se foram bloqueadas ou permitidas (você decide).
|
||||
|
||||
* A single-click to whitelist/blacklist one or multiple classes of requests according to the destination and type of data (a blocked request will NEVER leave your browser).
|
||||
* Um único-clique para meter múltiplas classes de pedidos na lista branca/negra, de acordo com o destino e tipo dos dados (um pedido bloqueado NUNCA vai sair do seu browser).
|
||||
|
||||
* Efficient blacklisting: cookies won't leave your browser, javascript won't execute, plugins won't play, tracking pixels won't download, etc.
|
||||
* Lista negra eficiente: cookies não iram sair do seu browser, JavaScript não será executado, plugins não irão correr, pixels de monitorização não serão transferidos, etc.
|
||||
|
||||
* You do not have to solely rely on just one particular curated blacklist (arguably with many missing entries) outside which nothing else can be blocked: You are in full control.
|
||||
* Você não tem de depender unicamente numa lista negra em particular (possivelmente a faltar entradas) fora do qual mais nada pode ser bloqueado: Você está em controlo total.
|
||||
|
||||
* Ease of use: µMatrix lets you easily whitelist/blacklist net requests which originate from within a web page according to a point-and-click matrix:
|
||||
* Facilidade de utilização: uMatrix deixa-o adicionar pedidos net que originam de uma página web a uma lista negra/branca, recorrendo a uma matriz point & click:
|
||||
|
||||
- domain names (left column)
|
||||
* from very specific
|
||||
* to very generic
|
||||
- nomes de domínio (coluna esquerda)
|
||||
* de muito específico
|
||||
* a muito genérico
|
||||
|
||||
- type of requests (top row)
|
||||
- tipo de pedidos (linha de topo)
|
||||
* cookies
|
||||
* CSS-related resources (stylesheets and web fonts)
|
||||
* images
|
||||
* plugins
|
||||
* Recursos relacionados com CSS (stylesheets e web fonts)
|
||||
* imagens
|
||||
* plug-ins
|
||||
* scripts
|
||||
* XHR (requests made by scripts)
|
||||
* XHR (pedidos efectuados pelos scripts)
|
||||
* frames
|
||||
* others
|
||||
* outros
|
||||
|
||||
You can blacklist/whitelist a single cell, an entire row, a group of rows, an entire column, or the whole matrix with just one click.
|
||||
Pode adicionar uma única célula à lista negra/branca, um grupo de linhas, uma coluna inteira, ou toda a matriz, com apenas um clique.
|
||||
|
||||
µMatrix's filtering engine uses precedence logic to evaluate what is blocked/allowed according to which cells are blacklisted/whitelisted. For example, this allows you to whitelist a whole page with one click, without having to repeatedly whitelist whatever new data appear on the page.
|
||||
O mecanismo de filtragem do uMatrix usa lógica de precedência para avaliar o que é permitido/está bloqueado, de acordo com as células que estão na lista negra/branca. Por exemplo, isto permite que adicione uma página inteira à lista branca com um só clique, sem ter que adicionar elementos à mesma, à medida que vão aparecendo.
|
||||
|
||||
All rules are scoped. For example, you can block `facebook.com` and `facebook.net` everywhere except when visiting a page on `www.facebook.com`. This way Facebook won't be able to build a profile of your browsing habits.
|
||||
Todas as regras têm escopos. Por exemplo, pode bloquear 'facebook.com' e 'facebook.net' em todo o lado, excepto quando visita a página em 'www.facebook.com'. Desta maneira, o Facebook não será capaz de criar um perfil com os seus hábitos de navegação pessoais.
|
||||
|
||||
The goal of this extension is to make the allowing or blocking of web sites, wholly or partly, as straightforward as possible, so as to encourage users to care about their privacy.
|
||||
O objectivo desta extensão é tornar o acto de permitir ou proibir web sites, total ou parcialmente, o mais directo possível, para encorajar os utilizadores a se preocuparem com a sua privacidade.
|
||||
|
||||
The extension comes with 3rd-party hosts files totaling over 58,000 distinct hostnames (lists can be selectively disabled/enabled according to your choice).
|
||||
Esta extensão vem com ficheiros hosts de terceiros, totalizando mais de 58,000 hostnames (as listas podem ser activadas e desactivadas selectivamente, de acordo com a sua escolha).
|
||||
|
||||
Ultimately, you can choose however you browse the net:
|
||||
Fundamentalmente, pode escolher como navegar na internet:
|
||||
|
||||
* Blacklist all by default, and whitelist as needed (default mode).
|
||||
* Adicionar tudo à lista negra, e ir adicionando o que precisa à branca (modo normal).
|
||||
|
||||
* Whitelist all by default, and blacklist as needed.
|
||||
* Adicionar tudo à lista branca, e ir adicionando o que não precisa à negra.
|
||||
|
||||
Either way, you still benefit from the preset blacklists so that at least you get basic protection from trackers, malware sites, etc. Or you can disable all of these preset blacklists.
|
||||
De qualquer modo, vai sempre beneficiar das listas negras presentes, para que tenha sempre protecção básica contra trackers, sites de malware, etc. Ou pode desactivar todas as listas negras.
|
||||
|
||||
Your choice.
|
||||
A escolha é sua.
|
||||
|
||||
Randomly assembled documentation: https://github.com/gorhill/uMatrix/wiki
|
||||
Documentação aleatória: https://github.com/gorhill/uMatrix/wiki
|
||||
|
||||
=====
|
||||
|
||||
FEEDBACK:
|
||||
|
||||
For any question/issue you might have, use the "Send Feedback" button on the right, in order for me to be able to answer readily. I can't answer directly to reviews, but I will be more than happy to answer you directly in the feedback section.
|
||||
Qualquer questão ou problema que possa ter, use o botão "Send Feedback" à direita, para que possa responder rapidamente. Não posso responder directamente a comentários, mas não poderia estar mais contente por lhe responder directamente na secção de feedback.
|
||||
|
||||
=====
|
||||
|
||||
BUGS, ISSUES, SUGEGSTIONS:
|
||||
ERROS, PROBLEMAS, SUGESTÕES:
|
||||
|
||||
https://github.com/gorhill/uMatrix/issues
|
||||
|
||||
You are very welcomed to contribute your views on open issues and suggestions, various arguments for/against help me in deciding what is needed to improve the extension.
|
||||
É muito bem vindo a contribuir com a sua opinião em questões em aberto, e a dar sugestões, argumentos para me ajudar a decidir o que é preciso para melhorar a extensão.
|
||||
|
||||
Ease of use is the primary goal. I've seen users give up on Firefox's NoScript because it gets too much in the way according to them, so rather than blame these users for poor security habits, I prefer to blame developers and this project is a tentative to address the issues which cause some users to give up on basic security.
|
||||
Facilidade de uso é o objectivo principal. Já vi utilizadores desistir de usar o NoScript do Firefox porque requer configuração excessiva, portanto, em vez de os culpar por hábitos de segurança pobres, prefiro culpar os developers, e este projecto é uma tentativa a adereçar problemas que causam alguns a desistir de segurança básica.
|
||||
|
||||
This extension is also useful to understand what the web page in your browser is doing, often without your knowledge. You have full ability to see and decide with whom a web page communicates, and to restrict these communications to specific classes of objects within the web page.
|
||||
Esta extensão é também útil para entender o que a página web no seu browser está a fazer, por vezes sem o seu conhecimento. Tem o poder de ver e decidir com quem é que a página web comunica, e restringir essas comunicações a uma classe específica de objectos na mesma página.
|
||||
|
||||
The number which appear in the extension icon correspond to the total number of distinct requests attempted (successfully or not depending on whether these were allowed or blocked) by the web page.
|
||||
O número que aparece no ícone da extensão corresponde ao número total de pedidos distintos tentados (com sucesso ou não, dependendo das lista branca/negra) pela página web.
|
||||
|
||||
Simply click on the appropriate entry in the matrix in order to white-, black- or graylist a component. Graylisting means the blocked or allowed status will be inherited from another cell with higher precedence in the matrix.
|
||||
Simplesmente clique na célula apropriada na matriz para adicionar um componente à lista branca, negra, ou cinzenta. A lista cinzenta representa os objectos cujo estatuto (permitido ou bloqueado) é herdado de uma célula que precede a presente, na matriz.
|
||||
|
||||
Red square = effectively blacklisted, i.e. requests are prevented from reaching their intended destination:
|
||||
* Dark red square: the domain name and/or type of request is specifically blacklisted.
|
||||
* Faded red square: the blacklist status is inherited because the entry is graylisted.
|
||||
Quadrado vermelho = completamente na lista negra, i.e. pedidos são impedidos de chegar ao seu destino:
|
||||
* Quadrado vermelho escuro: o nome do domínio e/ou tipo de pedido está especificamente na lista negra.
|
||||
* Quadrado vermelho esbranquiçado: o estatuto de lista negra foi herdado, porque a entrada está na lista cinzenta.
|
||||
|
||||
Green square = effectively whitelisted, i.e. requests are allowed to reach their intended destination:
|
||||
* Dark green square: the domain name and/or type of request is specifically whitelisted.
|
||||
* Faded green square: the whitelist status is inherited because the entry is graylisted.
|
||||
Quadrado verde = completamente na lista branca, i.e. pedidos são permitidos e chegam ao seu destino:
|
||||
* Quadrado verde escuro: o nome do domínio e/ou tipo de pedido está especificamente na lista branca.
|
||||
* Quadrado verde esbranquiçado: o estatuto de lista branca foi herdado, porque a entrada está na lista cinzenta.
|
||||
|
||||
The top-left cell in the matrix, the "all" cell, represents the default global setting, which allows you to choose whether allowing or blocking everything is the default behavior. Some prefer to allow everything while blocking exceptionally. My personal preference is of course the reverse, blocking everything and allowing exceptionally.
|
||||
A célula de topo à esquerda na matriz, a célula "all", representa a definição global, que permite escolher se quer permitir ou bloquear tudo, como o comportamento normal. Alguns preferem permitir tudo e bloquear excepcionalmente. A minha preferência pessoal é o oposto -- bloquear tudo e permitir excepcionalmente.
|
||||
|
||||
This extension is also useful if you wish to speed up your browsing, by globally blocking all requests for images as an example.
|
||||
Esta extensão é também útil caso queira acelerar a velocidade do carregamento das páginas, bloqueando todos os pedidos para imagens, por exemplo.
|
||||
|
||||
=====
|
||||
|
||||
SOURCE CODE: https://github.com/gorhill/uMatrix (GPLv3)
|
||||
CÓDIGO FONTE: https://github.com/gorhill/uMatrix (GPLv3)
|
||||
|
||||
CHANGE LOG: https://github.com/gorhill/uMatrix/releases
|
||||
REGISTO DE ALTERAÇÕES: https://github.com/gorhill/uMatrix/releases
|
||||
|
||||
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 97 KiB |
@ -1,88 +0,0 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"name": "__MSG_extName__",
|
||||
"short_name": "µMatrix",
|
||||
"version": "0.8.0.1",
|
||||
"description": "__MSG_extShortDesc__",
|
||||
"icons": {
|
||||
"16": "icon_16.png",
|
||||
"128": "icon_128.png"
|
||||
},
|
||||
"browser_action": {
|
||||
"default_icon": {
|
||||
"19": "img/browsericons/icon19.png"
|
||||
},
|
||||
"default_title": "__MSG_extName__",
|
||||
"default_popup": "popup.html"
|
||||
},
|
||||
"author": "Raymond Hill",
|
||||
"background": {
|
||||
"page": "background.html"
|
||||
},
|
||||
"commands": {
|
||||
"revert-all": {
|
||||
"description": "__MSG_commandRevertAll__",
|
||||
"suggested_key": {
|
||||
"default": "Alt+Q",
|
||||
"mac": "Command+Shift+Q"
|
||||
}
|
||||
},
|
||||
"whitelist-all": {
|
||||
"description": "__MSG_commandWhitelistAll__",
|
||||
"suggested_key": {
|
||||
"default": "Alt+A",
|
||||
"mac": "Command+Shift+A"
|
||||
}
|
||||
},
|
||||
"whitelist-page-domain": {
|
||||
"description": "__MSG_commandWhitelistPageDomain__",
|
||||
"suggested_key": {
|
||||
"default": "Alt+W",
|
||||
"mac": "Command+Shift+W"
|
||||
}
|
||||
},
|
||||
"open-dashboard": {
|
||||
"description": "__MSG_commandOpenDashboard__",
|
||||
"suggested_key": {
|
||||
"default": "Alt+S",
|
||||
"mac": "Command+Shift+S"
|
||||
}
|
||||
}
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["http://*/*", "https://*/*"],
|
||||
"js": ["js/contentscript-start.js"],
|
||||
"run_at": "document_start",
|
||||
"all_frames": true
|
||||
},
|
||||
{
|
||||
"matches": ["http://*/*", "https://*/*"],
|
||||
"js": ["js/contentscript-end.js"],
|
||||
"run_at": "document_end",
|
||||
"all_frames": true
|
||||
}
|
||||
],
|
||||
"default_locale": "en",
|
||||
"homepage_url": "https://github.com/gorhill/uMatrix/wiki",
|
||||
"minimum_chrome_version": "22.0",
|
||||
"options_page": "dashboard.html",
|
||||
"permissions": [
|
||||
"browsingData",
|
||||
"contentSettings",
|
||||
"cookies",
|
||||
"downloads",
|
||||
"storage",
|
||||
"tabs",
|
||||
"unlimitedStorage",
|
||||
"webNavigation",
|
||||
"webRequest",
|
||||
"webRequestBlocking",
|
||||
"http://*/*",
|
||||
"https://*/*"
|
||||
],
|
||||
"web_accessible_resources": [
|
||||
"css/fonts/Roboto_Condensed/RobotoCondensed-Regular.ttf",
|
||||
"css/noop.css"
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 817 B After Width: | Height: | Size: 817 B |
|
Before Width: | Height: | Size: 830 B After Width: | Height: | Size: 830 B |
|
Before Width: | Height: | Size: 840 B After Width: | Height: | Size: 840 B |
|
Before Width: | Height: | Size: 814 B After Width: | Height: | Size: 814 B |
|
Before Width: | Height: | Size: 829 B After Width: | Height: | Size: 829 B |
|
Before Width: | Height: | Size: 825 B After Width: | Height: | Size: 825 B |
|
Before Width: | Height: | Size: 808 B After Width: | Height: | Size: 808 B |
|
Before Width: | Height: | Size: 822 B After Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 808 B After Width: | Height: | Size: 808 B |
|
Before Width: | Height: | Size: 792 B After Width: | Height: | Size: 792 B |
|
Before Width: | Height: | Size: 761 B After Width: | Height: | Size: 761 B |
|
Before Width: | Height: | Size: 750 B After Width: | Height: | Size: 750 B |
|
Before Width: | Height: | Size: 836 B After Width: | Height: | Size: 836 B |
|
Before Width: | Height: | Size: 836 B After Width: | Height: | Size: 836 B |
|
Before Width: | Height: | Size: 827 B After Width: | Height: | Size: 827 B |
|
Before Width: | Height: | Size: 837 B After Width: | Height: | Size: 837 B |
|
Before Width: | Height: | Size: 833 B After Width: | Height: | Size: 833 B |
|
Before Width: | Height: | Size: 823 B After Width: | Height: | Size: 823 B |
|
Before Width: | Height: | Size: 818 B After Width: | Height: | Size: 818 B |
|
Before Width: | Height: | Size: 830 B After Width: | Height: | Size: 830 B |
|
Before Width: | Height: | Size: 777 B After Width: | Height: | Size: 777 B |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
@ -0,0 +1,55 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"name": "nuTensor",
|
||||
"short_name": "nuTensor",
|
||||
"version": "1.3.3.8",
|
||||
"description": "__MSG_extShortDesc__",
|
||||
"icons": {
|
||||
"16": "img/icon_16.png",
|
||||
"128": "img/icon_128.png"
|
||||
},
|
||||
"browser_action": {
|
||||
"default_icon": {
|
||||
"19": "img/browsericons/icon19-19.png"
|
||||
},
|
||||
"default_title": "nuTensor",
|
||||
"default_popup": "popup.html"
|
||||
},
|
||||
"author": "Raymond Hill",
|
||||
"background": {
|
||||
"page": "background.html"
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["http://*/*", "https://*/*"],
|
||||
"js": ["/js/vapi.js", "/js/vapi-client.js", "/js/contentscript-start.js"],
|
||||
"run_at": "document_start",
|
||||
"all_frames": true
|
||||
},
|
||||
{
|
||||
"matches": ["http://*/*", "https://*/*"],
|
||||
"js": ["/js/contentscript.js"],
|
||||
"run_at": "document_end",
|
||||
"all_frames": true
|
||||
}
|
||||
],
|
||||
"default_locale": "en",
|
||||
"homepage_url": "https://github.com/geekprojects/nuTensor",
|
||||
"minimum_chrome_version": "45.0",
|
||||
"options_ui": {
|
||||
"page": "dashboard.html",
|
||||
"open_in_tab": true
|
||||
},
|
||||
"permissions": [
|
||||
"browsingData",
|
||||
"cookies",
|
||||
"privacy",
|
||||
"storage",
|
||||
"tabs",
|
||||
"unlimitedStorage",
|
||||
"webNavigation",
|
||||
"webRequest",
|
||||
"webRequestBlocking",
|
||||
"<all_urls>"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,308 @@
|
||||
/*******************************************************************************
|
||||
|
||||
uBlock Origin - a browser extension to block requests.
|
||||
Copyright (C) 2019-present Raymond Hill
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
|
||||
Home: https://github.com/gorhill/uBlock
|
||||
*/
|
||||
|
||||
// For non-background page
|
||||
|
||||
'use strict';
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// Direct messaging connection ability
|
||||
|
||||
(( ) => {
|
||||
// >>>>>>>> start of private namespace
|
||||
|
||||
if (
|
||||
typeof vAPI !== 'object' ||
|
||||
vAPI.messaging instanceof Object === false ||
|
||||
vAPI.MessagingConnection instanceof Function
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
const listeners = new Set();
|
||||
const connections = new Map();
|
||||
|
||||
vAPI.MessagingConnection = class {
|
||||
constructor(handler, details) {
|
||||
this.messaging = vAPI.messaging;
|
||||
this.handler = handler;
|
||||
this.id = details.id;
|
||||
this.to = details.to;
|
||||
this.toToken = details.toToken;
|
||||
this.from = details.from;
|
||||
this.fromToken = details.fromToken;
|
||||
this.checkTimer = undefined;
|
||||
// On Firefox it appears ports are not automatically disconnected
|
||||
// when navigating to another page.
|
||||
const ctor = vAPI.MessagingConnection;
|
||||
if ( ctor.pagehide !== undefined ) { return; }
|
||||
ctor.pagehide = ( ) => {
|
||||
for ( const connection of connections.values() ) {
|
||||
connection.disconnect();
|
||||
connection.handler(
|
||||
connection.toDetails('connectionBroken')
|
||||
);
|
||||
}
|
||||
};
|
||||
window.addEventListener('pagehide', ctor.pagehide);
|
||||
}
|
||||
toDetails(what, payload) {
|
||||
return {
|
||||
what: what,
|
||||
id: this.id,
|
||||
from: this.from,
|
||||
fromToken: this.fromToken,
|
||||
to: this.to,
|
||||
toToken: this.toToken,
|
||||
payload: payload
|
||||
};
|
||||
}
|
||||
disconnect() {
|
||||
if ( this.checkTimer !== undefined ) {
|
||||
clearTimeout(this.checkTimer);
|
||||
this.checkTimer = undefined;
|
||||
}
|
||||
connections.delete(this.id);
|
||||
const port = this.messaging.getPort();
|
||||
if ( port === null ) { return; }
|
||||
port.postMessage({
|
||||
channel: 'vapi',
|
||||
msg: this.toDetails('connectionBroken'),
|
||||
});
|
||||
}
|
||||
checkAsync() {
|
||||
if ( this.checkTimer !== undefined ) {
|
||||
clearTimeout(this.checkTimer);
|
||||
}
|
||||
this.checkTimer = vAPI.setTimeout(
|
||||
( ) => { this.check(); },
|
||||
499
|
||||
);
|
||||
}
|
||||
check() {
|
||||
this.checkTimer = undefined;
|
||||
if ( connections.has(this.id) === false ) { return; }
|
||||
const port = this.messaging.getPort();
|
||||
if ( port === null ) { return; }
|
||||
port.postMessage({
|
||||
channel: 'vapi',
|
||||
msg: this.toDetails('connectionCheck'),
|
||||
});
|
||||
this.checkAsync();
|
||||
}
|
||||
receive(details) {
|
||||
switch ( details.what ) {
|
||||
case 'connectionAccepted':
|
||||
this.toToken = details.toToken;
|
||||
this.handler(details);
|
||||
this.checkAsync();
|
||||
break;
|
||||
case 'connectionBroken':
|
||||
connections.delete(this.id);
|
||||
this.handler(details);
|
||||
break;
|
||||
case 'connectionMessage':
|
||||
this.handler(details);
|
||||
this.checkAsync();
|
||||
break;
|
||||
case 'connectionCheck':
|
||||
const port = this.messaging.getPort();
|
||||
if ( port === null ) { return; }
|
||||
if ( connections.has(this.id) ) {
|
||||
this.checkAsync();
|
||||
} else {
|
||||
details.what = 'connectionBroken';
|
||||
port.postMessage({ channel: 'vapi', msg: details });
|
||||
}
|
||||
break;
|
||||
case 'connectionRefused':
|
||||
connections.delete(this.id);
|
||||
this.handler(details);
|
||||
break;
|
||||
}
|
||||
}
|
||||
send(payload) {
|
||||
const port = this.messaging.getPort();
|
||||
if ( port === null ) { return; }
|
||||
port.postMessage({
|
||||
channel: 'vapi',
|
||||
msg: this.toDetails('connectionMessage', payload),
|
||||
});
|
||||
}
|
||||
|
||||
static addListener(listener) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
static async connectTo(from, to, handler) {
|
||||
const port = vAPI.messaging.getPort();
|
||||
if ( port === null ) { return; }
|
||||
const connection = new vAPI.MessagingConnection(handler, {
|
||||
id: `${from}-${to}-${vAPI.sessionId}`,
|
||||
to: to,
|
||||
from: from,
|
||||
fromToken: port.name
|
||||
});
|
||||
connections.set(connection.id, connection);
|
||||
port.postMessage({
|
||||
channel: 'vapi',
|
||||
msg: {
|
||||
what: 'connectionRequested',
|
||||
id: connection.id,
|
||||
from: from,
|
||||
fromToken: port.name,
|
||||
to: to,
|
||||
}
|
||||
});
|
||||
return connection.id;
|
||||
}
|
||||
static disconnectFrom(connectionId) {
|
||||
const connection = connections.get(connectionId);
|
||||
if ( connection === undefined ) { return; }
|
||||
connection.disconnect();
|
||||
}
|
||||
static sendTo(connectionId, payload) {
|
||||
const connection = connections.get(connectionId);
|
||||
if ( connection === undefined ) { return; }
|
||||
connection.send(payload);
|
||||
}
|
||||
static canDestroyPort() {
|
||||
return listeners.length === 0 && connections.size === 0;
|
||||
}
|
||||
static mustDestroyPort() {
|
||||
if ( connections.size === 0 ) { return; }
|
||||
for ( const connection of connections.values() ) {
|
||||
connection.receive({ what: 'connectionBroken' });
|
||||
}
|
||||
connections.clear();
|
||||
}
|
||||
static canProcessMessage(details) {
|
||||
if ( details.channel !== 'vapi' ) { return; }
|
||||
switch ( details.msg.what ) {
|
||||
case 'connectionAccepted':
|
||||
case 'connectionBroken':
|
||||
case 'connectionCheck':
|
||||
case 'connectionMessage':
|
||||
case 'connectionRefused': {
|
||||
const connection = connections.get(details.msg.id);
|
||||
if ( connection === undefined ) { break; }
|
||||
connection.receive(details.msg);
|
||||
return true;
|
||||
}
|
||||
case 'connectionRequested':
|
||||
if ( listeners.length === 0 ) { return; }
|
||||
const port = vAPI.messaging.getPort();
|
||||
if ( port === null ) { break; }
|
||||
let listener, result;
|
||||
for ( listener of listeners ) {
|
||||
result = listener(details.msg);
|
||||
if ( result !== undefined ) { break; }
|
||||
}
|
||||
if ( result === undefined ) { break; }
|
||||
if ( result === true ) {
|
||||
details.msg.what = 'connectionAccepted';
|
||||
details.msg.toToken = port.name;
|
||||
const connection = new vAPI.MessagingConnection(
|
||||
listener,
|
||||
details.msg
|
||||
);
|
||||
connections.set(connection.id, connection);
|
||||
} else {
|
||||
details.msg.what = 'connectionRefused';
|
||||
}
|
||||
port.postMessage(details);
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
vAPI.messaging.extensions.push(vAPI.MessagingConnection);
|
||||
|
||||
// <<<<<<<< end of private namespace
|
||||
})();
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// Broadcast listening ability
|
||||
|
||||
(( ) => {
|
||||
// >>>>>>>> start of private namespace
|
||||
|
||||
if (
|
||||
typeof vAPI !== 'object' ||
|
||||
vAPI.messaging instanceof Object === false ||
|
||||
vAPI.broadcastListener instanceof Object
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
const listeners = new Set();
|
||||
|
||||
vAPI.broadcastListener = {
|
||||
add: function(listener) {
|
||||
listeners.add(listener);
|
||||
vAPI.messaging.getPort();
|
||||
},
|
||||
remove: function(listener) {
|
||||
listeners.delete(listener);
|
||||
},
|
||||
canDestroyPort() {
|
||||
return listeners.size === 0;
|
||||
},
|
||||
mustDestroyPort() {
|
||||
listeners.clear();
|
||||
},
|
||||
canProcessMessage(details) {
|
||||
if ( details.broadcast === false ) { return; }
|
||||
for ( const listener of listeners ) {
|
||||
listener(details.msg);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
vAPI.messaging.extensions.push(vAPI.broadcastListener);
|
||||
|
||||
// <<<<<<<< end of private namespace
|
||||
})();
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
DO NOT:
|
||||
- Remove the following code
|
||||
- Add code beyond the following code
|
||||
Reason:
|
||||
- https://github.com/gorhill/uBlock/pull/3721
|
||||
- uBO never uses the return value from injected content scripts
|
||||
|
||||
**/
|
||||
|
||||
void 0;
|
||||
@ -0,0 +1,268 @@
|
||||
/*******************************************************************************
|
||||
|
||||
uBlock Origin - a browser extension to block requests.
|
||||
Copyright (C) 2014-2015 The uBlock Origin authors
|
||||
Copyright (C) 2014-present Raymond Hill
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
|
||||
Home: https://github.com/gorhill/uBlock
|
||||
*/
|
||||
|
||||
// For non-background page
|
||||
|
||||
'use strict';
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// https://github.com/chrisaljoudi/uBlock/issues/456
|
||||
// Skip if already injected.
|
||||
|
||||
// >>>>>>>> start of HUGE-IF-BLOCK
|
||||
if (
|
||||
typeof vAPI === 'object' &&
|
||||
vAPI.randomToken instanceof Function === false
|
||||
) {
|
||||
|
||||
/******************************************************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
vAPI.randomToken = function() {
|
||||
const now = Date.now();
|
||||
return String.fromCharCode(now % 26 + 97) +
|
||||
Math.floor((1 + Math.random()) * now).toString(36);
|
||||
};
|
||||
|
||||
vAPI.sessionId = vAPI.randomToken();
|
||||
vAPI.setTimeout = vAPI.setTimeout || self.setTimeout.bind(self);
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
vAPI.shutdown = {
|
||||
jobs: [],
|
||||
add: function(job) {
|
||||
this.jobs.push(job);
|
||||
},
|
||||
exec: function() {
|
||||
// Shutdown asynchronously, to ensure shutdown jobs are called from
|
||||
// the top context.
|
||||
self.requestIdleCallback(( ) => {
|
||||
const jobs = this.jobs.slice();
|
||||
this.jobs.length = 0;
|
||||
while ( jobs.length !== 0 ) {
|
||||
(jobs.pop())();
|
||||
}
|
||||
});
|
||||
},
|
||||
remove: function(job) {
|
||||
let pos;
|
||||
while ( (pos = this.jobs.indexOf(job)) !== -1 ) {
|
||||
this.jobs.splice(pos, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
vAPI.messaging = {
|
||||
port: null,
|
||||
portTimer: null,
|
||||
portTimerDelay: 10000,
|
||||
extended: undefined,
|
||||
extensions: [],
|
||||
msgIdGenerator: 1,
|
||||
pending: new Map(),
|
||||
shuttingDown: false,
|
||||
|
||||
shutdown: function() {
|
||||
this.shuttingDown = true;
|
||||
this.destroyPort();
|
||||
},
|
||||
|
||||
// https://github.com/uBlockOrigin/uBlock-issues/issues/403
|
||||
// Spurious disconnection can happen, so do not consider such events
|
||||
// as world-ending, i.e. stay around. Except for embedded frames.
|
||||
|
||||
disconnectListener: function() {
|
||||
this.port = null;
|
||||
if ( window !== window.top ) {
|
||||
vAPI.shutdown.exec();
|
||||
}
|
||||
},
|
||||
disconnectListenerBound: null,
|
||||
|
||||
messageListener: function(details) {
|
||||
if ( details instanceof Object === false ) { return; }
|
||||
|
||||
// Response to specific message previously sent
|
||||
if ( details.msgId !== undefined ) {
|
||||
const resolver = this.pending.get(details.msgId);
|
||||
if ( resolver !== undefined ) {
|
||||
this.pending.delete(details.msgId);
|
||||
resolver(details.msg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Unhandled messages
|
||||
this.extensions.every(ext => ext.canProcessMessage(details) !== true);
|
||||
},
|
||||
messageListenerBound: null,
|
||||
|
||||
canDestroyPort: function() {
|
||||
return this.pending.size === 0 &&
|
||||
(
|
||||
this.extensions.length === 0 ||
|
||||
this.extensions.every(e => e.canDestroyPort())
|
||||
);
|
||||
},
|
||||
|
||||
mustDestroyPort: function() {
|
||||
if ( this.extensions.length === 0 ) { return; }
|
||||
this.extensions.forEach(e => e.mustDestroyPort());
|
||||
this.extensions.length = 0;
|
||||
},
|
||||
|
||||
portPoller: function() {
|
||||
this.portTimer = null;
|
||||
if ( this.port !== null && this.canDestroyPort() ) {
|
||||
return this.destroyPort();
|
||||
}
|
||||
this.portTimer = vAPI.setTimeout(this.portPollerBound, this.portTimerDelay);
|
||||
this.portTimerDelay = Math.min(this.portTimerDelay * 2, 60 * 60 * 1000);
|
||||
},
|
||||
portPollerBound: null,
|
||||
|
||||
destroyPort: function() {
|
||||
if ( this.portTimer !== null ) {
|
||||
clearTimeout(this.portTimer);
|
||||
this.portTimer = null;
|
||||
}
|
||||
const port = this.port;
|
||||
if ( port !== null ) {
|
||||
port.disconnect();
|
||||
port.onMessage.removeListener(this.messageListenerBound);
|
||||
port.onDisconnect.removeListener(this.disconnectListenerBound);
|
||||
this.port = null;
|
||||
}
|
||||
this.mustDestroyPort();
|
||||
// service pending callbacks
|
||||
if ( this.pending.size !== 0 ) {
|
||||
const pending = this.pending;
|
||||
this.pending = new Map();
|
||||
for ( const resolver of pending.values() ) {
|
||||
resolver();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
createPort: function() {
|
||||
if ( this.shuttingDown ) { return null; }
|
||||
if ( this.messageListenerBound === null ) {
|
||||
this.messageListenerBound = this.messageListener.bind(this);
|
||||
this.disconnectListenerBound = this.disconnectListener.bind(this);
|
||||
this.portPollerBound = this.portPoller.bind(this);
|
||||
}
|
||||
try {
|
||||
this.port = browser.runtime.connect({name: vAPI.sessionId}) || null;
|
||||
} catch (ex) {
|
||||
this.port = null;
|
||||
}
|
||||
// Not having a valid port at this point means the main process is
|
||||
// not available: no point keeping the content scripts alive.
|
||||
if ( this.port === null ) {
|
||||
vAPI.shutdown.exec();
|
||||
return null;
|
||||
}
|
||||
this.port.onMessage.addListener(this.messageListenerBound);
|
||||
this.port.onDisconnect.addListener(this.disconnectListenerBound);
|
||||
this.portTimerDelay = 10000;
|
||||
if ( this.portTimer === null ) {
|
||||
this.portTimer = vAPI.setTimeout(
|
||||
this.portPollerBound,
|
||||
this.portTimerDelay
|
||||
);
|
||||
}
|
||||
return this.port;
|
||||
},
|
||||
|
||||
getPort: function() {
|
||||
return this.port !== null ? this.port : this.createPort();
|
||||
},
|
||||
|
||||
send: function(channel, msg) {
|
||||
// Too large a gap between the last request and the last response means
|
||||
// the main process is no longer reachable: memory leaks and bad
|
||||
// performance become a risk -- especially for long-lived, dynamic
|
||||
// pages. Guard against this.
|
||||
if ( this.pending.size > 50 ) {
|
||||
vAPI.shutdown.exec();
|
||||
}
|
||||
const port = this.getPort();
|
||||
if ( port === null ) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
const msgId = this.msgIdGenerator++;
|
||||
const promise = new Promise(resolve => {
|
||||
this.pending.set(msgId, resolve);
|
||||
});
|
||||
port.postMessage({ channel, msgId, msg });
|
||||
return promise;
|
||||
},
|
||||
|
||||
// Dynamically extend capabilities.
|
||||
extend: function() {
|
||||
if ( this.extended === undefined ) {
|
||||
this.extended = vAPI.messaging.send('vapi', {
|
||||
what: 'extendClient'
|
||||
}).then(( ) => {
|
||||
return self.vAPI instanceof Object &&
|
||||
this.extensions.length !== 0;
|
||||
}).catch(( ) => {
|
||||
});
|
||||
}
|
||||
return this.extended;
|
||||
},
|
||||
};
|
||||
|
||||
vAPI.shutdown.add(( ) => {
|
||||
vAPI.messaging.shutdown();
|
||||
window.vAPI = undefined;
|
||||
});
|
||||
|
||||
/******************************************************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
}
|
||||
// <<<<<<<< end of HUGE-IF-BLOCK
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
DO NOT:
|
||||
- Remove the following code
|
||||
- Add code beyond the following code
|
||||
Reason:
|
||||
- https://github.com/gorhill/uBlock/pull/3721
|
||||
- uBO never uses the return value from injected content scripts
|
||||
|
||||
**/
|
||||
|
||||
void 0;
|
||||
@ -0,0 +1,279 @@
|
||||
/*******************************************************************************
|
||||
|
||||
uMatrix - a browser extension to black/white list requests.
|
||||
Copyright (C) 2014-present The uMatrix/uBlock Origin authors
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
|
||||
Home: https://github.com/gorhill/uMatrix
|
||||
*/
|
||||
|
||||
// For background page or non-background pages
|
||||
|
||||
'use strict';
|
||||
|
||||
/******************************************************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
vAPI.T0 = Date.now();
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
vAPI.setTimeout = vAPI.setTimeout || self.setTimeout.bind(self);
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
vAPI.webextFlavor = {
|
||||
major: 0,
|
||||
soup: new Set()
|
||||
};
|
||||
|
||||
(( ) => {
|
||||
const ua = navigator.userAgent;
|
||||
const flavor = vAPI.webextFlavor;
|
||||
const soup = flavor.soup;
|
||||
const dispatch = function() {
|
||||
window.dispatchEvent(new CustomEvent('webextFlavor'));
|
||||
};
|
||||
|
||||
// This is always true.
|
||||
soup.add('ublock').add('webext');
|
||||
|
||||
// Whether this is a dev build.
|
||||
if ( /^\d+\.\d+\.\d+\D/.test(browser.runtime.getManifest().version) ) {
|
||||
soup.add('devbuild');
|
||||
}
|
||||
|
||||
if ( /\bMobile\b/.test(ua) ) {
|
||||
soup.add('mobile');
|
||||
}
|
||||
|
||||
// Asynchronous
|
||||
if (
|
||||
browser instanceof Object &&
|
||||
typeof browser.runtime.getBrowserInfo === 'function'
|
||||
) {
|
||||
browser.runtime.getBrowserInfo().then(info => {
|
||||
flavor.major = parseInt(info.version, 10) || 60;
|
||||
soup.add(info.vendor.toLowerCase())
|
||||
.add(info.name.toLowerCase());
|
||||
if ( soup.has('firefox') && flavor.major < 57 ) {
|
||||
soup.delete('html_filtering');
|
||||
}
|
||||
dispatch();
|
||||
});
|
||||
if ( browser.runtime.getURL('').startsWith('moz-extension://') ) {
|
||||
soup.add('mozilla')
|
||||
.add('firefox')
|
||||
.add('user_stylesheet')
|
||||
.add('html_filtering');
|
||||
flavor.major = 60;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Synchronous -- order of tests is important
|
||||
let match;
|
||||
if ( (match = /\bEdge\/(\d+)/.exec(ua)) !== null ) {
|
||||
flavor.major = parseInt(match[1], 10) || 0;
|
||||
soup.add('microsoft').add('edge');
|
||||
} else if ( (match = /\bOPR\/(\d+)/.exec(ua)) !== null ) {
|
||||
const reEx = /\bChrom(?:e|ium)\/([\d.]+)/;
|
||||
if ( reEx.test(ua) ) { match = reEx.exec(ua); }
|
||||
flavor.major = parseInt(match[1], 10) || 0;
|
||||
soup.add('opera').add('chromium');
|
||||
} else if ( (match = /\bChromium\/(\d+)/.exec(ua)) !== null ) {
|
||||
flavor.major = parseInt(match[1], 10) || 0;
|
||||
soup.add('chromium');
|
||||
} else if ( (match = /\bChrome\/(\d+)/.exec(ua)) !== null ) {
|
||||
flavor.major = parseInt(match[1], 10) || 0;
|
||||
soup.add('google').add('chromium');
|
||||
} else if ( (match = /\bSafari\/(\d+)/.exec(ua)) !== null ) {
|
||||
flavor.major = parseInt(match[1], 10) || 0;
|
||||
soup.add('apple').add('safari');
|
||||
}
|
||||
|
||||
// https://github.com/gorhill/uBlock/issues/3588
|
||||
if ( soup.has('chromium') && flavor.major >= 66 ) {
|
||||
soup.add('user_stylesheet');
|
||||
}
|
||||
|
||||
// Don't starve potential listeners
|
||||
vAPI.setTimeout(dispatch, 97);
|
||||
})();
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
{
|
||||
const punycode = self.punycode;
|
||||
const reCommonHostnameFromURL = /^https?:\/\/([0-9a-z_][0-9a-z._-]*[0-9a-z])\//;
|
||||
const reAuthorityFromURI = /^(?:[^:\/?#]+:)?(\/\/[^\/?#]+)/;
|
||||
const reHostFromNakedAuthority = /^[0-9a-z._-]+[0-9a-z]$/i;
|
||||
const reHostFromAuthority = /^(?:[^@]*@)?([^:]+)(?::\d*)?$/;
|
||||
const reIPv6FromAuthority = /^(?:[^@]*@)?(\[[0-9a-f:]+\])(?::\d*)?$/i;
|
||||
const reMustNormalizeHostname = /[^0-9a-z._-]/;
|
||||
|
||||
vAPI.hostnameFromURI = function(uri) {
|
||||
let matches = reCommonHostnameFromURL.exec(uri);
|
||||
if ( matches !== null ) { return matches[1]; }
|
||||
matches = reAuthorityFromURI.exec(uri);
|
||||
if ( matches === null ) { return ''; }
|
||||
const authority = matches[1].slice(2);
|
||||
if ( reHostFromNakedAuthority.test(authority) ) {
|
||||
return authority.toLowerCase();
|
||||
}
|
||||
matches = reHostFromAuthority.exec(authority);
|
||||
if ( matches === null ) {
|
||||
matches = reIPv6FromAuthority.exec(authority);
|
||||
if ( matches === null ) { return ''; }
|
||||
}
|
||||
let hostname = matches[1];
|
||||
while ( hostname.endsWith('.') ) {
|
||||
hostname = hostname.slice(0, -1);
|
||||
}
|
||||
if ( reMustNormalizeHostname.test(hostname) ) {
|
||||
hostname = punycode.toASCII(hostname.toLowerCase());
|
||||
}
|
||||
return hostname;
|
||||
};
|
||||
|
||||
const reHostnameFromNetworkURL =
|
||||
/^(?:http|ws|ftp)s?:\/\/([0-9a-z_][0-9a-z._-]*[0-9a-z])\//;
|
||||
|
||||
vAPI.hostnameFromNetworkURL = function(url) {
|
||||
const matches = reHostnameFromNetworkURL.exec(url);
|
||||
return matches !== null ? matches[1] : '';
|
||||
};
|
||||
|
||||
const psl = self.publicSuffixList;
|
||||
const reIPAddressNaive = /^\d+\.\d+\.\d+\.\d+$|^\[[\da-zA-Z:]+\]$/;
|
||||
|
||||
vAPI.domainFromHostname = function(hostname) {
|
||||
return reIPAddressNaive.test(hostname)
|
||||
? hostname
|
||||
: psl.getDomain(hostname);
|
||||
};
|
||||
|
||||
vAPI.domainFromURI = function(uri) {
|
||||
return uri !== ''
|
||||
? vAPI.domainFromHostname(vAPI.hostnameFromURI(uri))
|
||||
: '';
|
||||
};
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
vAPI.download = function(details) {
|
||||
if ( !details.url ) { return; }
|
||||
const a = document.createElement('a');
|
||||
a.href = details.url;
|
||||
a.setAttribute('download', details.filename || '');
|
||||
a.setAttribute('type', 'text/plain');
|
||||
a.dispatchEvent(new MouseEvent('click'));
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
vAPI.getURL = browser.runtime.getURL;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
vAPI.i18n = browser.i18n.getMessage;
|
||||
|
||||
// http://www.w3.org/International/questions/qa-scripts#directions
|
||||
document.body.setAttribute(
|
||||
'dir',
|
||||
['ar', 'he', 'fa', 'ps', 'ur'].indexOf(vAPI.i18n('@@ui_locale')) !== -1
|
||||
? 'rtl'
|
||||
: 'ltr'
|
||||
);
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// https://github.com/gorhill/uBlock/issues/3057
|
||||
// - webNavigation.onCreatedNavigationTarget become broken on Firefox when we
|
||||
// try to make the popup panel close itself using the original
|
||||
// `window.open('', '_self').close()`.
|
||||
|
||||
vAPI.closePopup = function() {
|
||||
if ( vAPI.webextFlavor.soup.has('firefox') ) {
|
||||
window.close();
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: try to figure why this was used instead of a plain window.close().
|
||||
// https://github.com/gorhill/uBlock/commit/b301ac031e0c2e9a99cb6f8953319d44e22f33d2#diff-bc664f26b9c453e0d43a9379e8135c6a
|
||||
window.open('', '_self').close();
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// A localStorage-like object which should be accessible from the
|
||||
// background page or auxiliary pages.
|
||||
// This storage is optional, but it is nice to have, for a more polished user
|
||||
// experience.
|
||||
|
||||
// https://github.com/gorhill/uBlock/issues/2824
|
||||
// Use a dummy localStorage if for some reasons it's not available.
|
||||
|
||||
// https://github.com/gorhill/uMatrix/issues/840
|
||||
// Always use a wrapper to seamlessly handle exceptions
|
||||
|
||||
vAPI.localStorage = {
|
||||
clear: function() {
|
||||
try {
|
||||
window.localStorage.clear();
|
||||
} catch(ex) {
|
||||
}
|
||||
},
|
||||
getItem: function(key) {
|
||||
try {
|
||||
return window.localStorage.getItem(key);
|
||||
} catch(ex) {
|
||||
}
|
||||
return null;
|
||||
},
|
||||
removeItem: function(key) {
|
||||
try {
|
||||
window.localStorage.removeItem(key);
|
||||
} catch(ex) {
|
||||
}
|
||||
},
|
||||
setItem: function(key, value) {
|
||||
try {
|
||||
window.localStorage.setItem(key, value);
|
||||
} catch(ex) {
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
DO NOT:
|
||||
- Remove the following code
|
||||
- Add code beyond the following code
|
||||
Reason:
|
||||
- https://github.com/gorhill/uBlock/pull/3721
|
||||
- uBO never uses the return value from injected content scripts
|
||||
|
||||
**/
|
||||
|
||||
void 0;
|
||||
@ -0,0 +1,178 @@
|
||||
/*******************************************************************************
|
||||
|
||||
uMatrix - a browser extension to block requests.
|
||||
Copyright (C) 2017-present Raymond Hill
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
|
||||
Home: https://github.com/gorhill/uMatrix
|
||||
*/
|
||||
|
||||
// For background page
|
||||
|
||||
'use strict';
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
(( ) => {
|
||||
// https://github.com/uBlockOrigin/uBlock-issues/issues/407
|
||||
if ( vAPI.webextFlavor.soup.has('chromium') === false ) { return; }
|
||||
|
||||
const extToTypeMap = new Map([
|
||||
['eot','font'],['otf','font'],['svg','font'],['ttf','font'],['woff','font'],['woff2','font'],
|
||||
['mp3','media'],['mp4','media'],['webm','media'],
|
||||
['gif','image'],['ico','image'],['jpeg','image'],['jpg','image'],['png','image'],['webp','image']
|
||||
]);
|
||||
|
||||
const headerValue = (headers, name) => {
|
||||
let i = headers.length;
|
||||
while ( i-- ) {
|
||||
if ( headers[i].name.toLowerCase() === name ) {
|
||||
return headers[i].value.trim();
|
||||
}
|
||||
}
|
||||
return '';
|
||||
};
|
||||
|
||||
const parsedURL = new URL('https://www.example.org/');
|
||||
|
||||
// Extend base class to normalize as per platform.
|
||||
|
||||
vAPI.Net = class extends vAPI.Net {
|
||||
constructor() {
|
||||
super();
|
||||
this.suspendedTabIds = new Set();
|
||||
}
|
||||
normalizeDetails(details) {
|
||||
// Chromium 63+ supports the `initiator` property, which contains
|
||||
// the URL of the origin from which the network request was made.
|
||||
if (
|
||||
typeof details.initiator === 'string' &&
|
||||
details.initiator !== 'null'
|
||||
) {
|
||||
details.documentUrl = details.initiator;
|
||||
}
|
||||
|
||||
let type = details.type;
|
||||
|
||||
if ( type === 'imageset' ) {
|
||||
details.type = 'image';
|
||||
return;
|
||||
}
|
||||
|
||||
// The rest of the function code is to normalize type
|
||||
if ( type !== 'other' ) { return; }
|
||||
|
||||
// Try to map known "extension" part of URL to request type.
|
||||
parsedURL.href = details.url;
|
||||
const path = parsedURL.pathname,
|
||||
pos = path.indexOf('.', path.length - 6);
|
||||
if ( pos !== -1 && (type = extToTypeMap.get(path.slice(pos + 1))) ) {
|
||||
details.type = type;
|
||||
return;
|
||||
}
|
||||
|
||||
// Try to extract type from response headers if present.
|
||||
if ( details.responseHeaders ) {
|
||||
type = headerValue(details.responseHeaders, 'content-type');
|
||||
if ( type.startsWith('font/') ) {
|
||||
details.type = 'font';
|
||||
return;
|
||||
}
|
||||
if ( type.startsWith('image/') ) {
|
||||
details.type = 'image';
|
||||
return;
|
||||
}
|
||||
if ( type.startsWith('audio/') || type.startsWith('video/') ) {
|
||||
details.type = 'media';
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// https://www.reddit.com/r/uBlockOrigin/comments/9vcrk3/
|
||||
// Some types can be mapped from 'other', thus include 'other' if and
|
||||
// only if the caller is interested in at least one of those types.
|
||||
denormalizeTypes(types) {
|
||||
if ( types.length === 0 ) {
|
||||
return Array.from(this.validTypes);
|
||||
}
|
||||
const out = new Set();
|
||||
for ( const type of types ) {
|
||||
if ( this.validTypes.has(type) ) {
|
||||
out.add(type);
|
||||
}
|
||||
}
|
||||
if ( out.has('other') === false ) {
|
||||
for ( const type of extToTypeMap.values() ) {
|
||||
if ( out.has(type) ) {
|
||||
out.add('other');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Array.from(out);
|
||||
}
|
||||
suspendOneRequest(details) {
|
||||
this.suspendedTabIds.add(details.tabId);
|
||||
return { cancel: true };
|
||||
}
|
||||
unsuspendAllRequests() {
|
||||
for ( const tabId of this.suspendedTabIds ) {
|
||||
vAPI.tabs.reload(tabId);
|
||||
}
|
||||
this.suspendedTabIds.clear();
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// https://github.com/uBlockOrigin/uBlock-issues/issues/548
|
||||
// Use `X-DNS-Prefetch-Control` to workaround Chromium's disregard of the
|
||||
// setting "Predict network actions to improve page load performance".
|
||||
|
||||
vAPI.prefetching = (( ) => {
|
||||
// https://github.com/uBlockOrigin/uBlock-issues/issues/407
|
||||
if ( vAPI.webextFlavor.soup.has('chromium') === false ) { return; }
|
||||
|
||||
let listening = false;
|
||||
|
||||
const onHeadersReceived = function(details) {
|
||||
details.responseHeaders.push({
|
||||
name: 'X-DNS-Prefetch-Control',
|
||||
value: 'off'
|
||||
});
|
||||
return { responseHeaders: details.responseHeaders };
|
||||
};
|
||||
|
||||
return state => {
|
||||
const wr = chrome.webRequest;
|
||||
if ( state && listening ) {
|
||||
wr.onHeadersReceived.removeListener(onHeadersReceived);
|
||||
listening = false;
|
||||
} else if ( !state && !listening ) {
|
||||
wr.onHeadersReceived.addListener(
|
||||
onHeadersReceived,
|
||||
{
|
||||
urls: [ 'http://*/*', 'https://*/*' ],
|
||||
types: [ 'main_frame', 'sub_frame' ]
|
||||
},
|
||||
[ 'blocking', 'responseHeaders' ]
|
||||
);
|
||||
listening = true;
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
/******************************************************************************/
|
||||
@ -0,0 +1,86 @@
|
||||
/*******************************************************************************
|
||||
|
||||
uMatrix - a browser extension to block requests.
|
||||
Copyright (C) 2017-present Raymond Hill
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
|
||||
Home: https://github.com/gorhill/uBlock
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
/* global HTMLDocument, XMLDocument */
|
||||
|
||||
// For background page, auxiliary pages, and content scripts.
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
if ( self.browser instanceof Object ) {
|
||||
self.chrome = self.browser;
|
||||
} else {
|
||||
self.browser = self.chrome;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1408996#c9
|
||||
var vAPI = self.vAPI; // jshint ignore:line
|
||||
|
||||
// https://github.com/chrisaljoudi/uBlock/issues/464
|
||||
// https://github.com/chrisaljoudi/uBlock/issues/1528
|
||||
// A XMLDocument can be a valid HTML document.
|
||||
|
||||
// https://github.com/gorhill/uBlock/issues/1124
|
||||
// Looks like `contentType` is on track to be standardized:
|
||||
// https://dom.spec.whatwg.org/#concept-document-content-type
|
||||
|
||||
// https://forums.lanik.us/viewtopic.php?f=64&t=31522
|
||||
// Skip text/plain documents.
|
||||
|
||||
if (
|
||||
(
|
||||
document instanceof HTMLDocument ||
|
||||
document instanceof XMLDocument &&
|
||||
document.createElement('div') instanceof HTMLDivElement
|
||||
) &&
|
||||
(
|
||||
/^image\/|^text\/plain/.test(document.contentType || '') === false
|
||||
) &&
|
||||
(
|
||||
self.vAPI instanceof Object === false || vAPI.nuTensor !== true
|
||||
)
|
||||
) {
|
||||
vAPI = self.vAPI = { nuTensor: true };
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
DO NOT:
|
||||
- Remove the following code
|
||||
- Add code beyond the following code
|
||||
Reason:
|
||||
- https://github.com/gorhill/uBlock/pull/3721
|
||||
- uMatrix never uses the return value from injected content scripts
|
||||
|
||||
**/
|
||||
|
||||
void 0;
|
||||
@ -0,0 +1,176 @@
|
||||
/*******************************************************************************
|
||||
|
||||
uBlock Origin - a browser extension to block requests.
|
||||
Copyright (C) 2019-present Raymond Hill
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
|
||||
Home: https://github.com/gorhill/uBlock
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
// `webext` is a promisified api of `chrome`. Entries are added as
|
||||
// the promisification of uBO progress.
|
||||
|
||||
const webext = (( ) => { // jshint ignore:line
|
||||
// >>>>> start of private scope
|
||||
|
||||
const noopFunc = ( ) => { };
|
||||
|
||||
const promisifyNoFail = function(thisArg, fnName, outFn = r => r) {
|
||||
const fn = thisArg[fnName];
|
||||
return function() {
|
||||
return new Promise(resolve => {
|
||||
fn.call(thisArg, ...arguments, function() {
|
||||
if ( chrome.runtime.lastError instanceof Object ) {
|
||||
void chrome.runtime.lastError.message;
|
||||
}
|
||||
resolve(outFn(...arguments));
|
||||
});
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
const promisify = function(thisArg, fnName) {
|
||||
const fn = thisArg[fnName];
|
||||
return function() {
|
||||
return new Promise((resolve, reject) => {
|
||||
fn.call(thisArg, ...arguments, function() {
|
||||
const lastError = chrome.runtime.lastError;
|
||||
if ( lastError instanceof Object ) {
|
||||
return reject(lastError.message);
|
||||
}
|
||||
resolve(...arguments);
|
||||
});
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
const webext = {
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/browserAction
|
||||
browserAction: {
|
||||
setBadgeBackgroundColor: promisifyNoFail(chrome.browserAction, 'setBadgeBackgroundColor'),
|
||||
setBadgeText: promisifyNoFail(chrome.browserAction, 'setBadgeText'),
|
||||
setBadgeTextColor: noopFunc,
|
||||
setIcon: promisifyNoFail(chrome.browserAction, 'setIcon'),
|
||||
setTitle: promisifyNoFail(chrome.browserAction, 'setTitle'),
|
||||
},
|
||||
cookies: {
|
||||
getAll: promisifyNoFail(chrome.cookies, 'getAll'),
|
||||
remove: promisifyNoFail(chrome.cookies, 'remove'),
|
||||
},
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/menus
|
||||
/*
|
||||
menus: {
|
||||
create: function() {
|
||||
return chrome.contextMenus.create(...arguments, ( ) => {
|
||||
void chrome.runtime.lastError;
|
||||
});
|
||||
},
|
||||
onClicked: chrome.contextMenus.onClicked,
|
||||
remove: promisifyNoFail(chrome.contextMenus, 'remove'),
|
||||
},
|
||||
*/
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy
|
||||
privacy: {
|
||||
},
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage
|
||||
storage: {
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/local
|
||||
local: {
|
||||
clear: promisify(chrome.storage.local, 'clear'),
|
||||
get: promisify(chrome.storage.local, 'get'),
|
||||
getBytesInUse: promisify(chrome.storage.local, 'getBytesInUse'),
|
||||
remove: promisify(chrome.storage.local, 'remove'),
|
||||
set: promisify(chrome.storage.local, 'set'),
|
||||
},
|
||||
},
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs
|
||||
tabs: {
|
||||
get: promisifyNoFail(chrome.tabs, 'get', tab => tab instanceof Object ? tab : null),
|
||||
executeScript: promisifyNoFail(chrome.tabs, 'executeScript'),
|
||||
insertCSS: promisifyNoFail(chrome.tabs, 'insertCSS'),
|
||||
query: promisifyNoFail(chrome.tabs, 'query', tabs => Array.isArray(tabs) ? tabs : []),
|
||||
reload: promisifyNoFail(chrome.tabs, 'reload'),
|
||||
remove: promisifyNoFail(chrome.tabs, 'remove'),
|
||||
update: promisifyNoFail(chrome.tabs, 'update', tab => tab instanceof Object ? tab : null),
|
||||
},
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webNavigation
|
||||
webNavigation: {
|
||||
getFrame: promisify(chrome.webNavigation, 'getFrame'),
|
||||
},
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/windows
|
||||
windows: {
|
||||
get: promisifyNoFail(chrome.windows, 'get', win => win instanceof Object ? win : null),
|
||||
create: promisifyNoFail(chrome.windows, 'create', win => win instanceof Object ? win : null),
|
||||
update: promisifyNoFail(chrome.windows, 'update', win => win instanceof Object ? win : null),
|
||||
},
|
||||
};
|
||||
|
||||
// browser.privacy entries
|
||||
{
|
||||
const settings = [
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy/network
|
||||
[ 'network', 'networkPredictionEnabled' ],
|
||||
[ 'network', 'webRTCIPHandlingPolicy' ],
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy/websites
|
||||
[ 'websites', 'hyperlinkAuditingEnabled' ],
|
||||
];
|
||||
for ( const [ category, setting ] of settings ) {
|
||||
let categoryEntry = webext.privacy[category];
|
||||
if ( categoryEntry instanceof Object === false ) {
|
||||
categoryEntry = webext.privacy[category] = {};
|
||||
}
|
||||
const settingEntry = categoryEntry[setting] = {};
|
||||
const thisArg = chrome.privacy[category][setting];
|
||||
settingEntry.clear = promisifyNoFail(thisArg, 'clear');
|
||||
settingEntry.get = promisifyNoFail(thisArg, 'get');
|
||||
settingEntry.set = promisifyNoFail(thisArg, 'set');
|
||||
}
|
||||
}
|
||||
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/managed
|
||||
if ( chrome.storage.managed instanceof Object ) {
|
||||
webext.storage.managed = {
|
||||
get: promisify(chrome.storage.managed, 'get'),
|
||||
};
|
||||
}
|
||||
|
||||
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/sync
|
||||
if ( chrome.storage.sync instanceof Object ) {
|
||||
webext.storage.sync = {
|
||||
QUOTA_BYTES: chrome.storage.sync.QUOTA_BYTES,
|
||||
QUOTA_BYTES_PER_ITEM: chrome.storage.sync.QUOTA_BYTES_PER_ITEM,
|
||||
MAX_ITEMS: chrome.storage.sync.MAX_ITEMS,
|
||||
MAX_WRITE_OPERATIONS_PER_HOUR: chrome.storage.sync.MAX_WRITE_OPERATIONS_PER_HOUR,
|
||||
MAX_WRITE_OPERATIONS_PER_MINUTE: chrome.storage.sync.MAX_WRITE_OPERATIONS_PER_MINUTE,
|
||||
|
||||
clear: promisify(chrome.storage.sync, 'clear'),
|
||||
get: promisify(chrome.storage.sync, 'get'),
|
||||
getBytesInUse: promisify(chrome.storage.sync, 'getBytesInUse'),
|
||||
remove: promisify(chrome.storage.sync, 'remove'),
|
||||
set: promisify(chrome.storage.sync, 'set'),
|
||||
};
|
||||
}
|
||||
|
||||
// https://bugs.chromium.org/p/chromium/issues/detail?id=608854
|
||||
if ( chrome.tabs.removeCSS instanceof Function ) {
|
||||
webext.tabs.removeCSS = promisifyNoFail(chrome.tabs, 'removeCSS');
|
||||
}
|
||||
|
||||
return webext;
|
||||
|
||||
// <<<<< end of private scope
|
||||
})();
|
||||
@ -0,0 +1,69 @@
|
||||
{
|
||||
"browser_specific_settings": {
|
||||
"gecko": {
|
||||
"id": "nuTensor@geekprojects.com",
|
||||
"strict_min_version": "60.0"
|
||||
}
|
||||
},
|
||||
"author": "Raymond Hill",
|
||||
"background": {
|
||||
"page": "background.html"
|
||||
},
|
||||
"browser_action": {
|
||||
"browser_style": false,
|
||||
"default_icon": {
|
||||
"19": "img/browsericons/icon19-off.png"
|
||||
},
|
||||
"default_title": "nuTensor",
|
||||
"default_popup": "popup.html"
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["http://*/*", "https://*/*"],
|
||||
"js": ["/js/vapi.js", "/js/vapi-client.js", "/js/contentscript-start.js"],
|
||||
"run_at": "document_start",
|
||||
"all_frames": true
|
||||
},
|
||||
{
|
||||
"matches": ["http://*/*", "https://*/*"],
|
||||
"js": ["/js/contentscript.js"],
|
||||
"run_at": "document_end",
|
||||
"all_frames": true
|
||||
}
|
||||
],
|
||||
"default_locale": "en",
|
||||
"description": "__MSG_extShortDesc__",
|
||||
"icons": {
|
||||
"16": "img/icon_16.png",
|
||||
"128": "img/icon_128.png"
|
||||
},
|
||||
"manifest_version": 2,
|
||||
"name": "nuTensor",
|
||||
"options_ui": {
|
||||
"page":"dashboard.html",
|
||||
"open_in_tab": true
|
||||
},
|
||||
"permissions": [
|
||||
"browsingData",
|
||||
"cookies",
|
||||
"dns",
|
||||
"privacy",
|
||||
"storage",
|
||||
"tabs",
|
||||
"webNavigation",
|
||||
"webRequest",
|
||||
"webRequestBlocking",
|
||||
"<all_urls>"
|
||||
],
|
||||
"short_name": "nuTensor",
|
||||
"sidebar_action": {
|
||||
"default_title": "__MSG_loggerPageName__",
|
||||
"default_panel": "logger-ui.html",
|
||||
"default_icon": {
|
||||
"16": "img/icon_16.png",
|
||||
"128": "img/icon_128.png"
|
||||
},
|
||||
"open_at_install": false
|
||||
},
|
||||
"version": "0.9.9"
|
||||
}
|
||||
@ -0,0 +1,263 @@
|
||||
/*******************************************************************************
|
||||
|
||||
uMatrix - a browser extension to block requests.
|
||||
Copyright (C) 2017-present Raymond Hill
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
|
||||
Home: https://github.com/gorhill/uMatrix
|
||||
*/
|
||||
|
||||
// For background page
|
||||
|
||||
'use strict';
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
(( ) => {
|
||||
// https://github.com/uBlockOrigin/uBlock-issues/issues/407
|
||||
if ( vAPI.webextFlavor.soup.has('firefox') === false ) { return; }
|
||||
|
||||
// https://github.com/gorhill/uBlock/issues/2950
|
||||
// Firefox 56 does not normalize URLs to ASCII, uBO must do this itself.
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=945240
|
||||
const evalMustPunycode = ( ) => {
|
||||
return vAPI.webextFlavor.soup.has('firefox') &&
|
||||
vAPI.webextFlavor.major < 57;
|
||||
};
|
||||
|
||||
let mustPunycode = evalMustPunycode();
|
||||
|
||||
// The real actual webextFlavor value may not be set in stone, so listen
|
||||
// for possible future changes.
|
||||
window.addEventListener('webextFlavor', ( ) => {
|
||||
mustPunycode = evalMustPunycode();
|
||||
}, { once: true });
|
||||
|
||||
const punycode = self.punycode;
|
||||
const reAsciiHostname = /^https?:\/\/[0-9a-z_.:@-]+[/?#]/;
|
||||
const parsedURL = new URL('about:blank');
|
||||
|
||||
// Related issues:
|
||||
// - https://github.com/gorhill/uBlock/issues/1327
|
||||
// - https://github.com/uBlockOrigin/uBlock-issues/issues/128
|
||||
// - https://bugzilla.mozilla.org/show_bug.cgi?id=1503721
|
||||
|
||||
// Extend base class to normalize as per platform.
|
||||
|
||||
vAPI.Net = class extends vAPI.Net {
|
||||
constructor() {
|
||||
super();
|
||||
this.pendingRequests = [];
|
||||
this.cnames = new Map([ [ '', '' ] ]);
|
||||
this.cnameIgnoreList = null;
|
||||
this.cnameIgnore1stParty = true;
|
||||
this.cnameIgnoreExceptions = true;
|
||||
this.cnameIgnoreRootDocument = true;
|
||||
this.cnameMaxTTL = 60;
|
||||
this.cnameReplayFullURL = false;
|
||||
this.cnameTimer = undefined;
|
||||
this.canRevealCNAME = browser.dns instanceof Object;
|
||||
}
|
||||
setOptions(options) {
|
||||
super.setOptions(options);
|
||||
this.cnameIgnoreList = this.regexFromStrList(options.cnameIgnoreList);
|
||||
this.cnameIgnore1stParty = options.cnameIgnore1stParty !== false;
|
||||
this.cnameIgnoreExceptions = options.cnameIgnoreExceptions !== false;
|
||||
this.cnameIgnoreRootDocument = options.cnameIgnoreRootDocument !== false;
|
||||
this.cnameMaxTTL = options.cnameMaxTTL || 120;
|
||||
this.cnameReplayFullURL = options.cnameReplayFullURL === true;
|
||||
this.cnames.clear(); this.cnames.set('', '');
|
||||
}
|
||||
normalizeDetails(details) {
|
||||
if ( mustPunycode && !reAsciiHostname.test(details.url) ) {
|
||||
parsedURL.href = details.url;
|
||||
details.url = details.url.replace(
|
||||
parsedURL.hostname,
|
||||
punycode.toASCII(parsedURL.hostname)
|
||||
);
|
||||
}
|
||||
|
||||
const type = details.type;
|
||||
|
||||
if ( type === 'imageset' ) {
|
||||
details.type = 'image';
|
||||
return;
|
||||
}
|
||||
|
||||
// https://github.com/uBlockOrigin/uBlock-issues/issues/345
|
||||
// Re-categorize an embedded object as a `sub_frame` if its
|
||||
// content type is that of a HTML document.
|
||||
if ( type === 'object' && Array.isArray(details.responseHeaders) ) {
|
||||
for ( const header of details.responseHeaders ) {
|
||||
if ( header.name.toLowerCase() === 'content-type' ) {
|
||||
if ( header.value.startsWith('text/html') ) {
|
||||
details.type = 'sub_frame';
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
denormalizeTypes(types) {
|
||||
if ( types.length === 0 ) {
|
||||
return Array.from(this.validTypes);
|
||||
}
|
||||
const out = new Set();
|
||||
for ( const type of types ) {
|
||||
if ( this.validTypes.has(type) ) {
|
||||
out.add(type);
|
||||
}
|
||||
if ( type === 'image' && this.validTypes.has('imageset') ) {
|
||||
out.add('imageset');
|
||||
}
|
||||
if ( type === 'sub_frame' ) {
|
||||
out.add('object');
|
||||
}
|
||||
}
|
||||
return Array.from(out);
|
||||
}
|
||||
processCanonicalName(hn, cn, details) {
|
||||
const hnBeg = details.url.indexOf(hn);
|
||||
if ( hnBeg === -1 ) { return; }
|
||||
const oldURL = details.url;
|
||||
let newURL = oldURL.slice(0, hnBeg) + cn;
|
||||
const hnEnd = hnBeg + hn.length;
|
||||
if ( this.cnameReplayFullURL ) {
|
||||
newURL += oldURL.slice(hnEnd);
|
||||
} else {
|
||||
const pathBeg = oldURL.indexOf('/', hnEnd);
|
||||
if ( pathBeg !== -1 ) {
|
||||
newURL += oldURL.slice(hnEnd, pathBeg + 1);
|
||||
}
|
||||
}
|
||||
details.url = newURL;
|
||||
details.aliasURL = oldURL;
|
||||
return super.onBeforeSuspendableRequest(details);
|
||||
}
|
||||
recordCanonicalName(hn, record) {
|
||||
let cname =
|
||||
typeof record.canonicalName === 'string' &&
|
||||
record.canonicalName !== hn
|
||||
? record.canonicalName
|
||||
: '';
|
||||
if (
|
||||
cname !== '' &&
|
||||
this.cnameIgnore1stParty &&
|
||||
vAPI.domainFromHostname(cname) === vAPI.domainFromHostname(hn)
|
||||
) {
|
||||
cname = '';
|
||||
}
|
||||
if (
|
||||
cname !== '' &&
|
||||
this.cnameIgnoreList !== null &&
|
||||
this.cnameIgnoreList.test(cname)
|
||||
) {
|
||||
cname = '';
|
||||
}
|
||||
this.cnames.set(hn, cname);
|
||||
if ( this.cnameTimer === undefined ) {
|
||||
this.cnameTimer = self.setTimeout(
|
||||
( ) => {
|
||||
this.cnameTimer = undefined;
|
||||
this.cnames.clear(); this.cnames.set('', '');
|
||||
},
|
||||
this.cnameMaxTTL * 60000
|
||||
);
|
||||
}
|
||||
return cname;
|
||||
}
|
||||
regexFromStrList(list) {
|
||||
if (
|
||||
typeof list !== 'string' ||
|
||||
list.length === 0 ||
|
||||
list === 'unset' ||
|
||||
browser.dns instanceof Object === false
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
if ( list === '*' ) {
|
||||
return /^./;
|
||||
}
|
||||
return new RegExp(
|
||||
'(?:^|\.)(?:' +
|
||||
list.trim()
|
||||
.split(/\s+/)
|
||||
.map(a => a.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
|
||||
.join('|') +
|
||||
')$'
|
||||
);
|
||||
}
|
||||
onBeforeSuspendableRequest(details) {
|
||||
const r = super.onBeforeSuspendableRequest(details);
|
||||
if ( this.canRevealCNAME === false ) { return r; }
|
||||
if ( r !== undefined ) {
|
||||
if ( r.cancel === false ) { return; }
|
||||
if (
|
||||
r.cancel === true ||
|
||||
r.redirectUrl !== undefined ||
|
||||
this.cnameIgnoreExceptions
|
||||
) {
|
||||
return r;
|
||||
}
|
||||
}
|
||||
if (
|
||||
details.type === 'main_frame' &&
|
||||
this.cnameIgnoreRootDocument
|
||||
) {
|
||||
return;
|
||||
}
|
||||
const hn = vAPI.hostnameFromNetworkURL(details.url);
|
||||
const cname = this.cnames.get(hn);
|
||||
if ( cname === '' ) { return; }
|
||||
if ( cname !== undefined ) {
|
||||
return this.processCanonicalName(hn, cname, details);
|
||||
}
|
||||
return browser.dns.resolve(hn, [ 'canonical_name' ]).then(
|
||||
rec => {
|
||||
const cname = this.recordCanonicalName(hn, rec);
|
||||
if ( cname === '' ) { return; }
|
||||
return this.processCanonicalName(hn, cname, details);
|
||||
},
|
||||
( ) => {
|
||||
this.cnames.set(hn, '');
|
||||
}
|
||||
);
|
||||
}
|
||||
suspendOneRequest(details) {
|
||||
const pending = {
|
||||
details: Object.assign({}, details),
|
||||
resolve: undefined,
|
||||
promise: undefined
|
||||
};
|
||||
pending.promise = new Promise(resolve => {
|
||||
pending.resolve = resolve;
|
||||
});
|
||||
this.pendingRequests.push(pending);
|
||||
return pending.promise;
|
||||
}
|
||||
unsuspendAllRequests() {
|
||||
const pendingRequests = this.pendingRequests;
|
||||
this.pendingRequests = [];
|
||||
for ( const entry of pendingRequests ) {
|
||||
entry.resolve(this.onBeforeSuspendableRequest(entry.details));
|
||||
}
|
||||
}
|
||||
canSuspend() {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
/******************************************************************************/
|
||||
@ -0,0 +1,24 @@
|
||||
/*******************************************************************************
|
||||
|
||||
uBlock Origin - a browser extension to block requests.
|
||||
Copyright (C) 2019-present Raymond Hill
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
|
||||
Home: https://github.com/gorhill/uBlock
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const webext = browser; // jshint ignore:line
|
||||
@ -0,0 +1,10 @@
|
||||
{
|
||||
"sidebar_action": {
|
||||
"default_title": "__MSG_loggerPageName__",
|
||||
"default_panel": "logger-ui.html",
|
||||
"default_icon": {
|
||||
"16": "img/icon_16.png",
|
||||
"128": "img/icon_128.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,866 @@
|
||||
{
|
||||
"extName": {
|
||||
"message": "nuTensor",
|
||||
"description": ""
|
||||
},
|
||||
"extShortDesc": {
|
||||
"message": "Point & click to forbid/allow any class of requests made by your browser. Use it to block scripts, iframes, ads, facebook, etc.",
|
||||
"description": "this will be used as short description in web stores: MUST BE 132 characters OR LESS"
|
||||
},
|
||||
"dashboardPageName": {
|
||||
"message": "nuTensor — Dashboard",
|
||||
"description": ""
|
||||
},
|
||||
"loggerPageName": {
|
||||
"message": "nuTensor — Logger",
|
||||
"description": "Title for the logger window"
|
||||
},
|
||||
"settingsPageName": {
|
||||
"message": "Settings",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"privacyPageName": {
|
||||
"message": "Privacy",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"statsPageName": {
|
||||
"message": "Statistics",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"userRulesPageName": {
|
||||
"message": "My rules",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"ubiquitousRulesPageName": {
|
||||
"message": "Assets",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"rawSettingsPageName": {
|
||||
"message": "More",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"aboutPageName": {
|
||||
"message": "About",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"allPrettyName": {
|
||||
"message": "all",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"cookiePrettyName": {
|
||||
"message": "cookie",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"cssPrettyName": {
|
||||
"message": "css",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"imagePrettyName": {
|
||||
"message": "image",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"mediaPrettyName": {
|
||||
"message": "media",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"pluginPrettyName": {
|
||||
"message": "plugin",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"scriptPrettyName": {
|
||||
"message": "script",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"fetchPrettyName": {
|
||||
"message": "fetch",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"framePrettyName": {
|
||||
"message": "frame",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"otherPrettyName": {
|
||||
"message": "other",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"matrixNoNetTrafficPrompt": {
|
||||
"message": "No net traffic seen for this tab so far.",
|
||||
"description": ""
|
||||
},
|
||||
"matrixLocalScopeTip": {
|
||||
"message": "Select a local scope to see/create rules which apply only in that scope",
|
||||
"description": "Tool tip for the local scope button"
|
||||
},
|
||||
"matrixGlobalScopeTip": {
|
||||
"message": "Select the global scope to see/create rules which apply everywhere",
|
||||
"description": "Tool tip for the global scope button"
|
||||
},
|
||||
"matrixMtxButtonTip": {
|
||||
"message": "Disable/enable matrix filtering for this scope",
|
||||
"description": "Tool tip for matrix button"
|
||||
},
|
||||
"matrixPersistButtonTip": {
|
||||
"message": "Save all temporary changes for this scope",
|
||||
"description": "Tool tip for the persist button"
|
||||
},
|
||||
"matrixRevertButtonTip": {
|
||||
"message": "Revert temporary changes for this scope",
|
||||
"description": "Tool tip for the revert local permission button"
|
||||
},
|
||||
"matrixReloadButton": {
|
||||
"message": "Reload the page. \nPress Shift to bypass the browser cache.",
|
||||
"description": "Tool tip for the reload button"
|
||||
},
|
||||
"matrix1stPartyLabel": {
|
||||
"message": "1st-party",
|
||||
"description": "1st-party"
|
||||
},
|
||||
"matrixBlacklistedHostnames": {
|
||||
"message": "{{count}} blacklisted hostname(s)",
|
||||
"description": "Appears in the metadata row of bottom-most group: **mind the limited width**"
|
||||
},
|
||||
"matrixSwitchNoMixedContent": {
|
||||
"message": "Forbid mixed content",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixSwitchNoWorker": {
|
||||
"message": "Forbid web workers",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixSwitchReferrerSpoof": {
|
||||
"message": "Spoof <code>Referer</code> header",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixSwitchNoscriptSpoof": {
|
||||
"message": "Spoof <code><noscript></code> tags",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixSwitchRevealCname": {
|
||||
"message": "Reveal canonical names",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixRevertAllEntry": {
|
||||
"message": "Revert all temporary changes",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixLoggerMenuEntry": {
|
||||
"message": "Go to logger",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixDashboardMenuEntry": {
|
||||
"message": "Go to dashboard",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixNoTabFound": {
|
||||
"message": "No web page found",
|
||||
"description": "Displays in place of matrix when no data is found for the current page"
|
||||
},
|
||||
"matrixRecipeImportTip": {
|
||||
"message": "Import rules",
|
||||
"description": "Used as a tooltip for the recipe import button"
|
||||
},
|
||||
"matrixRecipeSaveTip": {
|
||||
"message": "Save rules",
|
||||
"description": "Used as a tooltip for the recipe padlock button"
|
||||
},
|
||||
"statsPageTitle": {
|
||||
"message": "nuTensor – Statistics",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageGenericStats": {
|
||||
"message": "Generic statistics",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageCookieHeadersFoiled": {
|
||||
"message": "<a href='https://en.wikipedia.org/wiki/HTTP_cookie'>HTTP cookie</a> headers foiled: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageRefererHeadersFoiled": {
|
||||
"message": "<a href='https://en.wikipedia.org/wiki/HTTP_referer'>HTTP referer</a> headers foiled: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageHyperlinkAuditingFoiled": {
|
||||
"message": "<a href='https://html.spec.whatwg.org/multipage/semantics.html#hyperlink-auditing'>Hyperlink auditing</a> attempts foiled: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageCookiesRemoved": {
|
||||
"message": "Local cookies removed: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageLocalStoragesCleared": {
|
||||
"message": "<a href='http://diveintohtml5.info/storage.html'>Local storages</a> emptied: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageBrowserCacheCleared": {
|
||||
"message": "Browser caches cleared: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageDetailedStats": {
|
||||
"message": "Detailed statistics",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageDetailedAllPages": {
|
||||
"message": "All",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageDetailedBehindTheScenePage": {
|
||||
"message": "Behind the scene",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageOverview": {
|
||||
"message": "Overview",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageRequests": {
|
||||
"message": "Requests",
|
||||
"description": "header for the stat type column"
|
||||
},
|
||||
"statsPageAllowed": {
|
||||
"message": "Allowed",
|
||||
"description": "header for the allowed requests column"
|
||||
},
|
||||
"statsPageBlocked": {
|
||||
"message": "Blocked",
|
||||
"description": "header for the blocked requests column"
|
||||
},
|
||||
"statsPageAll": {
|
||||
"message": "All",
|
||||
"description": ""
|
||||
},
|
||||
"statsPagePages": {
|
||||
"message": "Pages",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageCookies": {
|
||||
"message": "Cookies",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageCSS": {
|
||||
"message": "CSS",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageImages": {
|
||||
"message": "Images",
|
||||
"description": ""
|
||||
},
|
||||
"statsPagePlugins": {
|
||||
"message": "Plugins",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageScripts": {
|
||||
"message": "Scripts",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageXHRs": {
|
||||
"message": "XHRs",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageFrames": {
|
||||
"message": "Frames",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageOthers": {
|
||||
"message": "Others",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageDetailed": {
|
||||
"message": "Logger",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageLogSizePrompt1": {
|
||||
"message": "Remember the last",
|
||||
"description": "First part of Remember the last [n] HTTP requests per page"
|
||||
},
|
||||
"statsPageLogSizePrompt2": {
|
||||
"message": "HTTP requests <b>per page</b>",
|
||||
"description": "Second part of Remember the last [n] HTTP requests per page"
|
||||
},
|
||||
"statsPageLogSizeHelp": {
|
||||
"message": "<p>You can inspect details of the most recent raw HTTP requests which have been made by a web page (see below).</p><p>This is mostly useful to advanced users who want to investigate exactly what a web page has been doing. But logging these HTTP requests requires memory, and if you don't care about this technical information, then memory is being wasted.</p><p>Hence this field which lets you adjust the maximum number of the most recent HTTP requests which are to be logged for further inspection.</p><p>Enter “<code>0</code>” to turn off detailed logging (and consequently reduce the memory footprint of <i>nuTensor</i>).</p>",
|
||||
"description": "To help user understand the purpose of the log size value"
|
||||
},
|
||||
"statsPageRefresh": {
|
||||
"message": "Refresh",
|
||||
"description": ""
|
||||
},
|
||||
"logAll": {
|
||||
"message": "All",
|
||||
"description": "Appears in the logger's tab selector"
|
||||
},
|
||||
"logBehindTheScene": {
|
||||
"message": "Tabless",
|
||||
"description": "Pretty name for behind-the-scene network requests"
|
||||
},
|
||||
"loggerCurrentTab": {
|
||||
"message": "Current tab",
|
||||
"description": "Appears in the logger's tab selector"
|
||||
},
|
||||
"loggerReloadTip": {
|
||||
"message": "Reload the tab content",
|
||||
"description": "Tooltip for the reload button in the logger page"
|
||||
},
|
||||
"loggerFilterInputPlaceholder": {
|
||||
"message": "filter expression(s)",
|
||||
"description": "Appears in the input filed where filter expressions are entered"
|
||||
},
|
||||
"loggerEntryCookieDeleted": {
|
||||
"message": "cookie deleted: {{value}}",
|
||||
"description": "An entry for when a cookie is deleted"
|
||||
},
|
||||
"loggerEntryDeleteCookieError": {
|
||||
"message": "failed to delete cookie: {{value}}",
|
||||
"description": "An entry for when the browser cache is cleared"
|
||||
},
|
||||
"loggerEntryBrowserCacheCleared": {
|
||||
"message": "browser cache cleared",
|
||||
"description": "An entry for when a cookie can't be deleted"
|
||||
},
|
||||
"loggerEntryAssetUpdated": {
|
||||
"message": "asset updated: {{value}}",
|
||||
"description": "An entry for when an asset was updated"
|
||||
},
|
||||
"loggerRowFiltererButtonTip": {
|
||||
"message": "Toggle logger filtering",
|
||||
"description": "Tooltip for the row filterer button in the logger page"
|
||||
},
|
||||
"logFilterPrompt": {
|
||||
"message": "filter logger content",
|
||||
"description": "Placeholder string for logger output filtering input field"
|
||||
},
|
||||
"loggerPopupPanelTip": {
|
||||
"message": "Toggle the popup panel",
|
||||
"description": "Tooltip for the popup panel button in the logger page"
|
||||
},
|
||||
"loggerInfoTip": {
|
||||
"message": "uBlock Origin wiki: The logger",
|
||||
"description": "Tooltip for the top-right info label in the logger page"
|
||||
},
|
||||
"loggerClearTip": {
|
||||
"message": "Clear logger",
|
||||
"description": "Tooltip for the eraser in the logger page; used to blank the content of the logger"
|
||||
},
|
||||
"loggerPauseTip": {
|
||||
"message": "Pause logger (discard all incoming data)",
|
||||
"description": "Tooltip for the pause button in the logger page"
|
||||
},
|
||||
"loggerUnpauseTip": {
|
||||
"message": "Unpause logger",
|
||||
"description": "Tooltip for the play button in the logger page"
|
||||
},
|
||||
"loggerRowFiltererBuiltinTip": {
|
||||
"message": "Logger filtering options",
|
||||
"description": "Tooltip for the button to bring up logger output filtering options"
|
||||
},
|
||||
"loggerRowFiltererBuiltinNot": {
|
||||
"message": "Not",
|
||||
"description": "A keyword in the built-in row filtering expression"
|
||||
},
|
||||
"loggerRowFiltererBuiltinBlocked": {
|
||||
"message": "blocked",
|
||||
"description": "A keyword in the built-in row filtering expression"
|
||||
},
|
||||
"loggerRowFiltererBuiltinInfo": {
|
||||
"message": "info",
|
||||
"description": "A keyword in the built-in row filtering expression"
|
||||
},
|
||||
"loggerRowFiltererBuiltin1p": {
|
||||
"message": "1st-party",
|
||||
"description": "A keyword in the built-in row filtering expression"
|
||||
},
|
||||
"loggerRowFiltererBuiltin3p": {
|
||||
"message": "3rd-party",
|
||||
"description": "A keyword in the built-in row filtering expression"
|
||||
},
|
||||
"loggerEntryDetailsHeader": {
|
||||
"message": "Details",
|
||||
"description": "Small header to identify the 'Details' pane for a specific logger entry"
|
||||
},
|
||||
"loggerEntryDetailsContext": {
|
||||
"message": "Context",
|
||||
"description": "Label to identify a context field (typically a hostname)"
|
||||
},
|
||||
"loggerEntryDetailsPartyness": {
|
||||
"message": "Partyness",
|
||||
"description": "Label to identify a field providing partyness information"
|
||||
},
|
||||
"loggerEntryDetailsType": {
|
||||
"message": "Type",
|
||||
"description": "Label to identify the type of an entry"
|
||||
},
|
||||
"loggerEntryDetailsURL": {
|
||||
"message": "URL",
|
||||
"description": "Label to identify the URL of an entry"
|
||||
},
|
||||
"loggerEntryRuleHeader": {
|
||||
"message": "Rule",
|
||||
"description": "Small header to identify the 'Rule' pane for a specific logger entry"
|
||||
},
|
||||
"loggerSettingDiscardPrompt": {
|
||||
"message": "Logger entries which do not fulfill all three conditions below will be automatically discarded:",
|
||||
"description": "Logger setting: A sentence to describe the purpose of the settings below"
|
||||
},
|
||||
"loggerSettingPerEntryMaxAge": {
|
||||
"message": "Preserve entries from the last {{input}} minutes",
|
||||
"description": "A logger setting"
|
||||
},
|
||||
"loggerSettingPerTabMaxLoads": {
|
||||
"message": "Preserve at most {{input}} page loads per tab",
|
||||
"description": "A logger setting"
|
||||
},
|
||||
"loggerSettingPerTabMaxEntries": {
|
||||
"message": "Preserve at most {{input}} entries per tab",
|
||||
"description": "A logger setting"
|
||||
},
|
||||
"loggerSettingPerEntryLineCount": {
|
||||
"message": "Use {{input}} lines per entry in vertically expanded mode",
|
||||
"description": "A logger setting"
|
||||
},
|
||||
"loggerExportFormatList": {
|
||||
"message": "List",
|
||||
"description": "Label for radio-button to pick export format"
|
||||
},
|
||||
"loggerExportFormatTable": {
|
||||
"message": "Table",
|
||||
"description": "Label for radio-button to pick export format"
|
||||
},
|
||||
"loggerExportEncodePlain": {
|
||||
"message": "Plain",
|
||||
"description": "Label for radio-button to pick export text format"
|
||||
},
|
||||
"loggerExportEncodeMarkdown": {
|
||||
"message": "Markdown",
|
||||
"description": "Label for radio-button to pick export text format"
|
||||
},
|
||||
"settingsPageTitle": {
|
||||
"message": "nuTensor – Settings",
|
||||
"description": ""
|
||||
},
|
||||
"settingsMatrixDisplayHeader": {
|
||||
"message": "Matrix",
|
||||
"description": "header for matrix settings used in Settings page"
|
||||
},
|
||||
"settingsMatrixDisplayTextSizePrompt": {
|
||||
"message": "Text size:",
|
||||
"description": ""
|
||||
},
|
||||
"settingsIconBadgeEnabled": {
|
||||
"message": "Show the number of blocked resources on the icon",
|
||||
"description": ""
|
||||
},
|
||||
"settingsMatrixDisplayColorBlind": {
|
||||
"message": "Color-blind friendly",
|
||||
"description": ""
|
||||
},
|
||||
"settingsMatrixConvenienceHeader": {
|
||||
"message": "Convenience",
|
||||
"description": "English: Convenience"
|
||||
},
|
||||
"settingsDefaultScopeLevel": {
|
||||
"message": "Default scope level:",
|
||||
"description": "Label for default scope level selector in Settings pane"
|
||||
},
|
||||
"settingsDefaultScopeLevel0": {
|
||||
"message": "Global",
|
||||
"description": "Scope will be global"
|
||||
},
|
||||
"settingsDefaultScopeLevel1": {
|
||||
"message": "Domain",
|
||||
"description": "Scope will be base domain"
|
||||
},
|
||||
"settingsDefaultScopeLevel2": {
|
||||
"message": "Site",
|
||||
"description": "Scope will be full hostname of site"
|
||||
},
|
||||
"settingsCollapseBlocked": {
|
||||
"message": "Hide placeholder of blocked elements",
|
||||
"description": "A setting in the dashboard's Settings pane"
|
||||
},
|
||||
"settingsCollapseBlacklisted": {
|
||||
"message": "Hide placeholder of blacklisted elements",
|
||||
"description": "A setting in the dashboard's Settings pane: 'blacklisted' means 'for which there is a specific block rule', 'specific' means 'a rule for which the destination hostname is not `*`'"
|
||||
},
|
||||
"settingsNoscriptTagsSpoofed": {
|
||||
"message": "Spoof <code><noscript></code> tags when 1st-party scripts are blocked",
|
||||
"description": "This appears in the Settings pane in the dashboard"
|
||||
},
|
||||
"settingsCloudStorageEnabled": {
|
||||
"message": "Enable cloud storage support",
|
||||
"description": ""
|
||||
},
|
||||
"settingsMatrixNoTooltips": {
|
||||
"message": "Disable tooltips",
|
||||
"description": ""
|
||||
},
|
||||
"privacyPageTitle": {
|
||||
"message": "nuTensor – Privacy",
|
||||
"description": ""
|
||||
},
|
||||
"privacyDeleteBlockedCookiesPrompt": {
|
||||
"message": "Delete blocked cookies",
|
||||
"description": ""
|
||||
},
|
||||
"privacyDeleteBlockedCookiesHelp": {
|
||||
"message": "<p>Blacklisted cookies are not prevented by <i>nuTensor</i> from entering your browser. However they are prevented from leaving your browser, which is what really matters. Not blocking cookies before they enter your browser gives you the opportunity to be informed that a site tried to use cookies, and furthermore to inspect their contents if you wish.</p><p>Once these blacklisted cookies have been accounted for by <i>nuTensor</i>, they can be removed from your browser if you wish so.</p><p><b>Important note:</b> Extensions can make web requests during the course of their normal operation. These requests can result in cookies being created in the browser. If the hostname from where a cookie originate is not whitelisted, the cookie will be removed from the browser by <i>nuTensor</i> if this option is checked. So be sure that the hostname(s) with which an extension communicate is whitelisted.</p>",
|
||||
"description": ""
|
||||
},
|
||||
"privacyDeleteNonBlockedSessionCookiesPrompt1": {
|
||||
"message": "Delete non-blocked session cookies ",
|
||||
"description": "First part of 'Delete non-blocked session cookies [n] minutes after the last time they have been used'"
|
||||
},
|
||||
"privacyDeleteNonBlockedSessionCookiesPrompt2": {
|
||||
"message": " minutes after the last time they have been used",
|
||||
"description": "Second part of 'Delete non-blocked session cookies [n] minutes after the last time they have been used'"
|
||||
},
|
||||
"privacyDeleteNonBlockedSessionCookiesHelp": {
|
||||
"message": "<p><a href='http://www.w3.org/2001/tag/2010/09/ClientSideStorage.html'>W3C</a>: “A session cookie ... is erased when you end the browser session. The session cookie is stored in temporary memory and is not retained after the browser is closed.”</p><p>Except that this <a href='https://code.google.com/p/chromium/issues/detail?id=128513'>might not be happening</a> in some browsers. Also, to some, having to close the browser in order for the session cookies to clear might not be early enough.</p>",
|
||||
"description": ""
|
||||
},
|
||||
"privacyDeleteBlockedLocalStoragePrompt": {
|
||||
"message": "Delete <a href='https://en.wikipedia.org/wiki/Web_storage'>local storage</a> content set by blocked hostnames",
|
||||
"description": ""
|
||||
},
|
||||
"privacyDeleteBlockedLocalStorageHelp": {
|
||||
"message": "TODO",
|
||||
"description": ""
|
||||
},
|
||||
"privacyClearCachePrompt1": {
|
||||
"message": "Clear browser cache every",
|
||||
"description": "First part of 'Clear browser cache every [n] minutes'"
|
||||
},
|
||||
"privacyClearCachePrompt2": {
|
||||
"message": "minutes",
|
||||
"description": "Second part of 'Clear browser cache every [n] minutes'"
|
||||
},
|
||||
"privacyClearCacheHelp": {
|
||||
"message": "<p>Some web sites are really bent on tracking you, so much that they will use not-so-nice tricks to work around whatever measures you take in order to not be tracked.</p><p>A few of these tricks rely<sup>[1, 2]</sup> on the <a href='https://en.wikipedia.org/wiki/Web_cache'>browser cache</a>, which content is often long lasting since rarely will users take the time to regularly clear their browser cache.</p><p>There is little inconvenience to clear the browser cache regularly (likelihood is that you won't notice when it happens), and the benefit is to prevent these obnoxious trackers from invading your privacy.</p><p>Check this option to have <i>nuTensor</i> do it for you, at the interval you wish.</p><p>[1] <a href='https://grepular.com/Preventing_Web_Tracking_via_the_Browser_Cache'>“Preventing Web Tracking via the Browser Cache”</a>\n[2] <a href='http://lucb1e.com/rp/cookielesscookies/'>“Cookieless cookies”</a></p>",
|
||||
"description": ""
|
||||
},
|
||||
"privacyProcessRefererPrompt": {
|
||||
"message": "Spoof <a href='https://en.wikipedia.org/wiki/HTTP_referer'>HTTP referrer</a> string of third-party requests",
|
||||
"description": ""
|
||||
},
|
||||
"privacyProcessRefererHelp": {
|
||||
"message": "From Wikipedia:<blockquote>HTTP referer is an HTTP header field that identifies the address of the webpage that linked to the resource being requested. ... <b>Because referer information can violate privacy, some web browsers allow the user to disable the sending of referer information.</b></blockquote>If this setting is checked, <i>nuTensor</i> will spoof the HTTP referrer information if the domain name of the HTTP referrer is third-party to the domain name of net request.",
|
||||
"description": ""
|
||||
},
|
||||
"privacyNoMixedContentPrompt": {
|
||||
"message": "Strict HTTPS: forbid mixed content",
|
||||
"description": ""
|
||||
},
|
||||
"privacyNoMixedContentHelp": {
|
||||
"message": "<p>From <a href='https://developer.mozilla.org/en-US/docs/Security/MixedContent'>Mozilla Developer Network</a>:</p><blockquote>If [a] HTTPS page includes content retrieved through regular, cleartext HTTP, then the connection is only partially encrypted: the unencrypted content is accessible to sniffers and can be modified by man-in-the-middle attackers, and therefore the connection is not safeguarded anymore. When a webpage exhibits this behavior, it is called a mixed content page.</blockquote>",
|
||||
"description": ""
|
||||
},
|
||||
"privacyProcessHyperlinkAuditingPrompt": {
|
||||
"message": "Block all <a href='https://html.spec.whatwg.org/multipage/semantics.html#hyperlink-auditing'>hyperlink auditing</a> attempts",
|
||||
"description": ""
|
||||
},
|
||||
"privacyProcessHyperlinkAuditingHelp": {
|
||||
"message": "<p>Hyperlink auditing is a mechanism which allow a party, <b>any party</b>, to be informed about which link a user clicked on a particular web page. It is essentially a tracking feature: it allows a web site, or any third-party to that web site, to be informed about which link you clicked on which one of its web pages. The sole purpose is to track your browsing activity.</p>",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesPermanentHeader": {
|
||||
"message": "Permanent rules",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesTemporaryHeader": {
|
||||
"message": "Temporary rules",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesRevert": {
|
||||
"message": "Revert",
|
||||
"description": "Will remove all temporary rules"
|
||||
},
|
||||
"userRulesCommit": {
|
||||
"message": "Commit",
|
||||
"description": "Will save all temporary rules"
|
||||
},
|
||||
"userRulesEdit": {
|
||||
"message": "Edit",
|
||||
"description": "Will enable manual-edit mode (textarea)"
|
||||
},
|
||||
"userRulesEditSave": {
|
||||
"message": "Save",
|
||||
"description": "Will save manually-edited content and exit manual-edit mode"
|
||||
},
|
||||
"userRulesEditDicard": {
|
||||
"message": "Discard",
|
||||
"description": "Will discard manually-edited content and exit manual-edit mode"
|
||||
},
|
||||
"userRulesImport": {
|
||||
"message": "Import from file...",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesExport": {
|
||||
"message": "Export to file...",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesFormatHint": {
|
||||
"message": "See this page for rule syntax.",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesDefaultFileName": {
|
||||
"message": "my-umatrix-rules.txt",
|
||||
"description": "default file name to use"
|
||||
},
|
||||
"assetsHostsSection": {
|
||||
"message": "Hosts files",
|
||||
"description": "header to identify the hosts files section"
|
||||
},
|
||||
"hostsFilesPrompt": {
|
||||
"message": "All hostnames in a hosts file are loaded as blacklisted hostnames in the global scope.",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesStats": {
|
||||
"message": "{{blockedHostnameCount}} distinct blocked hostnames from:",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesPerFileStats": {
|
||||
"message": "{{used}} used out of {{total}}",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesLastUpdate": {
|
||||
"message": "Last update: {{ago}}",
|
||||
"description": "English: Last update: {{ago}}, where 'ago' will be replaced with something like '2 days ago'"
|
||||
},
|
||||
"hostsFilesApplyChanges": {
|
||||
"message": "Apply changes",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesAutoUpdatePrompt": {
|
||||
"message": "Auto-update assets",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesUpdateNow": {
|
||||
"message": "Update now",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesPurgeAll": {
|
||||
"message": "Purge all caches",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesExternalListsHint": {
|
||||
"message": "Import external assets here: \nOne URL per line; invalid URLs will be silently ignored.",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesExternalListsParse": {
|
||||
"message": "Parse",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesExternalListPurge": {
|
||||
"message": "purge cache",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesExternalListNew": {
|
||||
"message": "new version available",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesExternalListObsolete": {
|
||||
"message": "outdated",
|
||||
"description": ""
|
||||
},
|
||||
"assetsRecipesSection": {
|
||||
"message": "Ruleset recipes",
|
||||
"description": "header to identify the ruleset files section"
|
||||
},
|
||||
"assetsRecipesSummary": {
|
||||
"message": "Ruleset recipes are imported from the popup panel <em>on demand</em>, i.e. <b>only</b> through user interaction.",
|
||||
"description": ""
|
||||
},
|
||||
"assetsImportLabel": {
|
||||
"message": "Import...",
|
||||
"description": ""
|
||||
},
|
||||
"assetsInlineHostsLabel": {
|
||||
"message": "My hosts",
|
||||
"description": ""
|
||||
},
|
||||
"assetsInlineRecipesLabel": {
|
||||
"message": "My recipes",
|
||||
"description": ""
|
||||
},
|
||||
"rawSettingsWarning": {
|
||||
"message": "Warning! Change these raw configuration settings at your own risk.",
|
||||
"description": ""
|
||||
},
|
||||
"aboutChangelog": {
|
||||
"message": "<a href='https://github.com/geekprojects/nuTensor/releases'>Change log</a>",
|
||||
"description": ""
|
||||
},
|
||||
"aboutStorageUsed": {
|
||||
"message": "Storage used: {{storageUsed}} bytes",
|
||||
"description": ""
|
||||
},
|
||||
"aboutDoc": {
|
||||
"message": "<a href='https://github.com/geekprojects/nuTensor/wiki'>Documentation</a>",
|
||||
"description": ""
|
||||
},
|
||||
"aboutPermissions": {
|
||||
"message": "<a href='https://github.com/geekprojects/nuTensor/wiki/Permissions'>Permissions</a>",
|
||||
"description": ""
|
||||
},
|
||||
"aboutCode": {
|
||||
"message": "Source code (GPLv3)",
|
||||
"description": ""
|
||||
},
|
||||
"aboutIssues": {
|
||||
"message": "Issue tracker",
|
||||
"description": "Text for a link to official issue tracker"
|
||||
},
|
||||
"aboutContributors": {
|
||||
"message": "Contributors",
|
||||
"description": "English: Contributors"
|
||||
},
|
||||
"aboutCodeContributors": {
|
||||
"message": "Code:",
|
||||
"description": ""
|
||||
},
|
||||
"aboutIssueContributors": {
|
||||
"message": "Issues:",
|
||||
"description": ""
|
||||
},
|
||||
"aboutTranslationContributors": {
|
||||
"message": "Translations:",
|
||||
"description": ""
|
||||
},
|
||||
"aboutUserDataHeader": {
|
||||
"message": "Your data",
|
||||
"description": ""
|
||||
},
|
||||
"aboutBackupButton": {
|
||||
"message": "Back up to file...",
|
||||
"description": ""
|
||||
},
|
||||
"aboutBackupFilename": {
|
||||
"message": "my-umatrix-backup.txt",
|
||||
"description": "default filename to use"
|
||||
},
|
||||
"aboutRestoreButton": {
|
||||
"message": "Restore from file...",
|
||||
"description": ""
|
||||
},
|
||||
"aboutRestoreConfirm": {
|
||||
"message": "All your settings will be overwritten using data backed up on {{time}}, and nuTensor will restart.\n\nOverwrite all existing settings using backed up data?",
|
||||
"description": "Message asking user to confirm restore"
|
||||
},
|
||||
"aboutRestoreError": {
|
||||
"message": "The data could not be read or is invalid",
|
||||
"description": ""
|
||||
},
|
||||
"aboutOr": {
|
||||
"message": "... or ...",
|
||||
"description": "English: ... or ..."
|
||||
},
|
||||
"aboutResetButton": {
|
||||
"message": "Reset to default settings",
|
||||
"description": "English: Reset to default settings"
|
||||
},
|
||||
"aboutResetConfirm": {
|
||||
"message": "Caution! this will remove all your custom settings. Are you sure you want to proceed?",
|
||||
"description": "Message asking user to confirm reset"
|
||||
},
|
||||
"mainBlockedPrompt1": {
|
||||
"message": "nuTensor has prevented the following page from loading:",
|
||||
"description": "English: nuTensor has prevented the following page from loading:"
|
||||
},
|
||||
"mainBlockedPrompt2": {
|
||||
"message": "Because of the following rule",
|
||||
"description": "English: Because of the following rule"
|
||||
},
|
||||
"mainBlockedNoParamsPrompt": {
|
||||
"message": "without parameters",
|
||||
"description": "label to be used for the parameter-less URL: https://cloud.githubusercontent.com/assets/585534/9832014/bfb1b8f0-593b-11e5-8a27-fba472a5529a.png"
|
||||
},
|
||||
"mainBlockedBack": {
|
||||
"message": "Go back",
|
||||
"description": "English: Go back"
|
||||
},
|
||||
"mainBlockedClose": {
|
||||
"message": "Close",
|
||||
"description": "English: Close"
|
||||
},
|
||||
"commandRevertAll": {
|
||||
"message": "Revert all temporary changes",
|
||||
"description": ""
|
||||
},
|
||||
"commandWhitelistPageDomain": {
|
||||
"message": "Temporarily whitelist page domain",
|
||||
"description": ""
|
||||
},
|
||||
"commandWhitelistAll": {
|
||||
"message": "Temporarily whitelist all",
|
||||
"description": ""
|
||||
},
|
||||
"commandOpenDashboard": {
|
||||
"message": "Open dashboard",
|
||||
"description": ""
|
||||
},
|
||||
"elapsedOneMinuteAgo": {
|
||||
"message": "a minute ago",
|
||||
"description": "English: a minute ago"
|
||||
},
|
||||
"elapsedManyMinutesAgo": {
|
||||
"message": "{{value}} minutes ago",
|
||||
"description": "English: {{value}} minutes ago"
|
||||
},
|
||||
"elapsedOneHourAgo": {
|
||||
"message": "an hour ago",
|
||||
"description": "English: an hour ago"
|
||||
},
|
||||
"elapsedManyHoursAgo": {
|
||||
"message": "{{value}} hours ago",
|
||||
"description": "English: {{value}} hours ago"
|
||||
},
|
||||
"elapsedOneDayAgo": {
|
||||
"message": "a day ago",
|
||||
"description": "English: a day ago"
|
||||
},
|
||||
"elapsedManyDaysAgo": {
|
||||
"message": "{{value}} days ago",
|
||||
"description": "English: {{value}} days ago"
|
||||
},
|
||||
"showDashboardButton": {
|
||||
"message": "Dashboard",
|
||||
"description": "Appears in Firefox's add-on preferences"
|
||||
},
|
||||
"showLoggerButton": {
|
||||
"message": "Logger",
|
||||
"description": "Appears in Firefox's add-on preferences"
|
||||
},
|
||||
"cloudPush": {
|
||||
"message": "Export to cloud storage",
|
||||
"description": "tooltip"
|
||||
},
|
||||
"cloudPull": {
|
||||
"message": "Import from cloud storage",
|
||||
"description": "tooltip"
|
||||
},
|
||||
"cloudNoData": {
|
||||
"message": "...\n...",
|
||||
"description": ""
|
||||
},
|
||||
"cloudDeviceNamePrompt": {
|
||||
"message": "This device name:",
|
||||
"description": "used as a prompt for the user to provide a custom device name"
|
||||
},
|
||||
"genericSubmit": {
|
||||
"message": "Submit",
|
||||
"description": "for generic 'submit' buttons"
|
||||
},
|
||||
"genericRevert": {
|
||||
"message": "Revert",
|
||||
"description": "for generic 'revert' buttons"
|
||||
},
|
||||
"errorCantConnectTo": {
|
||||
"message": "Network error: Unable to connect to {{url}}",
|
||||
"description": ""
|
||||
},
|
||||
"genericApplyChanges": {
|
||||
"message": "Apply changes",
|
||||
"description": "for generic 'Apply changes' buttons"
|
||||
},
|
||||
"genericCopyToClipboard": {
|
||||
"message": "Copy to clipboard",
|
||||
"description": "Label for buttons used to copy something to the clipboard"
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,866 @@
|
||||
{
|
||||
"extName": {
|
||||
"message": "nuTensor",
|
||||
"description": ""
|
||||
},
|
||||
"extShortDesc": {
|
||||
"message": "قم بالاشارة ثم انقر لكي تقوم بسماح او منع اي اتصال يجري عن طريق المتصفح. يمكنك منع السكربتات، أطر، اعلانات، موقع مثل الفيسبوك، الخ.",
|
||||
"description": "this will be used as short description in web stores: MUST BE 132 characters OR LESS"
|
||||
},
|
||||
"dashboardPageName": {
|
||||
"message": "nuTensor — لوحة التحكم",
|
||||
"description": ""
|
||||
},
|
||||
"loggerPageName": {
|
||||
"message": "nuTensor — المسجل",
|
||||
"description": "Title for the logger window"
|
||||
},
|
||||
"settingsPageName": {
|
||||
"message": "الإعدادات",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"privacyPageName": {
|
||||
"message": "خصوصية",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"statsPageName": {
|
||||
"message": "الإحصائيات",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"userRulesPageName": {
|
||||
"message": "قواعدي",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"ubiquitousRulesPageName": {
|
||||
"message": "مصادر",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"rawSettingsPageName": {
|
||||
"message": "المزيد",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"aboutPageName": {
|
||||
"message": "حول البرنامج",
|
||||
"description": "a tab in dashboard"
|
||||
},
|
||||
"allPrettyName": {
|
||||
"message": "الكل",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"cookiePrettyName": {
|
||||
"message": "كوكي",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"cssPrettyName": {
|
||||
"message": "ستايل",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"imagePrettyName": {
|
||||
"message": "صورة",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"mediaPrettyName": {
|
||||
"message": "ميديا",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"pluginPrettyName": {
|
||||
"message": "إضافة",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"scriptPrettyName": {
|
||||
"message": "سكربت",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"fetchPrettyName": {
|
||||
"message": "fetch",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"framePrettyName": {
|
||||
"message": "إطار",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"otherPrettyName": {
|
||||
"message": "أخرى",
|
||||
"description": "HAS TO FIT IN MATRIX HEADER!"
|
||||
},
|
||||
"matrixNoNetTrafficPrompt": {
|
||||
"message": "لم يحدث اي اتصال بهذا التبويب حتى الآن.",
|
||||
"description": ""
|
||||
},
|
||||
"matrixLocalScopeTip": {
|
||||
"message": "Select a local scope to see/create rules which apply only in that scope",
|
||||
"description": "Tool tip for the local scope button"
|
||||
},
|
||||
"matrixGlobalScopeTip": {
|
||||
"message": "Select the global scope to see/create rules which apply everywhere",
|
||||
"description": "Tool tip for the global scope button"
|
||||
},
|
||||
"matrixMtxButtonTip": {
|
||||
"message": "تعطيل / تمكين ميزة التصفيه لهذا النطاق.",
|
||||
"description": "Tool tip for matrix button"
|
||||
},
|
||||
"matrixPersistButtonTip": {
|
||||
"message": "حفظ جميع التغييرات المؤقتة لهذا النطاق.",
|
||||
"description": "Tool tip for the persist button"
|
||||
},
|
||||
"matrixRevertButtonTip": {
|
||||
"message": "الرجوع عن التغييرات المؤقتة لهذا النطاق.",
|
||||
"description": "Tool tip for the revert local permission button"
|
||||
},
|
||||
"matrixReloadButton": {
|
||||
"message": "إعادة تحميل الصفحة.",
|
||||
"description": "Tool tip for the reload button"
|
||||
},
|
||||
"matrix1stPartyLabel": {
|
||||
"message": "الجزء الاول",
|
||||
"description": "1st-party"
|
||||
},
|
||||
"matrixBlacklistedHostnames": {
|
||||
"message": "القائمة السوداء {{count}}",
|
||||
"description": "Appears in the metadata row of bottom-most group: **mind the limited width**"
|
||||
},
|
||||
"matrixSwitchNoMixedContent": {
|
||||
"message": "الاتصال الآمن الصارم",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixSwitchNoWorker": {
|
||||
"message": "منع web workers",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixSwitchReferrerSpoof": {
|
||||
"message": "الإحالات بالتحايل",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixSwitchNoscriptSpoof": {
|
||||
"message": "محاكات وسمات <code><noscript></code>",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixSwitchRevealCname": {
|
||||
"message": "Reveal canonical names",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixRevertAllEntry": {
|
||||
"message": "إعادة كافة التغييرات المؤقتة",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixLoggerMenuEntry": {
|
||||
"message": "الذهاب إلى السجل",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixDashboardMenuEntry": {
|
||||
"message": "انتقل إلى لوحة التحكم",
|
||||
"description": "A menu entry in the matrix popup"
|
||||
},
|
||||
"matrixNoTabFound": {
|
||||
"message": "لم يتم العثور على أي صفحة ويب",
|
||||
"description": "Displays in place of matrix when no data is found for the current page"
|
||||
},
|
||||
"matrixRecipeImportTip": {
|
||||
"message": "Import rules",
|
||||
"description": "Used as a tooltip for the recipe import button"
|
||||
},
|
||||
"matrixRecipeSaveTip": {
|
||||
"message": "Save rules",
|
||||
"description": "Used as a tooltip for the recipe padlock button"
|
||||
},
|
||||
"statsPageTitle": {
|
||||
"message": "nuTensor – إحصائيات",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageGenericStats": {
|
||||
"message": "إحصاءات عامة",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageCookieHeadersFoiled": {
|
||||
"message": "<a href='https://en.wikipedia.org/wiki/HTTP_cookie'>HTTP ملف تعريف الارتباط</a> أحبطت foiled: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageRefererHeadersFoiled": {
|
||||
"message": "<a href='https://en.wikipedia.org/wiki/HTTP_referer'>HTTP تشير</a> headers أحبطت: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageHyperlinkAuditingFoiled": {
|
||||
"message": "<a href='http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#hyperlink-auditing'> مراجعة الارتباط التشعبي</a> أحبطت محاولات: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageCookiesRemoved": {
|
||||
"message": "ملفات تعريف الارتباط المحلية إزالة: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageLocalStoragesCleared": {
|
||||
"message": "<a href='http://diveintohtml5.info/storage.html'> المخازن المحلية</a> إفراغ: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageBrowserCacheCleared": {
|
||||
"message": "مسح تخزين المستعرض: {{count}}",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageDetailedStats": {
|
||||
"message": "إحصائيات مفصلة",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageDetailedAllPages": {
|
||||
"message": "الكل",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageDetailedBehindTheScenePage": {
|
||||
"message": "خلف الكواليس",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageOverview": {
|
||||
"message": "نظرة عامة",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageRequests": {
|
||||
"message": "الطلبات",
|
||||
"description": "header for the stat type column"
|
||||
},
|
||||
"statsPageAllowed": {
|
||||
"message": "السماح",
|
||||
"description": "header for the allowed requests column"
|
||||
},
|
||||
"statsPageBlocked": {
|
||||
"message": "حظر",
|
||||
"description": "header for the blocked requests column"
|
||||
},
|
||||
"statsPageAll": {
|
||||
"message": "الكل",
|
||||
"description": ""
|
||||
},
|
||||
"statsPagePages": {
|
||||
"message": "الصفحات",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageCookies": {
|
||||
"message": "ملفات تعريف الارتباط",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageCSS": {
|
||||
"message": "ستايل",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageImages": {
|
||||
"message": "الصُوَرْ",
|
||||
"description": ""
|
||||
},
|
||||
"statsPagePlugins": {
|
||||
"message": "الإضافات",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageScripts": {
|
||||
"message": "البرامج النصية",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageXHRs": {
|
||||
"message": "XHRs",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageFrames": {
|
||||
"message": "إطارات",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageOthers": {
|
||||
"message": "الآخرين",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageDetailed": {
|
||||
"message": "مسجل",
|
||||
"description": ""
|
||||
},
|
||||
"statsPageLogSizePrompt1": {
|
||||
"message": "تذكر الماضي",
|
||||
"description": "First part of Remember the last [n] HTTP requests per page"
|
||||
},
|
||||
"statsPageLogSizePrompt2": {
|
||||
"message": "HTTP طلبات <b>لكل صفحة</b>.",
|
||||
"description": "Second part of Remember the last [n] HTTP requests per page"
|
||||
},
|
||||
"statsPageLogSizeHelp": {
|
||||
"message": "<p>You can inspect details of the most recent raw HTTP requests which have been made by a web page (see below).</p><p>This is mostly useful to advanced users who want to investigate exactly what a web page has been doing. But logging these HTTP requests requires memory, and if you don't care about this technical information, then memory is being wasted.</p><p>Hence this field which lets you adjust the maximum number of the most recent HTTP requests which are to be logged for further inspection.</p><p>Enter “<code>0</code>” to turn off detailed logging (and consequently reduce the memory footprint of <i>nuTensor</i>).</p>",
|
||||
"description": "To help user understand the purpose of the log size value"
|
||||
},
|
||||
"statsPageRefresh": {
|
||||
"message": "تحديث الصفحة",
|
||||
"description": ""
|
||||
},
|
||||
"logAll": {
|
||||
"message": "All",
|
||||
"description": "Appears in the logger's tab selector"
|
||||
},
|
||||
"logBehindTheScene": {
|
||||
"message": "Tabless",
|
||||
"description": "Pretty name for behind-the-scene network requests"
|
||||
},
|
||||
"loggerCurrentTab": {
|
||||
"message": "Current tab",
|
||||
"description": "Appears in the logger's tab selector"
|
||||
},
|
||||
"loggerReloadTip": {
|
||||
"message": "Reload the tab content",
|
||||
"description": "Tooltip for the reload button in the logger page"
|
||||
},
|
||||
"loggerFilterInputPlaceholder": {
|
||||
"message": "فلتر مرشح",
|
||||
"description": "Appears in the input filed where filter expressions are entered"
|
||||
},
|
||||
"loggerEntryCookieDeleted": {
|
||||
"message": "حذف الارتباط: {{value}}",
|
||||
"description": "An entry for when a cookie is deleted"
|
||||
},
|
||||
"loggerEntryDeleteCookieError": {
|
||||
"message": "فشل في حذف الارتباط: {{value}}",
|
||||
"description": "An entry for when the browser cache is cleared"
|
||||
},
|
||||
"loggerEntryBrowserCacheCleared": {
|
||||
"message": "مخبأ المتصفح مسح",
|
||||
"description": "An entry for when a cookie can't be deleted"
|
||||
},
|
||||
"loggerEntryAssetUpdated": {
|
||||
"message": "الأصول تحديث: {{value}}",
|
||||
"description": "An entry for when an asset was updated"
|
||||
},
|
||||
"loggerRowFiltererButtonTip": {
|
||||
"message": "Toggle logger filtering",
|
||||
"description": "Tooltip for the row filterer button in the logger page"
|
||||
},
|
||||
"logFilterPrompt": {
|
||||
"message": "filter logger content",
|
||||
"description": "Placeholder string for logger output filtering input field"
|
||||
},
|
||||
"loggerPopupPanelTip": {
|
||||
"message": "Toggle the popup panel",
|
||||
"description": "Tooltip for the popup panel button in the logger page"
|
||||
},
|
||||
"loggerInfoTip": {
|
||||
"message": "uBlock Origin wiki: The logger",
|
||||
"description": "Tooltip for the top-right info label in the logger page"
|
||||
},
|
||||
"loggerClearTip": {
|
||||
"message": "Clear logger",
|
||||
"description": "Tooltip for the eraser in the logger page; used to blank the content of the logger"
|
||||
},
|
||||
"loggerPauseTip": {
|
||||
"message": "Pause logger (discard all incoming data)",
|
||||
"description": "Tooltip for the pause button in the logger page"
|
||||
},
|
||||
"loggerUnpauseTip": {
|
||||
"message": "Unpause logger",
|
||||
"description": "Tooltip for the play button in the logger page"
|
||||
},
|
||||
"loggerRowFiltererBuiltinTip": {
|
||||
"message": "Logger filtering options",
|
||||
"description": "Tooltip for the button to bring up logger output filtering options"
|
||||
},
|
||||
"loggerRowFiltererBuiltinNot": {
|
||||
"message": "Not",
|
||||
"description": "A keyword in the built-in row filtering expression"
|
||||
},
|
||||
"loggerRowFiltererBuiltinBlocked": {
|
||||
"message": "blocked",
|
||||
"description": "A keyword in the built-in row filtering expression"
|
||||
},
|
||||
"loggerRowFiltererBuiltinInfo": {
|
||||
"message": "info",
|
||||
"description": "A keyword in the built-in row filtering expression"
|
||||
},
|
||||
"loggerRowFiltererBuiltin1p": {
|
||||
"message": "1st-party",
|
||||
"description": "A keyword in the built-in row filtering expression"
|
||||
},
|
||||
"loggerRowFiltererBuiltin3p": {
|
||||
"message": "3rd-party",
|
||||
"description": "A keyword in the built-in row filtering expression"
|
||||
},
|
||||
"loggerEntryDetailsHeader": {
|
||||
"message": "Details",
|
||||
"description": "Small header to identify the 'Details' pane for a specific logger entry"
|
||||
},
|
||||
"loggerEntryDetailsContext": {
|
||||
"message": "Context",
|
||||
"description": "Label to identify a context field (typically a hostname)"
|
||||
},
|
||||
"loggerEntryDetailsPartyness": {
|
||||
"message": "Partyness",
|
||||
"description": "Label to identify a field providing partyness information"
|
||||
},
|
||||
"loggerEntryDetailsType": {
|
||||
"message": "Type",
|
||||
"description": "Label to identify the type of an entry"
|
||||
},
|
||||
"loggerEntryDetailsURL": {
|
||||
"message": "URL",
|
||||
"description": "Label to identify the URL of an entry"
|
||||
},
|
||||
"loggerEntryRuleHeader": {
|
||||
"message": "Rule",
|
||||
"description": "Small header to identify the 'Rule' pane for a specific logger entry"
|
||||
},
|
||||
"loggerSettingDiscardPrompt": {
|
||||
"message": "Logger entries which do not fulfill all three conditions below will be automatically discarded:",
|
||||
"description": "Logger setting: A sentence to describe the purpose of the settings below"
|
||||
},
|
||||
"loggerSettingPerEntryMaxAge": {
|
||||
"message": "Preserve entries from the last {{input}} minutes",
|
||||
"description": "A logger setting"
|
||||
},
|
||||
"loggerSettingPerTabMaxLoads": {
|
||||
"message": "Preserve at most {{input}} page loads per tab",
|
||||
"description": "A logger setting"
|
||||
},
|
||||
"loggerSettingPerTabMaxEntries": {
|
||||
"message": "Preserve at most {{input}} entries per tab",
|
||||
"description": "A logger setting"
|
||||
},
|
||||
"loggerSettingPerEntryLineCount": {
|
||||
"message": "Use {{input}} lines per entry in vertically expanded mode",
|
||||
"description": "A logger setting"
|
||||
},
|
||||
"loggerExportFormatList": {
|
||||
"message": "List",
|
||||
"description": "Label for radio-button to pick export format"
|
||||
},
|
||||
"loggerExportFormatTable": {
|
||||
"message": "Table",
|
||||
"description": "Label for radio-button to pick export format"
|
||||
},
|
||||
"loggerExportEncodePlain": {
|
||||
"message": "Plain",
|
||||
"description": "Label for radio-button to pick export text format"
|
||||
},
|
||||
"loggerExportEncodeMarkdown": {
|
||||
"message": "Markdown",
|
||||
"description": "Label for radio-button to pick export text format"
|
||||
},
|
||||
"settingsPageTitle": {
|
||||
"message": "nuTensor – إعدادات",
|
||||
"description": ""
|
||||
},
|
||||
"settingsMatrixDisplayHeader": {
|
||||
"message": "مظهر",
|
||||
"description": "header for matrix settings used in Settings page"
|
||||
},
|
||||
"settingsMatrixDisplayTextSizePrompt": {
|
||||
"message": "حجم الخط:",
|
||||
"description": ""
|
||||
},
|
||||
"settingsIconBadgeEnabled": {
|
||||
"message": "عرض عدد من طلبات متميزة على أيقونة",
|
||||
"description": ""
|
||||
},
|
||||
"settingsMatrixDisplayColorBlind": {
|
||||
"message": "عمي الألوان",
|
||||
"description": ""
|
||||
},
|
||||
"settingsMatrixConvenienceHeader": {
|
||||
"message": "ملاءمة",
|
||||
"description": "English: Convenience"
|
||||
},
|
||||
"settingsDefaultScopeLevel": {
|
||||
"message": "المستوى الافتراضي للمنظار:",
|
||||
"description": "Label for default scope level selector in Settings pane"
|
||||
},
|
||||
"settingsDefaultScopeLevel0": {
|
||||
"message": "عام",
|
||||
"description": "Scope will be global"
|
||||
},
|
||||
"settingsDefaultScopeLevel1": {
|
||||
"message": "النطاق",
|
||||
"description": "Scope will be base domain"
|
||||
},
|
||||
"settingsDefaultScopeLevel2": {
|
||||
"message": "موقع",
|
||||
"description": "Scope will be full hostname of site"
|
||||
},
|
||||
"settingsCollapseBlocked": {
|
||||
"message": "انهيار نائبا من عناصر المحظورة",
|
||||
"description": "A setting in the dashboard's Settings pane"
|
||||
},
|
||||
"settingsCollapseBlacklisted": {
|
||||
"message": "تقليص مكان العناصر المدرجة في القائمة السوداء",
|
||||
"description": "A setting in the dashboard's Settings pane: 'blacklisted' means 'for which there is a specific block rule', 'specific' means 'a rule for which the destination hostname is not `*`'"
|
||||
},
|
||||
"settingsNoscriptTagsSpoofed": {
|
||||
"message": "محاكات وسمات <code><noscript></code> عند حظر سكريبتات الطرف الأول",
|
||||
"description": "This appears in the Settings pane in the dashboard"
|
||||
},
|
||||
"settingsCloudStorageEnabled": {
|
||||
"message": "تمكين دعم سحابة التخزين",
|
||||
"description": ""
|
||||
},
|
||||
"settingsMatrixNoTooltips": {
|
||||
"message": "الغي التمليحات",
|
||||
"description": ""
|
||||
},
|
||||
"privacyPageTitle": {
|
||||
"message": "nuTensor – الخصوصية",
|
||||
"description": ""
|
||||
},
|
||||
"privacyDeleteBlockedCookiesPrompt": {
|
||||
"message": "حذف ملفات تعريف الارتباط المحظورة.",
|
||||
"description": ""
|
||||
},
|
||||
"privacyDeleteBlockedCookiesHelp": {
|
||||
"message": "<p>Blacklisted cookies are not prevented by <i>nuTensor</i> from entering your browser. However they are prevented from leaving your browser, which is what really matters. Not blocking cookies before they enter your browser gives you the opportunity to be informed that a site tried to use cookies, and furthermore to inspect their contents if you wish.</p><p>Once these blacklisted cookies have been accounted for by <i>nuTensor</i>, they can be removed from your browser if you wish so.</p><p><b>Important note:</b> Extensions can make web requests during the course of their normal operation. These requests can result in cookies being created in the browser. If the hostname from where a cookie originate is not whitelisted, the cookie will be removed from the browser by <i>nuTensor</i> if this option is checked. So be sure that the hostname(s) with which an extension communicate is whitelisted.</p>",
|
||||
"description": ""
|
||||
},
|
||||
"privacyDeleteNonBlockedSessionCookiesPrompt1": {
|
||||
"message": "حذف ملفات تعريف الارتباط جلسة ",
|
||||
"description": "First part of 'Delete non-blocked session cookies [n] minutes after the last time they have been used'"
|
||||
},
|
||||
"privacyDeleteNonBlockedSessionCookiesPrompt2": {
|
||||
"message": " دقيقة بعد آخر مرة استخدمت فيها.",
|
||||
"description": "Second part of 'Delete non-blocked session cookies [n] minutes after the last time they have been used'"
|
||||
},
|
||||
"privacyDeleteNonBlockedSessionCookiesHelp": {
|
||||
"message": "<p><a href='http://www.w3.org/2001/tag/2010/09/ClientSideStorage.html'>W3C</a>: “A session cookie ... is erased when you end the browser session. The session cookie is stored in temporary memory and is not retained after the browser is closed.”</p><p>Except that this <a href='https://code.google.com/p/chromium/issues/detail?id=128513'>might not be happening</a> in some browsers. Also, to some, having to close the browser in order for the session cookies to clear might not be early enough.</p>",
|
||||
"description": ""
|
||||
},
|
||||
"privacyDeleteBlockedLocalStoragePrompt": {
|
||||
"message": "Delete <a href='https://en.wikipedia.org/wiki/Web_storage'>local storage</a> content set by blocked hostnames",
|
||||
"description": ""
|
||||
},
|
||||
"privacyDeleteBlockedLocalStorageHelp": {
|
||||
"message": "TODO",
|
||||
"description": ""
|
||||
},
|
||||
"privacyClearCachePrompt1": {
|
||||
"message": "مخبأ المتصفح واضح كل",
|
||||
"description": "First part of 'Clear browser cache every [n] minutes'"
|
||||
},
|
||||
"privacyClearCachePrompt2": {
|
||||
"message": "دقائق.",
|
||||
"description": "Second part of 'Clear browser cache every [n] minutes'"
|
||||
},
|
||||
"privacyClearCacheHelp": {
|
||||
"message": "<p>Some web sites are really bent on tracking you, so much that they will use not-so-nice tricks to work around whatever measures you take in order to not be tracked.</p><p>A few of these tricks rely<sup style='font-size:smaller'>[1, 2]</sup> on the <a href='https://en.wikipedia.org/wiki/Web_cache'>browser cache</a>, which content is often long lasting since rarely will users take the time to regularly clear their browser cache.</p><p>There is little inconvenience to clear the browser cache regularly (likelihood is that you won't notice when it happens), and the benefit is to prevent these obnoxious trackers from invading your privacy.</p><p>Check this option to have <i>nuTensor</i> do it for you, at the interval you wish.</p><p style='font-size:smaller'>[1] <a href='https://grepular.com/Preventing_Web_Tracking_via_the_Browser_Cache'>“Preventing Web Tracking via the Browser Cache”</a><br>[2] <a href='http://lucb1e.com/rp/cookielesscookies/'>“Cookieless cookies”</a></p>",
|
||||
"description": ""
|
||||
},
|
||||
"privacyProcessRefererPrompt": {
|
||||
"message": "Spoof <a href='https://en.wikipedia.org/wiki/HTTP_referer'>HTTP referrer</a> string of third-party requests.",
|
||||
"description": ""
|
||||
},
|
||||
"privacyProcessRefererHelp": {
|
||||
"message": "<p>From Wikipedia:</p><blockquote>HTTP referer is an HTTP header field that identifies the address of the webpage that linked to the resource being requested. ... <b>Because referer information can violate privacy, some web browsers allow the user to disable the sending of referer information.</b></blockquote><p>If this setting is checked, <i>nuTensor</i> will spoof the HTTP referrer information if the domain name of the HTTP referrer is third-party to the domain name of net request.",
|
||||
"description": ""
|
||||
},
|
||||
"privacyNoMixedContentPrompt": {
|
||||
"message": "Strict HTTPS: لا سمح المحتوى المختلط.",
|
||||
"description": ""
|
||||
},
|
||||
"privacyNoMixedContentHelp": {
|
||||
"message": "<p>From <a href='https://developer.mozilla.org/en-US/docs/Security/MixedContent'>Mozilla Developer Network</a>:</p><blockquote>If [a] HTTPS page includes content retrieved through regular, cleartext HTTP, then the connection is only partially encrypted: the unencrypted content is accessible to sniffers and can be modified by man-in-the-middle attackers, and therefore the connection is not safeguarded anymore. When a webpage exhibits this behavior, it is called a mixed content page.</blockquote>",
|
||||
"description": ""
|
||||
},
|
||||
"privacyProcessHyperlinkAuditingPrompt": {
|
||||
"message": "Block all <a href='http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#hyperlink-auditing'>hyperlink auditing</a> attempts.",
|
||||
"description": ""
|
||||
},
|
||||
"privacyProcessHyperlinkAuditingHelp": {
|
||||
"message": "<p>Hyperlink auditing is a mechanism which allow a party, <b>any party</b>, to be informed about which link a user clicked on a particular web page. It is essentially a tracking feature: it allows a web site, or any third-party to that web site, to be informed about which link you clicked on which one of its web pages. The sole purpose is to track your browsing activity.</p>",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesPermanentHeader": {
|
||||
"message": "قواعد دائمة",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesTemporaryHeader": {
|
||||
"message": "القواعد المؤقتة",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesRevert": {
|
||||
"message": "إرجاع",
|
||||
"description": "Will remove all temporary rules"
|
||||
},
|
||||
"userRulesCommit": {
|
||||
"message": "يلتزم",
|
||||
"description": "Will save all temporary rules"
|
||||
},
|
||||
"userRulesEdit": {
|
||||
"message": "تحرير",
|
||||
"description": "Will enable manual-edit mode (textarea)"
|
||||
},
|
||||
"userRulesEditSave": {
|
||||
"message": "حفظ",
|
||||
"description": "Will save manually-edited content and exit manual-edit mode"
|
||||
},
|
||||
"userRulesEditDicard": {
|
||||
"message": "تخلص",
|
||||
"description": "Will discard manually-edited content and exit manual-edit mode"
|
||||
},
|
||||
"userRulesImport": {
|
||||
"message": "إستيراد من ملف...",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesExport": {
|
||||
"message": "تصدير إلى ملف...",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesFormatHint": {
|
||||
"message": "رؤية هذه الصفحة لتركيب القاعدة.",
|
||||
"description": ""
|
||||
},
|
||||
"userRulesDefaultFileName": {
|
||||
"message": "my-umatrix-rules.txt",
|
||||
"description": "default file name to use"
|
||||
},
|
||||
"assetsHostsSection": {
|
||||
"message": "ملفات الـ hosts",
|
||||
"description": "header to identify the hosts files section"
|
||||
},
|
||||
"hostsFilesPrompt": {
|
||||
"message": "يتم تحميل جميع أسماء المضيفين في ملف المضيفين كما المضيفين القائمة السوداء في نطاق عالمي.",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesStats": {
|
||||
"message": "{{blockedHostnameCount}} أسماء المضيفين منعت متميزة عن:",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesPerFileStats": {
|
||||
"message": "{{used}} تستخدم من {{total}}",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesLastUpdate": {
|
||||
"message": "اخر تحديث: {{ago}}",
|
||||
"description": "English: Last update: {{ago}}, where 'ago' will be replaced with something like '2 days ago'"
|
||||
},
|
||||
"hostsFilesApplyChanges": {
|
||||
"message": "تطبيق التغييرات",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesAutoUpdatePrompt": {
|
||||
"message": "Auto-update assets",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesUpdateNow": {
|
||||
"message": "تحديث الآن",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesPurgeAll": {
|
||||
"message": "تطهير جميع مخابئ",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesExternalListsHint": {
|
||||
"message": "One URL per line. Lines prefixed with ‘#’ will be ignored. Invalid URLs will be silently ignored.",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesExternalListsParse": {
|
||||
"message": "تحليل",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesExternalListPurge": {
|
||||
"message": "مخبأ تطهير",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesExternalListNew": {
|
||||
"message": "يوجد إصدار جديد",
|
||||
"description": ""
|
||||
},
|
||||
"hostsFilesExternalListObsolete": {
|
||||
"message": "عفا عليها الزمن",
|
||||
"description": ""
|
||||
},
|
||||
"assetsRecipesSection": {
|
||||
"message": "Ruleset recipes",
|
||||
"description": "header to identify the ruleset files section"
|
||||
},
|
||||
"assetsRecipesSummary": {
|
||||
"message": "Ruleset recipes are imported from the popup panel <em>on demand</em>, i.e. <b>only</b> through user interaction.",
|
||||
"description": ""
|
||||
},
|
||||
"assetsImportLabel": {
|
||||
"message": "استيراد...",
|
||||
"description": ""
|
||||
},
|
||||
"assetsInlineHostsLabel": {
|
||||
"message": "My hosts",
|
||||
"description": ""
|
||||
},
|
||||
"assetsInlineRecipesLabel": {
|
||||
"message": "My recipes",
|
||||
"description": ""
|
||||
},
|
||||
"rawSettingsWarning": {
|
||||
"message": "تحذير! غير إعدادات الضبط الخام على مسؤوليتك الخاصة.",
|
||||
"description": ""
|
||||
},
|
||||
"aboutChangelog": {
|
||||
"message": "<a href='https://github.com/geekprojects/nuTensor/releases'>تغيير log</a>",
|
||||
"description": ""
|
||||
},
|
||||
"aboutStorageUsed": {
|
||||
"message": "التخزين المستخدمة: {{storageUsed}} بايت",
|
||||
"description": ""
|
||||
},
|
||||
"aboutDoc": {
|
||||
"message": "<a href='https://github.com/geekprojects/nuTensor/wiki'>توثيق</a>",
|
||||
"description": ""
|
||||
},
|
||||
"aboutPermissions": {
|
||||
"message": "<a href='https://github.com/gorhill/httpswitchboard/wiki/Permissions'>ضوابط</a>",
|
||||
"description": ""
|
||||
},
|
||||
"aboutCode": {
|
||||
"message": "شفرة المصدر (GPLv3)",
|
||||
"description": ""
|
||||
},
|
||||
"aboutIssues": {
|
||||
"message": "الخطا وقضايا",
|
||||
"description": "Text for a link to official issue tracker"
|
||||
},
|
||||
"aboutContributors": {
|
||||
"message": "المساهمون",
|
||||
"description": "English: Contributors"
|
||||
},
|
||||
"aboutCodeContributors": {
|
||||
"message": "رمز:",
|
||||
"description": ""
|
||||
},
|
||||
"aboutIssueContributors": {
|
||||
"message": "قضايا:",
|
||||
"description": ""
|
||||
},
|
||||
"aboutTranslationContributors": {
|
||||
"message": "الترجمات:",
|
||||
"description": ""
|
||||
},
|
||||
"aboutUserDataHeader": {
|
||||
"message": "البيانات الخاصة بك",
|
||||
"description": ""
|
||||
},
|
||||
"aboutBackupButton": {
|
||||
"message": "النسخ الاحتياطي لملف...",
|
||||
"description": ""
|
||||
},
|
||||
"aboutBackupFilename": {
|
||||
"message": "my-umatrix-backup.txt",
|
||||
"description": "default filename to use"
|
||||
},
|
||||
"aboutRestoreButton": {
|
||||
"message": "استعادة من ملف...",
|
||||
"description": ""
|
||||
},
|
||||
"aboutRestoreConfirm": {
|
||||
"message": "سيتم الكتابة فوق كل ما تبذلونه من إعدادات استخدام البيانات احتياطيا على {{time}}، \n\nوسوف nuTensor إعادة تشغيل. الكتابة عن الإعدادات الموجودة باستخدام البيانات احتياطيا؟?",
|
||||
"description": "Message asking user to confirm restore"
|
||||
},
|
||||
"aboutRestoreError": {
|
||||
"message": "البيانات لا يمكن قراءة أو غير صالح",
|
||||
"description": ""
|
||||
},
|
||||
"aboutOr": {
|
||||
"message": "... او ...",
|
||||
"description": "English: ... or ..."
|
||||
},
|
||||
"aboutResetButton": {
|
||||
"message": "إعادة تعيين إلى الإعدادات الافتراضية",
|
||||
"description": "English: Reset to default settings"
|
||||
},
|
||||
"aboutResetConfirm": {
|
||||
"message": "الحذر! سيؤدي هذا إلى إزالة كافة الإعدادات المخصصة الخاصة بك. هل أنت متأكد أنك تريد المتابعة؟?",
|
||||
"description": "Message asking user to confirm reset"
|
||||
},
|
||||
"mainBlockedPrompt1": {
|
||||
"message": "منعت nuTensor على الصفحة التالية من التحميل:",
|
||||
"description": "English: nuTensor has prevented the following page from loading:"
|
||||
},
|
||||
"mainBlockedPrompt2": {
|
||||
"message": "بسبب القاعدة التالية",
|
||||
"description": "English: Because of the following rule"
|
||||
},
|
||||
"mainBlockedNoParamsPrompt": {
|
||||
"message": "without parameters",
|
||||
"description": "label to be used for the parameter-less URL: https://cloud.githubusercontent.com/assets/585534/9832014/bfb1b8f0-593b-11e5-8a27-fba472a5529a.png"
|
||||
},
|
||||
"mainBlockedBack": {
|
||||
"message": "الرجوع للخلف",
|
||||
"description": "English: Go back"
|
||||
},
|
||||
"mainBlockedClose": {
|
||||
"message": "مغلق",
|
||||
"description": "English: Close"
|
||||
},
|
||||
"commandRevertAll": {
|
||||
"message": "إعادة كافة التغييرات المؤقتة",
|
||||
"description": ""
|
||||
},
|
||||
"commandWhitelistPageDomain": {
|
||||
"message": "نطاق الصفحة القائمة البيضاء مؤقتا",
|
||||
"description": ""
|
||||
},
|
||||
"commandWhitelistAll": {
|
||||
"message": "مؤقتا القائمة البيضاء فقط",
|
||||
"description": ""
|
||||
},
|
||||
"commandOpenDashboard": {
|
||||
"message": "فتح لوحة القيادة",
|
||||
"description": ""
|
||||
},
|
||||
"elapsedOneMinuteAgo": {
|
||||
"message": "منذ 1 دقيقة",
|
||||
"description": "English: a minute ago"
|
||||
},
|
||||
"elapsedManyMinutesAgo": {
|
||||
"message": "{{value}} دقائق مضت",
|
||||
"description": "English: {{value}} minutes ago"
|
||||
},
|
||||
"elapsedOneHourAgo": {
|
||||
"message": "قبل ساعه",
|
||||
"description": "English: an hour ago"
|
||||
},
|
||||
"elapsedManyHoursAgo": {
|
||||
"message": "{{value}} منذ ساعات",
|
||||
"description": "English: {{value}} hours ago"
|
||||
},
|
||||
"elapsedOneDayAgo": {
|
||||
"message": "منذ يوم",
|
||||
"description": "English: a day ago"
|
||||
},
|
||||
"elapsedManyDaysAgo": {
|
||||
"message": "{{value}} أيام مضت",
|
||||
"description": "English: {{value}} days ago"
|
||||
},
|
||||
"showDashboardButton": {
|
||||
"message": "لوحة التحكم",
|
||||
"description": "Appears in Firefox's add-on preferences"
|
||||
},
|
||||
"showLoggerButton": {
|
||||
"message": "مسجل",
|
||||
"description": "Appears in Firefox's add-on preferences"
|
||||
},
|
||||
"cloudPush": {
|
||||
"message": "التصدير إلى سحابة التخزين",
|
||||
"description": "tooltip"
|
||||
},
|
||||
"cloudPull": {
|
||||
"message": "الاستيراد من سحابة التخزين",
|
||||
"description": "tooltip"
|
||||
},
|
||||
"cloudNoData": {
|
||||
"message": "...\n...",
|
||||
"description": ""
|
||||
},
|
||||
"cloudDeviceNamePrompt": {
|
||||
"message": "هذا اسم الجهاز:",
|
||||
"description": "used as a prompt for the user to provide a custom device name"
|
||||
},
|
||||
"genericSubmit": {
|
||||
"message": "تأكيد",
|
||||
"description": "for generic 'submit' buttons"
|
||||
},
|
||||
"genericRevert": {
|
||||
"message": "إرجاع",
|
||||
"description": "for generic 'revert' buttons"
|
||||
},
|
||||
"errorCantConnectTo": {
|
||||
"message": "خطأ في الشبكة: غير قادر على الاتصال {{url}}",
|
||||
"description": ""
|
||||
},
|
||||
"genericApplyChanges": {
|
||||
"message": "تطبيق التغييرات",
|
||||
"description": "for generic 'Apply changes' buttons"
|
||||
},
|
||||
"genericCopyToClipboard": {
|
||||
"message": "Copy to clipboard",
|
||||
"description": "Label for buttons used to copy something to the clipboard"
|
||||
}
|
||||
}
|
||||