@whitesev/utils 2.8.0 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -176
- package/dist/index.amd.js +893 -874
- package/dist/index.amd.js.map +1 -1
- package/dist/index.cjs.js +893 -874
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +893 -874
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +893 -874
- package/dist/index.iife.js.map +1 -1
- package/dist/index.system.js +893 -874
- package/dist/index.system.js.map +1 -1
- package/dist/index.umd.js +893 -874
- package/dist/index.umd.js.map +1 -1
- package/dist/types/src/CommonUtil.d.ts +59 -59
- package/dist/types/src/DOMUtils.d.ts +1 -1
- package/dist/types/src/Dictionary.d.ts +1 -1
- package/dist/types/src/Httpx.d.ts +2 -2
- package/dist/types/src/Progress.d.ts +0 -4
- package/dist/types/src/TryCatch.d.ts +2 -2
- package/dist/types/src/Utils.d.ts +365 -365
- package/dist/types/src/UtilsGMCookie.d.ts +2 -2
- package/dist/types/src/UtilsGMMenu.d.ts +1 -1
- package/dist/types/src/indexedDB.d.ts +3 -3
- package/dist/types/src/types/Event.d.ts +188 -188
- package/dist/types/src/types/Httpx.d.ts +1344 -1343
- package/dist/types/src/types/Log.d.ts +19 -19
- package/dist/types/src/types/Progress.d.ts +20 -20
- package/dist/types/src/types/React.d.ts +119 -119
- package/dist/types/src/types/TryCatch.d.ts +9 -9
- package/dist/types/src/types/UtilsGMCookie.d.ts +93 -93
- package/dist/types/src/types/UtilsGMMenu.d.ts +77 -77
- package/dist/types/src/types/Vue2.d.ts +166 -166
- package/dist/types/src/types/WindowApi.d.ts +14 -14
- package/dist/types/src/types/ajaxHooker.d.ts +151 -151
- package/dist/types/src/types/env.d.ts +7 -2
- package/dist/types/src/types/global.d.ts +31 -31
- package/package.json +16 -7
- package/src/ColorConversion.ts +105 -106
- package/src/CommonUtil.ts +280 -279
- package/src/DOMUtils.ts +251 -272
- package/src/Dictionary.ts +153 -154
- package/src/GBKEncoder.ts +108 -112
- package/src/Hooks.ts +73 -81
- package/src/Httpx.ts +1457 -1466
- package/src/LockFunction.ts +62 -62
- package/src/Log.ts +258 -259
- package/src/ModuleRaid.js +1 -0
- package/src/Progress.ts +108 -114
- package/src/TryCatch.ts +86 -86
- package/src/Utils.ts +4772 -4825
- package/src/UtilsCommon.ts +14 -14
- package/src/UtilsGMCookie.ts +254 -261
- package/src/UtilsGMMenu.ts +445 -454
- package/src/Vue.ts +233 -229
- package/src/WindowApi.ts +59 -59
- package/src/ajaxHooker/ajaxHooker.js +1 -0
- package/src/indexedDB.ts +497 -502
- package/src/types/Event.d.ts +188 -188
- package/src/types/Httpx.d.ts +1344 -1343
- package/src/types/Log.d.ts +19 -19
- package/src/types/Progress.d.ts +20 -20
- package/src/types/React.d.ts +119 -119
- package/src/types/TryCatch.d.ts +9 -9
- package/src/types/UtilsGMCookie.d.ts +93 -93
- package/src/types/UtilsGMMenu.d.ts +77 -77
- package/src/types/Vue2.d.ts +166 -166
- package/src/types/WindowApi.d.ts +14 -14
- package/src/types/ajaxHooker.d.ts +151 -151
- package/src/types/env.d.ts +7 -2
- package/src/types/global.d.ts +31 -31
package/dist/index.umd.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
if (typeof str !== "string") {
|
|
14
14
|
return false;
|
|
15
15
|
}
|
|
16
|
-
if (!str.match(/^(
|
|
16
|
+
if (!str.match(/^(#|)[0-9a-fA-F]{6}$/)) {
|
|
17
17
|
return false;
|
|
18
18
|
}
|
|
19
19
|
return true;
|
|
@@ -27,18 +27,10 @@
|
|
|
27
27
|
*/
|
|
28
28
|
hexToRgba(hex, opacity) {
|
|
29
29
|
if (!this.isHex(hex)) {
|
|
30
|
-
throw new TypeError(
|
|
30
|
+
throw new TypeError(`输入错误的hex:${hex}`);
|
|
31
31
|
}
|
|
32
32
|
return hex && hex.replace(/\s+/g, "").length === 7
|
|
33
|
-
?
|
|
34
|
-
parseInt("0x" + hex.slice(1, 3)) +
|
|
35
|
-
"," +
|
|
36
|
-
parseInt("0x" + hex.slice(3, 5)) +
|
|
37
|
-
"," +
|
|
38
|
-
parseInt("0x" + hex.slice(5, 7)) +
|
|
39
|
-
"," +
|
|
40
|
-
opacity +
|
|
41
|
-
")"
|
|
33
|
+
? `rgba(${parseInt(`0x${hex.slice(1, 3)}`)},${parseInt(`0x${hex.slice(3, 5)}`)},${parseInt(`0x${hex.slice(5, 7)}`)},${opacity})`
|
|
42
34
|
: "";
|
|
43
35
|
}
|
|
44
36
|
/**
|
|
@@ -47,14 +39,15 @@
|
|
|
47
39
|
*/
|
|
48
40
|
hexToRgb(str) {
|
|
49
41
|
if (!this.isHex(str)) {
|
|
50
|
-
throw new TypeError(
|
|
42
|
+
throw new TypeError(`输入错误的hex:${str}`);
|
|
51
43
|
}
|
|
52
44
|
/* replace替换查找的到的字符串 */
|
|
53
45
|
str = str.replace("#", "");
|
|
54
46
|
/* match得到查询数组 */
|
|
55
|
-
|
|
47
|
+
const hxs = str.match(/../g);
|
|
56
48
|
for (let index = 0; index < 3; index++) {
|
|
57
|
-
|
|
49
|
+
const value = parseInt(hxs[index], 16);
|
|
50
|
+
Reflect.set(hxs, index, value);
|
|
58
51
|
}
|
|
59
52
|
return hxs;
|
|
60
53
|
}
|
|
@@ -66,16 +59,16 @@
|
|
|
66
59
|
*/
|
|
67
60
|
rgbToHex(redValue, greenValue, blueValue) {
|
|
68
61
|
/* 验证输入的rgb值是否合法 */
|
|
69
|
-
|
|
62
|
+
const validPattern = /^\d{1,3}$/;
|
|
70
63
|
if (!validPattern.test(redValue.toString()) ||
|
|
71
64
|
!validPattern.test(greenValue.toString()) ||
|
|
72
65
|
!validPattern.test(blueValue.toString()))
|
|
73
66
|
throw new TypeError("输入错误的rgb颜色值");
|
|
74
|
-
|
|
67
|
+
const hexs = [redValue.toString(16), greenValue.toString(16), blueValue.toString(16)];
|
|
75
68
|
for (let index = 0; index < 3; index++)
|
|
76
69
|
if (hexs[index].length == 1)
|
|
77
|
-
hexs[index] =
|
|
78
|
-
return
|
|
70
|
+
hexs[index] = `0${hexs[index]}`;
|
|
71
|
+
return `#${hexs.join("")}`;
|
|
79
72
|
}
|
|
80
73
|
/**
|
|
81
74
|
* 获取颜色变暗或亮
|
|
@@ -84,11 +77,13 @@
|
|
|
84
77
|
*/
|
|
85
78
|
getDarkColor(color, level) {
|
|
86
79
|
if (!this.isHex(color)) {
|
|
87
|
-
throw new TypeError(
|
|
80
|
+
throw new TypeError(`输入错误的hex:${color}`);
|
|
88
81
|
}
|
|
89
|
-
|
|
82
|
+
const rgbc = this.hexToRgb(color);
|
|
90
83
|
for (let index = 0; index < 3; index++) {
|
|
91
|
-
|
|
84
|
+
const rgbcItemValue = rgbc[index];
|
|
85
|
+
const value = Math.floor(Number(rgbcItemValue) * (1 - Number(level)));
|
|
86
|
+
Reflect.set(rgbc, index, value);
|
|
92
87
|
}
|
|
93
88
|
return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
|
|
94
89
|
}
|
|
@@ -99,40 +94,43 @@
|
|
|
99
94
|
*/
|
|
100
95
|
getLightColor(color, level) {
|
|
101
96
|
if (!this.isHex(color)) {
|
|
102
|
-
throw new TypeError(
|
|
97
|
+
throw new TypeError(`输入错误的hex:${color}`);
|
|
103
98
|
}
|
|
104
|
-
|
|
99
|
+
const rgbc = this.hexToRgb(color);
|
|
105
100
|
for (let index = 0; index < 3; index++) {
|
|
106
|
-
|
|
101
|
+
const rgbcItemValue = Number(rgbc[index]);
|
|
102
|
+
const value = Math.floor(255 - rgbcItemValue * level + rgbcItemValue);
|
|
103
|
+
Reflect.set(rgbc, index, value);
|
|
107
104
|
}
|
|
108
105
|
return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
|
|
109
106
|
}
|
|
110
107
|
}
|
|
111
108
|
|
|
112
109
|
class GBKEncoder {
|
|
113
|
-
#data
|
|
110
|
+
#data;
|
|
114
111
|
#U2Ghash = {};
|
|
115
112
|
#G2Uhash = {};
|
|
116
113
|
constructor() {
|
|
117
|
-
let dataText = this.handleText("4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364");
|
|
114
|
+
const dataText = this.handleText("4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364");
|
|
118
115
|
let index = 0;
|
|
119
116
|
this.#data = dataText.match(/..../g);
|
|
120
117
|
for (let i = 0x81; i <= 0xfe; i++) {
|
|
121
118
|
for (let j = 0x40; j <= 0xfe; j++) {
|
|
122
|
-
this.#U2Ghash[this.#data[index++]] =
|
|
119
|
+
this.#U2Ghash[this.#data[index++]] = `%${i.toString(16)}%${j.toString(16)}`.toUpperCase();
|
|
123
120
|
}
|
|
124
121
|
}
|
|
125
|
-
for (
|
|
126
|
-
this.#
|
|
122
|
+
for (const key in this.#U2Ghash) {
|
|
123
|
+
const u2ghashValue = Reflect.get(this.#U2Ghash, key);
|
|
124
|
+
Reflect.set(this.#G2Uhash, u2ghashValue, key);
|
|
127
125
|
}
|
|
128
126
|
}
|
|
129
127
|
handleText(text) {
|
|
130
128
|
text = text
|
|
131
|
-
.replace(/#(\d+)\$/g, function (
|
|
129
|
+
.replace(/#(\d+)\$/g, function (_, b) {
|
|
132
130
|
return Array(+b + 3).join("#");
|
|
133
131
|
})
|
|
134
132
|
.replace(/#/g, "####")
|
|
135
|
-
.replace(/(\w\w):([\w#]+)(?:,|$)/g, function (
|
|
133
|
+
.replace(/(\w\w):([\w#]+)(?:,|$)/g, function (_, hd, dt) {
|
|
136
134
|
return dt.replace(/../g, function (a) {
|
|
137
135
|
if (a != "##") {
|
|
138
136
|
return hd + a;
|
|
@@ -152,8 +150,8 @@
|
|
|
152
150
|
* @param str
|
|
153
151
|
*/
|
|
154
152
|
encode(str) {
|
|
155
|
-
|
|
156
|
-
return [...str].reduce((result, val
|
|
153
|
+
const that = this;
|
|
154
|
+
return [...str].reduce((result, val) => {
|
|
157
155
|
return result + toGBK(val);
|
|
158
156
|
}, "");
|
|
159
157
|
function toGBK(val) {
|
|
@@ -162,7 +160,7 @@
|
|
|
162
160
|
const codePoint = val.codePointAt(i);
|
|
163
161
|
const code = String.fromCodePoint(codePoint);
|
|
164
162
|
let key = codePoint.toString(16);
|
|
165
|
-
key.length != 4 && (key =
|
|
163
|
+
key.length != 4 && (key = `000${key}`.match(/....$/)?.[0]);
|
|
166
164
|
/* Add up i by code.length */
|
|
167
165
|
i += code.length - 1;
|
|
168
166
|
/* If code is in ascii range */
|
|
@@ -176,9 +174,9 @@
|
|
|
176
174
|
continue;
|
|
177
175
|
}
|
|
178
176
|
/*
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
177
|
+
If 2 or more char combines to one visible code,
|
|
178
|
+
or just this code is not in GBK
|
|
179
|
+
*/
|
|
182
180
|
result += toGBK(`&#${codePoint};`);
|
|
183
181
|
}
|
|
184
182
|
return result;
|
|
@@ -189,18 +187,18 @@
|
|
|
189
187
|
* @param str
|
|
190
188
|
*/
|
|
191
189
|
decode(str) {
|
|
192
|
-
|
|
193
|
-
|
|
190
|
+
const GBKMatcher = /%[0-9A-F]{2}%[0-9A-F]{2}/;
|
|
191
|
+
const UTFMatcher = /%[0-9A-F]{2}/;
|
|
194
192
|
// let gbk = true;
|
|
195
193
|
let utf = true;
|
|
196
194
|
const that = this;
|
|
197
195
|
while (utf) {
|
|
198
|
-
|
|
199
|
-
|
|
196
|
+
const gbkMatch = str.match(GBKMatcher);
|
|
197
|
+
const utfMatch = str.match(UTFMatcher);
|
|
200
198
|
// gbk = Boolean(gbkMatch);
|
|
201
199
|
utf = Boolean(utfMatch);
|
|
202
200
|
if (gbkMatch && gbkMatch in that.#G2Uhash) {
|
|
203
|
-
str = str.replace(gbkMatch, String.fromCharCode(
|
|
201
|
+
str = str.replace(gbkMatch, String.fromCharCode(`0x${that.#G2Uhash[gbkMatch]}`));
|
|
204
202
|
}
|
|
205
203
|
else {
|
|
206
204
|
str = str.replace(utfMatch, decodeURIComponent(utfMatch));
|
|
@@ -214,7 +212,7 @@
|
|
|
214
212
|
/* 定义变量和函数 */
|
|
215
213
|
let callbackFunction = null;
|
|
216
214
|
let context = null;
|
|
217
|
-
let handleError = (
|
|
215
|
+
let handleError = () => { };
|
|
218
216
|
let defaultDetails = {
|
|
219
217
|
log: true,
|
|
220
218
|
};
|
|
@@ -246,7 +244,7 @@
|
|
|
246
244
|
run(callback, __context__) {
|
|
247
245
|
callbackFunction = callback;
|
|
248
246
|
context = __context__ || this;
|
|
249
|
-
|
|
247
|
+
const result = executeTryCatch(callbackFunction, handleError, context);
|
|
250
248
|
return result !== void 0 ? result : TryCatchCore;
|
|
251
249
|
},
|
|
252
250
|
};
|
|
@@ -270,8 +268,8 @@
|
|
|
270
268
|
catch (error) {
|
|
271
269
|
if (defaultDetails.log) {
|
|
272
270
|
callback = callback;
|
|
273
|
-
console.log(`%c ${callback?.name ? callback?.name : callback
|
|
274
|
-
console.log(`%c
|
|
271
|
+
console.log(`%c ${callback?.name ? callback?.name : `${callback}`} `, "color: #f20000");
|
|
272
|
+
console.log(`%c ${error}`, "color: #f20000");
|
|
275
273
|
console.trace(callback);
|
|
276
274
|
}
|
|
277
275
|
if (handleErrorFunc) {
|
|
@@ -290,9 +288,9 @@
|
|
|
290
288
|
|
|
291
289
|
class CommonUtil {
|
|
292
290
|
assign(target = {}, source = {}, isAdd = false) {
|
|
293
|
-
|
|
291
|
+
const UtilsContext = this;
|
|
294
292
|
if (Array.isArray(source)) {
|
|
295
|
-
|
|
293
|
+
const canTraverse = source.filter((item) => {
|
|
296
294
|
return typeof item === "object";
|
|
297
295
|
});
|
|
298
296
|
if (!canTraverse.length) {
|
|
@@ -308,34 +306,34 @@
|
|
|
308
306
|
if (isAdd) {
|
|
309
307
|
for (const sourceKeyName in source) {
|
|
310
308
|
const targetKeyName = sourceKeyName;
|
|
311
|
-
|
|
312
|
-
|
|
309
|
+
const targetValue = Reflect.get(target, targetKeyName);
|
|
310
|
+
const sourceValue = Reflect.get(source, sourceKeyName);
|
|
313
311
|
if (typeof sourceValue === "object" &&
|
|
314
312
|
sourceValue != null &&
|
|
315
313
|
sourceKeyName in target &&
|
|
316
314
|
!UtilsContext.isDOM(sourceValue)) {
|
|
317
315
|
/* 源端的值是object类型,且不是元素节点 */
|
|
318
|
-
target
|
|
316
|
+
Reflect.set(target, sourceKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
|
|
319
317
|
continue;
|
|
320
318
|
}
|
|
321
|
-
target
|
|
319
|
+
Reflect.set(target, sourceKeyName, sourceValue);
|
|
322
320
|
}
|
|
323
321
|
}
|
|
324
322
|
else {
|
|
325
323
|
for (const targetKeyName in target) {
|
|
326
324
|
if (targetKeyName in source) {
|
|
327
|
-
|
|
328
|
-
|
|
325
|
+
const targetValue = Reflect.get(target, targetKeyName);
|
|
326
|
+
const sourceValue = Reflect.get(source, targetKeyName);
|
|
329
327
|
if (typeof sourceValue === "object" &&
|
|
330
328
|
sourceValue != null &&
|
|
331
329
|
!UtilsContext.isDOM(sourceValue) &&
|
|
332
330
|
Object.keys(sourceValue).length) {
|
|
333
331
|
/* 源端的值是object类型,且不是元素节点 */
|
|
334
|
-
target
|
|
332
|
+
Reflect.set(target, targetKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
|
|
335
333
|
continue;
|
|
336
334
|
}
|
|
337
335
|
/* 直接赋值 */
|
|
338
|
-
target
|
|
336
|
+
Reflect.set(target, targetKeyName, sourceValue);
|
|
339
337
|
}
|
|
340
338
|
}
|
|
341
339
|
}
|
|
@@ -343,7 +341,7 @@
|
|
|
343
341
|
}
|
|
344
342
|
isNull(...args) {
|
|
345
343
|
let result = true;
|
|
346
|
-
|
|
344
|
+
const checkList = [...args];
|
|
347
345
|
for (const objItem of checkList) {
|
|
348
346
|
let itemResult = false;
|
|
349
347
|
if (objItem === null || objItem === undefined) {
|
|
@@ -369,11 +367,12 @@
|
|
|
369
367
|
case "boolean":
|
|
370
368
|
itemResult = !objItem;
|
|
371
369
|
break;
|
|
372
|
-
case "function":
|
|
373
|
-
|
|
370
|
+
case "function": {
|
|
371
|
+
const funcStr = objItem.toString().replace(/\s/g, "");
|
|
374
372
|
/* 排除()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){} */
|
|
375
373
|
itemResult = Boolean(funcStr.match(/^\(.*?\)=>\{\}$|^function.*?\(.*?\)\{\}$/));
|
|
376
374
|
break;
|
|
375
|
+
}
|
|
377
376
|
}
|
|
378
377
|
}
|
|
379
378
|
result = result && itemResult;
|
|
@@ -394,18 +393,23 @@
|
|
|
394
393
|
return target instanceof Node;
|
|
395
394
|
}
|
|
396
395
|
isNotNull(...args) {
|
|
397
|
-
|
|
396
|
+
const UtilsContext = this;
|
|
398
397
|
return !UtilsContext.isNull.apply(this, args);
|
|
399
398
|
}
|
|
400
399
|
deepClone(obj) {
|
|
401
|
-
|
|
400
|
+
const UtilsContext = this;
|
|
402
401
|
if (obj === void 0)
|
|
403
402
|
return void 0;
|
|
404
403
|
if (obj === null)
|
|
405
404
|
return null;
|
|
406
|
-
|
|
405
|
+
const clone = obj instanceof Array ? [] : {};
|
|
407
406
|
for (const [key, value] of Object.entries(obj)) {
|
|
408
|
-
|
|
407
|
+
if (typeof value === "object") {
|
|
408
|
+
Reflect.set(clone, key, UtilsContext.deepClone(value));
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
Reflect.set(clone, key, value);
|
|
412
|
+
}
|
|
409
413
|
}
|
|
410
414
|
return clone;
|
|
411
415
|
}
|
|
@@ -432,11 +436,11 @@
|
|
|
432
436
|
}
|
|
433
437
|
TryCatch()
|
|
434
438
|
.config({ log: false })
|
|
435
|
-
.error((
|
|
439
|
+
.error(() => {
|
|
436
440
|
TryCatch()
|
|
437
441
|
.error(() => {
|
|
438
442
|
try {
|
|
439
|
-
result = new Function(
|
|
443
|
+
result = new Function(`return ${data}`)();
|
|
440
444
|
}
|
|
441
445
|
catch (error2) {
|
|
442
446
|
if (typeof errorCallBack === "function") {
|
|
@@ -447,14 +451,14 @@
|
|
|
447
451
|
.run(() => {
|
|
448
452
|
if (data &&
|
|
449
453
|
/^[\],:{}\s]*$/.test(data
|
|
450
|
-
.replace(/\\(?:["
|
|
451
|
-
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][
|
|
454
|
+
.replace(/\\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
|
|
455
|
+
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?/g, "]")
|
|
452
456
|
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
|
|
453
|
-
result = new Function(
|
|
457
|
+
result = new Function(`return ${data}`)();
|
|
454
458
|
}
|
|
455
459
|
else {
|
|
456
460
|
if (typeof errorCallBack === "function") {
|
|
457
|
-
errorCallBack(new Error("target is not
|
|
461
|
+
errorCallBack(new Error("target is not JSON object"));
|
|
458
462
|
}
|
|
459
463
|
}
|
|
460
464
|
});
|
|
@@ -466,7 +470,7 @@
|
|
|
466
470
|
return result;
|
|
467
471
|
}
|
|
468
472
|
}
|
|
469
|
-
|
|
473
|
+
const commonUtil = new CommonUtil();
|
|
470
474
|
|
|
471
475
|
class UtilsGMCookie {
|
|
472
476
|
windowApi = {
|
|
@@ -495,14 +499,14 @@
|
|
|
495
499
|
if (typeof cookieName !== "string") {
|
|
496
500
|
throw new TypeError("Utils.GMCookie.get 参数cookieName 必须为字符串");
|
|
497
501
|
}
|
|
498
|
-
|
|
502
|
+
const cookies = this.getCookiesList();
|
|
499
503
|
let findValue = void 0;
|
|
500
504
|
for (const cookieItem of cookies) {
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
505
|
+
const item = cookieItem.trim();
|
|
506
|
+
const itemSplit = item.split("=");
|
|
507
|
+
const itemName = itemSplit[0];
|
|
504
508
|
itemSplit.splice(0, 1);
|
|
505
|
-
|
|
509
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
506
510
|
if (itemName === cookieName) {
|
|
507
511
|
findValue = {
|
|
508
512
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -532,7 +536,7 @@
|
|
|
532
536
|
if (option == null) {
|
|
533
537
|
throw new Error("Utils.GMCookie.list 参数不能为空");
|
|
534
538
|
}
|
|
535
|
-
|
|
539
|
+
const resultData = [];
|
|
536
540
|
try {
|
|
537
541
|
let defaultOption = {
|
|
538
542
|
url: this.windowApi.window.location.href,
|
|
@@ -541,16 +545,16 @@
|
|
|
541
545
|
path: "/",
|
|
542
546
|
};
|
|
543
547
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
544
|
-
|
|
548
|
+
const cookies = this.getCookiesList();
|
|
545
549
|
cookies.forEach((item) => {
|
|
546
550
|
item = item.trim();
|
|
547
|
-
|
|
548
|
-
|
|
551
|
+
const itemSplit = item.split("=");
|
|
552
|
+
const itemName = itemSplit[0];
|
|
549
553
|
itemSplit.splice(0, 1);
|
|
550
|
-
|
|
551
|
-
|
|
554
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
555
|
+
const nameRegexp = defaultOption.name instanceof RegExp
|
|
552
556
|
? defaultOption.name
|
|
553
|
-
: new RegExp(
|
|
557
|
+
: new RegExp(`^${defaultOption.name}`, "g");
|
|
554
558
|
if (itemName.match(nameRegexp)) {
|
|
555
559
|
resultData.push({
|
|
556
560
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -584,7 +588,7 @@
|
|
|
584
588
|
if (option == null) {
|
|
585
589
|
throw new Error("Utils.GMCookie.list 参数不能为空");
|
|
586
590
|
}
|
|
587
|
-
|
|
591
|
+
const resultData = [];
|
|
588
592
|
let defaultOption = {
|
|
589
593
|
url: this.windowApi.window.location.href,
|
|
590
594
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -592,16 +596,16 @@
|
|
|
592
596
|
path: "/",
|
|
593
597
|
};
|
|
594
598
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
595
|
-
|
|
599
|
+
const cookies = this.getCookiesList();
|
|
596
600
|
cookies.forEach((item) => {
|
|
597
601
|
item = item.trim();
|
|
598
|
-
|
|
599
|
-
|
|
602
|
+
const itemSplit = item.split("=");
|
|
603
|
+
const itemName = itemSplit[0];
|
|
600
604
|
itemSplit.splice(0, 1);
|
|
601
|
-
|
|
602
|
-
|
|
605
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
606
|
+
const nameRegexp = defaultOption.name instanceof RegExp
|
|
603
607
|
? defaultOption.name
|
|
604
|
-
: new RegExp(
|
|
608
|
+
: new RegExp(`^${defaultOption.name}`, "g");
|
|
605
609
|
if (itemName.match(nameRegexp)) {
|
|
606
610
|
resultData.push({
|
|
607
611
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -641,17 +645,12 @@
|
|
|
641
645
|
expirationDate: Math.floor(Date.now()) + 60 * 60 * 24 * 30,
|
|
642
646
|
};
|
|
643
647
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
644
|
-
|
|
648
|
+
const life = defaultOption.expirationDate
|
|
645
649
|
? defaultOption.expirationDate
|
|
646
650
|
: Math.floor(Date.now()) + 60 * 60 * 24 * 30;
|
|
647
|
-
let cookieStr = defaultOption.name
|
|
648
|
-
"=" +
|
|
649
|
-
decodeURIComponent(defaultOption.value) +
|
|
650
|
-
";expires=" +
|
|
651
|
-
new Date(life).toGMTString() +
|
|
652
|
-
"; path=/";
|
|
651
|
+
let cookieStr = `${defaultOption.name}=${decodeURIComponent(defaultOption.value)};expires=${new Date(life).toGMTString()}; path=/`;
|
|
653
652
|
if (commonUtil.isNull(defaultOption.domain)) {
|
|
654
|
-
cookieStr +=
|
|
653
|
+
cookieStr += `; domain=${defaultOption.domain}`;
|
|
655
654
|
}
|
|
656
655
|
this.windowApi.document.cookie = cookieStr;
|
|
657
656
|
}
|
|
@@ -703,14 +702,14 @@
|
|
|
703
702
|
if (cookieStr.trim() === "") {
|
|
704
703
|
return [];
|
|
705
704
|
}
|
|
706
|
-
|
|
707
|
-
|
|
705
|
+
const cookies = cookieStr.split(";");
|
|
706
|
+
const result = [];
|
|
708
707
|
for (const cookieItem of cookies) {
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
708
|
+
const item = cookieItem.trim();
|
|
709
|
+
const itemSplit = item.split("=");
|
|
710
|
+
const itemName = itemSplit[0];
|
|
712
711
|
itemSplit.splice(0, 1);
|
|
713
|
-
|
|
712
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
714
713
|
result.push({
|
|
715
714
|
key: itemName,
|
|
716
715
|
value: itemValue,
|
|
@@ -720,6 +719,7 @@
|
|
|
720
719
|
}
|
|
721
720
|
}
|
|
722
721
|
|
|
722
|
+
/* eslint-disable */
|
|
723
723
|
// ==UserScript==
|
|
724
724
|
// @name ajaxHooker
|
|
725
725
|
// @author cxxjackie
|
|
@@ -1770,15 +1770,15 @@
|
|
|
1770
1770
|
*/
|
|
1771
1771
|
init() {
|
|
1772
1772
|
for (let index = 0; index < this.$data.data.length; index++) {
|
|
1773
|
-
|
|
1773
|
+
const menuOption = this.$data.data[index]["data"];
|
|
1774
1774
|
menuOption.enable = Boolean(this.getLocalMenuData(menuOption.key, menuOption.enable));
|
|
1775
1775
|
if (typeof menuOption.showText !== "function") {
|
|
1776
1776
|
menuOption.showText = (menuText, menuEnable) => {
|
|
1777
1777
|
if (menuEnable) {
|
|
1778
|
-
return this.$emoji.success
|
|
1778
|
+
return `${this.$emoji.success} ${menuText}`;
|
|
1779
1779
|
}
|
|
1780
1780
|
else {
|
|
1781
|
-
return this.$emoji.error
|
|
1781
|
+
return `${this.$emoji.error} ${menuText}`;
|
|
1782
1782
|
}
|
|
1783
1783
|
};
|
|
1784
1784
|
}
|
|
@@ -1789,7 +1789,7 @@
|
|
|
1789
1789
|
* @param menuOptions 如果存在,使用它
|
|
1790
1790
|
*/
|
|
1791
1791
|
register(menuOptions) {
|
|
1792
|
-
|
|
1792
|
+
const that = this;
|
|
1793
1793
|
if (menuOptions == null) {
|
|
1794
1794
|
throw new TypeError("register菜单数据不能为空");
|
|
1795
1795
|
}
|
|
@@ -1797,9 +1797,9 @@
|
|
|
1797
1797
|
menuOptions = [menuOptions];
|
|
1798
1798
|
}
|
|
1799
1799
|
for (let index = 0; index < menuOptions.length; index++) {
|
|
1800
|
-
|
|
1800
|
+
const cloneMenuOptionData = commonUtil.deepClone(menuOptions[index].data);
|
|
1801
1801
|
const { showText, clickCallBack } = this.handleMenuData(cloneMenuOptionData);
|
|
1802
|
-
|
|
1802
|
+
const menuId = that.context.GM_Api.registerMenuCommand(showText, clickCallBack);
|
|
1803
1803
|
menuOptions[index].id = menuId;
|
|
1804
1804
|
cloneMenuOptionData.deleteMenu = function () {
|
|
1805
1805
|
that.context.GM_Api.unregisterMenuCommand(menuId);
|
|
@@ -1813,7 +1813,7 @@
|
|
|
1813
1813
|
* @param {string} key 键
|
|
1814
1814
|
*/
|
|
1815
1815
|
getLocalMenuData(key, defaultValue) {
|
|
1816
|
-
|
|
1816
|
+
const localData = this.context.GM_Api.getValue(this.$data.key, {});
|
|
1817
1817
|
if (key in localData) {
|
|
1818
1818
|
return localData[key];
|
|
1819
1819
|
}
|
|
@@ -1827,7 +1827,7 @@
|
|
|
1827
1827
|
* @param value 值
|
|
1828
1828
|
*/
|
|
1829
1829
|
setLocalMenuData(key, value) {
|
|
1830
|
-
|
|
1830
|
+
const localData = this.context.GM_Api.getValue(this.$data.key, {});
|
|
1831
1831
|
localData[key] = value;
|
|
1832
1832
|
this.context.GM_Api.setValue(this.$data.key, localData);
|
|
1833
1833
|
},
|
|
@@ -1840,10 +1840,10 @@
|
|
|
1840
1840
|
if (typeof menuOption.showText !== "function") {
|
|
1841
1841
|
menuOption.showText = (menuText, menuEnable) => {
|
|
1842
1842
|
if (menuEnable) {
|
|
1843
|
-
return this.$emoji.success
|
|
1843
|
+
return `${this.$emoji.success} ${menuText}`;
|
|
1844
1844
|
}
|
|
1845
1845
|
else {
|
|
1846
|
-
return this.$emoji.error
|
|
1846
|
+
return `${this.$emoji.error} ${menuText}`;
|
|
1847
1847
|
}
|
|
1848
1848
|
};
|
|
1849
1849
|
}
|
|
@@ -1854,12 +1854,12 @@
|
|
|
1854
1854
|
* @param menuOption
|
|
1855
1855
|
*/
|
|
1856
1856
|
handleMenuData(menuOption) {
|
|
1857
|
-
|
|
1858
|
-
|
|
1857
|
+
const that = this;
|
|
1858
|
+
const menuLocalDataItemKey = menuOption.key;
|
|
1859
1859
|
/* 菜单默认开启的状态 */
|
|
1860
|
-
|
|
1860
|
+
const defaultEnable = Boolean(this.getLocalMenuData(menuLocalDataItemKey, menuOption.enable));
|
|
1861
1861
|
/** 油猴菜单上显示的文本 */
|
|
1862
|
-
|
|
1862
|
+
const showText = menuOption.showText(menuOption.text, defaultEnable);
|
|
1863
1863
|
// const GMMenuOptions = {
|
|
1864
1864
|
// /**
|
|
1865
1865
|
// * 菜单的id
|
|
@@ -1889,7 +1889,7 @@
|
|
|
1889
1889
|
* @param event
|
|
1890
1890
|
*/
|
|
1891
1891
|
function clickCallBack(event) {
|
|
1892
|
-
|
|
1892
|
+
const localEnable = Boolean(that.getLocalMenuData(menuLocalDataItemKey, defaultEnable));
|
|
1893
1893
|
if (menuOption.isStoreValue) {
|
|
1894
1894
|
that.setLocalMenuData(menuLocalDataItemKey, !localEnable);
|
|
1895
1895
|
}
|
|
@@ -2002,7 +2002,7 @@
|
|
|
2002
2002
|
menuOptionList = [...menuOptionList, options];
|
|
2003
2003
|
}
|
|
2004
2004
|
menuOptionList.forEach((menuOption) => {
|
|
2005
|
-
|
|
2005
|
+
const oldMenuOption = this.MenuHandle.getMenuOption(menuOption.key);
|
|
2006
2006
|
if (oldMenuOption) {
|
|
2007
2007
|
// 覆盖
|
|
2008
2008
|
Object.assign(oldMenuOption, menuOption);
|
|
@@ -2170,42 +2170,42 @@
|
|
|
2170
2170
|
* 在Function原型上添加自定义方法.hook和.unhook
|
|
2171
2171
|
*/
|
|
2172
2172
|
initEnv() {
|
|
2173
|
-
Function.prototype.hook = function (
|
|
2173
|
+
Function.prototype.hook = function (_, hookFunc, context) {
|
|
2174
2174
|
let _context = null; //函数上下文
|
|
2175
2175
|
let _funcName = null; //函数名
|
|
2176
2176
|
_context = context || window;
|
|
2177
2177
|
_funcName = getFuncName(this);
|
|
2178
|
-
_context[
|
|
2178
|
+
_context[`realFunc_${_funcName}`] = this;
|
|
2179
2179
|
if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {
|
|
2180
2180
|
console.log("Already has been hooked,unhook first");
|
|
2181
2181
|
return false;
|
|
2182
2182
|
}
|
|
2183
2183
|
function getFuncName(fn) {
|
|
2184
2184
|
// 获取函数名
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2185
|
+
const strFunc = fn.toString();
|
|
2186
|
+
const _regex = /function\s+(\w+)\s*\(/;
|
|
2187
|
+
const patten = strFunc.match(_regex);
|
|
2188
2188
|
if (patten) {
|
|
2189
2189
|
return patten[1];
|
|
2190
2190
|
}
|
|
2191
2191
|
return "";
|
|
2192
2192
|
}
|
|
2193
2193
|
try {
|
|
2194
|
-
new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
|
|
2195
|
-
let args = Array.prototype.slice.call(arguments, 0);
|
|
2196
|
-
let obj = this;
|
|
2197
|
-
hookFunc.apply(obj, args);
|
|
2198
|
-
return _context['realFunc_${_funcName}'].apply(obj, args);
|
|
2194
|
+
new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
|
|
2195
|
+
let args = Array.prototype.slice.call(arguments, 0);
|
|
2196
|
+
let obj = this;
|
|
2197
|
+
hookFunc.apply(obj, args);
|
|
2198
|
+
return _context['realFunc_${_funcName}'].apply(obj, args);
|
|
2199
2199
|
};`)(_context, _funcName, hookFunc);
|
|
2200
2200
|
_context[_funcName].prototype.isHooked = true;
|
|
2201
2201
|
return true;
|
|
2202
2202
|
}
|
|
2203
2203
|
catch (e) {
|
|
2204
|
-
console.log("Hook failed,check the params.");
|
|
2204
|
+
console.log("Hook failed,check the params.", e);
|
|
2205
2205
|
return false;
|
|
2206
2206
|
}
|
|
2207
2207
|
};
|
|
2208
|
-
Function.prototype.unhook = function (
|
|
2208
|
+
Function.prototype.unhook = function (_, funcName, context) {
|
|
2209
2209
|
let _context = null;
|
|
2210
2210
|
let _funcName = null;
|
|
2211
2211
|
_context = context || window;
|
|
@@ -2214,8 +2214,8 @@
|
|
|
2214
2214
|
console.log("No function is hooked on");
|
|
2215
2215
|
return false;
|
|
2216
2216
|
}
|
|
2217
|
-
_context[_funcName] = _context[
|
|
2218
|
-
Reflect.deleteProperty(_context,
|
|
2217
|
+
_context[_funcName] = _context[`realFunc${_funcName}`];
|
|
2218
|
+
Reflect.deleteProperty(_context, `realFunc_${_funcName}`);
|
|
2219
2219
|
return true;
|
|
2220
2220
|
};
|
|
2221
2221
|
}
|
|
@@ -2223,10 +2223,10 @@
|
|
|
2223
2223
|
* 删除在Function原型上添加的自定义方法.hook和.unhook
|
|
2224
2224
|
*/
|
|
2225
2225
|
cleanEnv() {
|
|
2226
|
-
if (
|
|
2226
|
+
if (Object.prototype.hasOwnProperty.call(Function.prototype, "hook")) {
|
|
2227
2227
|
Reflect.deleteProperty(Function.prototype, "hook");
|
|
2228
2228
|
}
|
|
2229
|
-
if (
|
|
2229
|
+
if (Object.prototype.hasOwnProperty.call(Function.prototype, "unhook")) {
|
|
2230
2230
|
Reflect.deleteProperty(Function.prototype, "unhook");
|
|
2231
2231
|
}
|
|
2232
2232
|
return true;
|
|
@@ -2242,7 +2242,7 @@
|
|
|
2242
2242
|
}
|
|
2243
2243
|
else {
|
|
2244
2244
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (charStr) {
|
|
2245
|
-
|
|
2245
|
+
const randomValue = (Math.random() * 16) | 0, randomCharValue = charStr === "x" ? randomValue : (randomValue & 0x3) | 0x8;
|
|
2246
2246
|
return randomCharValue.toString(16);
|
|
2247
2247
|
});
|
|
2248
2248
|
}
|
|
@@ -2284,9 +2284,9 @@
|
|
|
2284
2284
|
}
|
|
2285
2285
|
}
|
|
2286
2286
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2287
|
-
|
|
2287
|
+
const item = this.$config.configList[index];
|
|
2288
2288
|
if (typeof item.fn === "function") {
|
|
2289
|
-
|
|
2289
|
+
const result = await item.fn(details);
|
|
2290
2290
|
if (result == null) {
|
|
2291
2291
|
return;
|
|
2292
2292
|
}
|
|
@@ -2299,7 +2299,7 @@
|
|
|
2299
2299
|
*/
|
|
2300
2300
|
add(fn) {
|
|
2301
2301
|
if (typeof fn === "function") {
|
|
2302
|
-
|
|
2302
|
+
const uuid = GenerateUUID();
|
|
2303
2303
|
this.$config.configList.push({
|
|
2304
2304
|
id: uuid,
|
|
2305
2305
|
fn: fn,
|
|
@@ -2316,7 +2316,7 @@
|
|
|
2316
2316
|
*/
|
|
2317
2317
|
delete(id) {
|
|
2318
2318
|
if (typeof id === "string") {
|
|
2319
|
-
|
|
2319
|
+
const findIndex = this.$config.configList.findIndex((item) => item.id === id);
|
|
2320
2320
|
if (findIndex !== -1) {
|
|
2321
2321
|
this.$config.configList.splice(findIndex, 1);
|
|
2322
2322
|
return true;
|
|
@@ -2362,9 +2362,9 @@
|
|
|
2362
2362
|
}
|
|
2363
2363
|
}
|
|
2364
2364
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2365
|
-
|
|
2365
|
+
const item = this.$config.configList[index];
|
|
2366
2366
|
if (typeof item.successFn === "function") {
|
|
2367
|
-
|
|
2367
|
+
const result = await item.successFn(response, details);
|
|
2368
2368
|
if (result == null) {
|
|
2369
2369
|
return;
|
|
2370
2370
|
}
|
|
@@ -2397,9 +2397,9 @@
|
|
|
2397
2397
|
}
|
|
2398
2398
|
}
|
|
2399
2399
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2400
|
-
|
|
2400
|
+
const item = this.$config.configList[index];
|
|
2401
2401
|
if (typeof item.errorFn === "function") {
|
|
2402
|
-
|
|
2402
|
+
const result = await item.errorFn(data);
|
|
2403
2403
|
if (result == null) {
|
|
2404
2404
|
return;
|
|
2405
2405
|
}
|
|
@@ -2411,7 +2411,7 @@
|
|
|
2411
2411
|
* 添加请求前的回调处理配置
|
|
2412
2412
|
*/
|
|
2413
2413
|
add(successFn, errorFn) {
|
|
2414
|
-
|
|
2414
|
+
const id = GenerateUUID();
|
|
2415
2415
|
this.$config.configList.push({
|
|
2416
2416
|
id: id,
|
|
2417
2417
|
successFn: successFn,
|
|
@@ -2425,7 +2425,7 @@
|
|
|
2425
2425
|
*/
|
|
2426
2426
|
delete(id) {
|
|
2427
2427
|
if (typeof id === "string") {
|
|
2428
|
-
|
|
2428
|
+
const findIndex = this.$config.configList.findIndex((item) => item.id === id);
|
|
2429
2429
|
if (findIndex !== -1) {
|
|
2430
2430
|
this.$config.configList.splice(findIndex, 1);
|
|
2431
2431
|
return true;
|
|
@@ -2446,23 +2446,23 @@
|
|
|
2446
2446
|
* 对请求的参数进行合并处理
|
|
2447
2447
|
*/
|
|
2448
2448
|
handleBeforeRequestOptionArgs(...args) {
|
|
2449
|
-
|
|
2449
|
+
const option = {
|
|
2450
2450
|
url: void 0,
|
|
2451
2451
|
};
|
|
2452
2452
|
if (typeof args[0] === "string") {
|
|
2453
2453
|
/* 传入的是url,转为配置 */
|
|
2454
|
-
|
|
2454
|
+
const url = args[0];
|
|
2455
2455
|
option.url = url;
|
|
2456
2456
|
if (typeof args[1] === "object") {
|
|
2457
2457
|
/* 处理第二个参数details */
|
|
2458
|
-
|
|
2458
|
+
const optionArg = args[1];
|
|
2459
2459
|
commonUtil.assign(option, optionArg, true);
|
|
2460
2460
|
option.url = url;
|
|
2461
2461
|
}
|
|
2462
2462
|
}
|
|
2463
2463
|
else {
|
|
2464
2464
|
/* 传入的是配置 */
|
|
2465
|
-
|
|
2465
|
+
const optionArg = args[0];
|
|
2466
2466
|
commonUtil.assign(option, optionArg, true);
|
|
2467
2467
|
}
|
|
2468
2468
|
return option;
|
|
@@ -2475,7 +2475,7 @@
|
|
|
2475
2475
|
* @param reject promise抛出错误回调
|
|
2476
2476
|
*/
|
|
2477
2477
|
getRequestOption(method, userRequestOption, resolve, reject) {
|
|
2478
|
-
|
|
2478
|
+
const that = this;
|
|
2479
2479
|
let url = userRequestOption.url || this.context.#defaultRequestOption.url;
|
|
2480
2480
|
if (typeof url === "string") {
|
|
2481
2481
|
// 去除左右空格
|
|
@@ -2488,7 +2488,7 @@
|
|
|
2488
2488
|
}
|
|
2489
2489
|
}
|
|
2490
2490
|
}
|
|
2491
|
-
|
|
2491
|
+
const requestOption = {
|
|
2492
2492
|
url: url,
|
|
2493
2493
|
method: (method || "GET").toString().toUpperCase().trim(),
|
|
2494
2494
|
timeout: userRequestOption.timeout || this.context.#defaultRequestOption.timeout,
|
|
@@ -2510,9 +2510,12 @@
|
|
|
2510
2510
|
/* 对象使用深拷贝 */
|
|
2511
2511
|
fetchInit: commonUtil.deepClone(this.context.#defaultRequestOption.fetchInit),
|
|
2512
2512
|
allowInterceptConfig: {
|
|
2513
|
-
beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2514
|
-
|
|
2515
|
-
|
|
2513
|
+
beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2514
|
+
.beforeRequest,
|
|
2515
|
+
afterResponseSuccess: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2516
|
+
.afterResponseSuccess,
|
|
2517
|
+
afterResponseError: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2518
|
+
.afterResponseError,
|
|
2516
2519
|
},
|
|
2517
2520
|
user: userRequestOption.user || this.context.#defaultRequestOption.user,
|
|
2518
2521
|
password: userRequestOption.password || this.context.#defaultRequestOption.password,
|
|
@@ -2540,15 +2543,17 @@
|
|
|
2540
2543
|
};
|
|
2541
2544
|
// 补全allowInterceptConfig参数
|
|
2542
2545
|
if (typeof userRequestOption.allowInterceptConfig === "boolean") {
|
|
2543
|
-
Object.keys(requestOption.allowInterceptConfig)
|
|
2546
|
+
const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
|
|
2547
|
+
allowInterceptConfigKeys.forEach((keyName) => {
|
|
2544
2548
|
Reflect.set(requestOption.allowInterceptConfig, keyName, userRequestOption.allowInterceptConfig);
|
|
2545
2549
|
});
|
|
2546
2550
|
}
|
|
2547
2551
|
else {
|
|
2548
2552
|
if (typeof userRequestOption.allowInterceptConfig === "object" &&
|
|
2549
2553
|
userRequestOption.allowInterceptConfig != null) {
|
|
2550
|
-
Object.keys(
|
|
2551
|
-
|
|
2554
|
+
const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
|
|
2555
|
+
allowInterceptConfigKeys.forEach((keyName) => {
|
|
2556
|
+
const value = Reflect.get(userRequestOption.allowInterceptConfig, keyName);
|
|
2552
2557
|
if (typeof value === "boolean" &&
|
|
2553
2558
|
Reflect.has(requestOption.allowInterceptConfig, keyName)) {
|
|
2554
2559
|
Reflect.set(requestOption.allowInterceptConfig, keyName, value);
|
|
@@ -2562,7 +2567,8 @@
|
|
|
2562
2567
|
}
|
|
2563
2568
|
if (typeof requestOption.headers === "object") {
|
|
2564
2569
|
if (typeof userRequestOption.headers === "object") {
|
|
2565
|
-
Object.keys(
|
|
2570
|
+
const headerKeys = Object.keys(requestOption.headers);
|
|
2571
|
+
headerKeys.forEach((keyName) => {
|
|
2566
2572
|
if (keyName in requestOption.headers && userRequestOption.headers?.[keyName] == null) {
|
|
2567
2573
|
/* 在默认的header中存在,且设置它新的值为空,那么就是默认的值 */
|
|
2568
2574
|
Reflect.deleteProperty(requestOption.headers, keyName);
|
|
@@ -2580,8 +2586,9 @@
|
|
|
2580
2586
|
if (typeof requestOption.fetchInit === "object") {
|
|
2581
2587
|
/* 使用assign替换且添加 */
|
|
2582
2588
|
if (typeof userRequestOption.fetchInit === "object") {
|
|
2583
|
-
Object.keys(
|
|
2584
|
-
|
|
2589
|
+
const fetchInitKeys = Object.keys(requestOption.fetchInit);
|
|
2590
|
+
fetchInitKeys.forEach((keyName) => {
|
|
2591
|
+
if (keyName in requestOption.fetchInit && Reflect.get(userRequestOption.fetchInit ?? {}, keyName) == null) {
|
|
2585
2592
|
/* 在默认的fetchInit中存在,且设置它新的值为空,那么就是默认的值 */
|
|
2586
2593
|
Reflect.deleteProperty(requestOption.fetchInit, keyName);
|
|
2587
2594
|
}
|
|
@@ -2606,7 +2613,7 @@
|
|
|
2606
2613
|
try {
|
|
2607
2614
|
new URL(requestOption.url);
|
|
2608
2615
|
}
|
|
2609
|
-
catch
|
|
2616
|
+
catch {
|
|
2610
2617
|
if (requestOption.url.startsWith("//")) {
|
|
2611
2618
|
// 补充https:
|
|
2612
2619
|
requestOption.url = globalThis.location.protocol + requestOption.url;
|
|
@@ -2617,7 +2624,7 @@
|
|
|
2617
2624
|
}
|
|
2618
2625
|
else {
|
|
2619
2626
|
// 补充origin+/
|
|
2620
|
-
requestOption.url = globalThis.location.origin
|
|
2627
|
+
requestOption.url = `${globalThis.location.origin}/${requestOption.url}`;
|
|
2621
2628
|
}
|
|
2622
2629
|
}
|
|
2623
2630
|
if (requestOption.fetchInit && !requestOption.fetch) {
|
|
@@ -2627,12 +2634,12 @@
|
|
|
2627
2634
|
// 转换data类型
|
|
2628
2635
|
try {
|
|
2629
2636
|
/** 是否对数据进行处理 */
|
|
2630
|
-
|
|
2637
|
+
const processData = userRequestOption.processData ?? true;
|
|
2631
2638
|
if (requestOption.data != null && processData) {
|
|
2632
|
-
|
|
2639
|
+
const method = requestOption.method;
|
|
2633
2640
|
if (method === "GET" || method === "HEAD") {
|
|
2634
2641
|
// GET类型,data如果有,那么需要转为searchParams
|
|
2635
|
-
|
|
2642
|
+
const urlObj = new URL(requestOption.url);
|
|
2636
2643
|
let urlSearch = "";
|
|
2637
2644
|
let isHandler = false;
|
|
2638
2645
|
if (typeof requestOption.data === "string") {
|
|
@@ -2642,7 +2649,7 @@
|
|
|
2642
2649
|
else if (typeof requestOption.data === "object") {
|
|
2643
2650
|
isHandler = true;
|
|
2644
2651
|
// URLSearchParams参数可以转普通的string:string,包括FormData
|
|
2645
|
-
|
|
2652
|
+
const searchParams = new URLSearchParams(requestOption.data);
|
|
2646
2653
|
urlSearch = searchParams.toString();
|
|
2647
2654
|
}
|
|
2648
2655
|
if (isHandler) {
|
|
@@ -2663,7 +2670,7 @@
|
|
|
2663
2670
|
}
|
|
2664
2671
|
else {
|
|
2665
2672
|
// xxx=xxx&xxx=
|
|
2666
|
-
urlObj.search = urlObj.search
|
|
2673
|
+
urlObj.search = `${urlObj.search}&${urlSearch}`;
|
|
2667
2674
|
}
|
|
2668
2675
|
}
|
|
2669
2676
|
}
|
|
@@ -2671,14 +2678,14 @@
|
|
|
2671
2678
|
}
|
|
2672
2679
|
else if (method === "POST" && requestOption.headers != null) {
|
|
2673
2680
|
// POST类型,data如果是FormData,那么需要转为string
|
|
2674
|
-
|
|
2675
|
-
|
|
2681
|
+
const headersKeyList = Object.keys(requestOption.headers);
|
|
2682
|
+
const ContentTypeIndex = headersKeyList.findIndex((headerKey) => {
|
|
2676
2683
|
return (headerKey.trim().toLowerCase() === "content-type" &&
|
|
2677
2684
|
typeof requestOption.headers[headerKey] === "string");
|
|
2678
2685
|
});
|
|
2679
2686
|
if (ContentTypeIndex !== -1) {
|
|
2680
|
-
|
|
2681
|
-
|
|
2687
|
+
const ContentTypeKey = headersKeyList[ContentTypeIndex];
|
|
2688
|
+
const ContentType = requestOption.headers[ContentTypeKey];
|
|
2682
2689
|
// 设置了Content-Type
|
|
2683
2690
|
if (ContentType.includes("application/json")) {
|
|
2684
2691
|
// application/json
|
|
@@ -2719,10 +2726,10 @@
|
|
|
2719
2726
|
* @param option 请求配置
|
|
2720
2727
|
*/
|
|
2721
2728
|
removeRequestNullOption(option) {
|
|
2722
|
-
Object.keys(option)
|
|
2723
|
-
|
|
2724
|
-
|
|
2725
|
-
|
|
2729
|
+
const optionKeys = Object.keys(option);
|
|
2730
|
+
optionKeys.forEach((keyName) => {
|
|
2731
|
+
const optionValue = option[keyName];
|
|
2732
|
+
if (optionValue == null || (optionValue instanceof Function && commonUtil.isNull(optionValue))) {
|
|
2726
2733
|
Reflect.deleteProperty(option, keyName);
|
|
2727
2734
|
return;
|
|
2728
2735
|
}
|
|
@@ -2740,14 +2747,14 @@
|
|
|
2740
2747
|
/**
|
|
2741
2748
|
* fetch的请求配置
|
|
2742
2749
|
**/
|
|
2743
|
-
|
|
2750
|
+
const fetchRequestOption = {};
|
|
2744
2751
|
if ((option.method === "GET" || option.method === "HEAD") && option.data != null) {
|
|
2745
2752
|
/* GET 或 HEAD 方法的请求不能包含 body 信息 */
|
|
2746
2753
|
Reflect.deleteProperty(option, "data");
|
|
2747
2754
|
}
|
|
2748
2755
|
/* 中止信号控制器 */
|
|
2749
|
-
|
|
2750
|
-
|
|
2756
|
+
const abortController = new AbortController();
|
|
2757
|
+
const signal = abortController.signal;
|
|
2751
2758
|
signal.onabort = () => {
|
|
2752
2759
|
option.onabort({
|
|
2753
2760
|
isFetch: true,
|
|
@@ -2792,10 +2799,10 @@
|
|
|
2792
2799
|
* onabort请求被取消-触发
|
|
2793
2800
|
* @param details 配置
|
|
2794
2801
|
* @param resolve promise回调
|
|
2795
|
-
* @param
|
|
2802
|
+
* @param _reject promise抛出错误回调
|
|
2796
2803
|
* @param argsResult 返回的参数列表
|
|
2797
2804
|
*/
|
|
2798
|
-
async onAbort(details, resolve,
|
|
2805
|
+
async onAbort(details, resolve, _reject, argsResult) {
|
|
2799
2806
|
// console.log(argsResult);
|
|
2800
2807
|
if (typeof details?.onabort === "function") {
|
|
2801
2808
|
details.onabort.apply(this, argsResult);
|
|
@@ -2832,7 +2839,7 @@
|
|
|
2832
2839
|
* @param reject 抛出错误
|
|
2833
2840
|
* @param argsResult 返回的参数列表
|
|
2834
2841
|
*/
|
|
2835
|
-
async onTimeout(details, resolve,
|
|
2842
|
+
async onTimeout(details, resolve, _reject, argsResult) {
|
|
2836
2843
|
// console.log(argsResult);
|
|
2837
2844
|
if (typeof details?.ontimeout === "function") {
|
|
2838
2845
|
// 执行配置中的ontime回调
|
|
@@ -2870,10 +2877,10 @@
|
|
|
2870
2877
|
* onerror请求异常-触发
|
|
2871
2878
|
* @param details 配置
|
|
2872
2879
|
* @param resolve 回调
|
|
2873
|
-
* @param
|
|
2880
|
+
* @param _reject 抛出错误
|
|
2874
2881
|
* @param argsResult 返回的参数列表
|
|
2875
2882
|
*/
|
|
2876
|
-
async onError(details, resolve,
|
|
2883
|
+
async onError(details, resolve, _reject, argsResult) {
|
|
2877
2884
|
// console.log(argsResult);
|
|
2878
2885
|
if (typeof details?.onerror === "function") {
|
|
2879
2886
|
details.onerror.apply(this, argsResult);
|
|
@@ -2907,16 +2914,15 @@
|
|
|
2907
2914
|
* onload加载完毕-触发
|
|
2908
2915
|
* @param details 请求的配置
|
|
2909
2916
|
* @param resolve 回调
|
|
2910
|
-
* @param
|
|
2917
|
+
* @param _reject 抛出错误
|
|
2911
2918
|
* @param argsResult 返回的参数列表
|
|
2912
2919
|
*/
|
|
2913
|
-
async onLoad(details, resolve,
|
|
2920
|
+
async onLoad(details, resolve, _reject, argsResult) {
|
|
2914
2921
|
// console.log(argsResult);
|
|
2915
2922
|
/* X浏览器会因为设置了responseType导致不返回responseText */
|
|
2916
|
-
|
|
2923
|
+
const originResponse = argsResult[0];
|
|
2917
2924
|
/* responseText为空,response不为空的情况 */
|
|
2918
|
-
if (commonUtil.isNull(originResponse["responseText"]) &&
|
|
2919
|
-
commonUtil.isNotNull(originResponse["response"])) {
|
|
2925
|
+
if (commonUtil.isNull(originResponse["responseText"]) && commonUtil.isNotNull(originResponse["response"])) {
|
|
2920
2926
|
if (typeof originResponse["response"] === "object") {
|
|
2921
2927
|
TryCatch().run(() => {
|
|
2922
2928
|
originResponse["responseText"] = JSON.stringify(originResponse["response"]);
|
|
@@ -2931,51 +2937,51 @@
|
|
|
2931
2937
|
typeof originResponse["responseText"] === "string" &&
|
|
2932
2938
|
originResponse["responseText"].trim() !== "") {
|
|
2933
2939
|
/** 原始的请求text */
|
|
2934
|
-
|
|
2940
|
+
const httpxResponseText = originResponse.responseText;
|
|
2935
2941
|
// 自定义个新的response
|
|
2936
2942
|
let httpxResponse = httpxResponseText;
|
|
2937
2943
|
if (details.responseType === "json") {
|
|
2938
2944
|
httpxResponse = commonUtil.toJSON(httpxResponseText);
|
|
2939
2945
|
}
|
|
2940
2946
|
else if (details.responseType === "document") {
|
|
2941
|
-
|
|
2947
|
+
const parser = new DOMParser();
|
|
2942
2948
|
httpxResponse = parser.parseFromString(httpxResponseText, "text/html");
|
|
2943
2949
|
}
|
|
2944
2950
|
else if (details.responseType === "arraybuffer") {
|
|
2945
|
-
|
|
2946
|
-
|
|
2951
|
+
const encoder = new TextEncoder();
|
|
2952
|
+
const arrayBuffer = encoder.encode(httpxResponseText);
|
|
2947
2953
|
httpxResponse = arrayBuffer;
|
|
2948
2954
|
}
|
|
2949
2955
|
else if (details.responseType === "blob") {
|
|
2950
|
-
|
|
2951
|
-
|
|
2956
|
+
const encoder = new TextEncoder();
|
|
2957
|
+
const arrayBuffer = encoder.encode(httpxResponseText);
|
|
2952
2958
|
httpxResponse = new Blob([arrayBuffer]);
|
|
2953
2959
|
}
|
|
2954
2960
|
// 尝试覆盖原response
|
|
2955
2961
|
try {
|
|
2956
|
-
|
|
2962
|
+
const setStatus = Reflect.set(originResponse, "response", httpxResponse);
|
|
2957
2963
|
if (!setStatus) {
|
|
2958
2964
|
console.warn("[Httpx-HttpxCallBack.oonLoad] 覆盖原始 response 失败,尝试添加新的httpxResponse");
|
|
2959
2965
|
try {
|
|
2960
2966
|
Reflect.set(originResponse, "httpxResponse", httpxResponse);
|
|
2961
2967
|
}
|
|
2962
|
-
catch
|
|
2968
|
+
catch {
|
|
2963
2969
|
console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
|
|
2964
2970
|
}
|
|
2965
2971
|
}
|
|
2966
2972
|
}
|
|
2967
|
-
catch
|
|
2973
|
+
catch {
|
|
2968
2974
|
console.warn("[Httpx-HttpxCallBack.oonLoad] 原始 response 无法被覆盖,尝试添加新的httpxResponse");
|
|
2969
2975
|
try {
|
|
2970
2976
|
Reflect.set(originResponse, "httpxResponse", httpxResponse);
|
|
2971
2977
|
}
|
|
2972
|
-
catch
|
|
2978
|
+
catch {
|
|
2973
2979
|
console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
|
|
2974
2980
|
}
|
|
2975
2981
|
}
|
|
2976
2982
|
}
|
|
2977
2983
|
/* Stay扩展中没有finalUrl,对应的是responseURL */
|
|
2978
|
-
|
|
2984
|
+
const originResponseURL = Reflect.get(originResponse, "responseURL");
|
|
2979
2985
|
if (originResponse["finalUrl"] == null && originResponseURL != null) {
|
|
2980
2986
|
Reflect.set(originResponse, "finalUrl", originResponseURL);
|
|
2981
2987
|
}
|
|
@@ -2995,7 +3001,7 @@
|
|
|
2995
3001
|
});
|
|
2996
3002
|
}
|
|
2997
3003
|
else {
|
|
2998
|
-
this.context.HttpxResponseCallBack.onError(details, resolve,
|
|
3004
|
+
this.context.HttpxResponseCallBack.onError(details, resolve, _reject, argsResult);
|
|
2999
3005
|
}
|
|
3000
3006
|
},
|
|
3001
3007
|
/**
|
|
@@ -3052,7 +3058,7 @@
|
|
|
3052
3058
|
console.log("[Httpx-HttpxRequest.request] 请求前的配置👇", details);
|
|
3053
3059
|
}
|
|
3054
3060
|
if (typeof this.context.HttpxRequestHook.beforeRequestCallBack === "function") {
|
|
3055
|
-
|
|
3061
|
+
const hookResult = await this.context.HttpxRequestHook.beforeRequestCallBack(details);
|
|
3056
3062
|
if (hookResult == null) {
|
|
3057
3063
|
return;
|
|
3058
3064
|
}
|
|
@@ -3084,7 +3090,7 @@
|
|
|
3084
3090
|
fetch(option.url, fetchRequestOption)
|
|
3085
3091
|
.then(async (fetchResponse) => {
|
|
3086
3092
|
/** 自定义的response */
|
|
3087
|
-
|
|
3093
|
+
const httpxResponse = {
|
|
3088
3094
|
isFetch: true,
|
|
3089
3095
|
finalUrl: fetchResponse.url,
|
|
3090
3096
|
readyState: 4,
|
|
@@ -3099,9 +3105,9 @@
|
|
|
3099
3105
|
};
|
|
3100
3106
|
Object.assign(httpxResponse, option.context || {});
|
|
3101
3107
|
// 把headers转为字符串
|
|
3102
|
-
|
|
3108
|
+
fetchResponse.headers.forEach((value, key) => {
|
|
3103
3109
|
httpxResponse.responseHeaders += `${key}: ${value}\n`;
|
|
3104
|
-
}
|
|
3110
|
+
});
|
|
3105
3111
|
/** 请求返回的类型 */
|
|
3106
3112
|
const fetchResponseType = fetchResponse.headers.get("Content-Type");
|
|
3107
3113
|
/* 如果需要stream,且获取到的是stream,那直接返回 */
|
|
@@ -3122,11 +3128,11 @@
|
|
|
3122
3128
|
/** 响应xml文档 */
|
|
3123
3129
|
let responseXML = "";
|
|
3124
3130
|
/** 先获取二进制数据 */
|
|
3125
|
-
|
|
3131
|
+
const arrayBuffer = await fetchResponse.arrayBuffer();
|
|
3126
3132
|
/** 数据编码 */
|
|
3127
3133
|
let encoding = "utf-8";
|
|
3128
3134
|
if (fetchResponse.headers.has("Content-Type")) {
|
|
3129
|
-
|
|
3135
|
+
const charsetMatched = fetchResponse.headers.get("Content-Type")?.match(/charset=(.+)/);
|
|
3130
3136
|
if (charsetMatched) {
|
|
3131
3137
|
encoding = charsetMatched[1];
|
|
3132
3138
|
encoding = encoding.toLowerCase();
|
|
@@ -3136,7 +3142,7 @@
|
|
|
3136
3142
|
// 去除引号
|
|
3137
3143
|
encoding = encoding.replace(/('|")/gi, "");
|
|
3138
3144
|
// 编码
|
|
3139
|
-
|
|
3145
|
+
const textDecoder = new TextDecoder(encoding);
|
|
3140
3146
|
responseText = textDecoder.decode(arrayBuffer);
|
|
3141
3147
|
response = responseText;
|
|
3142
3148
|
if (option.responseType === "arraybuffer") {
|
|
@@ -3154,11 +3160,11 @@
|
|
|
3154
3160
|
}
|
|
3155
3161
|
else if (option.responseType === "document" || option.responseType == null) {
|
|
3156
3162
|
// response返回格式是文档格式
|
|
3157
|
-
|
|
3163
|
+
const parser = new DOMParser();
|
|
3158
3164
|
response = parser.parseFromString(responseText, "text/html");
|
|
3159
3165
|
}
|
|
3160
3166
|
// 转为XML结构
|
|
3161
|
-
|
|
3167
|
+
const parser = new DOMParser();
|
|
3162
3168
|
responseXML = parser.parseFromString(responseText, "text/xml");
|
|
3163
3169
|
httpxResponse.response = response;
|
|
3164
3170
|
httpxResponse.responseText = responseText;
|
|
@@ -3232,6 +3238,9 @@
|
|
|
3232
3238
|
onreadystatechange() { },
|
|
3233
3239
|
onprogress() { },
|
|
3234
3240
|
};
|
|
3241
|
+
/**
|
|
3242
|
+
* 实例化的默认配置
|
|
3243
|
+
*/
|
|
3235
3244
|
#defaultInitOption = {
|
|
3236
3245
|
/**
|
|
3237
3246
|
* `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
|
|
@@ -3347,7 +3356,7 @@
|
|
|
3347
3356
|
* @param details 配置
|
|
3348
3357
|
*/
|
|
3349
3358
|
get(...args) {
|
|
3350
|
-
|
|
3359
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3351
3360
|
useRequestOption.method = "GET";
|
|
3352
3361
|
return this.request(useRequestOption, (option) => {
|
|
3353
3362
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3357,7 +3366,7 @@
|
|
|
3357
3366
|
* POST 请求
|
|
3358
3367
|
*/
|
|
3359
3368
|
post(...args) {
|
|
3360
|
-
|
|
3369
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3361
3370
|
useRequestOption.method = "POST";
|
|
3362
3371
|
return this.request(useRequestOption);
|
|
3363
3372
|
}
|
|
@@ -3365,7 +3374,7 @@
|
|
|
3365
3374
|
* HEAD 请求
|
|
3366
3375
|
*/
|
|
3367
3376
|
head(...args) {
|
|
3368
|
-
|
|
3377
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3369
3378
|
useRequestOption.method = "HEAD";
|
|
3370
3379
|
return this.request(useRequestOption, (option) => {
|
|
3371
3380
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3375,7 +3384,7 @@
|
|
|
3375
3384
|
* OPTIONS 请求
|
|
3376
3385
|
*/
|
|
3377
3386
|
options(...args) {
|
|
3378
|
-
|
|
3387
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3379
3388
|
useRequestOption.method = "OPTIONS";
|
|
3380
3389
|
return this.request(useRequestOption, (option) => {
|
|
3381
3390
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3385,7 +3394,7 @@
|
|
|
3385
3394
|
* DELETE 请求
|
|
3386
3395
|
*/
|
|
3387
3396
|
delete(...args) {
|
|
3388
|
-
|
|
3397
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3389
3398
|
useRequestOption.method = "DELETE";
|
|
3390
3399
|
return this.request(useRequestOption, (option) => {
|
|
3391
3400
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3395,7 +3404,7 @@
|
|
|
3395
3404
|
* PUT 请求
|
|
3396
3405
|
*/
|
|
3397
3406
|
put(...args) {
|
|
3398
|
-
|
|
3407
|
+
const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3399
3408
|
userRequestOption.method = "PUT";
|
|
3400
3409
|
return this.request(userRequestOption);
|
|
3401
3410
|
}
|
|
@@ -3405,18 +3414,30 @@
|
|
|
3405
3414
|
* @param beforeRequestOption 处理请求前的配置
|
|
3406
3415
|
*/
|
|
3407
3416
|
request(details, beforeRequestOption) {
|
|
3408
|
-
|
|
3409
|
-
|
|
3417
|
+
// 对请求的参数进行合并处理
|
|
3418
|
+
const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(details);
|
|
3419
|
+
/**
|
|
3420
|
+
* 取消请求
|
|
3421
|
+
*/
|
|
3410
3422
|
let abortFn = null;
|
|
3411
|
-
|
|
3412
|
-
|
|
3423
|
+
const promise = new globalThis.Promise(async (resolve, reject) => {
|
|
3424
|
+
// 请求配置
|
|
3425
|
+
let requestOption = this.HttpxRequestOption.getRequestOption(userRequestOption.method, userRequestOption, (resultOption) => {
|
|
3426
|
+
resolve(resultOption);
|
|
3427
|
+
}, (...args) => {
|
|
3428
|
+
reject(...args);
|
|
3429
|
+
});
|
|
3430
|
+
requestOption = this.HttpxRequestOption.removeRequestNullOption(requestOption);
|
|
3413
3431
|
if (typeof beforeRequestOption === "function") {
|
|
3414
3432
|
beforeRequestOption(requestOption);
|
|
3415
3433
|
}
|
|
3416
|
-
|
|
3434
|
+
// 处理重试逻辑
|
|
3417
3435
|
const requestResult = await this.HttpxRequest.request(requestOption);
|
|
3418
3436
|
if (requestResult != null && typeof requestResult.abort === "function") {
|
|
3419
|
-
abortFn =
|
|
3437
|
+
abortFn = () => {
|
|
3438
|
+
// 取消请求
|
|
3439
|
+
requestResult.abort();
|
|
3440
|
+
};
|
|
3420
3441
|
}
|
|
3421
3442
|
});
|
|
3422
3443
|
promise.abort = () => {
|
|
@@ -3435,10 +3456,7 @@
|
|
|
3435
3456
|
/* websql的版本号,由于ios的问题,版本号的写法不一样 */
|
|
3436
3457
|
// #slqVersion = "1";
|
|
3437
3458
|
/* 监听IndexDB */
|
|
3438
|
-
#indexedDB =
|
|
3439
|
-
window.mozIndexedDB ||
|
|
3440
|
-
window.webkitIndexedDB ||
|
|
3441
|
-
window.msIndexedDB;
|
|
3459
|
+
#indexedDB = globalThis.indexedDB || globalThis.mozIndexedDB || globalThis.webkitIndexedDB || globalThis.msIndexedDB;
|
|
3442
3460
|
/* 缓存数据库,避免同一个页面重复创建和销毁 */
|
|
3443
3461
|
#db = {};
|
|
3444
3462
|
// #store: IDBObjectStore = null as any;
|
|
@@ -3473,7 +3491,7 @@
|
|
|
3473
3491
|
this.#storeName = storeName;
|
|
3474
3492
|
this.#dbVersion = dbVersion;
|
|
3475
3493
|
if (!this.#indexedDB) {
|
|
3476
|
-
alert("很抱歉,您的浏览器不支持indexedDB");
|
|
3494
|
+
window.alert("很抱歉,您的浏览器不支持indexedDB");
|
|
3477
3495
|
throw new TypeError("很抱歉,您的浏览器不支持indexedDB");
|
|
3478
3496
|
}
|
|
3479
3497
|
}
|
|
@@ -3482,10 +3500,9 @@
|
|
|
3482
3500
|
* @param dbName 表名
|
|
3483
3501
|
*/
|
|
3484
3502
|
createStore(dbName) {
|
|
3485
|
-
|
|
3486
|
-
txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
|
|
3503
|
+
const txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
|
|
3487
3504
|
/* IndexDB的读写权限 */
|
|
3488
|
-
store = txn.objectStore(this.#storeName);
|
|
3505
|
+
const store = txn.objectStore(this.#storeName);
|
|
3489
3506
|
// this.#store = store;
|
|
3490
3507
|
return store;
|
|
3491
3508
|
}
|
|
@@ -3495,12 +3512,12 @@
|
|
|
3495
3512
|
* @param dbName 数据库名
|
|
3496
3513
|
*/
|
|
3497
3514
|
open(callback, dbName) {
|
|
3498
|
-
|
|
3515
|
+
const that = this;
|
|
3499
3516
|
/* 打开数据库 */
|
|
3500
3517
|
/* 如果支持IndexDB */
|
|
3501
3518
|
if (!that.#db[dbName]) {
|
|
3502
3519
|
/* 如果缓存中没有,则进行数据库的创建或打开,提高效率 */
|
|
3503
|
-
|
|
3520
|
+
const request = that.#indexedDB.open(dbName, that.#dbVersion);
|
|
3504
3521
|
request.onerror = function (event) {
|
|
3505
3522
|
callback(null, {
|
|
3506
3523
|
code: that.#statusCode.openFailed.code,
|
|
@@ -3510,26 +3527,26 @@
|
|
|
3510
3527
|
};
|
|
3511
3528
|
request.onsuccess = function (event) {
|
|
3512
3529
|
if (!that.#db[dbName]) {
|
|
3513
|
-
|
|
3530
|
+
const target = event.target;
|
|
3514
3531
|
that.#db[dbName] = target.result;
|
|
3515
3532
|
}
|
|
3516
|
-
|
|
3533
|
+
const store = that.createStore(dbName);
|
|
3517
3534
|
callback(store);
|
|
3518
3535
|
};
|
|
3519
3536
|
request.onupgradeneeded = function (event) {
|
|
3520
|
-
|
|
3537
|
+
const target = event.target;
|
|
3521
3538
|
that.#db[dbName] = target.result;
|
|
3522
|
-
|
|
3539
|
+
const store = that.#db[dbName].createObjectStore(that.#storeName, {
|
|
3523
3540
|
keyPath: "key",
|
|
3524
3541
|
});
|
|
3525
|
-
store.transaction.oncomplete = function (
|
|
3542
|
+
store.transaction.oncomplete = function () {
|
|
3526
3543
|
callback(store);
|
|
3527
3544
|
};
|
|
3528
3545
|
};
|
|
3529
3546
|
}
|
|
3530
3547
|
else {
|
|
3531
3548
|
/* 如果缓存中已经打开了数据库,就直接使用 */
|
|
3532
|
-
|
|
3549
|
+
const store = this.createStore(dbName);
|
|
3533
3550
|
callback(store);
|
|
3534
3551
|
}
|
|
3535
3552
|
}
|
|
@@ -3539,10 +3556,10 @@
|
|
|
3539
3556
|
* @param value 数据值
|
|
3540
3557
|
*/
|
|
3541
3558
|
async save(key, value) {
|
|
3542
|
-
|
|
3559
|
+
const that = this;
|
|
3543
3560
|
return new Promise((resolve) => {
|
|
3544
|
-
|
|
3545
|
-
|
|
3561
|
+
const dbName = this.#dbName;
|
|
3562
|
+
const inData = {
|
|
3546
3563
|
key: key,
|
|
3547
3564
|
value: value,
|
|
3548
3565
|
};
|
|
@@ -3555,7 +3572,7 @@
|
|
|
3555
3572
|
});
|
|
3556
3573
|
}
|
|
3557
3574
|
else {
|
|
3558
|
-
|
|
3575
|
+
const request = idbStore.put(inData);
|
|
3559
3576
|
request.onsuccess = function (event) {
|
|
3560
3577
|
/* 保存成功有success 字段 */
|
|
3561
3578
|
resolve({
|
|
@@ -3582,9 +3599,9 @@
|
|
|
3582
3599
|
* @param key 数据key
|
|
3583
3600
|
*/
|
|
3584
3601
|
async has(key) {
|
|
3585
|
-
|
|
3602
|
+
const that = this;
|
|
3586
3603
|
return new Promise((resolve) => {
|
|
3587
|
-
|
|
3604
|
+
const dbName = this.#dbName;
|
|
3588
3605
|
this.open(function (idbStore) {
|
|
3589
3606
|
/* 判断返回的数据中是否有error字段 */
|
|
3590
3607
|
if (idbStore == null) {
|
|
@@ -3595,7 +3612,7 @@
|
|
|
3595
3612
|
});
|
|
3596
3613
|
}
|
|
3597
3614
|
else {
|
|
3598
|
-
|
|
3615
|
+
const request = idbStore.get(key);
|
|
3599
3616
|
request.onsuccess = function (event) {
|
|
3600
3617
|
/* result 返回的是 {key: string, value: any} */
|
|
3601
3618
|
/* 键值对存储 */
|
|
@@ -3623,9 +3640,9 @@
|
|
|
3623
3640
|
* @param key 数据key
|
|
3624
3641
|
*/
|
|
3625
3642
|
async get(key) {
|
|
3626
|
-
|
|
3643
|
+
const that = this;
|
|
3627
3644
|
return new Promise((resolve) => {
|
|
3628
|
-
|
|
3645
|
+
const dbName = this.#dbName;
|
|
3629
3646
|
this.open(function (idbStore) {
|
|
3630
3647
|
/* 判断返回的数据中是否有error字段 */
|
|
3631
3648
|
if (idbStore == null) {
|
|
@@ -3637,13 +3654,13 @@
|
|
|
3637
3654
|
});
|
|
3638
3655
|
}
|
|
3639
3656
|
else {
|
|
3640
|
-
|
|
3657
|
+
const request = idbStore.get(key);
|
|
3641
3658
|
request.onsuccess = function (event) {
|
|
3642
|
-
|
|
3643
|
-
|
|
3659
|
+
const target = event.target;
|
|
3660
|
+
const result = target.result;
|
|
3644
3661
|
/* result 返回的是 {key: string, value: any} */
|
|
3645
3662
|
/* 键值对存储 */
|
|
3646
|
-
|
|
3663
|
+
const data = result ? result.value : void 0;
|
|
3647
3664
|
if (data == null) {
|
|
3648
3665
|
resolve({
|
|
3649
3666
|
success: true,
|
|
@@ -3684,10 +3701,10 @@
|
|
|
3684
3701
|
*/
|
|
3685
3702
|
async regexpGet(key) {
|
|
3686
3703
|
let list = [];
|
|
3687
|
-
|
|
3704
|
+
const that = this;
|
|
3688
3705
|
return new Promise((resolve) => {
|
|
3689
3706
|
/* 正则查询 */
|
|
3690
|
-
|
|
3707
|
+
const dbName = that.#dbName;
|
|
3691
3708
|
this.open(function (idbStore) {
|
|
3692
3709
|
/* 判断返回的数据中是否有error字段 */
|
|
3693
3710
|
if (idbStore == null) {
|
|
@@ -3699,16 +3716,16 @@
|
|
|
3699
3716
|
});
|
|
3700
3717
|
}
|
|
3701
3718
|
else {
|
|
3702
|
-
|
|
3719
|
+
const request = idbStore.getAll();
|
|
3703
3720
|
request.onsuccess = function (event) {
|
|
3704
|
-
|
|
3705
|
-
|
|
3721
|
+
const target = event.target;
|
|
3722
|
+
const result = target.result;
|
|
3706
3723
|
if (result.length !== 0) {
|
|
3707
|
-
result.forEach((dataItem
|
|
3724
|
+
result.forEach((dataItem) => {
|
|
3708
3725
|
// 当前项的key
|
|
3709
|
-
|
|
3726
|
+
const __key = dataItem["key"];
|
|
3710
3727
|
// 当前项的value
|
|
3711
|
-
|
|
3728
|
+
const __value = dataItem["value"];
|
|
3712
3729
|
if (__key.match(key)) {
|
|
3713
3730
|
list = list.concat(__value);
|
|
3714
3731
|
}
|
|
@@ -3740,10 +3757,10 @@
|
|
|
3740
3757
|
* @param key 数据key
|
|
3741
3758
|
*/
|
|
3742
3759
|
async delete(key) {
|
|
3743
|
-
|
|
3760
|
+
const that = this;
|
|
3744
3761
|
return new Promise((resolve) => {
|
|
3745
3762
|
/* 根据key删除某条数据 */
|
|
3746
|
-
|
|
3763
|
+
const dbName = that.#dbName;
|
|
3747
3764
|
this.open(function (idbStore) {
|
|
3748
3765
|
if (idbStore == null) {
|
|
3749
3766
|
resolve({
|
|
@@ -3754,7 +3771,7 @@
|
|
|
3754
3771
|
}
|
|
3755
3772
|
else {
|
|
3756
3773
|
// 删除键
|
|
3757
|
-
|
|
3774
|
+
const request = idbStore.delete(key);
|
|
3758
3775
|
request.onsuccess = function (event) {
|
|
3759
3776
|
resolve({
|
|
3760
3777
|
success: true,
|
|
@@ -3779,10 +3796,10 @@
|
|
|
3779
3796
|
* 删除所有数据
|
|
3780
3797
|
*/
|
|
3781
3798
|
async deleteAll() {
|
|
3782
|
-
|
|
3799
|
+
const that = this;
|
|
3783
3800
|
return new Promise((resolve) => {
|
|
3784
3801
|
/* 清空数据库 */
|
|
3785
|
-
|
|
3802
|
+
const dbName = that.#dbName;
|
|
3786
3803
|
this.open(function (idbStore) {
|
|
3787
3804
|
if (idbStore == null) {
|
|
3788
3805
|
resolve({
|
|
@@ -3793,7 +3810,7 @@
|
|
|
3793
3810
|
}
|
|
3794
3811
|
else {
|
|
3795
3812
|
// 清空
|
|
3796
|
-
|
|
3813
|
+
const operateResult = idbStore.clear();
|
|
3797
3814
|
operateResult.onsuccess = function (event) {
|
|
3798
3815
|
resolve({
|
|
3799
3816
|
success: true,
|
|
@@ -3826,7 +3843,7 @@
|
|
|
3826
3843
|
run;
|
|
3827
3844
|
isLock;
|
|
3828
3845
|
constructor(callback, context, delayTime) {
|
|
3829
|
-
|
|
3846
|
+
const that = this;
|
|
3830
3847
|
this.#callback = callback;
|
|
3831
3848
|
if (typeof context === "number") {
|
|
3832
3849
|
this.#delayTime = context;
|
|
@@ -3916,14 +3933,14 @@
|
|
|
3916
3933
|
* @param stack
|
|
3917
3934
|
*/
|
|
3918
3935
|
parseErrorStack(stack) {
|
|
3919
|
-
|
|
3936
|
+
const result = {
|
|
3920
3937
|
name: "",
|
|
3921
3938
|
position: "",
|
|
3922
3939
|
};
|
|
3923
3940
|
for (let stackString of stack) {
|
|
3924
3941
|
stackString = stackString.trim();
|
|
3925
|
-
|
|
3926
|
-
|
|
3942
|
+
const stackFunctionNameMatch = stackString.match(/^at[\s]+(.+?)[\s]+/i);
|
|
3943
|
+
const stackFunctionNamePositionMatch = stackString.match(/^at[\s]+.+[\s]+\((.+?)\)/i);
|
|
3927
3944
|
if (stackFunctionNameMatch == null) {
|
|
3928
3945
|
continue;
|
|
3929
3946
|
}
|
|
@@ -3931,8 +3948,8 @@
|
|
|
3931
3948
|
continue;
|
|
3932
3949
|
}
|
|
3933
3950
|
/* 获取最后一个,因为第一个是包含了at */
|
|
3934
|
-
|
|
3935
|
-
|
|
3951
|
+
const stackFunctionName = stackFunctionNameMatch[stackFunctionNameMatch.length - 1];
|
|
3952
|
+
const stackFunctionNamePosition = stackFunctionNamePositionMatch[stackFunctionNamePositionMatch.length - 1];
|
|
3936
3953
|
if (stackFunctionName === "" ||
|
|
3937
3954
|
stackFunctionName.match(/^(Utils\.|)Log(\.|)|.<anonymous>$|^Function.each|^NodeList.forEach|^k.fn.init.each/g)) {
|
|
3938
3955
|
continue;
|
|
@@ -3944,9 +3961,9 @@
|
|
|
3944
3961
|
}
|
|
3945
3962
|
}
|
|
3946
3963
|
if (result.position === "") {
|
|
3947
|
-
|
|
3964
|
+
const lastStackString = stack[stack.length - 1].trim();
|
|
3948
3965
|
if (lastStackString.startsWith("at chrome-extension://")) {
|
|
3949
|
-
|
|
3966
|
+
const lastStackMatch = lastStackString.match(/^at[\s]+(.+)/);
|
|
3950
3967
|
if (lastStackMatch) {
|
|
3951
3968
|
result.position = lastStackMatch[lastStackMatch.length - 1];
|
|
3952
3969
|
}
|
|
@@ -3976,16 +3993,18 @@
|
|
|
3976
3993
|
printContent(msg, color, otherStyle) {
|
|
3977
3994
|
this.checkClearConsole();
|
|
3978
3995
|
otherStyle = otherStyle || "";
|
|
3979
|
-
|
|
3996
|
+
const stackSplit = new Error().stack.split("\n");
|
|
3980
3997
|
stackSplit.splice(0, 2);
|
|
3981
|
-
|
|
3982
|
-
|
|
3983
|
-
|
|
3998
|
+
const { name: callerName, position: callerPosition } = this.parseErrorStack(stackSplit);
|
|
3999
|
+
const tagName = this.tag;
|
|
4000
|
+
const that = this;
|
|
3984
4001
|
/** tag的html输出格式 */
|
|
3985
|
-
|
|
4002
|
+
const tagNameHTML = `%c[${tagName}%c`;
|
|
3986
4003
|
/** 调用的函数名的html输出格式 */
|
|
3987
4004
|
let callerNameHTML = `%c${callerName}%c]%c`;
|
|
3988
|
-
callerName.trim()
|
|
4005
|
+
if (callerName.trim() === "") {
|
|
4006
|
+
callerNameHTML = `-${callerNameHTML}`;
|
|
4007
|
+
}
|
|
3989
4008
|
/**
|
|
3990
4009
|
* 输出消息到控制台
|
|
3991
4010
|
* @param message
|
|
@@ -4071,14 +4090,14 @@
|
|
|
4071
4090
|
if (this.#disable)
|
|
4072
4091
|
return;
|
|
4073
4092
|
this.checkClearConsole();
|
|
4074
|
-
|
|
4093
|
+
const stack = new Error().stack.split("\n");
|
|
4075
4094
|
stack.splice(0, 1);
|
|
4076
|
-
|
|
4095
|
+
const errorStackParse = this.parseErrorStack(stack);
|
|
4077
4096
|
/** 堆栈函数名 */
|
|
4078
|
-
|
|
4097
|
+
const stackFunctionName = errorStackParse.name;
|
|
4079
4098
|
/** 堆栈位置 */
|
|
4080
|
-
|
|
4081
|
-
|
|
4099
|
+
const stackFunctionNamePosition = errorStackParse.position;
|
|
4100
|
+
const callerName = stackFunctionName;
|
|
4082
4101
|
this.#console.log(`%c[${this.tag}%c-%c${callerName}%c]%c`, ...this.#msgColorDetails, `color: ${this.#details.infoColor};`);
|
|
4083
4102
|
this.#console.table(msg);
|
|
4084
4103
|
if (this.#details.debug) {
|
|
@@ -4141,9 +4160,9 @@
|
|
|
4141
4160
|
*/
|
|
4142
4161
|
circleRadius: 50,
|
|
4143
4162
|
};
|
|
4144
|
-
#ctx
|
|
4145
|
-
#width
|
|
4146
|
-
#height
|
|
4163
|
+
#ctx;
|
|
4164
|
+
#width;
|
|
4165
|
+
#height;
|
|
4147
4166
|
/**
|
|
4148
4167
|
*
|
|
4149
4168
|
* @param paramConfig 配置信息
|
|
@@ -4153,14 +4172,8 @@
|
|
|
4153
4172
|
if (!(this.#config.canvasNode instanceof HTMLCanvasElement)) {
|
|
4154
4173
|
throw new Error("Utils.Progress 参数 canvasNode 必须是 HTMLCanvasElement");
|
|
4155
4174
|
}
|
|
4156
|
-
this.init();
|
|
4157
|
-
}
|
|
4158
|
-
/**
|
|
4159
|
-
* 初始化
|
|
4160
|
-
*/
|
|
4161
|
-
init() {
|
|
4162
4175
|
/* 获取画笔 */
|
|
4163
|
-
|
|
4176
|
+
const ctx = this.#config.canvasNode.getContext("2d");
|
|
4164
4177
|
if (ctx == null) {
|
|
4165
4178
|
throw new Error("Utils.Progress 获取画笔失败");
|
|
4166
4179
|
}
|
|
@@ -4171,8 +4184,8 @@
|
|
|
4171
4184
|
this.#height = this.#config.canvasNode.height;
|
|
4172
4185
|
/* 清除锯齿 */
|
|
4173
4186
|
if (window.devicePixelRatio) {
|
|
4174
|
-
this.#config.canvasNode.style.width = this.#width
|
|
4175
|
-
this.#config.canvasNode.style.height = this.#height
|
|
4187
|
+
this.#config.canvasNode.style.width = `${this.#width}px`;
|
|
4188
|
+
this.#config.canvasNode.style.height = `${this.#height}px`;
|
|
4176
4189
|
this.#config.canvasNode.height = this.#height * window.devicePixelRatio;
|
|
4177
4190
|
this.#config.canvasNode.width = this.#width * window.devicePixelRatio;
|
|
4178
4191
|
this.#ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
|
|
@@ -4184,7 +4197,7 @@
|
|
|
4184
4197
|
* 绘制
|
|
4185
4198
|
*/
|
|
4186
4199
|
draw() {
|
|
4187
|
-
|
|
4200
|
+
const degActive = (this.#config.progress * 360) / 100;
|
|
4188
4201
|
/* 清除画布 */
|
|
4189
4202
|
this.#ctx.clearRect(0, 0, this.#width, this.#height);
|
|
4190
4203
|
/* 开始绘制底圆 */
|
|
@@ -4198,11 +4211,11 @@
|
|
|
4198
4211
|
this.#ctx.strokeStyle = this.#config.lineColor;
|
|
4199
4212
|
this.#ctx.stroke();
|
|
4200
4213
|
/* 获取百分比 */
|
|
4201
|
-
|
|
4202
|
-
this.#ctx.font = this.#config.fontSize
|
|
4214
|
+
const txt = `${parseInt(this.#config.progress.toString())}%`;
|
|
4215
|
+
this.#ctx.font = `${this.#config.fontSize}px SimHei`;
|
|
4203
4216
|
/* 获取文本宽度 */
|
|
4204
|
-
|
|
4205
|
-
|
|
4217
|
+
const w = this.#ctx.measureText(txt).width;
|
|
4218
|
+
const h = this.#config.fontSize / 2;
|
|
4206
4219
|
this.#ctx.fillStyle = this.#config.textColor;
|
|
4207
4220
|
this.#ctx.fillText(txt, this.#width / 2 - w / 2, this.#height / 2 + h / 2);
|
|
4208
4221
|
}
|
|
@@ -4226,9 +4239,9 @@
|
|
|
4226
4239
|
* 迭代器
|
|
4227
4240
|
*/
|
|
4228
4241
|
get entries() {
|
|
4229
|
-
|
|
4242
|
+
const that = this;
|
|
4230
4243
|
return function* () {
|
|
4231
|
-
|
|
4244
|
+
const itemKeys = Object.keys(that.getItems());
|
|
4232
4245
|
for (const keyName of itemKeys) {
|
|
4233
4246
|
yield [keyName, that.get(keyName)];
|
|
4234
4247
|
}
|
|
@@ -4238,9 +4251,8 @@
|
|
|
4238
4251
|
* 是否可遍历
|
|
4239
4252
|
*/
|
|
4240
4253
|
get [Symbol.iterator]() {
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
return that.entries();
|
|
4254
|
+
return () => {
|
|
4255
|
+
return this.entries();
|
|
4244
4256
|
};
|
|
4245
4257
|
}
|
|
4246
4258
|
/**
|
|
@@ -4327,7 +4339,7 @@
|
|
|
4327
4339
|
* @param callbackfn 回调函数
|
|
4328
4340
|
*/
|
|
4329
4341
|
forEach(callbackfn) {
|
|
4330
|
-
this.items.forEach((value, key
|
|
4342
|
+
this.items.forEach((value, key) => {
|
|
4331
4343
|
callbackfn(value, key, this);
|
|
4332
4344
|
});
|
|
4333
4345
|
}
|
|
@@ -4419,6 +4431,7 @@
|
|
|
4419
4431
|
}
|
|
4420
4432
|
}
|
|
4421
4433
|
|
|
4434
|
+
// @ts-nocheck
|
|
4422
4435
|
const VueUtils = {
|
|
4423
4436
|
/** 标签 */
|
|
4424
4437
|
ReactiveFlags: {
|
|
@@ -4457,10 +4470,10 @@
|
|
|
4457
4470
|
deps = [];
|
|
4458
4471
|
active = true;
|
|
4459
4472
|
fn;
|
|
4460
|
-
|
|
4473
|
+
scheduler;
|
|
4461
4474
|
constructor(fn, scheduler) {
|
|
4462
4475
|
this.fn = fn;
|
|
4463
|
-
|
|
4476
|
+
this.scheduler = scheduler;
|
|
4464
4477
|
}
|
|
4465
4478
|
run(cb) {
|
|
4466
4479
|
if (!this.active) {
|
|
@@ -4532,7 +4545,7 @@
|
|
|
4532
4545
|
if (VueUtils.isReactive(target)) {
|
|
4533
4546
|
return target;
|
|
4534
4547
|
}
|
|
4535
|
-
|
|
4548
|
+
const exisProxy = this.reactMap.get(target);
|
|
4536
4549
|
if (exisProxy) {
|
|
4537
4550
|
return exisProxy;
|
|
4538
4551
|
}
|
|
@@ -4545,8 +4558,8 @@
|
|
|
4545
4558
|
return Reflect.get(target, key, receiver);
|
|
4546
4559
|
},
|
|
4547
4560
|
set(target, key, value, receiver) {
|
|
4548
|
-
|
|
4549
|
-
|
|
4561
|
+
const oldValue = target[key];
|
|
4562
|
+
const result = Reflect.set(target, key, value, receiver);
|
|
4550
4563
|
if (oldValue !== value) {
|
|
4551
4564
|
that.trigger(target, "set", key, oldValue, value);
|
|
4552
4565
|
}
|
|
@@ -4596,11 +4609,12 @@
|
|
|
4596
4609
|
}
|
|
4597
4610
|
toRefs(object) {
|
|
4598
4611
|
const result = VueUtils.isArray(object) ? new Array(object.length) : {};
|
|
4599
|
-
for (
|
|
4612
|
+
for (const key in object) {
|
|
4600
4613
|
result[key] = this.toRef(object, key);
|
|
4601
4614
|
}
|
|
4602
4615
|
return result;
|
|
4603
4616
|
}
|
|
4617
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4604
4618
|
trigger(target, type, key, oldValue, value) {
|
|
4605
4619
|
const depsMap = this.targetMap.get(target);
|
|
4606
4620
|
if (!depsMap)
|
|
@@ -4608,8 +4622,9 @@
|
|
|
4608
4622
|
const effects = depsMap.get(key);
|
|
4609
4623
|
this.triggerEffect(effects, "effects");
|
|
4610
4624
|
}
|
|
4625
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4611
4626
|
triggerEffect(effects, name) {
|
|
4612
|
-
effects
|
|
4627
|
+
if (effects) {
|
|
4613
4628
|
effects.forEach((effect) => {
|
|
4614
4629
|
if (effect.scheduler) {
|
|
4615
4630
|
effect.scheduler();
|
|
@@ -4618,6 +4633,7 @@
|
|
|
4618
4633
|
effect.run();
|
|
4619
4634
|
}
|
|
4620
4635
|
});
|
|
4636
|
+
}
|
|
4621
4637
|
}
|
|
4622
4638
|
track(target, type, key) {
|
|
4623
4639
|
if (!this.activeEffect)
|
|
@@ -4634,7 +4650,7 @@
|
|
|
4634
4650
|
}
|
|
4635
4651
|
trackEffect(dep) {
|
|
4636
4652
|
if (this.activeEffect) {
|
|
4637
|
-
|
|
4653
|
+
const shouldTrack = !dep.has(this.activeEffect);
|
|
4638
4654
|
if (shouldTrack) {
|
|
4639
4655
|
dep.add(this.activeEffect);
|
|
4640
4656
|
this.activeEffect.deps.push(dep);
|
|
@@ -4648,7 +4664,7 @@
|
|
|
4648
4664
|
return value;
|
|
4649
4665
|
}
|
|
4650
4666
|
set.add(value);
|
|
4651
|
-
for (
|
|
4667
|
+
for (const key in value) {
|
|
4652
4668
|
this.traversal(value[key], set);
|
|
4653
4669
|
}
|
|
4654
4670
|
return value;
|
|
@@ -4900,6 +4916,7 @@
|
|
|
4900
4916
|
const setInterval = (...args) => loadOrReturnBroker().setInterval(...args);
|
|
4901
4917
|
const setTimeout$1 = (...args) => loadOrReturnBroker().setTimeout(...args);
|
|
4902
4918
|
|
|
4919
|
+
/* eslint-disable */
|
|
4903
4920
|
// ==UserScript==
|
|
4904
4921
|
// @name ModuleRaid.js
|
|
4905
4922
|
// @namespace http://tampermonkey.net/
|
|
@@ -5317,28 +5334,26 @@
|
|
|
5317
5334
|
return $ele?.innerHTML?.trim() === "";
|
|
5318
5335
|
});
|
|
5319
5336
|
}
|
|
5320
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5321
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5337
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5322
5338
|
// contains 语法
|
|
5323
|
-
|
|
5324
|
-
|
|
5339
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5340
|
+
const text = textMatch[2];
|
|
5325
5341
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5326
5342
|
return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
|
|
5327
5343
|
return ($ele?.textContent || $ele?.innerText)?.includes(text);
|
|
5328
5344
|
});
|
|
5329
5345
|
}
|
|
5330
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5331
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5346
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5332
5347
|
// regexp 语法
|
|
5333
|
-
|
|
5348
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5334
5349
|
let pattern = textMatch[2];
|
|
5335
|
-
|
|
5350
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5336
5351
|
let flags = "";
|
|
5337
5352
|
if (flagMatch) {
|
|
5338
5353
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5339
5354
|
flags = flagMatch[3];
|
|
5340
5355
|
}
|
|
5341
|
-
|
|
5356
|
+
const regexp = new RegExp(pattern, flags);
|
|
5342
5357
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5343
5358
|
return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
|
|
5344
5359
|
return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
|
|
@@ -5380,11 +5395,10 @@
|
|
|
5380
5395
|
selector = selector.replace(/:empty$/gi, "");
|
|
5381
5396
|
return $el.matches(selector) && $el?.innerHTML?.trim() === "";
|
|
5382
5397
|
}
|
|
5383
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5384
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5398
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5385
5399
|
// contains 语法
|
|
5386
|
-
|
|
5387
|
-
|
|
5400
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5401
|
+
const text = textMatch[2];
|
|
5388
5402
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5389
5403
|
let content = $el?.textContent || $el?.innerText;
|
|
5390
5404
|
if (typeof content !== "string") {
|
|
@@ -5392,18 +5406,17 @@
|
|
|
5392
5406
|
}
|
|
5393
5407
|
return $el.matches(selector) && content?.includes(text);
|
|
5394
5408
|
}
|
|
5395
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5396
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5409
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5397
5410
|
// regexp 语法
|
|
5398
|
-
|
|
5411
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5399
5412
|
let pattern = textMatch[2];
|
|
5400
|
-
|
|
5413
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5401
5414
|
let flags = "";
|
|
5402
5415
|
if (flagMatch) {
|
|
5403
5416
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5404
5417
|
flags = flagMatch[3];
|
|
5405
5418
|
}
|
|
5406
|
-
|
|
5419
|
+
const regexp = new RegExp(pattern, flags);
|
|
5407
5420
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5408
5421
|
let content = $el?.textContent || $el?.innerText;
|
|
5409
5422
|
if (typeof content !== "string") {
|
|
@@ -5421,43 +5434,41 @@
|
|
|
5421
5434
|
if (selector.match(/[^\s]{1}:empty$/gi)) {
|
|
5422
5435
|
// empty 语法
|
|
5423
5436
|
selector = selector.replace(/:empty$/gi, "");
|
|
5424
|
-
|
|
5437
|
+
const $closest = $el?.closest(selector);
|
|
5425
5438
|
if ($closest && $closest?.innerHTML?.trim() === "") {
|
|
5426
5439
|
return $closest;
|
|
5427
5440
|
}
|
|
5428
5441
|
return null;
|
|
5429
5442
|
}
|
|
5430
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5431
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5443
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5432
5444
|
// contains 语法
|
|
5433
|
-
|
|
5434
|
-
|
|
5445
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5446
|
+
const text = textMatch[2];
|
|
5435
5447
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5436
|
-
|
|
5448
|
+
const $closest = $el?.closest(selector);
|
|
5437
5449
|
if ($closest) {
|
|
5438
|
-
|
|
5450
|
+
const content = $el?.textContent || $el?.innerText;
|
|
5439
5451
|
if (typeof content === "string" && content.includes(text)) {
|
|
5440
5452
|
return $closest;
|
|
5441
5453
|
}
|
|
5442
5454
|
}
|
|
5443
5455
|
return null;
|
|
5444
5456
|
}
|
|
5445
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5446
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5457
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5447
5458
|
// regexp 语法
|
|
5448
|
-
|
|
5459
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5449
5460
|
let pattern = textMatch[2];
|
|
5450
|
-
|
|
5461
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5451
5462
|
let flags = "";
|
|
5452
5463
|
if (flagMatch) {
|
|
5453
5464
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5454
5465
|
flags = flagMatch[3];
|
|
5455
5466
|
}
|
|
5456
|
-
|
|
5467
|
+
const regexp = new RegExp(pattern, flags);
|
|
5457
5468
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5458
|
-
|
|
5469
|
+
const $closest = $el?.closest(selector);
|
|
5459
5470
|
if ($closest) {
|
|
5460
|
-
|
|
5471
|
+
const content = $el?.textContent || $el?.innerText;
|
|
5461
5472
|
if (typeof content === "string" && content.match(regexp)) {
|
|
5462
5473
|
return $closest;
|
|
5463
5474
|
}
|
|
@@ -5466,12 +5477,12 @@
|
|
|
5466
5477
|
}
|
|
5467
5478
|
else {
|
|
5468
5479
|
// 普通语法
|
|
5469
|
-
|
|
5480
|
+
const $closest = $el?.closest(selector);
|
|
5470
5481
|
return $closest;
|
|
5471
5482
|
}
|
|
5472
5483
|
}
|
|
5473
5484
|
}
|
|
5474
|
-
|
|
5485
|
+
const domUtils = new DOMUtils();
|
|
5475
5486
|
|
|
5476
5487
|
class Utils {
|
|
5477
5488
|
windowApi;
|
|
@@ -5484,7 +5495,7 @@
|
|
|
5484
5495
|
if (typeof cssText !== "string") {
|
|
5485
5496
|
throw new Error("Utils.addStyle 参数cssText 必须为String类型");
|
|
5486
5497
|
}
|
|
5487
|
-
|
|
5498
|
+
const cssNode = this.windowApi.document.createElement("style");
|
|
5488
5499
|
cssNode.setAttribute("type", "text/css");
|
|
5489
5500
|
cssNode.innerHTML = cssText;
|
|
5490
5501
|
if (this.windowApi.document.head) {
|
|
@@ -5506,23 +5517,23 @@
|
|
|
5506
5517
|
return cssNode;
|
|
5507
5518
|
}
|
|
5508
5519
|
/**
|
|
5509
|
-
|
|
5510
|
-
|
|
5511
|
-
|
|
5512
|
-
|
|
5513
|
-
|
|
5514
|
-
|
|
5515
|
-
|
|
5516
|
-
|
|
5517
|
-
|
|
5518
|
-
|
|
5519
|
-
|
|
5520
|
-
|
|
5521
|
-
|
|
5522
|
-
|
|
5520
|
+
* JSON数据从源端替换到目标端中,如果目标端存在该数据则替换,不添加,返回结果为目标端替换完毕的结果
|
|
5521
|
+
* @param target 目标数据
|
|
5522
|
+
* @param source 源数据
|
|
5523
|
+
* @param isAdd 是否可以追加键,默认false
|
|
5524
|
+
* @example
|
|
5525
|
+
* Utils.assign({"1":1,"2":{"3":3}}, {"2":{"3":4}});
|
|
5526
|
+
* >
|
|
5527
|
+
* {
|
|
5528
|
+
"1": 1,
|
|
5529
|
+
"2": {
|
|
5530
|
+
"3": 4
|
|
5531
|
+
}
|
|
5532
|
+
}
|
|
5533
|
+
*/
|
|
5523
5534
|
assign = commonUtil.assign.bind(commonUtil);
|
|
5524
5535
|
async asyncReplaceAll(string, pattern, asyncFn) {
|
|
5525
|
-
|
|
5536
|
+
const UtilsContext = this;
|
|
5526
5537
|
if (typeof string !== "string") {
|
|
5527
5538
|
throw new TypeError("string必须是字符串");
|
|
5528
5539
|
}
|
|
@@ -5594,18 +5605,18 @@
|
|
|
5594
5605
|
canvasElement.dispatchEvent(new MouseEvent("mouseup", eventInit));
|
|
5595
5606
|
}
|
|
5596
5607
|
checkUserClickInNode(element) {
|
|
5597
|
-
|
|
5608
|
+
const UtilsContext = this;
|
|
5598
5609
|
if (!UtilsContext.isDOM(element)) {
|
|
5599
5610
|
throw new Error("Utils.checkUserClickInNode 参数 targetNode 必须为 Element|Node 类型");
|
|
5600
5611
|
}
|
|
5601
|
-
|
|
5602
|
-
|
|
5603
|
-
|
|
5612
|
+
const clickEvent = UtilsContext.windowApi.window.event;
|
|
5613
|
+
const touchEvent = UtilsContext.windowApi.window.event;
|
|
5614
|
+
const $click = clickEvent?.composedPath()?.[0];
|
|
5604
5615
|
// 点击的x坐标
|
|
5605
|
-
|
|
5616
|
+
const clickPosX = clickEvent?.clientX != null ? clickEvent.clientX : touchEvent.touches[0].clientX;
|
|
5606
5617
|
// 点击的y坐标
|
|
5607
|
-
|
|
5608
|
-
|
|
5618
|
+
const clickPosY = clickEvent?.clientY != null ? clickEvent.clientY : touchEvent.touches[0].clientY;
|
|
5619
|
+
const {
|
|
5609
5620
|
/* 要检测的元素的相对屏幕的横坐标最左边 */
|
|
5610
5621
|
left: elementPosXLeft,
|
|
5611
5622
|
/* 要检测的元素的相对屏幕的横坐标最右边 */
|
|
@@ -5633,32 +5644,32 @@
|
|
|
5633
5644
|
* @param formData 需要clone的数据
|
|
5634
5645
|
*/
|
|
5635
5646
|
cloneFormData(formData, filterFn) {
|
|
5636
|
-
|
|
5637
|
-
|
|
5638
|
-
|
|
5647
|
+
const clonedFormData = new FormData();
|
|
5648
|
+
formData.forEach((value, key) => {
|
|
5649
|
+
const isFilter = typeof filterFn === "function" ? filterFn(key, value) : false;
|
|
5639
5650
|
if (typeof isFilter === "boolean" && isFilter) {
|
|
5640
|
-
|
|
5651
|
+
return;
|
|
5641
5652
|
}
|
|
5642
5653
|
clonedFormData.append(key, value);
|
|
5643
|
-
}
|
|
5654
|
+
});
|
|
5644
5655
|
return clonedFormData;
|
|
5645
5656
|
}
|
|
5646
5657
|
createOverload() {
|
|
5647
|
-
|
|
5658
|
+
const fnMap = new Map();
|
|
5648
5659
|
function overload(...args) {
|
|
5649
|
-
|
|
5650
|
-
|
|
5660
|
+
const key = args.map((it) => typeof it).join(",");
|
|
5661
|
+
const fn = fnMap.get(key);
|
|
5651
5662
|
if (!fn) {
|
|
5652
5663
|
throw new TypeError("没有找到对应的实现");
|
|
5653
5664
|
}
|
|
5654
5665
|
return fn.apply(this, args);
|
|
5655
5666
|
}
|
|
5656
5667
|
overload.addImpl = function (...args) {
|
|
5657
|
-
|
|
5668
|
+
const fn = args.pop();
|
|
5658
5669
|
if (typeof fn !== "function") {
|
|
5659
5670
|
throw new TypeError("最后一个参数必须是函数");
|
|
5660
5671
|
}
|
|
5661
|
-
|
|
5672
|
+
const key = args.join(",");
|
|
5662
5673
|
fnMap.set(key, fn);
|
|
5663
5674
|
};
|
|
5664
5675
|
return overload;
|
|
@@ -5675,7 +5686,7 @@
|
|
|
5675
5686
|
deepClone = commonUtil.deepClone.bind(commonUtil);
|
|
5676
5687
|
debounce(fn, delay = 0) {
|
|
5677
5688
|
let timer = null;
|
|
5678
|
-
|
|
5689
|
+
const UtilsContext = this;
|
|
5679
5690
|
return function (...args) {
|
|
5680
5691
|
UtilsContext.workerClearTimeout(timer);
|
|
5681
5692
|
timer = UtilsContext.workerSetTimeout(function () {
|
|
@@ -5684,7 +5695,7 @@
|
|
|
5684
5695
|
};
|
|
5685
5696
|
}
|
|
5686
5697
|
deleteParentNode(element, targetSelector) {
|
|
5687
|
-
|
|
5698
|
+
const UtilsContext = this;
|
|
5688
5699
|
if (element == null) {
|
|
5689
5700
|
return;
|
|
5690
5701
|
}
|
|
@@ -5695,7 +5706,7 @@
|
|
|
5695
5706
|
throw new Error("Utils.deleteParentNode 参数 targetSelector 必须为 string 类型");
|
|
5696
5707
|
}
|
|
5697
5708
|
let result = false;
|
|
5698
|
-
|
|
5709
|
+
const needRemoveDOM = domUtils.closest(element, targetSelector);
|
|
5699
5710
|
if (needRemoveDOM) {
|
|
5700
5711
|
needRemoveDOM.remove();
|
|
5701
5712
|
result = true;
|
|
@@ -5725,7 +5736,7 @@
|
|
|
5725
5736
|
eventNameList = [...eventName];
|
|
5726
5737
|
}
|
|
5727
5738
|
eventNameList.forEach((_eventName_) => {
|
|
5728
|
-
|
|
5739
|
+
const event = new Event(_eventName_);
|
|
5729
5740
|
if (details) {
|
|
5730
5741
|
Object.assign(event, details);
|
|
5731
5742
|
}
|
|
@@ -5733,7 +5744,7 @@
|
|
|
5733
5744
|
});
|
|
5734
5745
|
}
|
|
5735
5746
|
downloadBase64(base64Data, fileName, isIFrame = false) {
|
|
5736
|
-
|
|
5747
|
+
const UtilsContext = this;
|
|
5737
5748
|
if (typeof base64Data !== "string") {
|
|
5738
5749
|
throw new Error("Utils.downloadBase64 参数 base64Data 必须为 string 类型");
|
|
5739
5750
|
}
|
|
@@ -5765,7 +5776,7 @@
|
|
|
5765
5776
|
let strFound;
|
|
5766
5777
|
if (this.windowApi.globalThis.find) {
|
|
5767
5778
|
/* CODE FOR BROWSERS THAT SUPPORT window.find */
|
|
5768
|
-
|
|
5779
|
+
const windowFind = this.windowApi.self.find;
|
|
5769
5780
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
5770
5781
|
if (strFound && this.windowApi.self.getSelection && !this.windowApi.self.getSelection().anchorNode) {
|
|
5771
5782
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
@@ -5799,19 +5810,19 @@
|
|
|
5799
5810
|
return strFound ? true : false;
|
|
5800
5811
|
}
|
|
5801
5812
|
*findElementsWithText(element, text, filter) {
|
|
5802
|
-
|
|
5813
|
+
const that = this;
|
|
5803
5814
|
if (element.outerHTML.includes(text)) {
|
|
5804
5815
|
if (element.children.length === 0) {
|
|
5805
|
-
|
|
5816
|
+
const filterResult = typeof filter === "function" ? filter(element) : false;
|
|
5806
5817
|
if (!filterResult) {
|
|
5807
5818
|
yield element;
|
|
5808
5819
|
}
|
|
5809
5820
|
}
|
|
5810
5821
|
else {
|
|
5811
|
-
|
|
5812
|
-
for (
|
|
5822
|
+
const textElement = Array.from(element.childNodes).filter((ele) => ele.nodeType === Node.TEXT_NODE);
|
|
5823
|
+
for (const $child of textElement) {
|
|
5813
5824
|
if ($child.textContent.includes(text)) {
|
|
5814
|
-
|
|
5825
|
+
const filterResult = typeof filter === "function" ? filter(element) : false;
|
|
5815
5826
|
if (!filterResult) {
|
|
5816
5827
|
yield $child;
|
|
5817
5828
|
}
|
|
@@ -5820,7 +5831,7 @@
|
|
|
5820
5831
|
}
|
|
5821
5832
|
}
|
|
5822
5833
|
for (let index = 0; index < element.children.length; index++) {
|
|
5823
|
-
|
|
5834
|
+
const $child = element.children[index];
|
|
5824
5835
|
yield* that.findElementsWithText($child, text, filter);
|
|
5825
5836
|
}
|
|
5826
5837
|
}
|
|
@@ -5834,8 +5845,8 @@
|
|
|
5834
5845
|
findVisibleElement(element) {
|
|
5835
5846
|
let currentElement = element;
|
|
5836
5847
|
while (currentElement) {
|
|
5837
|
-
|
|
5838
|
-
if (
|
|
5848
|
+
const elementRect = currentElement.getBoundingClientRect();
|
|
5849
|
+
if (elementRect.length) {
|
|
5839
5850
|
return currentElement;
|
|
5840
5851
|
}
|
|
5841
5852
|
currentElement = currentElement.parentElement;
|
|
@@ -5849,7 +5860,7 @@
|
|
|
5849
5860
|
}
|
|
5850
5861
|
let result = 0;
|
|
5851
5862
|
let resultType = "KB";
|
|
5852
|
-
|
|
5863
|
+
const sizeData = {};
|
|
5853
5864
|
sizeData.B = 1;
|
|
5854
5865
|
sizeData.KB = 1024;
|
|
5855
5866
|
sizeData.MB = sizeData.KB * sizeData.KB;
|
|
@@ -5862,7 +5873,7 @@
|
|
|
5862
5873
|
sizeData.BB = sizeData.YB * sizeData.KB;
|
|
5863
5874
|
sizeData.NB = sizeData.BB * sizeData.KB;
|
|
5864
5875
|
sizeData.DB = sizeData.NB * sizeData.KB;
|
|
5865
|
-
for (
|
|
5876
|
+
for (const key in sizeData) {
|
|
5866
5877
|
result = byteSize / sizeData[key];
|
|
5867
5878
|
resultType = key;
|
|
5868
5879
|
if (sizeData.KB >= result) {
|
|
@@ -5875,7 +5886,7 @@
|
|
|
5875
5886
|
}
|
|
5876
5887
|
getNodeListValue(...args) {
|
|
5877
5888
|
let resultArray = [];
|
|
5878
|
-
for (
|
|
5889
|
+
for (const arg of args) {
|
|
5879
5890
|
let value = arg;
|
|
5880
5891
|
if (typeof arg === "function") {
|
|
5881
5892
|
/* 方法 */
|
|
@@ -5890,7 +5901,7 @@
|
|
|
5890
5901
|
}
|
|
5891
5902
|
getNonNullValue(...args) {
|
|
5892
5903
|
let resultValue = args[args.length - 1];
|
|
5893
|
-
|
|
5904
|
+
const UtilsContext = this;
|
|
5894
5905
|
for (const argValue of args) {
|
|
5895
5906
|
if (UtilsContext.isNotNull(argValue)) {
|
|
5896
5907
|
resultValue = argValue;
|
|
@@ -5900,7 +5911,7 @@
|
|
|
5900
5911
|
return resultValue;
|
|
5901
5912
|
}
|
|
5902
5913
|
formatTime(text = new Date(), formatType = "yyyy-MM-dd HH:mm:ss") {
|
|
5903
|
-
|
|
5914
|
+
const time = text == null ? new Date() : new Date(text);
|
|
5904
5915
|
/**
|
|
5905
5916
|
* 校验时间补0
|
|
5906
5917
|
* @param timeNum
|
|
@@ -5908,7 +5919,7 @@
|
|
|
5908
5919
|
*/
|
|
5909
5920
|
function checkTime(timeNum) {
|
|
5910
5921
|
if (timeNum < 10)
|
|
5911
|
-
return
|
|
5922
|
+
return `0${timeNum}`;
|
|
5912
5923
|
return timeNum;
|
|
5913
5924
|
}
|
|
5914
5925
|
/**
|
|
@@ -5919,7 +5930,7 @@
|
|
|
5919
5930
|
function timeSystemChange(hourNum) {
|
|
5920
5931
|
return hourNum > 12 ? hourNum - 12 : hourNum;
|
|
5921
5932
|
}
|
|
5922
|
-
|
|
5933
|
+
const timeRegexp = {
|
|
5923
5934
|
yyyy: time.getFullYear(),
|
|
5924
5935
|
/* 年 */
|
|
5925
5936
|
MM: checkTime(time.getMonth() + 1),
|
|
@@ -5936,7 +5947,7 @@
|
|
|
5936
5947
|
/* 秒 */
|
|
5937
5948
|
};
|
|
5938
5949
|
Object.keys(timeRegexp).forEach(function (key) {
|
|
5939
|
-
|
|
5950
|
+
const replaecRegexp = new RegExp(key, "g");
|
|
5940
5951
|
formatType = formatType.replace(replaecRegexp, timeRegexp[key]);
|
|
5941
5952
|
});
|
|
5942
5953
|
return formatType;
|
|
@@ -5948,12 +5959,12 @@
|
|
|
5948
5959
|
}
|
|
5949
5960
|
if (text.length === 8) {
|
|
5950
5961
|
/* 该字符串只有时分秒 */
|
|
5951
|
-
|
|
5952
|
-
text = today.getFullYear()
|
|
5962
|
+
const today = new Date();
|
|
5963
|
+
text = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()} ${text}`;
|
|
5953
5964
|
}
|
|
5954
5965
|
text = text.substring(0, 19);
|
|
5955
5966
|
text = text.replace(/-/g, "/");
|
|
5956
|
-
|
|
5967
|
+
const timestamp = new Date(text).getTime();
|
|
5957
5968
|
return timestamp;
|
|
5958
5969
|
}
|
|
5959
5970
|
/**
|
|
@@ -6003,16 +6014,16 @@
|
|
|
6003
6014
|
if (timestamp2.toString().length === 10) {
|
|
6004
6015
|
timestamp2 = timestamp2 * 1000;
|
|
6005
6016
|
}
|
|
6006
|
-
|
|
6007
|
-
|
|
6008
|
-
|
|
6009
|
-
|
|
6010
|
-
|
|
6011
|
-
|
|
6012
|
-
|
|
6013
|
-
|
|
6014
|
-
|
|
6015
|
-
|
|
6017
|
+
const smallTimeStamp = timestamp1 > timestamp2 ? timestamp2 : timestamp1;
|
|
6018
|
+
const bigTimeStamp = timestamp1 > timestamp2 ? timestamp1 : timestamp2;
|
|
6019
|
+
const oneSecond = 1000; /* 一秒的毫秒数 */
|
|
6020
|
+
const oneMinute = 60 * oneSecond; /* 一分钟的毫秒数 */
|
|
6021
|
+
const oneHour = 60 * oneMinute; /* 一小时的毫秒数 */
|
|
6022
|
+
const oneDay = 24 * oneHour; /* 一天的毫秒数 */
|
|
6023
|
+
const oneMonth = 30 * oneDay; /* 一个月的毫秒数(30天) */
|
|
6024
|
+
const oneYear = 12 * oneMonth; /* 一年的毫秒数 */
|
|
6025
|
+
const bigDate = new Date(bigTimeStamp);
|
|
6026
|
+
const smallDate = new Date(smallTimeStamp);
|
|
6016
6027
|
let remainderValue = 1;
|
|
6017
6028
|
if (type === "年") {
|
|
6018
6029
|
remainderValue = oneYear;
|
|
@@ -6034,30 +6045,30 @@
|
|
|
6034
6045
|
}
|
|
6035
6046
|
let diffValue = Math.round(Math.abs((bigDate - smallDate) / remainderValue));
|
|
6036
6047
|
if (type === "auto") {
|
|
6037
|
-
|
|
6048
|
+
const timeDifference = bigTimeStamp - smallTimeStamp;
|
|
6038
6049
|
diffValue = Math.floor(timeDifference / (24 * 3600 * 1000));
|
|
6039
6050
|
if (diffValue > 0) {
|
|
6040
|
-
diffValue = diffValue
|
|
6051
|
+
diffValue = `${diffValue}天`;
|
|
6041
6052
|
}
|
|
6042
6053
|
else {
|
|
6043
6054
|
/* 计算出小时数 */
|
|
6044
|
-
|
|
6045
|
-
|
|
6055
|
+
const leave1 = timeDifference % (24 * 3600 * 1000); /* 计算天数后剩余的毫秒数 */
|
|
6056
|
+
const hours = Math.floor(leave1 / (3600 * 1000));
|
|
6046
6057
|
if (hours > 0) {
|
|
6047
|
-
diffValue = hours
|
|
6058
|
+
diffValue = `${hours}小时`;
|
|
6048
6059
|
}
|
|
6049
6060
|
else {
|
|
6050
6061
|
/* 计算相差分钟数 */
|
|
6051
|
-
|
|
6052
|
-
|
|
6062
|
+
const leave2 = leave1 % (3600 * 1000); /* 计算小时数后剩余的毫秒数 */
|
|
6063
|
+
const minutes = Math.floor(leave2 / (60 * 1000));
|
|
6053
6064
|
if (minutes > 0) {
|
|
6054
|
-
diffValue = minutes
|
|
6065
|
+
diffValue = `${minutes}分钟`;
|
|
6055
6066
|
}
|
|
6056
6067
|
else {
|
|
6057
6068
|
/* 计算相差秒数 */
|
|
6058
|
-
|
|
6059
|
-
|
|
6060
|
-
diffValue = seconds
|
|
6069
|
+
const leave3 = leave2 % (60 * 1000); /* 计算分钟数后剩余的毫秒数 */
|
|
6070
|
+
const seconds = Math.round(leave3 / 1000);
|
|
6071
|
+
diffValue = `${seconds}秒`;
|
|
6061
6072
|
}
|
|
6062
6073
|
}
|
|
6063
6074
|
}
|
|
@@ -6065,14 +6076,14 @@
|
|
|
6065
6076
|
return diffValue;
|
|
6066
6077
|
}
|
|
6067
6078
|
getElementSelector(element) {
|
|
6068
|
-
|
|
6079
|
+
const UtilsContext = this;
|
|
6069
6080
|
if (!element)
|
|
6070
6081
|
return void 0;
|
|
6071
6082
|
if (!element.parentElement)
|
|
6072
6083
|
return void 0;
|
|
6073
6084
|
/* 如果元素有id属性,则直接返回id选择器 */
|
|
6074
6085
|
if (element.id)
|
|
6075
|
-
return
|
|
6086
|
+
return `#${element.id}`;
|
|
6076
6087
|
/* 递归地获取父元素的选择器 */
|
|
6077
6088
|
let selector = UtilsContext.getElementSelector(element.parentElement);
|
|
6078
6089
|
if (!selector) {
|
|
@@ -6080,11 +6091,11 @@
|
|
|
6080
6091
|
}
|
|
6081
6092
|
/* 如果有多个相同类型的兄弟元素,则需要添加索引 */
|
|
6082
6093
|
if (element.parentElement.querySelectorAll(element.tagName).length > 1) {
|
|
6083
|
-
|
|
6084
|
-
selector +=
|
|
6094
|
+
const index = Array.prototype.indexOf.call(element.parentElement.children, element) + 1;
|
|
6095
|
+
selector += ` > ${element.tagName.toLowerCase()}:nth-child(${index})`;
|
|
6085
6096
|
}
|
|
6086
6097
|
else {
|
|
6087
|
-
selector +=
|
|
6098
|
+
selector += ` > ${element.tagName.toLowerCase()}`;
|
|
6088
6099
|
}
|
|
6089
6100
|
return selector;
|
|
6090
6101
|
}
|
|
@@ -6095,15 +6106,15 @@
|
|
|
6095
6106
|
* > 2
|
|
6096
6107
|
*/
|
|
6097
6108
|
getMaxValue(...args) {
|
|
6098
|
-
|
|
6109
|
+
const result = [...args];
|
|
6099
6110
|
let newResult = [];
|
|
6100
6111
|
if (result.length === 0) {
|
|
6101
6112
|
return void 0;
|
|
6102
6113
|
}
|
|
6103
6114
|
if (result.length > 1) {
|
|
6104
6115
|
if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
|
|
6105
|
-
|
|
6106
|
-
|
|
6116
|
+
const data = result[0];
|
|
6117
|
+
const handleDataFunc = result[1];
|
|
6107
6118
|
Object.keys(data).forEach((keyName) => {
|
|
6108
6119
|
newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
|
|
6109
6120
|
});
|
|
@@ -6151,7 +6162,7 @@
|
|
|
6151
6162
|
*/
|
|
6152
6163
|
function queryMaxZIndex($ele) {
|
|
6153
6164
|
if (typeof ignoreCallBack === "function") {
|
|
6154
|
-
|
|
6165
|
+
const ignoreResult = ignoreCallBack($ele);
|
|
6155
6166
|
if (typeof ignoreResult === "boolean" && !ignoreResult) {
|
|
6156
6167
|
return;
|
|
6157
6168
|
}
|
|
@@ -6160,7 +6171,7 @@
|
|
|
6160
6171
|
const nodeStyle = UtilsContext.windowApi.window.getComputedStyle($ele);
|
|
6161
6172
|
/* 不对position为static和display为none的元素进行获取它们的z-index */
|
|
6162
6173
|
if (isVisibleNode(nodeStyle)) {
|
|
6163
|
-
|
|
6174
|
+
const nodeZIndex = parseInt(nodeStyle.zIndex);
|
|
6164
6175
|
if (!isNaN(nodeZIndex)) {
|
|
6165
6176
|
if (nodeZIndex > zIndex) {
|
|
6166
6177
|
// 赋值到全局
|
|
@@ -6176,7 +6187,7 @@
|
|
|
6176
6187
|
}
|
|
6177
6188
|
}
|
|
6178
6189
|
}
|
|
6179
|
-
target.querySelectorAll("*").forEach(($ele
|
|
6190
|
+
target.querySelectorAll("*").forEach(($ele) => {
|
|
6180
6191
|
queryMaxZIndex($ele);
|
|
6181
6192
|
});
|
|
6182
6193
|
zIndex += deviation;
|
|
@@ -6193,15 +6204,15 @@
|
|
|
6193
6204
|
return this.getMaxZIndexNodeInfo(deviation, target, ignoreCallBack).zIndex;
|
|
6194
6205
|
}
|
|
6195
6206
|
getMinValue(...args) {
|
|
6196
|
-
|
|
6207
|
+
const result = [...args];
|
|
6197
6208
|
let newResult = [];
|
|
6198
6209
|
if (result.length === 0) {
|
|
6199
6210
|
return void 0;
|
|
6200
6211
|
}
|
|
6201
6212
|
if (result.length > 1) {
|
|
6202
6213
|
if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
|
|
6203
|
-
|
|
6204
|
-
|
|
6214
|
+
const data = result[0];
|
|
6215
|
+
const handleDataFunc = result[1];
|
|
6205
6216
|
Object.keys(data).forEach((keyName) => {
|
|
6206
6217
|
newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
|
|
6207
6218
|
});
|
|
@@ -6231,8 +6242,8 @@
|
|
|
6231
6242
|
* > 'Mozilla/5.0 (Linux; Android 10; MI 13 Build/OPR1.170623.027; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.3490.40 Mobile Safari/537.36'
|
|
6232
6243
|
**/
|
|
6233
6244
|
getRandomAndroidUA() {
|
|
6234
|
-
|
|
6235
|
-
|
|
6245
|
+
const UtilsContext = this;
|
|
6246
|
+
const mobileNameList = [
|
|
6236
6247
|
"LDN-LX3",
|
|
6237
6248
|
"RNE-L03",
|
|
6238
6249
|
"ASUS_X00ID Build/NMF26F",
|
|
@@ -6249,14 +6260,14 @@
|
|
|
6249
6260
|
"MI 13 Build/OPR1.170623.027; wv",
|
|
6250
6261
|
];
|
|
6251
6262
|
/* 安卓版本 */
|
|
6252
|
-
|
|
6263
|
+
const androidVersion = UtilsContext.getRandomValue(12, 14);
|
|
6253
6264
|
/* 手机型号 */
|
|
6254
|
-
|
|
6265
|
+
const randomMobile = UtilsContext.getRandomValue(mobileNameList);
|
|
6255
6266
|
/* chrome大版本号 */
|
|
6256
|
-
|
|
6257
|
-
|
|
6258
|
-
|
|
6259
|
-
|
|
6267
|
+
const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
|
|
6268
|
+
const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
|
|
6269
|
+
const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
|
|
6270
|
+
const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
|
|
6260
6271
|
return `Mozilla/5.0 (Linux; Android ${androidVersion}; ${randomMobile}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Mobile Safari/537.36`;
|
|
6261
6272
|
}
|
|
6262
6273
|
/**
|
|
@@ -6278,20 +6289,20 @@
|
|
|
6278
6289
|
* > 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5068.19 Safari/537.36'
|
|
6279
6290
|
**/
|
|
6280
6291
|
getRandomPCUA() {
|
|
6281
|
-
|
|
6292
|
+
const UtilsContext = this;
|
|
6282
6293
|
/* chrome大版本号 */
|
|
6283
|
-
|
|
6284
|
-
|
|
6285
|
-
|
|
6286
|
-
|
|
6294
|
+
const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
|
|
6295
|
+
const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
|
|
6296
|
+
const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
|
|
6297
|
+
const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
|
|
6287
6298
|
return `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Safari/537.36`;
|
|
6288
6299
|
}
|
|
6289
6300
|
getRandomValue(...args) {
|
|
6290
|
-
|
|
6301
|
+
const result = [...args];
|
|
6291
6302
|
if (result.length > 1) {
|
|
6292
6303
|
if (result.length === 2 && typeof result[0] === "number" && typeof result[1] === "number") {
|
|
6293
|
-
|
|
6294
|
-
|
|
6304
|
+
const leftNumber = result[0] > result[1] ? result[1] : result[0];
|
|
6305
|
+
const rightNumber = result[0] > result[1] ? result[0] : result[1];
|
|
6295
6306
|
return Math.round(Math.random() * (rightNumber - leftNumber)) + leftNumber;
|
|
6296
6307
|
}
|
|
6297
6308
|
else {
|
|
@@ -6299,12 +6310,12 @@
|
|
|
6299
6310
|
}
|
|
6300
6311
|
}
|
|
6301
6312
|
else if (result.length === 1) {
|
|
6302
|
-
|
|
6313
|
+
const paramData = result[0];
|
|
6303
6314
|
if (Array.isArray(paramData)) {
|
|
6304
6315
|
return paramData[Math.floor(Math.random() * paramData.length)];
|
|
6305
6316
|
}
|
|
6306
6317
|
else if (typeof paramData === "object" && Object.keys(paramData).length > 0) {
|
|
6307
|
-
|
|
6318
|
+
const paramObjDataKey = Object.keys(paramData)[Math.floor(Math.random() * Object.keys(paramData).length)];
|
|
6308
6319
|
return paramData[paramObjDataKey];
|
|
6309
6320
|
}
|
|
6310
6321
|
else {
|
|
@@ -6320,7 +6331,7 @@
|
|
|
6320
6331
|
* Utils.getReactObj(document.querySelector("input"))?.reactProps?.onChange({target:{value:"123"}});
|
|
6321
6332
|
*/
|
|
6322
6333
|
getReactObj(element) {
|
|
6323
|
-
|
|
6334
|
+
const result = {};
|
|
6324
6335
|
if (element == null) {
|
|
6325
6336
|
return result;
|
|
6326
6337
|
}
|
|
@@ -6346,9 +6357,9 @@
|
|
|
6346
6357
|
if (typeof target !== "object") {
|
|
6347
6358
|
throw new TypeError("target不是一个对象");
|
|
6348
6359
|
}
|
|
6349
|
-
|
|
6360
|
+
const objectsSymbols = Object.getOwnPropertySymbols(target);
|
|
6350
6361
|
if (typeof keyName === "string") {
|
|
6351
|
-
|
|
6362
|
+
const findSymbol = objectsSymbols.find((key) => {
|
|
6352
6363
|
return key.toString() === keyName;
|
|
6353
6364
|
});
|
|
6354
6365
|
if (findSymbol) {
|
|
@@ -6356,7 +6367,7 @@
|
|
|
6356
6367
|
}
|
|
6357
6368
|
}
|
|
6358
6369
|
else if (typeof keyName === "symbol") {
|
|
6359
|
-
|
|
6370
|
+
const findSymbol = objectsSymbols.find((key) => {
|
|
6360
6371
|
return key === keyName;
|
|
6361
6372
|
});
|
|
6362
6373
|
if (findSymbol) {
|
|
@@ -6364,7 +6375,7 @@
|
|
|
6364
6375
|
}
|
|
6365
6376
|
}
|
|
6366
6377
|
else {
|
|
6367
|
-
|
|
6378
|
+
const result = {};
|
|
6368
6379
|
objectsSymbols.forEach((item) => {
|
|
6369
6380
|
result[item] = target[item];
|
|
6370
6381
|
});
|
|
@@ -6379,12 +6390,12 @@
|
|
|
6379
6390
|
* > 12
|
|
6380
6391
|
*/
|
|
6381
6392
|
getTextLength(text) {
|
|
6382
|
-
|
|
6383
|
-
|
|
6393
|
+
const encoder = new TextEncoder();
|
|
6394
|
+
const bytes = encoder.encode(text);
|
|
6384
6395
|
return bytes.length;
|
|
6385
6396
|
}
|
|
6386
6397
|
getTextStorageSize(text, addType = true) {
|
|
6387
|
-
|
|
6398
|
+
const UtilsContext = this;
|
|
6388
6399
|
return UtilsContext.formatByteToSize(UtilsContext.getTextLength(text), addType);
|
|
6389
6400
|
}
|
|
6390
6401
|
getThunderUrl(url) {
|
|
@@ -6397,88 +6408,75 @@
|
|
|
6397
6408
|
if (url.trim() === "") {
|
|
6398
6409
|
throw new TypeError("url不能为空字符串或纯空格");
|
|
6399
6410
|
}
|
|
6400
|
-
return `thunder://${this.windowApi.globalThis.btoa(
|
|
6411
|
+
return `thunder://${this.windowApi.globalThis.btoa(`AA${url}ZZ`)}`;
|
|
6401
6412
|
}
|
|
6402
6413
|
/**
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
|
|
6407
|
-
|
|
6408
|
-
|
|
6409
|
-
|
|
6410
|
-
|
|
6411
|
-
|
|
6412
|
-
|
|
6413
|
-
|
|
6414
|
-
|
|
6415
|
-
|
|
6416
|
-
|
|
6417
|
-
|
|
6418
|
-
|
|
6419
|
-
|
|
6420
|
-
|
|
6421
|
-
|
|
6422
|
-
|
|
6423
|
-
|
|
6424
|
-
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
|
|
6428
|
-
|
|
6414
|
+
* 对于GM_cookie的兼容写法,当无法使用GM_cookie时可以使用这个,但是并不完全兼容,有些写不出来且限制了httponly是无法访问的
|
|
6415
|
+
* @example
|
|
6416
|
+
let GM_cookie = new Utils.GM_Cookie();
|
|
6417
|
+
GM_cookie.list({name:"xxx_cookie_xxx"},function(cookies,error){
|
|
6418
|
+
if (!error) {
|
|
6419
|
+
console.log(cookies);
|
|
6420
|
+
console.log(cookies.value);
|
|
6421
|
+
} else {
|
|
6422
|
+
console.error(error);
|
|
6423
|
+
}
|
|
6424
|
+
});
|
|
6425
|
+
GM_cookie.set({name:"xxx_cookie_test_xxx",value:"这是Cookie测试值"},function(error){
|
|
6426
|
+
if (error) {
|
|
6427
|
+
console.error(error);
|
|
6428
|
+
} else {
|
|
6429
|
+
console.log('Cookie set successfully.');
|
|
6430
|
+
}
|
|
6431
|
+
})
|
|
6432
|
+
GM_cookie.delete({name:"xxx_cookie_test_xxx"},function(error){
|
|
6433
|
+
if (error) {
|
|
6434
|
+
console.error(error);
|
|
6435
|
+
} else {
|
|
6436
|
+
console.log('Cookie set successfully.');
|
|
6437
|
+
}
|
|
6438
|
+
})
|
|
6439
|
+
**/
|
|
6429
6440
|
GM_Cookie = UtilsGMCookie;
|
|
6430
6441
|
/**
|
|
6431
|
-
|
|
6432
|
-
|
|
6433
|
-
|
|
6434
|
-
|
|
6435
|
-
|
|
6436
|
-
|
|
6437
|
-
|
|
6438
|
-
|
|
6439
|
-
|
|
6440
|
-
|
|
6441
|
-
|
|
6442
|
-
|
|
6442
|
+
* 注册油猴菜单,要求本地存储的键名不能存在其它键名`GM_Menu_Local_Map`会冲突/覆盖
|
|
6443
|
+
* @example
|
|
6444
|
+
let GM_Menu = new Utils.GM_Menu({
|
|
6445
|
+
data: [
|
|
6446
|
+
{
|
|
6447
|
+
menu_key: "menu_key",
|
|
6448
|
+
text: "测试按钮",
|
|
6449
|
+
enable: true,
|
|
6450
|
+
accessKey: "a",
|
|
6451
|
+
autoClose: false,
|
|
6452
|
+
showText(text, enable) {
|
|
6453
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6454
|
+
},
|
|
6455
|
+
callback(data) {
|
|
6456
|
+
console.log("点击菜单,值修改为", data.enable);
|
|
6457
|
+
},
|
|
6443
6458
|
},
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
|
|
6447
|
-
|
|
6448
|
-
|
|
6449
|
-
|
|
6450
|
-
|
|
6451
|
-
|
|
6452
|
-
|
|
6453
|
-
|
|
6454
|
-
|
|
6455
|
-
|
|
6456
|
-
|
|
6457
|
-
|
|
6458
|
-
|
|
6459
|
-
|
|
6460
|
-
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
|
|
6464
|
-
|
|
6465
|
-
// 添加键为menu_key2的菜单项
|
|
6466
|
-
GM_Menu.add({
|
|
6467
|
-
key:"menu_key2",
|
|
6468
|
-
text: "测试按钮2",
|
|
6469
|
-
enable: false,
|
|
6470
|
-
showText(text,enable){
|
|
6471
|
-
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6472
|
-
},
|
|
6473
|
-
callback(data){
|
|
6474
|
-
console.log("点击菜单,值修改为",data.enable);
|
|
6475
|
-
}
|
|
6476
|
-
});
|
|
6477
|
-
// 使用数组的方式添加多个菜单,如menu_key3、menu_key4
|
|
6478
|
-
GM_Menu.add([
|
|
6479
|
-
{
|
|
6480
|
-
key:"menu_key3",
|
|
6481
|
-
text: "测试按钮3",
|
|
6459
|
+
],
|
|
6460
|
+
autoReload: false,
|
|
6461
|
+
GM_getValue,
|
|
6462
|
+
GM_setValue,
|
|
6463
|
+
GM_registerMenuCommand,
|
|
6464
|
+
GM_unregisterMenuCommand,
|
|
6465
|
+
});
|
|
6466
|
+
|
|
6467
|
+
|
|
6468
|
+
// 获取某个菜单项的值
|
|
6469
|
+
GM_Menu.get("menu_key");
|
|
6470
|
+
> true
|
|
6471
|
+
|
|
6472
|
+
// 获取某个菜单项的开启/关闭后显示的文本
|
|
6473
|
+
GM_Menu.getShowTextValue("menu_key");
|
|
6474
|
+
> √测试按钮
|
|
6475
|
+
|
|
6476
|
+
// 添加键为menu_key2的菜单项
|
|
6477
|
+
GM_Menu.add({
|
|
6478
|
+
key:"menu_key2",
|
|
6479
|
+
text: "测试按钮2",
|
|
6482
6480
|
enable: false,
|
|
6483
6481
|
showText(text,enable){
|
|
6484
6482
|
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
@@ -6486,152 +6484,165 @@
|
|
|
6486
6484
|
callback(data){
|
|
6487
6485
|
console.log("点击菜单,值修改为",data.enable);
|
|
6488
6486
|
}
|
|
6489
|
-
}
|
|
6490
|
-
|
|
6491
|
-
|
|
6492
|
-
|
|
6493
|
-
|
|
6494
|
-
|
|
6495
|
-
|
|
6487
|
+
});
|
|
6488
|
+
// 使用数组的方式添加多个菜单,如menu_key3、menu_key4
|
|
6489
|
+
GM_Menu.add([
|
|
6490
|
+
{
|
|
6491
|
+
key:"menu_key3",
|
|
6492
|
+
text: "测试按钮3",
|
|
6493
|
+
enable: false,
|
|
6494
|
+
showText(text,enable){
|
|
6495
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6496
|
+
},
|
|
6497
|
+
callback(data){
|
|
6498
|
+
console.log("点击菜单,值修改为",data.enable);
|
|
6499
|
+
}
|
|
6496
6500
|
},
|
|
6497
|
-
|
|
6498
|
-
|
|
6501
|
+
{
|
|
6502
|
+
key:"menu_key4",
|
|
6503
|
+
text: "测试按钮4",
|
|
6504
|
+
enable: false,
|
|
6505
|
+
showText(text,enable){
|
|
6506
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6507
|
+
},
|
|
6508
|
+
callback(data){
|
|
6509
|
+
console.log("点击菜单,值修改为",data.enable);
|
|
6510
|
+
}
|
|
6499
6511
|
}
|
|
6500
|
-
|
|
6501
|
-
|
|
6502
|
-
|
|
6503
|
-
|
|
6504
|
-
|
|
6505
|
-
|
|
6506
|
-
|
|
6507
|
-
|
|
6508
|
-
|
|
6509
|
-
|
|
6510
|
-
|
|
6511
|
-
|
|
6512
|
-
|
|
6512
|
+
]);
|
|
6513
|
+
|
|
6514
|
+
// 更新键为menu_key的显示文字和点击回调
|
|
6515
|
+
GM_Menu.update({
|
|
6516
|
+
menu_key:{
|
|
6517
|
+
text: "更新后的测试按钮",
|
|
6518
|
+
enable: true,
|
|
6519
|
+
showText(text,enable){
|
|
6520
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6521
|
+
},
|
|
6522
|
+
callback(data){
|
|
6523
|
+
console.log("点击菜单更新后的测试按钮,新值修改为",data.enable);
|
|
6524
|
+
}
|
|
6513
6525
|
}
|
|
6514
|
-
}
|
|
6515
|
-
|
|
6516
|
-
|
|
6517
|
-
|
|
6518
|
-
|
|
6519
|
-
**/
|
|
6526
|
+
});
|
|
6527
|
+
|
|
6528
|
+
// 删除键为menu_key的菜单
|
|
6529
|
+
GM_Menu.delete("menu_key");
|
|
6530
|
+
**/
|
|
6520
6531
|
GM_Menu = GMMenu;
|
|
6521
6532
|
/**
|
|
6522
|
-
|
|
6523
|
-
|
|
6524
|
-
|
|
6525
|
-
|
|
6526
|
-
|
|
6527
|
-
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
|
|
6534
|
-
|
|
6535
|
-
|
|
6536
|
-
|
|
6537
|
-
|
|
6538
|
-
|
|
6539
|
-
|
|
6540
|
-
|
|
6541
|
-
|
|
6542
|
-
|
|
6543
|
-
|
|
6544
|
-
|
|
6533
|
+
* 基于Function prototype,能够勾住和释放任何函数
|
|
6534
|
+
*
|
|
6535
|
+
* .hook
|
|
6536
|
+
* + realFunc {string} 用于保存原始函数的函数名称,用于unHook
|
|
6537
|
+
* + hookFunc {string} 替换的hook函数
|
|
6538
|
+
* + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
|
|
6539
|
+
* + methodName {string} 匿名函数需显式传入目标函数名eg:this.Begin = function(){....};}
|
|
6540
|
+
*
|
|
6541
|
+
* .unhook
|
|
6542
|
+
* + realFunc {string} 用于保存原始函数的函数名称,用于unHook
|
|
6543
|
+
* + funcName {string} 被Hook的函数名称
|
|
6544
|
+
* + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
|
|
6545
|
+
* @example
|
|
6546
|
+
let hook = new Utils.Hooks();
|
|
6547
|
+
hook.initEnv();
|
|
6548
|
+
function myFunction(){
|
|
6549
|
+
console.log("我自己需要执行的函数");
|
|
6550
|
+
}
|
|
6551
|
+
function testFunction(){
|
|
6552
|
+
console.log("正常执行的函数");
|
|
6553
|
+
}
|
|
6554
|
+
testFunction.hook(testFunction,myFunction,window);
|
|
6555
|
+
**/
|
|
6545
6556
|
Hooks = Hooks;
|
|
6546
6557
|
/**
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
|
|
6551
|
-
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
|
|
6557
|
-
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
|
|
6565
|
-
|
|
6566
|
-
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
|
|
6571
|
-
|
|
6572
|
-
|
|
6573
|
-
|
|
6574
|
-
|
|
6575
|
-
|
|
6576
|
-
|
|
6577
|
-
|
|
6578
|
-
|
|
6579
|
-
|
|
6580
|
-
|
|
6581
|
-
|
|
6582
|
-
|
|
6583
|
-
|
|
6558
|
+
* 为减少代码量和回调,把GM_xmlhttpRequest封装
|
|
6559
|
+
* 文档地址: https://www.tampermonkey.net/documentation.php?ext=iikm
|
|
6560
|
+
* 其中onloadstart、onprogress、onreadystatechange是回调形式,onabort、ontimeout、onerror可以设置全局回调函数
|
|
6561
|
+
* @param _GM_xmlHttpRequest_ 油猴中的GM_xmlhttpRequest
|
|
6562
|
+
* @example
|
|
6563
|
+
let httpx = new Utils.Httpx(GM_xmlhttpRequest);
|
|
6564
|
+
let postResp = await httpx.post({
|
|
6565
|
+
url:url,
|
|
6566
|
+
data:JSON.stringify({
|
|
6567
|
+
test:1
|
|
6568
|
+
}),
|
|
6569
|
+
timeout: 5000
|
|
6570
|
+
});
|
|
6571
|
+
console.log(postResp);
|
|
6572
|
+
> {
|
|
6573
|
+
status: true,
|
|
6574
|
+
data: {responseText: "...", response: xxx,...},
|
|
6575
|
+
msg: "请求完毕",
|
|
6576
|
+
type: "onload",
|
|
6577
|
+
}
|
|
6578
|
+
|
|
6579
|
+
if(postResp === "onload" && postResp.status){
|
|
6580
|
+
// onload
|
|
6581
|
+
}else if(postResp === "ontimeout"){
|
|
6582
|
+
// ontimeout
|
|
6583
|
+
}
|
|
6584
|
+
* @example
|
|
6585
|
+
// 也可以先配置全局参数
|
|
6586
|
+
let httpx = new Utils.Httpx(GM_xmlhttpRequest);
|
|
6587
|
+
httpx.config({
|
|
6588
|
+
timeout: 5000,
|
|
6589
|
+
async: false,
|
|
6590
|
+
responseType: "html",
|
|
6591
|
+
redirect: "follow",
|
|
6592
|
+
})
|
|
6593
|
+
// 优先级为 默认details < 全局details < 单独的details
|
|
6594
|
+
*/
|
|
6584
6595
|
Httpx = Httpx;
|
|
6585
6596
|
/**
|
|
6586
|
-
|
|
6587
|
-
|
|
6588
|
-
|
|
6589
|
-
|
|
6590
|
-
|
|
6591
|
-
|
|
6592
|
-
|
|
6593
|
-
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
|
|
6600
|
-
|
|
6601
|
-
|
|
6602
|
-
|
|
6603
|
-
|
|
6604
|
-
|
|
6605
|
-
|
|
6606
|
-
|
|
6607
|
-
|
|
6608
|
-
|
|
6609
|
-
|
|
6597
|
+
* 浏览器端的indexedDB操作封装
|
|
6598
|
+
* @example
|
|
6599
|
+
let db = new Utils.indexedDB('web_DB', 'nav_text')
|
|
6600
|
+
let data = {name:'管理员', roleId: 1, type: 1};
|
|
6601
|
+
db.save('list',data).then((resolve)=>{
|
|
6602
|
+
console.log(resolve,'存储成功')
|
|
6603
|
+
})
|
|
6604
|
+
|
|
6605
|
+
db.get('list').then((resolve)=>{
|
|
6606
|
+
console.log(resolve,'查询成功')
|
|
6607
|
+
})
|
|
6608
|
+
|
|
6609
|
+
db.getPaging('list',20,10).then((resolve)=>{
|
|
6610
|
+
console.log(resolve,'查询分页偏移第20,一共10行成功');
|
|
6611
|
+
})
|
|
6612
|
+
|
|
6613
|
+
db.delete('list').then(resolve=>{
|
|
6614
|
+
console.log(resolve,'删除成功---->>>>>>name')
|
|
6615
|
+
})
|
|
6616
|
+
|
|
6617
|
+
db.deleteAll().then(resolve=>{
|
|
6618
|
+
console.log(resolve,'清除数据库---->>>>>>name')
|
|
6619
|
+
})
|
|
6620
|
+
**/
|
|
6610
6621
|
indexedDB = indexedDB;
|
|
6611
6622
|
isNativeFunc(target) {
|
|
6612
6623
|
return Boolean(target.toString().match(/^function .*\(\) { \[native code\] }$/));
|
|
6613
6624
|
}
|
|
6614
6625
|
isNearBottom(...args) {
|
|
6615
6626
|
let nearBottomHeight = 50;
|
|
6616
|
-
|
|
6627
|
+
const checkWindow = () => {
|
|
6617
6628
|
// 已滚动的距离
|
|
6618
|
-
|
|
6629
|
+
const scrollTop = this.windowApi.window.pageYOffset || this.windowApi.document.documentElement.scrollTop;
|
|
6619
6630
|
// 视窗高度
|
|
6620
|
-
|
|
6631
|
+
const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
|
|
6621
6632
|
// 最大滚动距离
|
|
6622
|
-
|
|
6633
|
+
const maxScrollHeight = this.windowApi.document.documentElement.scrollHeight - nearBottomHeight;
|
|
6623
6634
|
return scrollTop + viewportHeight >= maxScrollHeight;
|
|
6624
6635
|
};
|
|
6625
|
-
|
|
6636
|
+
const checkNode = ($ele) => {
|
|
6626
6637
|
// 已滚动的距离
|
|
6627
|
-
|
|
6638
|
+
const scrollTop = $ele.scrollTop;
|
|
6628
6639
|
// 视窗高度
|
|
6629
|
-
|
|
6640
|
+
const viewportHeight = $ele.clientHeight;
|
|
6630
6641
|
// 最大滚动距离
|
|
6631
|
-
|
|
6642
|
+
const maxScrollHeight = $ele.scrollHeight - viewportHeight - nearBottomHeight;
|
|
6632
6643
|
return scrollTop >= maxScrollHeight;
|
|
6633
6644
|
};
|
|
6634
|
-
|
|
6645
|
+
const firstArg = args[0];
|
|
6635
6646
|
if (args.length === 0 || typeof args[0] === "number") {
|
|
6636
6647
|
// nearBottomHeight
|
|
6637
6648
|
//
|
|
@@ -6646,7 +6657,7 @@
|
|
|
6646
6657
|
return checkNode(args[0]);
|
|
6647
6658
|
}
|
|
6648
6659
|
else {
|
|
6649
|
-
throw new TypeError(
|
|
6660
|
+
throw new TypeError(`参数1类型错误${typeof firstArg}`);
|
|
6650
6661
|
}
|
|
6651
6662
|
}
|
|
6652
6663
|
/**
|
|
@@ -6676,7 +6687,7 @@
|
|
|
6676
6687
|
}
|
|
6677
6688
|
if (typeof target === "object") {
|
|
6678
6689
|
/* 也有种可能,这个jQuery对象是1.8.3版本的,页面中的jQuery是3.4.1版本的 */
|
|
6679
|
-
|
|
6690
|
+
const jQueryProps = [
|
|
6680
6691
|
"add",
|
|
6681
6692
|
"addBack",
|
|
6682
6693
|
"addClass",
|
|
@@ -6860,50 +6871,50 @@
|
|
|
6860
6871
|
*/
|
|
6861
6872
|
isNotNull = commonUtil.isNotNull.bind(commonUtil);
|
|
6862
6873
|
/**
|
|
6863
|
-
|
|
6864
|
-
|
|
6865
|
-
|
|
6866
|
-
|
|
6867
|
-
|
|
6868
|
-
|
|
6869
|
-
|
|
6870
|
-
|
|
6871
|
-
|
|
6872
|
-
|
|
6873
|
-
|
|
6874
|
-
|
|
6875
|
-
|
|
6876
|
-
|
|
6877
|
-
|
|
6878
|
-
|
|
6879
|
-
|
|
6880
|
-
|
|
6881
|
-
|
|
6882
|
-
|
|
6883
|
-
|
|
6884
|
-
|
|
6885
|
-
|
|
6886
|
-
|
|
6887
|
-
|
|
6888
|
-
|
|
6889
|
-
|
|
6890
|
-
|
|
6891
|
-
|
|
6892
|
-
|
|
6893
|
-
|
|
6894
|
-
|
|
6895
|
-
|
|
6896
|
-
|
|
6897
|
-
|
|
6898
|
-
|
|
6899
|
-
|
|
6900
|
-
|
|
6901
|
-
|
|
6902
|
-
|
|
6903
|
-
|
|
6904
|
-
|
|
6905
|
-
|
|
6906
|
-
|
|
6874
|
+
* 判断对象或数据是否为空
|
|
6875
|
+
* + `String`判空的值,如 ""、"null"、"undefined"、" "
|
|
6876
|
+
* + `Number`判空的值,如 0
|
|
6877
|
+
* + `Object`判空的值,如 {}、null、undefined
|
|
6878
|
+
* + `Array`(存在属性Symbol.iterator)判空的值,如 []
|
|
6879
|
+
* + `Boolean`判空的值,如false
|
|
6880
|
+
* + `Function`判空的值,如()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){}
|
|
6881
|
+
* @returns
|
|
6882
|
+
* + true 为空
|
|
6883
|
+
* + false 不为空
|
|
6884
|
+
* @example
|
|
6885
|
+
Utils.isNull({});
|
|
6886
|
+
> true
|
|
6887
|
+
* @example
|
|
6888
|
+
Utils.isNull([]);
|
|
6889
|
+
> true
|
|
6890
|
+
* @example
|
|
6891
|
+
Utils.isNull(" ");
|
|
6892
|
+
> true
|
|
6893
|
+
* @example
|
|
6894
|
+
Utils.isNull(function(){});
|
|
6895
|
+
> true
|
|
6896
|
+
* @example
|
|
6897
|
+
Utils.isNull(()=>{}));
|
|
6898
|
+
> true
|
|
6899
|
+
* @example
|
|
6900
|
+
Utils.isNull("undefined");
|
|
6901
|
+
> true
|
|
6902
|
+
* @example
|
|
6903
|
+
Utils.isNull("null");
|
|
6904
|
+
> true
|
|
6905
|
+
* @example
|
|
6906
|
+
Utils.isNull(" ", false);
|
|
6907
|
+
> true
|
|
6908
|
+
* @example
|
|
6909
|
+
Utils.isNull([1],[]);
|
|
6910
|
+
> false
|
|
6911
|
+
* @example
|
|
6912
|
+
Utils.isNull([],[1]);
|
|
6913
|
+
> false
|
|
6914
|
+
* @example
|
|
6915
|
+
Utils.isNull(false,[123]);
|
|
6916
|
+
> false
|
|
6917
|
+
**/
|
|
6907
6918
|
isNull = commonUtil.isNull.bind(commonUtil);
|
|
6908
6919
|
isThemeDark() {
|
|
6909
6920
|
return this.windowApi.globalThis.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
@@ -6932,15 +6943,15 @@
|
|
|
6932
6943
|
}
|
|
6933
6944
|
let result = true;
|
|
6934
6945
|
for (const domItem of needCheckDomList) {
|
|
6935
|
-
|
|
6946
|
+
const domDisplay = this.windowApi.window.getComputedStyle(domItem);
|
|
6936
6947
|
if (domDisplay.display === "none") {
|
|
6937
6948
|
result = false;
|
|
6938
6949
|
}
|
|
6939
6950
|
else {
|
|
6940
|
-
|
|
6951
|
+
const domClientRect = domItem.getBoundingClientRect();
|
|
6941
6952
|
if (inView) {
|
|
6942
|
-
|
|
6943
|
-
|
|
6953
|
+
const viewportWidth = this.windowApi.window.innerWidth || this.windowApi.document.documentElement.clientWidth;
|
|
6954
|
+
const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
|
|
6944
6955
|
result = !(domClientRect.right < 0 ||
|
|
6945
6956
|
domClientRect.left > viewportWidth ||
|
|
6946
6957
|
domClientRect.bottom < 0 ||
|
|
@@ -6959,11 +6970,11 @@
|
|
|
6959
6970
|
}
|
|
6960
6971
|
isWebView_Via() {
|
|
6961
6972
|
let result = true;
|
|
6962
|
-
|
|
6973
|
+
const UtilsContext = this;
|
|
6963
6974
|
if (typeof this.windowApi.top.window.via === "object") {
|
|
6964
6975
|
for (const key in Object.values(this.windowApi.top.window.via)) {
|
|
6965
6976
|
if (Reflect.has(this.windowApi.top.window.via, key)) {
|
|
6966
|
-
|
|
6977
|
+
const objValueFunc = this.windowApi.top.window.via[key];
|
|
6967
6978
|
if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
|
|
6968
6979
|
result = true;
|
|
6969
6980
|
}
|
|
@@ -6981,11 +6992,11 @@
|
|
|
6981
6992
|
}
|
|
6982
6993
|
isWebView_X() {
|
|
6983
6994
|
let result = true;
|
|
6984
|
-
|
|
6995
|
+
const UtilsContext = this;
|
|
6985
6996
|
if (typeof this.windowApi.top.window.mbrowser === "object") {
|
|
6986
6997
|
for (const key in Object.values(this.windowApi.top.window.mbrowser)) {
|
|
6987
6998
|
if (Reflect.has(this.windowApi.top.window.mbrowser, key)) {
|
|
6988
|
-
|
|
6999
|
+
const objValueFunc = this.windowApi.top.window.mbrowser[key];
|
|
6989
7000
|
if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
|
|
6990
7001
|
result = true;
|
|
6991
7002
|
}
|
|
@@ -7012,46 +7023,46 @@
|
|
|
7012
7023
|
return result;
|
|
7013
7024
|
}
|
|
7014
7025
|
/**
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
|
|
7018
|
-
|
|
7019
|
-
|
|
7020
|
-
|
|
7021
|
-
|
|
7022
|
-
|
|
7023
|
-
|
|
7024
|
-
|
|
7026
|
+
* 自动锁对象,用于循环判断运行的函数,在循环外new后使用,注意,如果函数内部存在异步操作,需要使用await
|
|
7027
|
+
* @example
|
|
7028
|
+
let lock = new Utils.LockFunction(()=>{console.log(1)}))
|
|
7029
|
+
lock.run();
|
|
7030
|
+
> 1
|
|
7031
|
+
* @example
|
|
7032
|
+
let lock = new Utils.LockFunction(()=>{console.log(1)}),true) -- 异步操作
|
|
7033
|
+
await lock.run();
|
|
7034
|
+
> 1
|
|
7035
|
+
**/
|
|
7025
7036
|
LockFunction = LockFunction;
|
|
7026
7037
|
/**
|
|
7027
|
-
|
|
7028
|
-
|
|
7029
|
-
|
|
7030
|
-
|
|
7031
|
-
|
|
7032
|
-
|
|
7033
|
-
|
|
7034
|
-
|
|
7035
|
-
|
|
7036
|
-
|
|
7037
|
-
|
|
7038
|
-
|
|
7039
|
-
|
|
7040
|
-
|
|
7041
|
-
|
|
7042
|
-
|
|
7043
|
-
|
|
7044
|
-
|
|
7045
|
-
|
|
7046
|
-
|
|
7047
|
-
|
|
7048
|
-
|
|
7049
|
-
|
|
7050
|
-
|
|
7051
|
-
|
|
7052
|
-
|
|
7053
|
-
|
|
7054
|
-
|
|
7038
|
+
* 日志对象
|
|
7039
|
+
* @param _GM_info_ 油猴管理器的API GM_info,或者是一个对象,如{"script":{name:"Utils.Log"}}
|
|
7040
|
+
* @example
|
|
7041
|
+
let log = new Utils.Log(GM_info);
|
|
7042
|
+
log.info("普通输出");
|
|
7043
|
+
> 普通输出
|
|
7044
|
+
|
|
7045
|
+
log.success("成功输出");
|
|
7046
|
+
> 成功输出
|
|
7047
|
+
|
|
7048
|
+
log.error("错误输出");
|
|
7049
|
+
> 错误输出
|
|
7050
|
+
|
|
7051
|
+
log.warn("警告输出");
|
|
7052
|
+
> 警告输出
|
|
7053
|
+
|
|
7054
|
+
log.tag = "自定义tag信息";
|
|
7055
|
+
log.info("自定义info的颜色","#e0e0e0");
|
|
7056
|
+
> 自定义info的颜色
|
|
7057
|
+
|
|
7058
|
+
log.config({
|
|
7059
|
+
successColor: "#31dc02",
|
|
7060
|
+
errorColor: "#e02d2d",
|
|
7061
|
+
infoColor: "black",
|
|
7062
|
+
})
|
|
7063
|
+
log.success("颜色为#31dc02");
|
|
7064
|
+
> 颜色为#31dc02
|
|
7065
|
+
*/
|
|
7055
7066
|
Log = Log;
|
|
7056
7067
|
mergeArrayToString(data, handleFunc) {
|
|
7057
7068
|
if (!(data instanceof Array)) {
|
|
@@ -7080,8 +7091,8 @@
|
|
|
7080
7091
|
return content;
|
|
7081
7092
|
}
|
|
7082
7093
|
mutationObserver(target, observer_config) {
|
|
7083
|
-
|
|
7084
|
-
|
|
7094
|
+
const UtilsContext = this;
|
|
7095
|
+
const default_obverser_config = {
|
|
7085
7096
|
/* 监听到元素有反馈,需执行的函数 */
|
|
7086
7097
|
callback: () => { },
|
|
7087
7098
|
config: {
|
|
@@ -7123,11 +7134,11 @@
|
|
|
7123
7134
|
immediate: false,
|
|
7124
7135
|
};
|
|
7125
7136
|
observer_config = UtilsContext.assign(default_obverser_config, observer_config);
|
|
7126
|
-
|
|
7137
|
+
const windowMutationObserver = this.windowApi.window.MutationObserver ||
|
|
7127
7138
|
this.windowApi.window.webkitMutationObserver ||
|
|
7128
7139
|
this.windowApi.window.MozMutationObserver;
|
|
7129
7140
|
// 观察者对象
|
|
7130
|
-
|
|
7141
|
+
const mutationObserver = new windowMutationObserver(function (mutations, observer) {
|
|
7131
7142
|
if (typeof observer_config.callback === "function") {
|
|
7132
7143
|
observer_config.callback(mutations, observer);
|
|
7133
7144
|
}
|
|
@@ -7140,7 +7151,7 @@
|
|
|
7140
7151
|
}
|
|
7141
7152
|
else if (UtilsContext.isJQuery(target)) {
|
|
7142
7153
|
/* 传入的参数是jQuery对象 */
|
|
7143
|
-
target.each((
|
|
7154
|
+
target.each((_, item) => {
|
|
7144
7155
|
mutationObserver.observe(item, observer_config.config);
|
|
7145
7156
|
});
|
|
7146
7157
|
}
|
|
@@ -7178,7 +7189,7 @@
|
|
|
7178
7189
|
threshold: [0.01, 0.99],
|
|
7179
7190
|
};
|
|
7180
7191
|
defaultOptions = this.assign(defaultOptions, options || {});
|
|
7181
|
-
|
|
7192
|
+
const intersectionObserver = new IntersectionObserver((entries, observer) => {
|
|
7182
7193
|
if (entries[0].isIntersecting) {
|
|
7183
7194
|
if (typeof callback === "function") {
|
|
7184
7195
|
callback(entries, observer);
|
|
@@ -7208,7 +7219,7 @@
|
|
|
7208
7219
|
return utils;
|
|
7209
7220
|
}
|
|
7210
7221
|
noConflictFunc(needReleaseObject, needReleaseName, functionNameList = [], release = true) {
|
|
7211
|
-
|
|
7222
|
+
const UtilsContext = this;
|
|
7212
7223
|
if (typeof needReleaseObject !== "object") {
|
|
7213
7224
|
throw new Error("Utils.noConflictFunc 参数 needReleaseObject 必须为 object 类型");
|
|
7214
7225
|
}
|
|
@@ -7218,7 +7229,7 @@
|
|
|
7218
7229
|
if (!Array.isArray(functionNameList)) {
|
|
7219
7230
|
throw new Error("Utils.noConflictFunc 参数 functionNameList 必须为 Array 类型");
|
|
7220
7231
|
}
|
|
7221
|
-
|
|
7232
|
+
const needReleaseKey = `__${needReleaseName}`;
|
|
7222
7233
|
/**
|
|
7223
7234
|
* 释放所有
|
|
7224
7235
|
*/
|
|
@@ -7306,7 +7317,9 @@
|
|
|
7306
7317
|
if (typeof dataUri !== "string") {
|
|
7307
7318
|
throw new Error("Utils.parseBase64ToBlob 参数 dataUri 必须为 string 类型");
|
|
7308
7319
|
}
|
|
7309
|
-
|
|
7320
|
+
const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
|
|
7321
|
+
let dataUriLength = dataUriBase64Str.length;
|
|
7322
|
+
const u8arr = new Uint8Array(dataUriLength);
|
|
7310
7323
|
while (dataUriLength--) {
|
|
7311
7324
|
u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
|
|
7312
7325
|
}
|
|
@@ -7321,7 +7334,9 @@
|
|
|
7321
7334
|
if (typeof fileName !== "string") {
|
|
7322
7335
|
throw new Error("Utils.parseBase64ToFile 参数 fileName 必须为 string 类型");
|
|
7323
7336
|
}
|
|
7324
|
-
|
|
7337
|
+
const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
|
|
7338
|
+
let dataUriLength = dataUriBase64Str.length;
|
|
7339
|
+
const u8arr = new Uint8Array(dataUriLength);
|
|
7325
7340
|
while (dataUriLength--) {
|
|
7326
7341
|
u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
|
|
7327
7342
|
}
|
|
@@ -7355,15 +7370,15 @@
|
|
|
7355
7370
|
}
|
|
7356
7371
|
parseCDATA(text = "") {
|
|
7357
7372
|
let result = "";
|
|
7358
|
-
|
|
7359
|
-
|
|
7373
|
+
const cdataRegexp = /<!\[CDATA\[([\s\S]*)\]\]>/;
|
|
7374
|
+
const cdataMatch = cdataRegexp.exec(text.trim());
|
|
7360
7375
|
if (cdataMatch && cdataMatch.length > 1) {
|
|
7361
7376
|
result = cdataMatch[cdataMatch.length - 1];
|
|
7362
7377
|
}
|
|
7363
7378
|
return result;
|
|
7364
7379
|
}
|
|
7365
7380
|
async parseFileToBase64(fileObj) {
|
|
7366
|
-
|
|
7381
|
+
const reader = new FileReader();
|
|
7367
7382
|
reader.readAsDataURL(fileObj);
|
|
7368
7383
|
return new Promise((resolve) => {
|
|
7369
7384
|
reader.onload = function (event) {
|
|
@@ -7372,14 +7387,14 @@
|
|
|
7372
7387
|
});
|
|
7373
7388
|
}
|
|
7374
7389
|
parseFromString(text, mimeType = "text/html") {
|
|
7375
|
-
|
|
7390
|
+
const parser = new DOMParser();
|
|
7376
7391
|
return parser.parseFromString(text, mimeType);
|
|
7377
7392
|
}
|
|
7378
7393
|
parseStringToRegExpString(text) {
|
|
7379
7394
|
if (typeof text !== "string") {
|
|
7380
7395
|
throw new TypeError("string必须是字符串");
|
|
7381
7396
|
}
|
|
7382
|
-
|
|
7397
|
+
const regString = text.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
|
|
7383
7398
|
return regString;
|
|
7384
7399
|
}
|
|
7385
7400
|
preventEvent(element, eventNameList = [], capture) {
|
|
@@ -7394,6 +7409,7 @@
|
|
|
7394
7409
|
}
|
|
7395
7410
|
if (arguments.length === 1) {
|
|
7396
7411
|
/* 直接阻止事件 */
|
|
7412
|
+
// eslint-disable-next-line prefer-rest-params
|
|
7397
7413
|
return stopEvent(arguments[0]);
|
|
7398
7414
|
}
|
|
7399
7415
|
else {
|
|
@@ -7409,11 +7425,11 @@
|
|
|
7409
7425
|
}
|
|
7410
7426
|
}
|
|
7411
7427
|
/**
|
|
7412
|
-
|
|
7413
|
-
|
|
7414
|
-
|
|
7415
|
-
|
|
7416
|
-
|
|
7428
|
+
* 在canvas元素节点上绘制进度圆圈
|
|
7429
|
+
* @example
|
|
7430
|
+
let progress = new Utils.Process({canvasNode:document.querySelector("canvas")});
|
|
7431
|
+
progress.draw();
|
|
7432
|
+
* **/
|
|
7417
7433
|
Progress = Progress;
|
|
7418
7434
|
registerTrustClickEvent(isTrustValue = true, filter) {
|
|
7419
7435
|
function trustEvent(event) {
|
|
@@ -7435,8 +7451,8 @@
|
|
|
7435
7451
|
}
|
|
7436
7452
|
const originalListener = EventTarget.prototype.addEventListener;
|
|
7437
7453
|
EventTarget.prototype.addEventListener = function (...args) {
|
|
7438
|
-
|
|
7439
|
-
|
|
7454
|
+
const type = args[0];
|
|
7455
|
+
const callback = args[1];
|
|
7440
7456
|
// let options = args[2];
|
|
7441
7457
|
if (filter(type)) {
|
|
7442
7458
|
if (typeof callback === "function") {
|
|
@@ -7445,7 +7461,7 @@
|
|
|
7445
7461
|
};
|
|
7446
7462
|
}
|
|
7447
7463
|
else if (typeof callback === "object" && "handleEvent" in callback) {
|
|
7448
|
-
|
|
7464
|
+
const oldHandleEvent = callback["handleEvent"];
|
|
7449
7465
|
args[1]["handleEvent"] = function (event) {
|
|
7450
7466
|
if (event == null) {
|
|
7451
7467
|
return;
|
|
@@ -7456,7 +7472,7 @@
|
|
|
7456
7472
|
event instanceof Proxy;
|
|
7457
7473
|
oldHandleEvent.call(this, trustEvent(event));
|
|
7458
7474
|
}
|
|
7459
|
-
catch
|
|
7475
|
+
catch {
|
|
7460
7476
|
Reflect.set(event, "isTrusted", isTrustValue);
|
|
7461
7477
|
}
|
|
7462
7478
|
};
|
|
@@ -7479,7 +7495,7 @@
|
|
|
7479
7495
|
return isNegative ? -reversedNum : reversedNum;
|
|
7480
7496
|
}
|
|
7481
7497
|
selectElementText(element, childTextNode, startIndex, endIndex) {
|
|
7482
|
-
|
|
7498
|
+
const range = this.windowApi.document.createRange();
|
|
7483
7499
|
range.selectNodeContents(element);
|
|
7484
7500
|
if (childTextNode) {
|
|
7485
7501
|
if (childTextNode.nodeType !== Node.TEXT_NODE) {
|
|
@@ -7490,7 +7506,7 @@
|
|
|
7490
7506
|
range.setEnd(childTextNode, endIndex);
|
|
7491
7507
|
}
|
|
7492
7508
|
}
|
|
7493
|
-
|
|
7509
|
+
const selection = this.windowApi.globalThis.getSelection();
|
|
7494
7510
|
if (selection) {
|
|
7495
7511
|
selection.removeAllRanges();
|
|
7496
7512
|
selection.addRange(range);
|
|
@@ -7518,7 +7534,7 @@
|
|
|
7518
7534
|
else {
|
|
7519
7535
|
textType = "text/plain";
|
|
7520
7536
|
}
|
|
7521
|
-
|
|
7537
|
+
const UtilsContext = this;
|
|
7522
7538
|
class UtilsClipboard {
|
|
7523
7539
|
#resolve;
|
|
7524
7540
|
#copyData;
|
|
@@ -7530,7 +7546,7 @@
|
|
|
7530
7546
|
}
|
|
7531
7547
|
async init() {
|
|
7532
7548
|
let copyStatus = false;
|
|
7533
|
-
|
|
7549
|
+
const requestPermissionStatus = await this.requestClipboardPermission();
|
|
7534
7550
|
console.log(requestPermissionStatus);
|
|
7535
7551
|
if (this.hasClipboard() && (this.hasClipboardWrite() || this.hasClipboardWriteText())) {
|
|
7536
7552
|
try {
|
|
@@ -7569,7 +7585,7 @@
|
|
|
7569
7585
|
*/
|
|
7570
7586
|
copyTextByTextArea() {
|
|
7571
7587
|
try {
|
|
7572
|
-
|
|
7588
|
+
const copyElement = UtilsContext.windowApi.document.createElement("textarea");
|
|
7573
7589
|
copyElement.value = this.#copyData;
|
|
7574
7590
|
copyElement.setAttribute("type", "text");
|
|
7575
7591
|
copyElement.setAttribute("style", "opacity:0;position:absolute;");
|
|
@@ -7589,20 +7605,17 @@
|
|
|
7589
7605
|
* 申请剪贴板权限
|
|
7590
7606
|
*/
|
|
7591
7607
|
requestClipboardPermission() {
|
|
7592
|
-
return new Promise((resolve
|
|
7608
|
+
return new Promise((resolve) => {
|
|
7593
7609
|
if (navigator.permissions && navigator.permissions.query) {
|
|
7594
7610
|
navigator.permissions
|
|
7595
7611
|
.query({
|
|
7596
7612
|
name: "clipboard-write",
|
|
7597
7613
|
})
|
|
7598
|
-
.then((
|
|
7614
|
+
.then(() => {
|
|
7599
7615
|
resolve(true);
|
|
7600
7616
|
})
|
|
7601
7617
|
.catch((error) => {
|
|
7602
|
-
console.error([
|
|
7603
|
-
"申请剪贴板权限失败,尝试直接写入👉",
|
|
7604
|
-
error.message ?? error.name ?? error.stack,
|
|
7605
|
-
]);
|
|
7618
|
+
console.error(["申请剪贴板权限失败,尝试直接写入👉", error.message ?? error.name ?? error.stack]);
|
|
7606
7619
|
resolve(false);
|
|
7607
7620
|
});
|
|
7608
7621
|
}
|
|
@@ -7629,7 +7642,7 @@
|
|
|
7629
7642
|
}
|
|
7630
7643
|
else {
|
|
7631
7644
|
/* 可复制对象 */
|
|
7632
|
-
|
|
7645
|
+
const textBlob = new Blob([this.#copyData], {
|
|
7633
7646
|
type: this.#copyDataType,
|
|
7634
7647
|
});
|
|
7635
7648
|
navigator.clipboard
|
|
@@ -7661,7 +7674,7 @@
|
|
|
7661
7674
|
});
|
|
7662
7675
|
}
|
|
7663
7676
|
setTimeout(callback, delayTime = 0) {
|
|
7664
|
-
|
|
7677
|
+
const UtilsContext = this;
|
|
7665
7678
|
if (typeof callback !== "function" && typeof callback !== "string") {
|
|
7666
7679
|
throw new TypeError("Utils.setTimeout 参数 callback 必须为 function|string 类型");
|
|
7667
7680
|
}
|
|
@@ -7675,7 +7688,7 @@
|
|
|
7675
7688
|
});
|
|
7676
7689
|
}
|
|
7677
7690
|
sleep(delayTime = 0) {
|
|
7678
|
-
|
|
7691
|
+
const UtilsContext = this;
|
|
7679
7692
|
if (typeof delayTime !== "number") {
|
|
7680
7693
|
throw new Error("Utils.sleep 参数 delayTime 必须为 number 类型");
|
|
7681
7694
|
}
|
|
@@ -7686,18 +7699,18 @@
|
|
|
7686
7699
|
});
|
|
7687
7700
|
}
|
|
7688
7701
|
dragSlider(selector, offsetX = this.windowApi.window.innerWidth) {
|
|
7689
|
-
|
|
7702
|
+
const UtilsContext = this;
|
|
7690
7703
|
function initMouseEvent(eventName, offSetX, offSetY) {
|
|
7691
|
-
|
|
7692
|
-
|
|
7704
|
+
const win = typeof unsafeWindow === "undefined" ? globalThis : unsafeWindow;
|
|
7705
|
+
const mouseEvent = UtilsContext.windowApi.document.createEvent("MouseEvents");
|
|
7693
7706
|
mouseEvent.initMouseEvent(eventName, true, true, win, 0, offSetX, offSetY, offSetX, offSetY, false, false, false, false, 0, null);
|
|
7694
7707
|
return mouseEvent;
|
|
7695
7708
|
}
|
|
7696
|
-
|
|
7709
|
+
const sliderElement = typeof selector === "string" ? domUtils.selector(selector) : selector;
|
|
7697
7710
|
if (!(sliderElement instanceof Node) || !(sliderElement instanceof Element)) {
|
|
7698
7711
|
throw new Error("Utils.dragSlider 参数selector 必须为Node/Element类型");
|
|
7699
7712
|
}
|
|
7700
|
-
|
|
7713
|
+
const rect = sliderElement.getBoundingClientRect(), x0 = rect.x || rect.left, y0 = rect.y || rect.top, x1 = x0 + offsetX, y1 = y0;
|
|
7701
7714
|
sliderElement.dispatchEvent(initMouseEvent("mousedown", x0, y0));
|
|
7702
7715
|
sliderElement.dispatchEvent(initMouseEvent("mousemove", x1, y1));
|
|
7703
7716
|
sliderElement.dispatchEvent(initMouseEvent("mouseleave", x1, y1));
|
|
@@ -7725,34 +7738,34 @@
|
|
|
7725
7738
|
console.error(err);
|
|
7726
7739
|
}
|
|
7727
7740
|
}
|
|
7728
|
-
exitFullScreen(
|
|
7729
|
-
if (
|
|
7730
|
-
return
|
|
7741
|
+
exitFullScreen($el = this.windowApi.document.documentElement) {
|
|
7742
|
+
if ($el.exitFullscreen) {
|
|
7743
|
+
return $el.exitFullscreen();
|
|
7731
7744
|
}
|
|
7732
|
-
else if (
|
|
7733
|
-
return
|
|
7745
|
+
else if ($el.msExitFullscreen) {
|
|
7746
|
+
return $el.msExitFullscreen();
|
|
7734
7747
|
}
|
|
7735
|
-
else if (
|
|
7736
|
-
return
|
|
7748
|
+
else if ($el.mozCancelFullScreen) {
|
|
7749
|
+
return $el.mozCancelFullScreen();
|
|
7737
7750
|
}
|
|
7738
|
-
else if (
|
|
7739
|
-
return
|
|
7751
|
+
else if ($el.webkitCancelFullScreen) {
|
|
7752
|
+
return $el.webkitCancelFullScreen();
|
|
7740
7753
|
}
|
|
7741
7754
|
else {
|
|
7742
|
-
return new Promise((
|
|
7755
|
+
return new Promise((_, reject) => {
|
|
7743
7756
|
reject(new TypeError("该浏览器不支持全屏API"));
|
|
7744
7757
|
});
|
|
7745
7758
|
}
|
|
7746
7759
|
}
|
|
7747
7760
|
sortListByProperty(data, getPropertyValueFunc, sortByDesc = true) {
|
|
7748
|
-
|
|
7761
|
+
const UtilsContext = this;
|
|
7749
7762
|
if (typeof getPropertyValueFunc !== "function" && typeof getPropertyValueFunc !== "string") {
|
|
7750
7763
|
throw new Error("Utils.sortListByProperty 参数 getPropertyValueFunc 必须为 function|string 类型");
|
|
7751
7764
|
}
|
|
7752
7765
|
if (typeof sortByDesc !== "boolean") {
|
|
7753
7766
|
throw new Error("Utils.sortListByProperty 参数 sortByDesc 必须为 boolean 类型");
|
|
7754
7767
|
}
|
|
7755
|
-
|
|
7768
|
+
const getObjValue = function (obj) {
|
|
7756
7769
|
return typeof getPropertyValueFunc === "string" ? obj[getPropertyValueFunc] : getPropertyValueFunc(obj);
|
|
7757
7770
|
};
|
|
7758
7771
|
/**
|
|
@@ -7761,9 +7774,9 @@
|
|
|
7761
7774
|
* @param {any} before_obj
|
|
7762
7775
|
* @returns
|
|
7763
7776
|
*/
|
|
7764
|
-
|
|
7765
|
-
|
|
7766
|
-
|
|
7777
|
+
const sortFunc = function (after_obj, before_obj) {
|
|
7778
|
+
const beforeValue = getObjValue(before_obj); /* 前 */
|
|
7779
|
+
const afterValue = getObjValue(after_obj); /* 后 */
|
|
7767
7780
|
if (sortByDesc) {
|
|
7768
7781
|
if (afterValue > beforeValue) {
|
|
7769
7782
|
return -1;
|
|
@@ -7792,19 +7805,18 @@
|
|
|
7792
7805
|
* @param nodeList 元素列表
|
|
7793
7806
|
* @param getNodeListFunc 获取元素列表的函数
|
|
7794
7807
|
*/
|
|
7795
|
-
|
|
7796
|
-
|
|
7808
|
+
const sortNodeFunc = function (nodeList, getNodeListFunc) {
|
|
7809
|
+
const nodeListLength = nodeList.length;
|
|
7797
7810
|
for (let i = 0; i < nodeListLength - 1; i++) {
|
|
7798
7811
|
for (let j = 0; j < nodeListLength - 1 - i; j++) {
|
|
7799
|
-
|
|
7800
|
-
|
|
7801
|
-
|
|
7802
|
-
|
|
7803
|
-
if ((sortByDesc == true && beforeValue < afterValue) ||
|
|
7804
|
-
(sortByDesc == false && beforeValue > afterValue)) {
|
|
7812
|
+
const beforeNode = nodeList[j];
|
|
7813
|
+
const afterNode = nodeList[j + 1];
|
|
7814
|
+
const beforeValue = getObjValue(beforeNode); /* 前 */
|
|
7815
|
+
const afterValue = getObjValue(afterNode); /* 后 */
|
|
7816
|
+
if ((sortByDesc == true && beforeValue < afterValue) || (sortByDesc == false && beforeValue > afterValue)) {
|
|
7805
7817
|
/* 升序/降序 */
|
|
7806
7818
|
/* 相邻元素两两对比 */
|
|
7807
|
-
|
|
7819
|
+
const temp = beforeNode.nextElementSibling;
|
|
7808
7820
|
afterNode.after(beforeNode);
|
|
7809
7821
|
if (temp == null) {
|
|
7810
7822
|
/* 如果为空,那么是最后一个元素,使用append */
|
|
@@ -7862,7 +7874,7 @@
|
|
|
7862
7874
|
return newTargetString;
|
|
7863
7875
|
}
|
|
7864
7876
|
startsWith(target, searchString, position = 0) {
|
|
7865
|
-
|
|
7877
|
+
const UtilsContext = this;
|
|
7866
7878
|
if (position > target.length) {
|
|
7867
7879
|
/* 超出目标字符串的长度 */
|
|
7868
7880
|
return false;
|
|
@@ -7906,7 +7918,7 @@
|
|
|
7906
7918
|
*/
|
|
7907
7919
|
toJSON = commonUtil.toJSON.bind(commonUtil);
|
|
7908
7920
|
toSearchParamsStr(obj, addPrefix) {
|
|
7909
|
-
|
|
7921
|
+
const UtilsContext = this;
|
|
7910
7922
|
let searhParamsStr = "";
|
|
7911
7923
|
if (Array.isArray(obj)) {
|
|
7912
7924
|
obj.forEach((item) => {
|
|
@@ -7914,7 +7926,7 @@
|
|
|
7914
7926
|
searhParamsStr += UtilsContext.toSearchParamsStr(item);
|
|
7915
7927
|
}
|
|
7916
7928
|
else {
|
|
7917
|
-
searhParamsStr +=
|
|
7929
|
+
searhParamsStr += `&${UtilsContext.toSearchParamsStr(item)}`;
|
|
7918
7930
|
}
|
|
7919
7931
|
});
|
|
7920
7932
|
}
|
|
@@ -7922,7 +7934,7 @@
|
|
|
7922
7934
|
searhParamsStr = new URLSearchParams(Object.entries(obj)).toString();
|
|
7923
7935
|
}
|
|
7924
7936
|
if (addPrefix && !searhParamsStr.startsWith("?")) {
|
|
7925
|
-
searhParamsStr =
|
|
7937
|
+
searhParamsStr = `?${searhParamsStr}`;
|
|
7926
7938
|
}
|
|
7927
7939
|
return searhParamsStr;
|
|
7928
7940
|
}
|
|
@@ -7970,7 +7982,7 @@
|
|
|
7970
7982
|
}
|
|
7971
7983
|
}
|
|
7972
7984
|
waitArrayLoopToEnd(data, handleFunc) {
|
|
7973
|
-
|
|
7985
|
+
const UtilsContext = this;
|
|
7974
7986
|
if (typeof handleFunc !== "function" && typeof handleFunc !== "string") {
|
|
7975
7987
|
throw new Error("Utils.waitArrayLoopToEnd 参数 handleDataFunction 必须为 function|string 类型");
|
|
7976
7988
|
}
|
|
@@ -7980,17 +7992,17 @@
|
|
|
7980
7992
|
}
|
|
7981
7993
|
wait(checkFn, timeout, parent) {
|
|
7982
7994
|
const UtilsContext = this;
|
|
7983
|
-
|
|
7995
|
+
const __timeout__ = typeof timeout === "number" ? timeout : 0;
|
|
7984
7996
|
return new Promise((resolve) => {
|
|
7985
|
-
|
|
7997
|
+
const observer = UtilsContext.mutationObserver(parent || UtilsContext.windowApi.document, {
|
|
7986
7998
|
config: {
|
|
7987
7999
|
subtree: true,
|
|
7988
8000
|
childList: true,
|
|
7989
8001
|
attributes: true,
|
|
7990
8002
|
},
|
|
7991
8003
|
immediate: true,
|
|
7992
|
-
callback(
|
|
7993
|
-
|
|
8004
|
+
callback(_, __observer__) {
|
|
8005
|
+
const result = checkFn();
|
|
7994
8006
|
if (result.success) {
|
|
7995
8007
|
// 取消观察器
|
|
7996
8008
|
if (typeof __observer__?.disconnect === "function") {
|
|
@@ -8014,9 +8026,9 @@
|
|
|
8014
8026
|
waitNode(...args) {
|
|
8015
8027
|
// 过滤掉undefined
|
|
8016
8028
|
args = args.filter((arg) => arg !== void 0);
|
|
8017
|
-
|
|
8029
|
+
const UtilsContext = this;
|
|
8018
8030
|
// 选择器
|
|
8019
|
-
|
|
8031
|
+
const selector = args[0];
|
|
8020
8032
|
// 父元素(监听的元素)
|
|
8021
8033
|
let parent = UtilsContext.windowApi.document;
|
|
8022
8034
|
// 超时时间
|
|
@@ -8026,7 +8038,7 @@
|
|
|
8026
8038
|
}
|
|
8027
8039
|
if (args.length === 1) ;
|
|
8028
8040
|
else if (args.length === 2) {
|
|
8029
|
-
|
|
8041
|
+
const secondParam = args[1];
|
|
8030
8042
|
if (typeof secondParam === "number") {
|
|
8031
8043
|
// "div",10000
|
|
8032
8044
|
timeout = secondParam;
|
|
@@ -8042,9 +8054,9 @@
|
|
|
8042
8054
|
else if (args.length === 3) {
|
|
8043
8055
|
// "div",document,10000
|
|
8044
8056
|
// 第二个参数,parent
|
|
8045
|
-
|
|
8057
|
+
const secondParam = args[1];
|
|
8046
8058
|
// 第三个参数,timeout
|
|
8047
|
-
|
|
8059
|
+
const thirdParam = args[2];
|
|
8048
8060
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8049
8061
|
parent = secondParam;
|
|
8050
8062
|
if (typeof thirdParam === "number") {
|
|
@@ -8063,9 +8075,9 @@
|
|
|
8063
8075
|
}
|
|
8064
8076
|
function getNode() {
|
|
8065
8077
|
if (Array.isArray(selector)) {
|
|
8066
|
-
|
|
8078
|
+
const result = [];
|
|
8067
8079
|
for (let index = 0; index < selector.length; index++) {
|
|
8068
|
-
|
|
8080
|
+
const node = domUtils.selector(selector[index]);
|
|
8069
8081
|
if (node) {
|
|
8070
8082
|
result.push(node);
|
|
8071
8083
|
}
|
|
@@ -8082,7 +8094,7 @@
|
|
|
8082
8094
|
}
|
|
8083
8095
|
}
|
|
8084
8096
|
return UtilsContext.wait(() => {
|
|
8085
|
-
|
|
8097
|
+
const node = getNode();
|
|
8086
8098
|
if (node) {
|
|
8087
8099
|
return {
|
|
8088
8100
|
success: true,
|
|
@@ -8100,9 +8112,9 @@
|
|
|
8100
8112
|
waitAnyNode(...args) {
|
|
8101
8113
|
// 过滤掉undefined
|
|
8102
8114
|
args = args.filter((arg) => arg !== void 0);
|
|
8103
|
-
|
|
8115
|
+
const UtilsContext = this;
|
|
8104
8116
|
// 选择器
|
|
8105
|
-
|
|
8117
|
+
const selectorList = args[0];
|
|
8106
8118
|
// 父元素(监听的元素)
|
|
8107
8119
|
let parent = UtilsContext.windowApi.document;
|
|
8108
8120
|
// 超时时间
|
|
@@ -8112,7 +8124,7 @@
|
|
|
8112
8124
|
}
|
|
8113
8125
|
if (args.length === 1) ;
|
|
8114
8126
|
else if (args.length === 2) {
|
|
8115
|
-
|
|
8127
|
+
const secondParam = args[1];
|
|
8116
8128
|
if (typeof secondParam === "number") {
|
|
8117
8129
|
// "div",10000
|
|
8118
8130
|
timeout = secondParam;
|
|
@@ -8128,9 +8140,9 @@
|
|
|
8128
8140
|
else if (args.length === 3) {
|
|
8129
8141
|
// "div",document,10000
|
|
8130
8142
|
// 第二个参数,parent
|
|
8131
|
-
|
|
8143
|
+
const secondParam = args[1];
|
|
8132
8144
|
// 第三个参数,timeout
|
|
8133
|
-
|
|
8145
|
+
const thirdParam = args[2];
|
|
8134
8146
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8135
8147
|
parent = secondParam;
|
|
8136
8148
|
if (typeof thirdParam === "number") {
|
|
@@ -8147,7 +8159,7 @@
|
|
|
8147
8159
|
else {
|
|
8148
8160
|
throw new TypeError("Utils.waitAnyNode 参数个数错误");
|
|
8149
8161
|
}
|
|
8150
|
-
|
|
8162
|
+
const promiseList = selectorList.map((selector) => {
|
|
8151
8163
|
return UtilsContext.waitNode(selector, parent, timeout);
|
|
8152
8164
|
});
|
|
8153
8165
|
return Promise.any(promiseList);
|
|
@@ -8155,9 +8167,9 @@
|
|
|
8155
8167
|
waitNodeList(...args) {
|
|
8156
8168
|
// 过滤掉undefined
|
|
8157
8169
|
args = args.filter((arg) => arg !== void 0);
|
|
8158
|
-
|
|
8170
|
+
const UtilsContext = this;
|
|
8159
8171
|
// 选择器数组
|
|
8160
|
-
|
|
8172
|
+
const selector = args[0];
|
|
8161
8173
|
// 父元素(监听的元素)
|
|
8162
8174
|
let parent = UtilsContext.windowApi.document;
|
|
8163
8175
|
// 超时时间
|
|
@@ -8167,7 +8179,7 @@
|
|
|
8167
8179
|
}
|
|
8168
8180
|
if (args.length === 1) ;
|
|
8169
8181
|
else if (args.length === 2) {
|
|
8170
|
-
|
|
8182
|
+
const secondParam = args[1];
|
|
8171
8183
|
if (typeof secondParam === "number") {
|
|
8172
8184
|
// "div",10000
|
|
8173
8185
|
timeout = secondParam;
|
|
@@ -8183,9 +8195,9 @@
|
|
|
8183
8195
|
else if (args.length === 3) {
|
|
8184
8196
|
// "div",document,10000
|
|
8185
8197
|
// 第二个参数,parent
|
|
8186
|
-
|
|
8198
|
+
const secondParam = args[1];
|
|
8187
8199
|
// 第三个参数,timeout
|
|
8188
|
-
|
|
8200
|
+
const thirdParam = args[2];
|
|
8189
8201
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8190
8202
|
parent = secondParam;
|
|
8191
8203
|
if (typeof thirdParam === "number") {
|
|
@@ -8204,9 +8216,9 @@
|
|
|
8204
8216
|
}
|
|
8205
8217
|
function getNodeList() {
|
|
8206
8218
|
if (Array.isArray(selector)) {
|
|
8207
|
-
|
|
8219
|
+
const result = [];
|
|
8208
8220
|
for (let index = 0; index < selector.length; index++) {
|
|
8209
|
-
|
|
8221
|
+
const nodeList = domUtils.selectorAll(selector[index], parent);
|
|
8210
8222
|
if (nodeList.length) {
|
|
8211
8223
|
result.push(nodeList);
|
|
8212
8224
|
}
|
|
@@ -8216,14 +8228,14 @@
|
|
|
8216
8228
|
}
|
|
8217
8229
|
}
|
|
8218
8230
|
else {
|
|
8219
|
-
|
|
8231
|
+
const nodeList = domUtils.selectorAll(selector, parent);
|
|
8220
8232
|
if (nodeList.length) {
|
|
8221
8233
|
return nodeList;
|
|
8222
8234
|
}
|
|
8223
8235
|
}
|
|
8224
8236
|
}
|
|
8225
8237
|
return UtilsContext.wait(() => {
|
|
8226
|
-
|
|
8238
|
+
const node = getNodeList();
|
|
8227
8239
|
if (node) {
|
|
8228
8240
|
return {
|
|
8229
8241
|
success: true,
|
|
@@ -8241,9 +8253,9 @@
|
|
|
8241
8253
|
waitAnyNodeList(...args) {
|
|
8242
8254
|
// 过滤掉undefined
|
|
8243
8255
|
args = args.filter((arg) => arg !== void 0);
|
|
8244
|
-
|
|
8256
|
+
const UtilsContext = this;
|
|
8245
8257
|
// 选择器数组
|
|
8246
|
-
|
|
8258
|
+
const selectorList = args[0];
|
|
8247
8259
|
// 父元素(监听的元素)
|
|
8248
8260
|
let parent = UtilsContext.windowApi.document;
|
|
8249
8261
|
// 超时时间
|
|
@@ -8253,7 +8265,7 @@
|
|
|
8253
8265
|
}
|
|
8254
8266
|
if (args.length === 1) ;
|
|
8255
8267
|
else if (args.length === 2) {
|
|
8256
|
-
|
|
8268
|
+
const secondParam = args[1];
|
|
8257
8269
|
if (typeof secondParam === "number") {
|
|
8258
8270
|
// "div",10000
|
|
8259
8271
|
timeout = secondParam;
|
|
@@ -8269,9 +8281,9 @@
|
|
|
8269
8281
|
else if (args.length === 3) {
|
|
8270
8282
|
// "div",document,10000
|
|
8271
8283
|
// 第二个参数,parent
|
|
8272
|
-
|
|
8284
|
+
const secondParam = args[1];
|
|
8273
8285
|
// 第三个参数,timeout
|
|
8274
|
-
|
|
8286
|
+
const thirdParam = args[2];
|
|
8275
8287
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8276
8288
|
parent = secondParam;
|
|
8277
8289
|
if (typeof thirdParam === "number") {
|
|
@@ -8288,7 +8300,7 @@
|
|
|
8288
8300
|
else {
|
|
8289
8301
|
throw new TypeError("Utils.waitAnyNodeList 参数个数错误");
|
|
8290
8302
|
}
|
|
8291
|
-
|
|
8303
|
+
const promiseList = selectorList.map((selector) => {
|
|
8292
8304
|
return UtilsContext.waitNodeList(selector, parent, timeout);
|
|
8293
8305
|
});
|
|
8294
8306
|
return Promise.any(promiseList);
|
|
@@ -8317,13 +8329,13 @@
|
|
|
8317
8329
|
});
|
|
8318
8330
|
}
|
|
8319
8331
|
waitPropertyByInterval(checkObj, checkPropertyName, intervalTimer = 250, maxTime = -1) {
|
|
8320
|
-
|
|
8332
|
+
const UtilsContext = this;
|
|
8321
8333
|
if (checkObj == null) {
|
|
8322
8334
|
throw new TypeError("checkObj 不能为空对象 ");
|
|
8323
8335
|
}
|
|
8324
8336
|
let isResolve = false;
|
|
8325
8337
|
return new Promise((resolve, reject) => {
|
|
8326
|
-
|
|
8338
|
+
const interval = UtilsContext.workerSetInterval(() => {
|
|
8327
8339
|
let obj = checkObj;
|
|
8328
8340
|
if (typeof checkObj === "function") {
|
|
8329
8341
|
obj = checkObj();
|
|
@@ -8356,7 +8368,7 @@
|
|
|
8356
8368
|
throw new Error("Utils.waitVueByInterval 参数element 不能为空");
|
|
8357
8369
|
}
|
|
8358
8370
|
let flag = false;
|
|
8359
|
-
|
|
8371
|
+
const UtilsContext = this;
|
|
8360
8372
|
try {
|
|
8361
8373
|
await UtilsContext.waitPropertyByInterval(element, function (targetElement) {
|
|
8362
8374
|
if (targetElement == null) {
|
|
@@ -8368,7 +8380,7 @@
|
|
|
8368
8380
|
if (propertyName == null) {
|
|
8369
8381
|
return true;
|
|
8370
8382
|
}
|
|
8371
|
-
|
|
8383
|
+
const vueObject = targetElement[vueName];
|
|
8372
8384
|
if (typeof propertyName === "string") {
|
|
8373
8385
|
if (propertyName in vueObject) {
|
|
8374
8386
|
flag = true;
|
|
@@ -8384,6 +8396,7 @@
|
|
|
8384
8396
|
}
|
|
8385
8397
|
return false;
|
|
8386
8398
|
}, timer, maxTime);
|
|
8399
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8387
8400
|
}
|
|
8388
8401
|
catch (error) {
|
|
8389
8402
|
return flag;
|
|
@@ -8442,7 +8455,7 @@
|
|
|
8442
8455
|
if (target == null) {
|
|
8443
8456
|
return;
|
|
8444
8457
|
}
|
|
8445
|
-
|
|
8458
|
+
const handleResult = handler(target);
|
|
8446
8459
|
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
|
|
8447
8460
|
return handleResult.data;
|
|
8448
8461
|
}
|
|
@@ -8455,10 +8468,10 @@
|
|
|
8455
8468
|
*/
|
|
8456
8469
|
async asyncQueryProperty(target, handler) {
|
|
8457
8470
|
if (target == null) {
|
|
8458
|
-
// @ts-
|
|
8471
|
+
// @ts-expect-error 空返回
|
|
8459
8472
|
return;
|
|
8460
8473
|
}
|
|
8461
|
-
|
|
8474
|
+
const handleResult = await handler(target);
|
|
8462
8475
|
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
|
|
8463
8476
|
return handleResult.data;
|
|
8464
8477
|
}
|
|
@@ -8566,6 +8579,7 @@
|
|
|
8566
8579
|
workerSetTimeout(callback, timeout = 0) {
|
|
8567
8580
|
try {
|
|
8568
8581
|
return setTimeout$1(callback, timeout);
|
|
8582
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8569
8583
|
}
|
|
8570
8584
|
catch (error) {
|
|
8571
8585
|
return this.windowApi.setTimeout(callback, timeout);
|
|
@@ -8580,8 +8594,10 @@
|
|
|
8580
8594
|
if (timeId != null) {
|
|
8581
8595
|
clearTimeout$1(timeId);
|
|
8582
8596
|
}
|
|
8597
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8583
8598
|
}
|
|
8584
8599
|
catch (error) {
|
|
8600
|
+
// console.log(error);
|
|
8585
8601
|
}
|
|
8586
8602
|
finally {
|
|
8587
8603
|
this.windowApi.clearTimeout(timeId);
|
|
@@ -8595,6 +8611,7 @@
|
|
|
8595
8611
|
workerSetInterval(callback, timeout = 0) {
|
|
8596
8612
|
try {
|
|
8597
8613
|
return setInterval(callback, timeout);
|
|
8614
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8598
8615
|
}
|
|
8599
8616
|
catch (error) {
|
|
8600
8617
|
return this.windowApi.setInterval(callback, timeout);
|
|
@@ -8609,8 +8626,10 @@
|
|
|
8609
8626
|
if (timeId != null) {
|
|
8610
8627
|
clearInterval(timeId);
|
|
8611
8628
|
}
|
|
8629
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8612
8630
|
}
|
|
8613
8631
|
catch (error) {
|
|
8632
|
+
// console.log(error);
|
|
8614
8633
|
}
|
|
8615
8634
|
finally {
|
|
8616
8635
|
this.windowApi.clearInterval(timeId);
|
|
@@ -8644,10 +8663,10 @@
|
|
|
8644
8663
|
.query({
|
|
8645
8664
|
name: "clipboard-read",
|
|
8646
8665
|
})
|
|
8647
|
-
.then((
|
|
8666
|
+
.then(() => {
|
|
8648
8667
|
readClipboardText();
|
|
8649
8668
|
})
|
|
8650
|
-
.catch((
|
|
8669
|
+
.catch(() => {
|
|
8651
8670
|
/* 该权限申请Api可能在该环境下不生效,尝试直接读取剪贴板 */
|
|
8652
8671
|
readClipboardText();
|
|
8653
8672
|
});
|
|
@@ -8684,7 +8703,7 @@
|
|
|
8684
8703
|
});
|
|
8685
8704
|
}
|
|
8686
8705
|
}
|
|
8687
|
-
|
|
8706
|
+
const utils = new Utils();
|
|
8688
8707
|
|
|
8689
8708
|
return utils;
|
|
8690
8709
|
|