@whitesev/utils 2.8.0 → 2.8.2
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 +896 -875
- package/dist/index.amd.js.map +1 -1
- package/dist/index.cjs.js +896 -875
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +896 -875
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +896 -875
- package/dist/index.iife.js.map +1 -1
- package/dist/index.system.js +896 -875
- package/dist/index.system.js.map +1 -1
- package/dist/index.umd.js +896 -875
- 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/index.ts +3 -0
- package/package.json +19 -8
- 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 +4773 -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.esm.js
CHANGED
|
@@ -7,7 +7,7 @@ class ColorConversion {
|
|
|
7
7
|
if (typeof str !== "string") {
|
|
8
8
|
return false;
|
|
9
9
|
}
|
|
10
|
-
if (!str.match(/^(
|
|
10
|
+
if (!str.match(/^(#|)[0-9a-fA-F]{6}$/)) {
|
|
11
11
|
return false;
|
|
12
12
|
}
|
|
13
13
|
return true;
|
|
@@ -21,18 +21,10 @@ class ColorConversion {
|
|
|
21
21
|
*/
|
|
22
22
|
hexToRgba(hex, opacity) {
|
|
23
23
|
if (!this.isHex(hex)) {
|
|
24
|
-
throw new TypeError(
|
|
24
|
+
throw new TypeError(`输入错误的hex:${hex}`);
|
|
25
25
|
}
|
|
26
26
|
return hex && hex.replace(/\s+/g, "").length === 7
|
|
27
|
-
?
|
|
28
|
-
parseInt("0x" + hex.slice(1, 3)) +
|
|
29
|
-
"," +
|
|
30
|
-
parseInt("0x" + hex.slice(3, 5)) +
|
|
31
|
-
"," +
|
|
32
|
-
parseInt("0x" + hex.slice(5, 7)) +
|
|
33
|
-
"," +
|
|
34
|
-
opacity +
|
|
35
|
-
")"
|
|
27
|
+
? `rgba(${parseInt(`0x${hex.slice(1, 3)}`)},${parseInt(`0x${hex.slice(3, 5)}`)},${parseInt(`0x${hex.slice(5, 7)}`)},${opacity})`
|
|
36
28
|
: "";
|
|
37
29
|
}
|
|
38
30
|
/**
|
|
@@ -41,14 +33,15 @@ class ColorConversion {
|
|
|
41
33
|
*/
|
|
42
34
|
hexToRgb(str) {
|
|
43
35
|
if (!this.isHex(str)) {
|
|
44
|
-
throw new TypeError(
|
|
36
|
+
throw new TypeError(`输入错误的hex:${str}`);
|
|
45
37
|
}
|
|
46
38
|
/* replace替换查找的到的字符串 */
|
|
47
39
|
str = str.replace("#", "");
|
|
48
40
|
/* match得到查询数组 */
|
|
49
|
-
|
|
41
|
+
const hxs = str.match(/../g);
|
|
50
42
|
for (let index = 0; index < 3; index++) {
|
|
51
|
-
|
|
43
|
+
const value = parseInt(hxs[index], 16);
|
|
44
|
+
Reflect.set(hxs, index, value);
|
|
52
45
|
}
|
|
53
46
|
return hxs;
|
|
54
47
|
}
|
|
@@ -60,16 +53,16 @@ class ColorConversion {
|
|
|
60
53
|
*/
|
|
61
54
|
rgbToHex(redValue, greenValue, blueValue) {
|
|
62
55
|
/* 验证输入的rgb值是否合法 */
|
|
63
|
-
|
|
56
|
+
const validPattern = /^\d{1,3}$/;
|
|
64
57
|
if (!validPattern.test(redValue.toString()) ||
|
|
65
58
|
!validPattern.test(greenValue.toString()) ||
|
|
66
59
|
!validPattern.test(blueValue.toString()))
|
|
67
60
|
throw new TypeError("输入错误的rgb颜色值");
|
|
68
|
-
|
|
61
|
+
const hexs = [redValue.toString(16), greenValue.toString(16), blueValue.toString(16)];
|
|
69
62
|
for (let index = 0; index < 3; index++)
|
|
70
63
|
if (hexs[index].length == 1)
|
|
71
|
-
hexs[index] =
|
|
72
|
-
return
|
|
64
|
+
hexs[index] = `0${hexs[index]}`;
|
|
65
|
+
return `#${hexs.join("")}`;
|
|
73
66
|
}
|
|
74
67
|
/**
|
|
75
68
|
* 获取颜色变暗或亮
|
|
@@ -78,11 +71,13 @@ class ColorConversion {
|
|
|
78
71
|
*/
|
|
79
72
|
getDarkColor(color, level) {
|
|
80
73
|
if (!this.isHex(color)) {
|
|
81
|
-
throw new TypeError(
|
|
74
|
+
throw new TypeError(`输入错误的hex:${color}`);
|
|
82
75
|
}
|
|
83
|
-
|
|
76
|
+
const rgbc = this.hexToRgb(color);
|
|
84
77
|
for (let index = 0; index < 3; index++) {
|
|
85
|
-
|
|
78
|
+
const rgbcItemValue = rgbc[index];
|
|
79
|
+
const value = Math.floor(Number(rgbcItemValue) * (1 - Number(level)));
|
|
80
|
+
Reflect.set(rgbc, index, value);
|
|
86
81
|
}
|
|
87
82
|
return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
|
|
88
83
|
}
|
|
@@ -93,40 +88,43 @@ class ColorConversion {
|
|
|
93
88
|
*/
|
|
94
89
|
getLightColor(color, level) {
|
|
95
90
|
if (!this.isHex(color)) {
|
|
96
|
-
throw new TypeError(
|
|
91
|
+
throw new TypeError(`输入错误的hex:${color}`);
|
|
97
92
|
}
|
|
98
|
-
|
|
93
|
+
const rgbc = this.hexToRgb(color);
|
|
99
94
|
for (let index = 0; index < 3; index++) {
|
|
100
|
-
|
|
95
|
+
const rgbcItemValue = Number(rgbc[index]);
|
|
96
|
+
const value = Math.floor(255 - rgbcItemValue * level + rgbcItemValue);
|
|
97
|
+
Reflect.set(rgbc, index, value);
|
|
101
98
|
}
|
|
102
99
|
return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
|
|
103
100
|
}
|
|
104
101
|
}
|
|
105
102
|
|
|
106
103
|
class GBKEncoder {
|
|
107
|
-
#data
|
|
104
|
+
#data;
|
|
108
105
|
#U2Ghash = {};
|
|
109
106
|
#G2Uhash = {};
|
|
110
107
|
constructor() {
|
|
111
|
-
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");
|
|
108
|
+
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");
|
|
112
109
|
let index = 0;
|
|
113
110
|
this.#data = dataText.match(/..../g);
|
|
114
111
|
for (let i = 0x81; i <= 0xfe; i++) {
|
|
115
112
|
for (let j = 0x40; j <= 0xfe; j++) {
|
|
116
|
-
this.#U2Ghash[this.#data[index++]] =
|
|
113
|
+
this.#U2Ghash[this.#data[index++]] = `%${i.toString(16)}%${j.toString(16)}`.toUpperCase();
|
|
117
114
|
}
|
|
118
115
|
}
|
|
119
|
-
for (
|
|
120
|
-
this.#
|
|
116
|
+
for (const key in this.#U2Ghash) {
|
|
117
|
+
const u2ghashValue = Reflect.get(this.#U2Ghash, key);
|
|
118
|
+
Reflect.set(this.#G2Uhash, u2ghashValue, key);
|
|
121
119
|
}
|
|
122
120
|
}
|
|
123
121
|
handleText(text) {
|
|
124
122
|
text = text
|
|
125
|
-
.replace(/#(\d+)\$/g, function (
|
|
123
|
+
.replace(/#(\d+)\$/g, function (_, b) {
|
|
126
124
|
return Array(+b + 3).join("#");
|
|
127
125
|
})
|
|
128
126
|
.replace(/#/g, "####")
|
|
129
|
-
.replace(/(\w\w):([\w#]+)(?:,|$)/g, function (
|
|
127
|
+
.replace(/(\w\w):([\w#]+)(?:,|$)/g, function (_, hd, dt) {
|
|
130
128
|
return dt.replace(/../g, function (a) {
|
|
131
129
|
if (a != "##") {
|
|
132
130
|
return hd + a;
|
|
@@ -146,8 +144,8 @@ class GBKEncoder {
|
|
|
146
144
|
* @param str
|
|
147
145
|
*/
|
|
148
146
|
encode(str) {
|
|
149
|
-
|
|
150
|
-
return [...str].reduce((result, val
|
|
147
|
+
const that = this;
|
|
148
|
+
return [...str].reduce((result, val) => {
|
|
151
149
|
return result + toGBK(val);
|
|
152
150
|
}, "");
|
|
153
151
|
function toGBK(val) {
|
|
@@ -156,7 +154,7 @@ class GBKEncoder {
|
|
|
156
154
|
const codePoint = val.codePointAt(i);
|
|
157
155
|
const code = String.fromCodePoint(codePoint);
|
|
158
156
|
let key = codePoint.toString(16);
|
|
159
|
-
key.length != 4 && (key =
|
|
157
|
+
key.length != 4 && (key = `000${key}`.match(/....$/)?.[0]);
|
|
160
158
|
/* Add up i by code.length */
|
|
161
159
|
i += code.length - 1;
|
|
162
160
|
/* If code is in ascii range */
|
|
@@ -170,9 +168,9 @@ class GBKEncoder {
|
|
|
170
168
|
continue;
|
|
171
169
|
}
|
|
172
170
|
/*
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
171
|
+
If 2 or more char combines to one visible code,
|
|
172
|
+
or just this code is not in GBK
|
|
173
|
+
*/
|
|
176
174
|
result += toGBK(`&#${codePoint};`);
|
|
177
175
|
}
|
|
178
176
|
return result;
|
|
@@ -183,18 +181,18 @@ class GBKEncoder {
|
|
|
183
181
|
* @param str
|
|
184
182
|
*/
|
|
185
183
|
decode(str) {
|
|
186
|
-
|
|
187
|
-
|
|
184
|
+
const GBKMatcher = /%[0-9A-F]{2}%[0-9A-F]{2}/;
|
|
185
|
+
const UTFMatcher = /%[0-9A-F]{2}/;
|
|
188
186
|
// let gbk = true;
|
|
189
187
|
let utf = true;
|
|
190
188
|
const that = this;
|
|
191
189
|
while (utf) {
|
|
192
|
-
|
|
193
|
-
|
|
190
|
+
const gbkMatch = str.match(GBKMatcher);
|
|
191
|
+
const utfMatch = str.match(UTFMatcher);
|
|
194
192
|
// gbk = Boolean(gbkMatch);
|
|
195
193
|
utf = Boolean(utfMatch);
|
|
196
194
|
if (gbkMatch && gbkMatch in that.#G2Uhash) {
|
|
197
|
-
str = str.replace(gbkMatch, String.fromCharCode(
|
|
195
|
+
str = str.replace(gbkMatch, String.fromCharCode(`0x${that.#G2Uhash[gbkMatch]}`));
|
|
198
196
|
}
|
|
199
197
|
else {
|
|
200
198
|
str = str.replace(utfMatch, decodeURIComponent(utfMatch));
|
|
@@ -208,7 +206,7 @@ const TryCatch = function (...args) {
|
|
|
208
206
|
/* 定义变量和函数 */
|
|
209
207
|
let callbackFunction = null;
|
|
210
208
|
let context = null;
|
|
211
|
-
let handleError = (
|
|
209
|
+
let handleError = () => { };
|
|
212
210
|
let defaultDetails = {
|
|
213
211
|
log: true,
|
|
214
212
|
};
|
|
@@ -240,7 +238,7 @@ const TryCatch = function (...args) {
|
|
|
240
238
|
run(callback, __context__) {
|
|
241
239
|
callbackFunction = callback;
|
|
242
240
|
context = __context__ || this;
|
|
243
|
-
|
|
241
|
+
const result = executeTryCatch(callbackFunction, handleError, context);
|
|
244
242
|
return result !== void 0 ? result : TryCatchCore;
|
|
245
243
|
},
|
|
246
244
|
};
|
|
@@ -264,8 +262,8 @@ const TryCatch = function (...args) {
|
|
|
264
262
|
catch (error) {
|
|
265
263
|
if (defaultDetails.log) {
|
|
266
264
|
callback = callback;
|
|
267
|
-
console.log(`%c ${callback?.name ? callback?.name : callback
|
|
268
|
-
console.log(`%c
|
|
265
|
+
console.log(`%c ${callback?.name ? callback?.name : `${callback}`} `, "color: #f20000");
|
|
266
|
+
console.log(`%c ${error}`, "color: #f20000");
|
|
269
267
|
console.trace(callback);
|
|
270
268
|
}
|
|
271
269
|
if (handleErrorFunc) {
|
|
@@ -284,9 +282,9 @@ const TryCatch = function (...args) {
|
|
|
284
282
|
|
|
285
283
|
class CommonUtil {
|
|
286
284
|
assign(target = {}, source = {}, isAdd = false) {
|
|
287
|
-
|
|
285
|
+
const UtilsContext = this;
|
|
288
286
|
if (Array.isArray(source)) {
|
|
289
|
-
|
|
287
|
+
const canTraverse = source.filter((item) => {
|
|
290
288
|
return typeof item === "object";
|
|
291
289
|
});
|
|
292
290
|
if (!canTraverse.length) {
|
|
@@ -302,34 +300,34 @@ class CommonUtil {
|
|
|
302
300
|
if (isAdd) {
|
|
303
301
|
for (const sourceKeyName in source) {
|
|
304
302
|
const targetKeyName = sourceKeyName;
|
|
305
|
-
|
|
306
|
-
|
|
303
|
+
const targetValue = Reflect.get(target, targetKeyName);
|
|
304
|
+
const sourceValue = Reflect.get(source, sourceKeyName);
|
|
307
305
|
if (typeof sourceValue === "object" &&
|
|
308
306
|
sourceValue != null &&
|
|
309
307
|
sourceKeyName in target &&
|
|
310
308
|
!UtilsContext.isDOM(sourceValue)) {
|
|
311
309
|
/* 源端的值是object类型,且不是元素节点 */
|
|
312
|
-
target
|
|
310
|
+
Reflect.set(target, sourceKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
|
|
313
311
|
continue;
|
|
314
312
|
}
|
|
315
|
-
target
|
|
313
|
+
Reflect.set(target, sourceKeyName, sourceValue);
|
|
316
314
|
}
|
|
317
315
|
}
|
|
318
316
|
else {
|
|
319
317
|
for (const targetKeyName in target) {
|
|
320
318
|
if (targetKeyName in source) {
|
|
321
|
-
|
|
322
|
-
|
|
319
|
+
const targetValue = Reflect.get(target, targetKeyName);
|
|
320
|
+
const sourceValue = Reflect.get(source, targetKeyName);
|
|
323
321
|
if (typeof sourceValue === "object" &&
|
|
324
322
|
sourceValue != null &&
|
|
325
323
|
!UtilsContext.isDOM(sourceValue) &&
|
|
326
324
|
Object.keys(sourceValue).length) {
|
|
327
325
|
/* 源端的值是object类型,且不是元素节点 */
|
|
328
|
-
target
|
|
326
|
+
Reflect.set(target, targetKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
|
|
329
327
|
continue;
|
|
330
328
|
}
|
|
331
329
|
/* 直接赋值 */
|
|
332
|
-
target
|
|
330
|
+
Reflect.set(target, targetKeyName, sourceValue);
|
|
333
331
|
}
|
|
334
332
|
}
|
|
335
333
|
}
|
|
@@ -337,7 +335,7 @@ class CommonUtil {
|
|
|
337
335
|
}
|
|
338
336
|
isNull(...args) {
|
|
339
337
|
let result = true;
|
|
340
|
-
|
|
338
|
+
const checkList = [...args];
|
|
341
339
|
for (const objItem of checkList) {
|
|
342
340
|
let itemResult = false;
|
|
343
341
|
if (objItem === null || objItem === undefined) {
|
|
@@ -363,11 +361,12 @@ class CommonUtil {
|
|
|
363
361
|
case "boolean":
|
|
364
362
|
itemResult = !objItem;
|
|
365
363
|
break;
|
|
366
|
-
case "function":
|
|
367
|
-
|
|
364
|
+
case "function": {
|
|
365
|
+
const funcStr = objItem.toString().replace(/\s/g, "");
|
|
368
366
|
/* 排除()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){} */
|
|
369
367
|
itemResult = Boolean(funcStr.match(/^\(.*?\)=>\{\}$|^function.*?\(.*?\)\{\}$/));
|
|
370
368
|
break;
|
|
369
|
+
}
|
|
371
370
|
}
|
|
372
371
|
}
|
|
373
372
|
result = result && itemResult;
|
|
@@ -388,18 +387,23 @@ class CommonUtil {
|
|
|
388
387
|
return target instanceof Node;
|
|
389
388
|
}
|
|
390
389
|
isNotNull(...args) {
|
|
391
|
-
|
|
390
|
+
const UtilsContext = this;
|
|
392
391
|
return !UtilsContext.isNull.apply(this, args);
|
|
393
392
|
}
|
|
394
393
|
deepClone(obj) {
|
|
395
|
-
|
|
394
|
+
const UtilsContext = this;
|
|
396
395
|
if (obj === void 0)
|
|
397
396
|
return void 0;
|
|
398
397
|
if (obj === null)
|
|
399
398
|
return null;
|
|
400
|
-
|
|
399
|
+
const clone = obj instanceof Array ? [] : {};
|
|
401
400
|
for (const [key, value] of Object.entries(obj)) {
|
|
402
|
-
|
|
401
|
+
if (typeof value === "object") {
|
|
402
|
+
Reflect.set(clone, key, UtilsContext.deepClone(value));
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
Reflect.set(clone, key, value);
|
|
406
|
+
}
|
|
403
407
|
}
|
|
404
408
|
return clone;
|
|
405
409
|
}
|
|
@@ -426,11 +430,11 @@ class CommonUtil {
|
|
|
426
430
|
}
|
|
427
431
|
TryCatch()
|
|
428
432
|
.config({ log: false })
|
|
429
|
-
.error((
|
|
433
|
+
.error(() => {
|
|
430
434
|
TryCatch()
|
|
431
435
|
.error(() => {
|
|
432
436
|
try {
|
|
433
|
-
result = new Function(
|
|
437
|
+
result = new Function(`return ${data}`)();
|
|
434
438
|
}
|
|
435
439
|
catch (error2) {
|
|
436
440
|
if (typeof errorCallBack === "function") {
|
|
@@ -441,14 +445,14 @@ class CommonUtil {
|
|
|
441
445
|
.run(() => {
|
|
442
446
|
if (data &&
|
|
443
447
|
/^[\],:{}\s]*$/.test(data
|
|
444
|
-
.replace(/\\(?:["
|
|
445
|
-
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][
|
|
448
|
+
.replace(/\\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
|
|
449
|
+
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?/g, "]")
|
|
446
450
|
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
|
|
447
|
-
result = new Function(
|
|
451
|
+
result = new Function(`return ${data}`)();
|
|
448
452
|
}
|
|
449
453
|
else {
|
|
450
454
|
if (typeof errorCallBack === "function") {
|
|
451
|
-
errorCallBack(new Error("target is not
|
|
455
|
+
errorCallBack(new Error("target is not JSON object"));
|
|
452
456
|
}
|
|
453
457
|
}
|
|
454
458
|
});
|
|
@@ -460,7 +464,7 @@ class CommonUtil {
|
|
|
460
464
|
return result;
|
|
461
465
|
}
|
|
462
466
|
}
|
|
463
|
-
|
|
467
|
+
const commonUtil = new CommonUtil();
|
|
464
468
|
|
|
465
469
|
class UtilsGMCookie {
|
|
466
470
|
windowApi = {
|
|
@@ -489,14 +493,14 @@ class UtilsGMCookie {
|
|
|
489
493
|
if (typeof cookieName !== "string") {
|
|
490
494
|
throw new TypeError("Utils.GMCookie.get 参数cookieName 必须为字符串");
|
|
491
495
|
}
|
|
492
|
-
|
|
496
|
+
const cookies = this.getCookiesList();
|
|
493
497
|
let findValue = void 0;
|
|
494
498
|
for (const cookieItem of cookies) {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
499
|
+
const item = cookieItem.trim();
|
|
500
|
+
const itemSplit = item.split("=");
|
|
501
|
+
const itemName = itemSplit[0];
|
|
498
502
|
itemSplit.splice(0, 1);
|
|
499
|
-
|
|
503
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
500
504
|
if (itemName === cookieName) {
|
|
501
505
|
findValue = {
|
|
502
506
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -526,7 +530,7 @@ class UtilsGMCookie {
|
|
|
526
530
|
if (option == null) {
|
|
527
531
|
throw new Error("Utils.GMCookie.list 参数不能为空");
|
|
528
532
|
}
|
|
529
|
-
|
|
533
|
+
const resultData = [];
|
|
530
534
|
try {
|
|
531
535
|
let defaultOption = {
|
|
532
536
|
url: this.windowApi.window.location.href,
|
|
@@ -535,16 +539,16 @@ class UtilsGMCookie {
|
|
|
535
539
|
path: "/",
|
|
536
540
|
};
|
|
537
541
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
538
|
-
|
|
542
|
+
const cookies = this.getCookiesList();
|
|
539
543
|
cookies.forEach((item) => {
|
|
540
544
|
item = item.trim();
|
|
541
|
-
|
|
542
|
-
|
|
545
|
+
const itemSplit = item.split("=");
|
|
546
|
+
const itemName = itemSplit[0];
|
|
543
547
|
itemSplit.splice(0, 1);
|
|
544
|
-
|
|
545
|
-
|
|
548
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
549
|
+
const nameRegexp = defaultOption.name instanceof RegExp
|
|
546
550
|
? defaultOption.name
|
|
547
|
-
: new RegExp(
|
|
551
|
+
: new RegExp(`^${defaultOption.name}`, "g");
|
|
548
552
|
if (itemName.match(nameRegexp)) {
|
|
549
553
|
resultData.push({
|
|
550
554
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -578,7 +582,7 @@ class UtilsGMCookie {
|
|
|
578
582
|
if (option == null) {
|
|
579
583
|
throw new Error("Utils.GMCookie.list 参数不能为空");
|
|
580
584
|
}
|
|
581
|
-
|
|
585
|
+
const resultData = [];
|
|
582
586
|
let defaultOption = {
|
|
583
587
|
url: this.windowApi.window.location.href,
|
|
584
588
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -586,16 +590,16 @@ class UtilsGMCookie {
|
|
|
586
590
|
path: "/",
|
|
587
591
|
};
|
|
588
592
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
589
|
-
|
|
593
|
+
const cookies = this.getCookiesList();
|
|
590
594
|
cookies.forEach((item) => {
|
|
591
595
|
item = item.trim();
|
|
592
|
-
|
|
593
|
-
|
|
596
|
+
const itemSplit = item.split("=");
|
|
597
|
+
const itemName = itemSplit[0];
|
|
594
598
|
itemSplit.splice(0, 1);
|
|
595
|
-
|
|
596
|
-
|
|
599
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
600
|
+
const nameRegexp = defaultOption.name instanceof RegExp
|
|
597
601
|
? defaultOption.name
|
|
598
|
-
: new RegExp(
|
|
602
|
+
: new RegExp(`^${defaultOption.name}`, "g");
|
|
599
603
|
if (itemName.match(nameRegexp)) {
|
|
600
604
|
resultData.push({
|
|
601
605
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -635,17 +639,12 @@ class UtilsGMCookie {
|
|
|
635
639
|
expirationDate: Math.floor(Date.now()) + 60 * 60 * 24 * 30,
|
|
636
640
|
};
|
|
637
641
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
638
|
-
|
|
642
|
+
const life = defaultOption.expirationDate
|
|
639
643
|
? defaultOption.expirationDate
|
|
640
644
|
: Math.floor(Date.now()) + 60 * 60 * 24 * 30;
|
|
641
|
-
let cookieStr = defaultOption.name
|
|
642
|
-
"=" +
|
|
643
|
-
decodeURIComponent(defaultOption.value) +
|
|
644
|
-
";expires=" +
|
|
645
|
-
new Date(life).toGMTString() +
|
|
646
|
-
"; path=/";
|
|
645
|
+
let cookieStr = `${defaultOption.name}=${decodeURIComponent(defaultOption.value)};expires=${new Date(life).toGMTString()}; path=/`;
|
|
647
646
|
if (commonUtil.isNull(defaultOption.domain)) {
|
|
648
|
-
cookieStr +=
|
|
647
|
+
cookieStr += `; domain=${defaultOption.domain}`;
|
|
649
648
|
}
|
|
650
649
|
this.windowApi.document.cookie = cookieStr;
|
|
651
650
|
}
|
|
@@ -697,14 +696,14 @@ class UtilsGMCookie {
|
|
|
697
696
|
if (cookieStr.trim() === "") {
|
|
698
697
|
return [];
|
|
699
698
|
}
|
|
700
|
-
|
|
701
|
-
|
|
699
|
+
const cookies = cookieStr.split(";");
|
|
700
|
+
const result = [];
|
|
702
701
|
for (const cookieItem of cookies) {
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
702
|
+
const item = cookieItem.trim();
|
|
703
|
+
const itemSplit = item.split("=");
|
|
704
|
+
const itemName = itemSplit[0];
|
|
706
705
|
itemSplit.splice(0, 1);
|
|
707
|
-
|
|
706
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
708
707
|
result.push({
|
|
709
708
|
key: itemName,
|
|
710
709
|
value: itemValue,
|
|
@@ -714,6 +713,7 @@ class UtilsGMCookie {
|
|
|
714
713
|
}
|
|
715
714
|
}
|
|
716
715
|
|
|
716
|
+
/* eslint-disable */
|
|
717
717
|
// ==UserScript==
|
|
718
718
|
// @name ajaxHooker
|
|
719
719
|
// @author cxxjackie
|
|
@@ -1764,15 +1764,15 @@ class GMMenu {
|
|
|
1764
1764
|
*/
|
|
1765
1765
|
init() {
|
|
1766
1766
|
for (let index = 0; index < this.$data.data.length; index++) {
|
|
1767
|
-
|
|
1767
|
+
const menuOption = this.$data.data[index]["data"];
|
|
1768
1768
|
menuOption.enable = Boolean(this.getLocalMenuData(menuOption.key, menuOption.enable));
|
|
1769
1769
|
if (typeof menuOption.showText !== "function") {
|
|
1770
1770
|
menuOption.showText = (menuText, menuEnable) => {
|
|
1771
1771
|
if (menuEnable) {
|
|
1772
|
-
return this.$emoji.success
|
|
1772
|
+
return `${this.$emoji.success} ${menuText}`;
|
|
1773
1773
|
}
|
|
1774
1774
|
else {
|
|
1775
|
-
return this.$emoji.error
|
|
1775
|
+
return `${this.$emoji.error} ${menuText}`;
|
|
1776
1776
|
}
|
|
1777
1777
|
};
|
|
1778
1778
|
}
|
|
@@ -1783,7 +1783,7 @@ class GMMenu {
|
|
|
1783
1783
|
* @param menuOptions 如果存在,使用它
|
|
1784
1784
|
*/
|
|
1785
1785
|
register(menuOptions) {
|
|
1786
|
-
|
|
1786
|
+
const that = this;
|
|
1787
1787
|
if (menuOptions == null) {
|
|
1788
1788
|
throw new TypeError("register菜单数据不能为空");
|
|
1789
1789
|
}
|
|
@@ -1791,9 +1791,9 @@ class GMMenu {
|
|
|
1791
1791
|
menuOptions = [menuOptions];
|
|
1792
1792
|
}
|
|
1793
1793
|
for (let index = 0; index < menuOptions.length; index++) {
|
|
1794
|
-
|
|
1794
|
+
const cloneMenuOptionData = commonUtil.deepClone(menuOptions[index].data);
|
|
1795
1795
|
const { showText, clickCallBack } = this.handleMenuData(cloneMenuOptionData);
|
|
1796
|
-
|
|
1796
|
+
const menuId = that.context.GM_Api.registerMenuCommand(showText, clickCallBack);
|
|
1797
1797
|
menuOptions[index].id = menuId;
|
|
1798
1798
|
cloneMenuOptionData.deleteMenu = function () {
|
|
1799
1799
|
that.context.GM_Api.unregisterMenuCommand(menuId);
|
|
@@ -1807,7 +1807,7 @@ class GMMenu {
|
|
|
1807
1807
|
* @param {string} key 键
|
|
1808
1808
|
*/
|
|
1809
1809
|
getLocalMenuData(key, defaultValue) {
|
|
1810
|
-
|
|
1810
|
+
const localData = this.context.GM_Api.getValue(this.$data.key, {});
|
|
1811
1811
|
if (key in localData) {
|
|
1812
1812
|
return localData[key];
|
|
1813
1813
|
}
|
|
@@ -1821,7 +1821,7 @@ class GMMenu {
|
|
|
1821
1821
|
* @param value 值
|
|
1822
1822
|
*/
|
|
1823
1823
|
setLocalMenuData(key, value) {
|
|
1824
|
-
|
|
1824
|
+
const localData = this.context.GM_Api.getValue(this.$data.key, {});
|
|
1825
1825
|
localData[key] = value;
|
|
1826
1826
|
this.context.GM_Api.setValue(this.$data.key, localData);
|
|
1827
1827
|
},
|
|
@@ -1834,10 +1834,10 @@ class GMMenu {
|
|
|
1834
1834
|
if (typeof menuOption.showText !== "function") {
|
|
1835
1835
|
menuOption.showText = (menuText, menuEnable) => {
|
|
1836
1836
|
if (menuEnable) {
|
|
1837
|
-
return this.$emoji.success
|
|
1837
|
+
return `${this.$emoji.success} ${menuText}`;
|
|
1838
1838
|
}
|
|
1839
1839
|
else {
|
|
1840
|
-
return this.$emoji.error
|
|
1840
|
+
return `${this.$emoji.error} ${menuText}`;
|
|
1841
1841
|
}
|
|
1842
1842
|
};
|
|
1843
1843
|
}
|
|
@@ -1848,12 +1848,12 @@ class GMMenu {
|
|
|
1848
1848
|
* @param menuOption
|
|
1849
1849
|
*/
|
|
1850
1850
|
handleMenuData(menuOption) {
|
|
1851
|
-
|
|
1852
|
-
|
|
1851
|
+
const that = this;
|
|
1852
|
+
const menuLocalDataItemKey = menuOption.key;
|
|
1853
1853
|
/* 菜单默认开启的状态 */
|
|
1854
|
-
|
|
1854
|
+
const defaultEnable = Boolean(this.getLocalMenuData(menuLocalDataItemKey, menuOption.enable));
|
|
1855
1855
|
/** 油猴菜单上显示的文本 */
|
|
1856
|
-
|
|
1856
|
+
const showText = menuOption.showText(menuOption.text, defaultEnable);
|
|
1857
1857
|
// const GMMenuOptions = {
|
|
1858
1858
|
// /**
|
|
1859
1859
|
// * 菜单的id
|
|
@@ -1883,7 +1883,7 @@ class GMMenu {
|
|
|
1883
1883
|
* @param event
|
|
1884
1884
|
*/
|
|
1885
1885
|
function clickCallBack(event) {
|
|
1886
|
-
|
|
1886
|
+
const localEnable = Boolean(that.getLocalMenuData(menuLocalDataItemKey, defaultEnable));
|
|
1887
1887
|
if (menuOption.isStoreValue) {
|
|
1888
1888
|
that.setLocalMenuData(menuLocalDataItemKey, !localEnable);
|
|
1889
1889
|
}
|
|
@@ -1996,7 +1996,7 @@ class GMMenu {
|
|
|
1996
1996
|
menuOptionList = [...menuOptionList, options];
|
|
1997
1997
|
}
|
|
1998
1998
|
menuOptionList.forEach((menuOption) => {
|
|
1999
|
-
|
|
1999
|
+
const oldMenuOption = this.MenuHandle.getMenuOption(menuOption.key);
|
|
2000
2000
|
if (oldMenuOption) {
|
|
2001
2001
|
// 覆盖
|
|
2002
2002
|
Object.assign(oldMenuOption, menuOption);
|
|
@@ -2164,42 +2164,42 @@ class Hooks {
|
|
|
2164
2164
|
* 在Function原型上添加自定义方法.hook和.unhook
|
|
2165
2165
|
*/
|
|
2166
2166
|
initEnv() {
|
|
2167
|
-
Function.prototype.hook = function (
|
|
2167
|
+
Function.prototype.hook = function (_, hookFunc, context) {
|
|
2168
2168
|
let _context = null; //函数上下文
|
|
2169
2169
|
let _funcName = null; //函数名
|
|
2170
2170
|
_context = context || window;
|
|
2171
2171
|
_funcName = getFuncName(this);
|
|
2172
|
-
_context[
|
|
2172
|
+
_context[`realFunc_${_funcName}`] = this;
|
|
2173
2173
|
if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {
|
|
2174
2174
|
console.log("Already has been hooked,unhook first");
|
|
2175
2175
|
return false;
|
|
2176
2176
|
}
|
|
2177
2177
|
function getFuncName(fn) {
|
|
2178
2178
|
// 获取函数名
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2179
|
+
const strFunc = fn.toString();
|
|
2180
|
+
const _regex = /function\s+(\w+)\s*\(/;
|
|
2181
|
+
const patten = strFunc.match(_regex);
|
|
2182
2182
|
if (patten) {
|
|
2183
2183
|
return patten[1];
|
|
2184
2184
|
}
|
|
2185
2185
|
return "";
|
|
2186
2186
|
}
|
|
2187
2187
|
try {
|
|
2188
|
-
new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
|
|
2189
|
-
let args = Array.prototype.slice.call(arguments, 0);
|
|
2190
|
-
let obj = this;
|
|
2191
|
-
hookFunc.apply(obj, args);
|
|
2192
|
-
return _context['realFunc_${_funcName}'].apply(obj, args);
|
|
2188
|
+
new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
|
|
2189
|
+
let args = Array.prototype.slice.call(arguments, 0);
|
|
2190
|
+
let obj = this;
|
|
2191
|
+
hookFunc.apply(obj, args);
|
|
2192
|
+
return _context['realFunc_${_funcName}'].apply(obj, args);
|
|
2193
2193
|
};`)(_context, _funcName, hookFunc);
|
|
2194
2194
|
_context[_funcName].prototype.isHooked = true;
|
|
2195
2195
|
return true;
|
|
2196
2196
|
}
|
|
2197
2197
|
catch (e) {
|
|
2198
|
-
console.log("Hook failed,check the params.");
|
|
2198
|
+
console.log("Hook failed,check the params.", e);
|
|
2199
2199
|
return false;
|
|
2200
2200
|
}
|
|
2201
2201
|
};
|
|
2202
|
-
Function.prototype.unhook = function (
|
|
2202
|
+
Function.prototype.unhook = function (_, funcName, context) {
|
|
2203
2203
|
let _context = null;
|
|
2204
2204
|
let _funcName = null;
|
|
2205
2205
|
_context = context || window;
|
|
@@ -2208,8 +2208,8 @@ class Hooks {
|
|
|
2208
2208
|
console.log("No function is hooked on");
|
|
2209
2209
|
return false;
|
|
2210
2210
|
}
|
|
2211
|
-
_context[_funcName] = _context[
|
|
2212
|
-
Reflect.deleteProperty(_context,
|
|
2211
|
+
_context[_funcName] = _context[`realFunc${_funcName}`];
|
|
2212
|
+
Reflect.deleteProperty(_context, `realFunc_${_funcName}`);
|
|
2213
2213
|
return true;
|
|
2214
2214
|
};
|
|
2215
2215
|
}
|
|
@@ -2217,10 +2217,10 @@ class Hooks {
|
|
|
2217
2217
|
* 删除在Function原型上添加的自定义方法.hook和.unhook
|
|
2218
2218
|
*/
|
|
2219
2219
|
cleanEnv() {
|
|
2220
|
-
if (
|
|
2220
|
+
if (Object.prototype.hasOwnProperty.call(Function.prototype, "hook")) {
|
|
2221
2221
|
Reflect.deleteProperty(Function.prototype, "hook");
|
|
2222
2222
|
}
|
|
2223
|
-
if (
|
|
2223
|
+
if (Object.prototype.hasOwnProperty.call(Function.prototype, "unhook")) {
|
|
2224
2224
|
Reflect.deleteProperty(Function.prototype, "unhook");
|
|
2225
2225
|
}
|
|
2226
2226
|
return true;
|
|
@@ -2236,7 +2236,7 @@ const GenerateUUID = function () {
|
|
|
2236
2236
|
}
|
|
2237
2237
|
else {
|
|
2238
2238
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (charStr) {
|
|
2239
|
-
|
|
2239
|
+
const randomValue = (Math.random() * 16) | 0, randomCharValue = charStr === "x" ? randomValue : (randomValue & 0x3) | 0x8;
|
|
2240
2240
|
return randomCharValue.toString(16);
|
|
2241
2241
|
});
|
|
2242
2242
|
}
|
|
@@ -2278,9 +2278,9 @@ class Httpx {
|
|
|
2278
2278
|
}
|
|
2279
2279
|
}
|
|
2280
2280
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2281
|
-
|
|
2281
|
+
const item = this.$config.configList[index];
|
|
2282
2282
|
if (typeof item.fn === "function") {
|
|
2283
|
-
|
|
2283
|
+
const result = await item.fn(details);
|
|
2284
2284
|
if (result == null) {
|
|
2285
2285
|
return;
|
|
2286
2286
|
}
|
|
@@ -2293,7 +2293,7 @@ class Httpx {
|
|
|
2293
2293
|
*/
|
|
2294
2294
|
add(fn) {
|
|
2295
2295
|
if (typeof fn === "function") {
|
|
2296
|
-
|
|
2296
|
+
const uuid = GenerateUUID();
|
|
2297
2297
|
this.$config.configList.push({
|
|
2298
2298
|
id: uuid,
|
|
2299
2299
|
fn: fn,
|
|
@@ -2310,7 +2310,7 @@ class Httpx {
|
|
|
2310
2310
|
*/
|
|
2311
2311
|
delete(id) {
|
|
2312
2312
|
if (typeof id === "string") {
|
|
2313
|
-
|
|
2313
|
+
const findIndex = this.$config.configList.findIndex((item) => item.id === id);
|
|
2314
2314
|
if (findIndex !== -1) {
|
|
2315
2315
|
this.$config.configList.splice(findIndex, 1);
|
|
2316
2316
|
return true;
|
|
@@ -2356,9 +2356,9 @@ class Httpx {
|
|
|
2356
2356
|
}
|
|
2357
2357
|
}
|
|
2358
2358
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2359
|
-
|
|
2359
|
+
const item = this.$config.configList[index];
|
|
2360
2360
|
if (typeof item.successFn === "function") {
|
|
2361
|
-
|
|
2361
|
+
const result = await item.successFn(response, details);
|
|
2362
2362
|
if (result == null) {
|
|
2363
2363
|
return;
|
|
2364
2364
|
}
|
|
@@ -2391,9 +2391,9 @@ class Httpx {
|
|
|
2391
2391
|
}
|
|
2392
2392
|
}
|
|
2393
2393
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2394
|
-
|
|
2394
|
+
const item = this.$config.configList[index];
|
|
2395
2395
|
if (typeof item.errorFn === "function") {
|
|
2396
|
-
|
|
2396
|
+
const result = await item.errorFn(data);
|
|
2397
2397
|
if (result == null) {
|
|
2398
2398
|
return;
|
|
2399
2399
|
}
|
|
@@ -2405,7 +2405,7 @@ class Httpx {
|
|
|
2405
2405
|
* 添加请求前的回调处理配置
|
|
2406
2406
|
*/
|
|
2407
2407
|
add(successFn, errorFn) {
|
|
2408
|
-
|
|
2408
|
+
const id = GenerateUUID();
|
|
2409
2409
|
this.$config.configList.push({
|
|
2410
2410
|
id: id,
|
|
2411
2411
|
successFn: successFn,
|
|
@@ -2419,7 +2419,7 @@ class Httpx {
|
|
|
2419
2419
|
*/
|
|
2420
2420
|
delete(id) {
|
|
2421
2421
|
if (typeof id === "string") {
|
|
2422
|
-
|
|
2422
|
+
const findIndex = this.$config.configList.findIndex((item) => item.id === id);
|
|
2423
2423
|
if (findIndex !== -1) {
|
|
2424
2424
|
this.$config.configList.splice(findIndex, 1);
|
|
2425
2425
|
return true;
|
|
@@ -2440,23 +2440,23 @@ class Httpx {
|
|
|
2440
2440
|
* 对请求的参数进行合并处理
|
|
2441
2441
|
*/
|
|
2442
2442
|
handleBeforeRequestOptionArgs(...args) {
|
|
2443
|
-
|
|
2443
|
+
const option = {
|
|
2444
2444
|
url: void 0,
|
|
2445
2445
|
};
|
|
2446
2446
|
if (typeof args[0] === "string") {
|
|
2447
2447
|
/* 传入的是url,转为配置 */
|
|
2448
|
-
|
|
2448
|
+
const url = args[0];
|
|
2449
2449
|
option.url = url;
|
|
2450
2450
|
if (typeof args[1] === "object") {
|
|
2451
2451
|
/* 处理第二个参数details */
|
|
2452
|
-
|
|
2452
|
+
const optionArg = args[1];
|
|
2453
2453
|
commonUtil.assign(option, optionArg, true);
|
|
2454
2454
|
option.url = url;
|
|
2455
2455
|
}
|
|
2456
2456
|
}
|
|
2457
2457
|
else {
|
|
2458
2458
|
/* 传入的是配置 */
|
|
2459
|
-
|
|
2459
|
+
const optionArg = args[0];
|
|
2460
2460
|
commonUtil.assign(option, optionArg, true);
|
|
2461
2461
|
}
|
|
2462
2462
|
return option;
|
|
@@ -2469,7 +2469,7 @@ class Httpx {
|
|
|
2469
2469
|
* @param reject promise抛出错误回调
|
|
2470
2470
|
*/
|
|
2471
2471
|
getRequestOption(method, userRequestOption, resolve, reject) {
|
|
2472
|
-
|
|
2472
|
+
const that = this;
|
|
2473
2473
|
let url = userRequestOption.url || this.context.#defaultRequestOption.url;
|
|
2474
2474
|
if (typeof url === "string") {
|
|
2475
2475
|
// 去除左右空格
|
|
@@ -2482,7 +2482,7 @@ class Httpx {
|
|
|
2482
2482
|
}
|
|
2483
2483
|
}
|
|
2484
2484
|
}
|
|
2485
|
-
|
|
2485
|
+
const requestOption = {
|
|
2486
2486
|
url: url,
|
|
2487
2487
|
method: (method || "GET").toString().toUpperCase().trim(),
|
|
2488
2488
|
timeout: userRequestOption.timeout || this.context.#defaultRequestOption.timeout,
|
|
@@ -2504,9 +2504,12 @@ class Httpx {
|
|
|
2504
2504
|
/* 对象使用深拷贝 */
|
|
2505
2505
|
fetchInit: commonUtil.deepClone(this.context.#defaultRequestOption.fetchInit),
|
|
2506
2506
|
allowInterceptConfig: {
|
|
2507
|
-
beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2508
|
-
|
|
2509
|
-
|
|
2507
|
+
beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2508
|
+
.beforeRequest,
|
|
2509
|
+
afterResponseSuccess: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2510
|
+
.afterResponseSuccess,
|
|
2511
|
+
afterResponseError: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2512
|
+
.afterResponseError,
|
|
2510
2513
|
},
|
|
2511
2514
|
user: userRequestOption.user || this.context.#defaultRequestOption.user,
|
|
2512
2515
|
password: userRequestOption.password || this.context.#defaultRequestOption.password,
|
|
@@ -2534,15 +2537,17 @@ class Httpx {
|
|
|
2534
2537
|
};
|
|
2535
2538
|
// 补全allowInterceptConfig参数
|
|
2536
2539
|
if (typeof userRequestOption.allowInterceptConfig === "boolean") {
|
|
2537
|
-
Object.keys(requestOption.allowInterceptConfig)
|
|
2540
|
+
const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
|
|
2541
|
+
allowInterceptConfigKeys.forEach((keyName) => {
|
|
2538
2542
|
Reflect.set(requestOption.allowInterceptConfig, keyName, userRequestOption.allowInterceptConfig);
|
|
2539
2543
|
});
|
|
2540
2544
|
}
|
|
2541
2545
|
else {
|
|
2542
2546
|
if (typeof userRequestOption.allowInterceptConfig === "object" &&
|
|
2543
2547
|
userRequestOption.allowInterceptConfig != null) {
|
|
2544
|
-
Object.keys(
|
|
2545
|
-
|
|
2548
|
+
const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
|
|
2549
|
+
allowInterceptConfigKeys.forEach((keyName) => {
|
|
2550
|
+
const value = Reflect.get(userRequestOption.allowInterceptConfig, keyName);
|
|
2546
2551
|
if (typeof value === "boolean" &&
|
|
2547
2552
|
Reflect.has(requestOption.allowInterceptConfig, keyName)) {
|
|
2548
2553
|
Reflect.set(requestOption.allowInterceptConfig, keyName, value);
|
|
@@ -2556,7 +2561,8 @@ class Httpx {
|
|
|
2556
2561
|
}
|
|
2557
2562
|
if (typeof requestOption.headers === "object") {
|
|
2558
2563
|
if (typeof userRequestOption.headers === "object") {
|
|
2559
|
-
Object.keys(
|
|
2564
|
+
const headerKeys = Object.keys(requestOption.headers);
|
|
2565
|
+
headerKeys.forEach((keyName) => {
|
|
2560
2566
|
if (keyName in requestOption.headers && userRequestOption.headers?.[keyName] == null) {
|
|
2561
2567
|
/* 在默认的header中存在,且设置它新的值为空,那么就是默认的值 */
|
|
2562
2568
|
Reflect.deleteProperty(requestOption.headers, keyName);
|
|
@@ -2574,8 +2580,9 @@ class Httpx {
|
|
|
2574
2580
|
if (typeof requestOption.fetchInit === "object") {
|
|
2575
2581
|
/* 使用assign替换且添加 */
|
|
2576
2582
|
if (typeof userRequestOption.fetchInit === "object") {
|
|
2577
|
-
Object.keys(
|
|
2578
|
-
|
|
2583
|
+
const fetchInitKeys = Object.keys(requestOption.fetchInit);
|
|
2584
|
+
fetchInitKeys.forEach((keyName) => {
|
|
2585
|
+
if (keyName in requestOption.fetchInit && Reflect.get(userRequestOption.fetchInit ?? {}, keyName) == null) {
|
|
2579
2586
|
/* 在默认的fetchInit中存在,且设置它新的值为空,那么就是默认的值 */
|
|
2580
2587
|
Reflect.deleteProperty(requestOption.fetchInit, keyName);
|
|
2581
2588
|
}
|
|
@@ -2600,7 +2607,7 @@ class Httpx {
|
|
|
2600
2607
|
try {
|
|
2601
2608
|
new URL(requestOption.url);
|
|
2602
2609
|
}
|
|
2603
|
-
catch
|
|
2610
|
+
catch {
|
|
2604
2611
|
if (requestOption.url.startsWith("//")) {
|
|
2605
2612
|
// 补充https:
|
|
2606
2613
|
requestOption.url = globalThis.location.protocol + requestOption.url;
|
|
@@ -2611,7 +2618,7 @@ class Httpx {
|
|
|
2611
2618
|
}
|
|
2612
2619
|
else {
|
|
2613
2620
|
// 补充origin+/
|
|
2614
|
-
requestOption.url = globalThis.location.origin
|
|
2621
|
+
requestOption.url = `${globalThis.location.origin}/${requestOption.url}`;
|
|
2615
2622
|
}
|
|
2616
2623
|
}
|
|
2617
2624
|
if (requestOption.fetchInit && !requestOption.fetch) {
|
|
@@ -2621,12 +2628,12 @@ class Httpx {
|
|
|
2621
2628
|
// 转换data类型
|
|
2622
2629
|
try {
|
|
2623
2630
|
/** 是否对数据进行处理 */
|
|
2624
|
-
|
|
2631
|
+
const processData = userRequestOption.processData ?? true;
|
|
2625
2632
|
if (requestOption.data != null && processData) {
|
|
2626
|
-
|
|
2633
|
+
const method = requestOption.method;
|
|
2627
2634
|
if (method === "GET" || method === "HEAD") {
|
|
2628
2635
|
// GET类型,data如果有,那么需要转为searchParams
|
|
2629
|
-
|
|
2636
|
+
const urlObj = new URL(requestOption.url);
|
|
2630
2637
|
let urlSearch = "";
|
|
2631
2638
|
let isHandler = false;
|
|
2632
2639
|
if (typeof requestOption.data === "string") {
|
|
@@ -2636,7 +2643,7 @@ class Httpx {
|
|
|
2636
2643
|
else if (typeof requestOption.data === "object") {
|
|
2637
2644
|
isHandler = true;
|
|
2638
2645
|
// URLSearchParams参数可以转普通的string:string,包括FormData
|
|
2639
|
-
|
|
2646
|
+
const searchParams = new URLSearchParams(requestOption.data);
|
|
2640
2647
|
urlSearch = searchParams.toString();
|
|
2641
2648
|
}
|
|
2642
2649
|
if (isHandler) {
|
|
@@ -2657,7 +2664,7 @@ class Httpx {
|
|
|
2657
2664
|
}
|
|
2658
2665
|
else {
|
|
2659
2666
|
// xxx=xxx&xxx=
|
|
2660
|
-
urlObj.search = urlObj.search
|
|
2667
|
+
urlObj.search = `${urlObj.search}&${urlSearch}`;
|
|
2661
2668
|
}
|
|
2662
2669
|
}
|
|
2663
2670
|
}
|
|
@@ -2665,14 +2672,14 @@ class Httpx {
|
|
|
2665
2672
|
}
|
|
2666
2673
|
else if (method === "POST" && requestOption.headers != null) {
|
|
2667
2674
|
// POST类型,data如果是FormData,那么需要转为string
|
|
2668
|
-
|
|
2669
|
-
|
|
2675
|
+
const headersKeyList = Object.keys(requestOption.headers);
|
|
2676
|
+
const ContentTypeIndex = headersKeyList.findIndex((headerKey) => {
|
|
2670
2677
|
return (headerKey.trim().toLowerCase() === "content-type" &&
|
|
2671
2678
|
typeof requestOption.headers[headerKey] === "string");
|
|
2672
2679
|
});
|
|
2673
2680
|
if (ContentTypeIndex !== -1) {
|
|
2674
|
-
|
|
2675
|
-
|
|
2681
|
+
const ContentTypeKey = headersKeyList[ContentTypeIndex];
|
|
2682
|
+
const ContentType = requestOption.headers[ContentTypeKey];
|
|
2676
2683
|
// 设置了Content-Type
|
|
2677
2684
|
if (ContentType.includes("application/json")) {
|
|
2678
2685
|
// application/json
|
|
@@ -2713,10 +2720,10 @@ class Httpx {
|
|
|
2713
2720
|
* @param option 请求配置
|
|
2714
2721
|
*/
|
|
2715
2722
|
removeRequestNullOption(option) {
|
|
2716
|
-
Object.keys(option)
|
|
2717
|
-
|
|
2718
|
-
|
|
2719
|
-
|
|
2723
|
+
const optionKeys = Object.keys(option);
|
|
2724
|
+
optionKeys.forEach((keyName) => {
|
|
2725
|
+
const optionValue = option[keyName];
|
|
2726
|
+
if (optionValue == null || (optionValue instanceof Function && commonUtil.isNull(optionValue))) {
|
|
2720
2727
|
Reflect.deleteProperty(option, keyName);
|
|
2721
2728
|
return;
|
|
2722
2729
|
}
|
|
@@ -2734,14 +2741,14 @@ class Httpx {
|
|
|
2734
2741
|
/**
|
|
2735
2742
|
* fetch的请求配置
|
|
2736
2743
|
**/
|
|
2737
|
-
|
|
2744
|
+
const fetchRequestOption = {};
|
|
2738
2745
|
if ((option.method === "GET" || option.method === "HEAD") && option.data != null) {
|
|
2739
2746
|
/* GET 或 HEAD 方法的请求不能包含 body 信息 */
|
|
2740
2747
|
Reflect.deleteProperty(option, "data");
|
|
2741
2748
|
}
|
|
2742
2749
|
/* 中止信号控制器 */
|
|
2743
|
-
|
|
2744
|
-
|
|
2750
|
+
const abortController = new AbortController();
|
|
2751
|
+
const signal = abortController.signal;
|
|
2745
2752
|
signal.onabort = () => {
|
|
2746
2753
|
option.onabort({
|
|
2747
2754
|
isFetch: true,
|
|
@@ -2786,10 +2793,10 @@ class Httpx {
|
|
|
2786
2793
|
* onabort请求被取消-触发
|
|
2787
2794
|
* @param details 配置
|
|
2788
2795
|
* @param resolve promise回调
|
|
2789
|
-
* @param
|
|
2796
|
+
* @param _reject promise抛出错误回调
|
|
2790
2797
|
* @param argsResult 返回的参数列表
|
|
2791
2798
|
*/
|
|
2792
|
-
async onAbort(details, resolve,
|
|
2799
|
+
async onAbort(details, resolve, _reject, argsResult) {
|
|
2793
2800
|
// console.log(argsResult);
|
|
2794
2801
|
if (typeof details?.onabort === "function") {
|
|
2795
2802
|
details.onabort.apply(this, argsResult);
|
|
@@ -2826,7 +2833,7 @@ class Httpx {
|
|
|
2826
2833
|
* @param reject 抛出错误
|
|
2827
2834
|
* @param argsResult 返回的参数列表
|
|
2828
2835
|
*/
|
|
2829
|
-
async onTimeout(details, resolve,
|
|
2836
|
+
async onTimeout(details, resolve, _reject, argsResult) {
|
|
2830
2837
|
// console.log(argsResult);
|
|
2831
2838
|
if (typeof details?.ontimeout === "function") {
|
|
2832
2839
|
// 执行配置中的ontime回调
|
|
@@ -2864,10 +2871,10 @@ class Httpx {
|
|
|
2864
2871
|
* onerror请求异常-触发
|
|
2865
2872
|
* @param details 配置
|
|
2866
2873
|
* @param resolve 回调
|
|
2867
|
-
* @param
|
|
2874
|
+
* @param _reject 抛出错误
|
|
2868
2875
|
* @param argsResult 返回的参数列表
|
|
2869
2876
|
*/
|
|
2870
|
-
async onError(details, resolve,
|
|
2877
|
+
async onError(details, resolve, _reject, argsResult) {
|
|
2871
2878
|
// console.log(argsResult);
|
|
2872
2879
|
if (typeof details?.onerror === "function") {
|
|
2873
2880
|
details.onerror.apply(this, argsResult);
|
|
@@ -2901,16 +2908,15 @@ class Httpx {
|
|
|
2901
2908
|
* onload加载完毕-触发
|
|
2902
2909
|
* @param details 请求的配置
|
|
2903
2910
|
* @param resolve 回调
|
|
2904
|
-
* @param
|
|
2911
|
+
* @param _reject 抛出错误
|
|
2905
2912
|
* @param argsResult 返回的参数列表
|
|
2906
2913
|
*/
|
|
2907
|
-
async onLoad(details, resolve,
|
|
2914
|
+
async onLoad(details, resolve, _reject, argsResult) {
|
|
2908
2915
|
// console.log(argsResult);
|
|
2909
2916
|
/* X浏览器会因为设置了responseType导致不返回responseText */
|
|
2910
|
-
|
|
2917
|
+
const originResponse = argsResult[0];
|
|
2911
2918
|
/* responseText为空,response不为空的情况 */
|
|
2912
|
-
if (commonUtil.isNull(originResponse["responseText"]) &&
|
|
2913
|
-
commonUtil.isNotNull(originResponse["response"])) {
|
|
2919
|
+
if (commonUtil.isNull(originResponse["responseText"]) && commonUtil.isNotNull(originResponse["response"])) {
|
|
2914
2920
|
if (typeof originResponse["response"] === "object") {
|
|
2915
2921
|
TryCatch().run(() => {
|
|
2916
2922
|
originResponse["responseText"] = JSON.stringify(originResponse["response"]);
|
|
@@ -2925,51 +2931,51 @@ class Httpx {
|
|
|
2925
2931
|
typeof originResponse["responseText"] === "string" &&
|
|
2926
2932
|
originResponse["responseText"].trim() !== "") {
|
|
2927
2933
|
/** 原始的请求text */
|
|
2928
|
-
|
|
2934
|
+
const httpxResponseText = originResponse.responseText;
|
|
2929
2935
|
// 自定义个新的response
|
|
2930
2936
|
let httpxResponse = httpxResponseText;
|
|
2931
2937
|
if (details.responseType === "json") {
|
|
2932
2938
|
httpxResponse = commonUtil.toJSON(httpxResponseText);
|
|
2933
2939
|
}
|
|
2934
2940
|
else if (details.responseType === "document") {
|
|
2935
|
-
|
|
2941
|
+
const parser = new DOMParser();
|
|
2936
2942
|
httpxResponse = parser.parseFromString(httpxResponseText, "text/html");
|
|
2937
2943
|
}
|
|
2938
2944
|
else if (details.responseType === "arraybuffer") {
|
|
2939
|
-
|
|
2940
|
-
|
|
2945
|
+
const encoder = new TextEncoder();
|
|
2946
|
+
const arrayBuffer = encoder.encode(httpxResponseText);
|
|
2941
2947
|
httpxResponse = arrayBuffer;
|
|
2942
2948
|
}
|
|
2943
2949
|
else if (details.responseType === "blob") {
|
|
2944
|
-
|
|
2945
|
-
|
|
2950
|
+
const encoder = new TextEncoder();
|
|
2951
|
+
const arrayBuffer = encoder.encode(httpxResponseText);
|
|
2946
2952
|
httpxResponse = new Blob([arrayBuffer]);
|
|
2947
2953
|
}
|
|
2948
2954
|
// 尝试覆盖原response
|
|
2949
2955
|
try {
|
|
2950
|
-
|
|
2956
|
+
const setStatus = Reflect.set(originResponse, "response", httpxResponse);
|
|
2951
2957
|
if (!setStatus) {
|
|
2952
2958
|
console.warn("[Httpx-HttpxCallBack.oonLoad] 覆盖原始 response 失败,尝试添加新的httpxResponse");
|
|
2953
2959
|
try {
|
|
2954
2960
|
Reflect.set(originResponse, "httpxResponse", httpxResponse);
|
|
2955
2961
|
}
|
|
2956
|
-
catch
|
|
2962
|
+
catch {
|
|
2957
2963
|
console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
|
|
2958
2964
|
}
|
|
2959
2965
|
}
|
|
2960
2966
|
}
|
|
2961
|
-
catch
|
|
2967
|
+
catch {
|
|
2962
2968
|
console.warn("[Httpx-HttpxCallBack.oonLoad] 原始 response 无法被覆盖,尝试添加新的httpxResponse");
|
|
2963
2969
|
try {
|
|
2964
2970
|
Reflect.set(originResponse, "httpxResponse", httpxResponse);
|
|
2965
2971
|
}
|
|
2966
|
-
catch
|
|
2972
|
+
catch {
|
|
2967
2973
|
console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
|
|
2968
2974
|
}
|
|
2969
2975
|
}
|
|
2970
2976
|
}
|
|
2971
2977
|
/* Stay扩展中没有finalUrl,对应的是responseURL */
|
|
2972
|
-
|
|
2978
|
+
const originResponseURL = Reflect.get(originResponse, "responseURL");
|
|
2973
2979
|
if (originResponse["finalUrl"] == null && originResponseURL != null) {
|
|
2974
2980
|
Reflect.set(originResponse, "finalUrl", originResponseURL);
|
|
2975
2981
|
}
|
|
@@ -2989,7 +2995,7 @@ class Httpx {
|
|
|
2989
2995
|
});
|
|
2990
2996
|
}
|
|
2991
2997
|
else {
|
|
2992
|
-
this.context.HttpxResponseCallBack.onError(details, resolve,
|
|
2998
|
+
this.context.HttpxResponseCallBack.onError(details, resolve, _reject, argsResult);
|
|
2993
2999
|
}
|
|
2994
3000
|
},
|
|
2995
3001
|
/**
|
|
@@ -3046,7 +3052,7 @@ class Httpx {
|
|
|
3046
3052
|
console.log("[Httpx-HttpxRequest.request] 请求前的配置👇", details);
|
|
3047
3053
|
}
|
|
3048
3054
|
if (typeof this.context.HttpxRequestHook.beforeRequestCallBack === "function") {
|
|
3049
|
-
|
|
3055
|
+
const hookResult = await this.context.HttpxRequestHook.beforeRequestCallBack(details);
|
|
3050
3056
|
if (hookResult == null) {
|
|
3051
3057
|
return;
|
|
3052
3058
|
}
|
|
@@ -3078,7 +3084,7 @@ class Httpx {
|
|
|
3078
3084
|
fetch(option.url, fetchRequestOption)
|
|
3079
3085
|
.then(async (fetchResponse) => {
|
|
3080
3086
|
/** 自定义的response */
|
|
3081
|
-
|
|
3087
|
+
const httpxResponse = {
|
|
3082
3088
|
isFetch: true,
|
|
3083
3089
|
finalUrl: fetchResponse.url,
|
|
3084
3090
|
readyState: 4,
|
|
@@ -3093,9 +3099,9 @@ class Httpx {
|
|
|
3093
3099
|
};
|
|
3094
3100
|
Object.assign(httpxResponse, option.context || {});
|
|
3095
3101
|
// 把headers转为字符串
|
|
3096
|
-
|
|
3102
|
+
fetchResponse.headers.forEach((value, key) => {
|
|
3097
3103
|
httpxResponse.responseHeaders += `${key}: ${value}\n`;
|
|
3098
|
-
}
|
|
3104
|
+
});
|
|
3099
3105
|
/** 请求返回的类型 */
|
|
3100
3106
|
const fetchResponseType = fetchResponse.headers.get("Content-Type");
|
|
3101
3107
|
/* 如果需要stream,且获取到的是stream,那直接返回 */
|
|
@@ -3116,11 +3122,11 @@ class Httpx {
|
|
|
3116
3122
|
/** 响应xml文档 */
|
|
3117
3123
|
let responseXML = "";
|
|
3118
3124
|
/** 先获取二进制数据 */
|
|
3119
|
-
|
|
3125
|
+
const arrayBuffer = await fetchResponse.arrayBuffer();
|
|
3120
3126
|
/** 数据编码 */
|
|
3121
3127
|
let encoding = "utf-8";
|
|
3122
3128
|
if (fetchResponse.headers.has("Content-Type")) {
|
|
3123
|
-
|
|
3129
|
+
const charsetMatched = fetchResponse.headers.get("Content-Type")?.match(/charset=(.+)/);
|
|
3124
3130
|
if (charsetMatched) {
|
|
3125
3131
|
encoding = charsetMatched[1];
|
|
3126
3132
|
encoding = encoding.toLowerCase();
|
|
@@ -3130,7 +3136,7 @@ class Httpx {
|
|
|
3130
3136
|
// 去除引号
|
|
3131
3137
|
encoding = encoding.replace(/('|")/gi, "");
|
|
3132
3138
|
// 编码
|
|
3133
|
-
|
|
3139
|
+
const textDecoder = new TextDecoder(encoding);
|
|
3134
3140
|
responseText = textDecoder.decode(arrayBuffer);
|
|
3135
3141
|
response = responseText;
|
|
3136
3142
|
if (option.responseType === "arraybuffer") {
|
|
@@ -3148,11 +3154,11 @@ class Httpx {
|
|
|
3148
3154
|
}
|
|
3149
3155
|
else if (option.responseType === "document" || option.responseType == null) {
|
|
3150
3156
|
// response返回格式是文档格式
|
|
3151
|
-
|
|
3157
|
+
const parser = new DOMParser();
|
|
3152
3158
|
response = parser.parseFromString(responseText, "text/html");
|
|
3153
3159
|
}
|
|
3154
3160
|
// 转为XML结构
|
|
3155
|
-
|
|
3161
|
+
const parser = new DOMParser();
|
|
3156
3162
|
responseXML = parser.parseFromString(responseText, "text/xml");
|
|
3157
3163
|
httpxResponse.response = response;
|
|
3158
3164
|
httpxResponse.responseText = responseText;
|
|
@@ -3226,6 +3232,9 @@ class Httpx {
|
|
|
3226
3232
|
onreadystatechange() { },
|
|
3227
3233
|
onprogress() { },
|
|
3228
3234
|
};
|
|
3235
|
+
/**
|
|
3236
|
+
* 实例化的默认配置
|
|
3237
|
+
*/
|
|
3229
3238
|
#defaultInitOption = {
|
|
3230
3239
|
/**
|
|
3231
3240
|
* `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
|
|
@@ -3341,7 +3350,7 @@ class Httpx {
|
|
|
3341
3350
|
* @param details 配置
|
|
3342
3351
|
*/
|
|
3343
3352
|
get(...args) {
|
|
3344
|
-
|
|
3353
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3345
3354
|
useRequestOption.method = "GET";
|
|
3346
3355
|
return this.request(useRequestOption, (option) => {
|
|
3347
3356
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3351,7 +3360,7 @@ class Httpx {
|
|
|
3351
3360
|
* POST 请求
|
|
3352
3361
|
*/
|
|
3353
3362
|
post(...args) {
|
|
3354
|
-
|
|
3363
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3355
3364
|
useRequestOption.method = "POST";
|
|
3356
3365
|
return this.request(useRequestOption);
|
|
3357
3366
|
}
|
|
@@ -3359,7 +3368,7 @@ class Httpx {
|
|
|
3359
3368
|
* HEAD 请求
|
|
3360
3369
|
*/
|
|
3361
3370
|
head(...args) {
|
|
3362
|
-
|
|
3371
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3363
3372
|
useRequestOption.method = "HEAD";
|
|
3364
3373
|
return this.request(useRequestOption, (option) => {
|
|
3365
3374
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3369,7 +3378,7 @@ class Httpx {
|
|
|
3369
3378
|
* OPTIONS 请求
|
|
3370
3379
|
*/
|
|
3371
3380
|
options(...args) {
|
|
3372
|
-
|
|
3381
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3373
3382
|
useRequestOption.method = "OPTIONS";
|
|
3374
3383
|
return this.request(useRequestOption, (option) => {
|
|
3375
3384
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3379,7 +3388,7 @@ class Httpx {
|
|
|
3379
3388
|
* DELETE 请求
|
|
3380
3389
|
*/
|
|
3381
3390
|
delete(...args) {
|
|
3382
|
-
|
|
3391
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3383
3392
|
useRequestOption.method = "DELETE";
|
|
3384
3393
|
return this.request(useRequestOption, (option) => {
|
|
3385
3394
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3389,7 +3398,7 @@ class Httpx {
|
|
|
3389
3398
|
* PUT 请求
|
|
3390
3399
|
*/
|
|
3391
3400
|
put(...args) {
|
|
3392
|
-
|
|
3401
|
+
const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3393
3402
|
userRequestOption.method = "PUT";
|
|
3394
3403
|
return this.request(userRequestOption);
|
|
3395
3404
|
}
|
|
@@ -3399,18 +3408,30 @@ class Httpx {
|
|
|
3399
3408
|
* @param beforeRequestOption 处理请求前的配置
|
|
3400
3409
|
*/
|
|
3401
3410
|
request(details, beforeRequestOption) {
|
|
3402
|
-
|
|
3403
|
-
|
|
3411
|
+
// 对请求的参数进行合并处理
|
|
3412
|
+
const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(details);
|
|
3413
|
+
/**
|
|
3414
|
+
* 取消请求
|
|
3415
|
+
*/
|
|
3404
3416
|
let abortFn = null;
|
|
3405
|
-
|
|
3406
|
-
|
|
3417
|
+
const promise = new globalThis.Promise(async (resolve, reject) => {
|
|
3418
|
+
// 请求配置
|
|
3419
|
+
let requestOption = this.HttpxRequestOption.getRequestOption(userRequestOption.method, userRequestOption, (resultOption) => {
|
|
3420
|
+
resolve(resultOption);
|
|
3421
|
+
}, (...args) => {
|
|
3422
|
+
reject(...args);
|
|
3423
|
+
});
|
|
3424
|
+
requestOption = this.HttpxRequestOption.removeRequestNullOption(requestOption);
|
|
3407
3425
|
if (typeof beforeRequestOption === "function") {
|
|
3408
3426
|
beforeRequestOption(requestOption);
|
|
3409
3427
|
}
|
|
3410
|
-
|
|
3428
|
+
// 处理重试逻辑
|
|
3411
3429
|
const requestResult = await this.HttpxRequest.request(requestOption);
|
|
3412
3430
|
if (requestResult != null && typeof requestResult.abort === "function") {
|
|
3413
|
-
abortFn =
|
|
3431
|
+
abortFn = () => {
|
|
3432
|
+
// 取消请求
|
|
3433
|
+
requestResult.abort();
|
|
3434
|
+
};
|
|
3414
3435
|
}
|
|
3415
3436
|
});
|
|
3416
3437
|
promise.abort = () => {
|
|
@@ -3429,10 +3450,7 @@ class indexedDB {
|
|
|
3429
3450
|
/* websql的版本号,由于ios的问题,版本号的写法不一样 */
|
|
3430
3451
|
// #slqVersion = "1";
|
|
3431
3452
|
/* 监听IndexDB */
|
|
3432
|
-
#indexedDB =
|
|
3433
|
-
window.mozIndexedDB ||
|
|
3434
|
-
window.webkitIndexedDB ||
|
|
3435
|
-
window.msIndexedDB;
|
|
3453
|
+
#indexedDB = globalThis.indexedDB || globalThis.mozIndexedDB || globalThis.webkitIndexedDB || globalThis.msIndexedDB;
|
|
3436
3454
|
/* 缓存数据库,避免同一个页面重复创建和销毁 */
|
|
3437
3455
|
#db = {};
|
|
3438
3456
|
// #store: IDBObjectStore = null as any;
|
|
@@ -3467,7 +3485,7 @@ class indexedDB {
|
|
|
3467
3485
|
this.#storeName = storeName;
|
|
3468
3486
|
this.#dbVersion = dbVersion;
|
|
3469
3487
|
if (!this.#indexedDB) {
|
|
3470
|
-
alert("很抱歉,您的浏览器不支持indexedDB");
|
|
3488
|
+
window.alert("很抱歉,您的浏览器不支持indexedDB");
|
|
3471
3489
|
throw new TypeError("很抱歉,您的浏览器不支持indexedDB");
|
|
3472
3490
|
}
|
|
3473
3491
|
}
|
|
@@ -3476,10 +3494,9 @@ class indexedDB {
|
|
|
3476
3494
|
* @param dbName 表名
|
|
3477
3495
|
*/
|
|
3478
3496
|
createStore(dbName) {
|
|
3479
|
-
|
|
3480
|
-
txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
|
|
3497
|
+
const txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
|
|
3481
3498
|
/* IndexDB的读写权限 */
|
|
3482
|
-
store = txn.objectStore(this.#storeName);
|
|
3499
|
+
const store = txn.objectStore(this.#storeName);
|
|
3483
3500
|
// this.#store = store;
|
|
3484
3501
|
return store;
|
|
3485
3502
|
}
|
|
@@ -3489,12 +3506,12 @@ class indexedDB {
|
|
|
3489
3506
|
* @param dbName 数据库名
|
|
3490
3507
|
*/
|
|
3491
3508
|
open(callback, dbName) {
|
|
3492
|
-
|
|
3509
|
+
const that = this;
|
|
3493
3510
|
/* 打开数据库 */
|
|
3494
3511
|
/* 如果支持IndexDB */
|
|
3495
3512
|
if (!that.#db[dbName]) {
|
|
3496
3513
|
/* 如果缓存中没有,则进行数据库的创建或打开,提高效率 */
|
|
3497
|
-
|
|
3514
|
+
const request = that.#indexedDB.open(dbName, that.#dbVersion);
|
|
3498
3515
|
request.onerror = function (event) {
|
|
3499
3516
|
callback(null, {
|
|
3500
3517
|
code: that.#statusCode.openFailed.code,
|
|
@@ -3504,26 +3521,26 @@ class indexedDB {
|
|
|
3504
3521
|
};
|
|
3505
3522
|
request.onsuccess = function (event) {
|
|
3506
3523
|
if (!that.#db[dbName]) {
|
|
3507
|
-
|
|
3524
|
+
const target = event.target;
|
|
3508
3525
|
that.#db[dbName] = target.result;
|
|
3509
3526
|
}
|
|
3510
|
-
|
|
3527
|
+
const store = that.createStore(dbName);
|
|
3511
3528
|
callback(store);
|
|
3512
3529
|
};
|
|
3513
3530
|
request.onupgradeneeded = function (event) {
|
|
3514
|
-
|
|
3531
|
+
const target = event.target;
|
|
3515
3532
|
that.#db[dbName] = target.result;
|
|
3516
|
-
|
|
3533
|
+
const store = that.#db[dbName].createObjectStore(that.#storeName, {
|
|
3517
3534
|
keyPath: "key",
|
|
3518
3535
|
});
|
|
3519
|
-
store.transaction.oncomplete = function (
|
|
3536
|
+
store.transaction.oncomplete = function () {
|
|
3520
3537
|
callback(store);
|
|
3521
3538
|
};
|
|
3522
3539
|
};
|
|
3523
3540
|
}
|
|
3524
3541
|
else {
|
|
3525
3542
|
/* 如果缓存中已经打开了数据库,就直接使用 */
|
|
3526
|
-
|
|
3543
|
+
const store = this.createStore(dbName);
|
|
3527
3544
|
callback(store);
|
|
3528
3545
|
}
|
|
3529
3546
|
}
|
|
@@ -3533,10 +3550,10 @@ class indexedDB {
|
|
|
3533
3550
|
* @param value 数据值
|
|
3534
3551
|
*/
|
|
3535
3552
|
async save(key, value) {
|
|
3536
|
-
|
|
3553
|
+
const that = this;
|
|
3537
3554
|
return new Promise((resolve) => {
|
|
3538
|
-
|
|
3539
|
-
|
|
3555
|
+
const dbName = this.#dbName;
|
|
3556
|
+
const inData = {
|
|
3540
3557
|
key: key,
|
|
3541
3558
|
value: value,
|
|
3542
3559
|
};
|
|
@@ -3549,7 +3566,7 @@ class indexedDB {
|
|
|
3549
3566
|
});
|
|
3550
3567
|
}
|
|
3551
3568
|
else {
|
|
3552
|
-
|
|
3569
|
+
const request = idbStore.put(inData);
|
|
3553
3570
|
request.onsuccess = function (event) {
|
|
3554
3571
|
/* 保存成功有success 字段 */
|
|
3555
3572
|
resolve({
|
|
@@ -3576,9 +3593,9 @@ class indexedDB {
|
|
|
3576
3593
|
* @param key 数据key
|
|
3577
3594
|
*/
|
|
3578
3595
|
async has(key) {
|
|
3579
|
-
|
|
3596
|
+
const that = this;
|
|
3580
3597
|
return new Promise((resolve) => {
|
|
3581
|
-
|
|
3598
|
+
const dbName = this.#dbName;
|
|
3582
3599
|
this.open(function (idbStore) {
|
|
3583
3600
|
/* 判断返回的数据中是否有error字段 */
|
|
3584
3601
|
if (idbStore == null) {
|
|
@@ -3589,7 +3606,7 @@ class indexedDB {
|
|
|
3589
3606
|
});
|
|
3590
3607
|
}
|
|
3591
3608
|
else {
|
|
3592
|
-
|
|
3609
|
+
const request = idbStore.get(key);
|
|
3593
3610
|
request.onsuccess = function (event) {
|
|
3594
3611
|
/* result 返回的是 {key: string, value: any} */
|
|
3595
3612
|
/* 键值对存储 */
|
|
@@ -3617,9 +3634,9 @@ class indexedDB {
|
|
|
3617
3634
|
* @param key 数据key
|
|
3618
3635
|
*/
|
|
3619
3636
|
async get(key) {
|
|
3620
|
-
|
|
3637
|
+
const that = this;
|
|
3621
3638
|
return new Promise((resolve) => {
|
|
3622
|
-
|
|
3639
|
+
const dbName = this.#dbName;
|
|
3623
3640
|
this.open(function (idbStore) {
|
|
3624
3641
|
/* 判断返回的数据中是否有error字段 */
|
|
3625
3642
|
if (idbStore == null) {
|
|
@@ -3631,13 +3648,13 @@ class indexedDB {
|
|
|
3631
3648
|
});
|
|
3632
3649
|
}
|
|
3633
3650
|
else {
|
|
3634
|
-
|
|
3651
|
+
const request = idbStore.get(key);
|
|
3635
3652
|
request.onsuccess = function (event) {
|
|
3636
|
-
|
|
3637
|
-
|
|
3653
|
+
const target = event.target;
|
|
3654
|
+
const result = target.result;
|
|
3638
3655
|
/* result 返回的是 {key: string, value: any} */
|
|
3639
3656
|
/* 键值对存储 */
|
|
3640
|
-
|
|
3657
|
+
const data = result ? result.value : void 0;
|
|
3641
3658
|
if (data == null) {
|
|
3642
3659
|
resolve({
|
|
3643
3660
|
success: true,
|
|
@@ -3678,10 +3695,10 @@ class indexedDB {
|
|
|
3678
3695
|
*/
|
|
3679
3696
|
async regexpGet(key) {
|
|
3680
3697
|
let list = [];
|
|
3681
|
-
|
|
3698
|
+
const that = this;
|
|
3682
3699
|
return new Promise((resolve) => {
|
|
3683
3700
|
/* 正则查询 */
|
|
3684
|
-
|
|
3701
|
+
const dbName = that.#dbName;
|
|
3685
3702
|
this.open(function (idbStore) {
|
|
3686
3703
|
/* 判断返回的数据中是否有error字段 */
|
|
3687
3704
|
if (idbStore == null) {
|
|
@@ -3693,16 +3710,16 @@ class indexedDB {
|
|
|
3693
3710
|
});
|
|
3694
3711
|
}
|
|
3695
3712
|
else {
|
|
3696
|
-
|
|
3713
|
+
const request = idbStore.getAll();
|
|
3697
3714
|
request.onsuccess = function (event) {
|
|
3698
|
-
|
|
3699
|
-
|
|
3715
|
+
const target = event.target;
|
|
3716
|
+
const result = target.result;
|
|
3700
3717
|
if (result.length !== 0) {
|
|
3701
|
-
result.forEach((dataItem
|
|
3718
|
+
result.forEach((dataItem) => {
|
|
3702
3719
|
// 当前项的key
|
|
3703
|
-
|
|
3720
|
+
const __key = dataItem["key"];
|
|
3704
3721
|
// 当前项的value
|
|
3705
|
-
|
|
3722
|
+
const __value = dataItem["value"];
|
|
3706
3723
|
if (__key.match(key)) {
|
|
3707
3724
|
list = list.concat(__value);
|
|
3708
3725
|
}
|
|
@@ -3734,10 +3751,10 @@ class indexedDB {
|
|
|
3734
3751
|
* @param key 数据key
|
|
3735
3752
|
*/
|
|
3736
3753
|
async delete(key) {
|
|
3737
|
-
|
|
3754
|
+
const that = this;
|
|
3738
3755
|
return new Promise((resolve) => {
|
|
3739
3756
|
/* 根据key删除某条数据 */
|
|
3740
|
-
|
|
3757
|
+
const dbName = that.#dbName;
|
|
3741
3758
|
this.open(function (idbStore) {
|
|
3742
3759
|
if (idbStore == null) {
|
|
3743
3760
|
resolve({
|
|
@@ -3748,7 +3765,7 @@ class indexedDB {
|
|
|
3748
3765
|
}
|
|
3749
3766
|
else {
|
|
3750
3767
|
// 删除键
|
|
3751
|
-
|
|
3768
|
+
const request = idbStore.delete(key);
|
|
3752
3769
|
request.onsuccess = function (event) {
|
|
3753
3770
|
resolve({
|
|
3754
3771
|
success: true,
|
|
@@ -3773,10 +3790,10 @@ class indexedDB {
|
|
|
3773
3790
|
* 删除所有数据
|
|
3774
3791
|
*/
|
|
3775
3792
|
async deleteAll() {
|
|
3776
|
-
|
|
3793
|
+
const that = this;
|
|
3777
3794
|
return new Promise((resolve) => {
|
|
3778
3795
|
/* 清空数据库 */
|
|
3779
|
-
|
|
3796
|
+
const dbName = that.#dbName;
|
|
3780
3797
|
this.open(function (idbStore) {
|
|
3781
3798
|
if (idbStore == null) {
|
|
3782
3799
|
resolve({
|
|
@@ -3787,7 +3804,7 @@ class indexedDB {
|
|
|
3787
3804
|
}
|
|
3788
3805
|
else {
|
|
3789
3806
|
// 清空
|
|
3790
|
-
|
|
3807
|
+
const operateResult = idbStore.clear();
|
|
3791
3808
|
operateResult.onsuccess = function (event) {
|
|
3792
3809
|
resolve({
|
|
3793
3810
|
success: true,
|
|
@@ -3820,7 +3837,7 @@ class LockFunction {
|
|
|
3820
3837
|
run;
|
|
3821
3838
|
isLock;
|
|
3822
3839
|
constructor(callback, context, delayTime) {
|
|
3823
|
-
|
|
3840
|
+
const that = this;
|
|
3824
3841
|
this.#callback = callback;
|
|
3825
3842
|
if (typeof context === "number") {
|
|
3826
3843
|
this.#delayTime = context;
|
|
@@ -3910,14 +3927,14 @@ class Log {
|
|
|
3910
3927
|
* @param stack
|
|
3911
3928
|
*/
|
|
3912
3929
|
parseErrorStack(stack) {
|
|
3913
|
-
|
|
3930
|
+
const result = {
|
|
3914
3931
|
name: "",
|
|
3915
3932
|
position: "",
|
|
3916
3933
|
};
|
|
3917
3934
|
for (let stackString of stack) {
|
|
3918
3935
|
stackString = stackString.trim();
|
|
3919
|
-
|
|
3920
|
-
|
|
3936
|
+
const stackFunctionNameMatch = stackString.match(/^at[\s]+(.+?)[\s]+/i);
|
|
3937
|
+
const stackFunctionNamePositionMatch = stackString.match(/^at[\s]+.+[\s]+\((.+?)\)/i);
|
|
3921
3938
|
if (stackFunctionNameMatch == null) {
|
|
3922
3939
|
continue;
|
|
3923
3940
|
}
|
|
@@ -3925,8 +3942,8 @@ class Log {
|
|
|
3925
3942
|
continue;
|
|
3926
3943
|
}
|
|
3927
3944
|
/* 获取最后一个,因为第一个是包含了at */
|
|
3928
|
-
|
|
3929
|
-
|
|
3945
|
+
const stackFunctionName = stackFunctionNameMatch[stackFunctionNameMatch.length - 1];
|
|
3946
|
+
const stackFunctionNamePosition = stackFunctionNamePositionMatch[stackFunctionNamePositionMatch.length - 1];
|
|
3930
3947
|
if (stackFunctionName === "" ||
|
|
3931
3948
|
stackFunctionName.match(/^(Utils\.|)Log(\.|)|.<anonymous>$|^Function.each|^NodeList.forEach|^k.fn.init.each/g)) {
|
|
3932
3949
|
continue;
|
|
@@ -3938,9 +3955,9 @@ class Log {
|
|
|
3938
3955
|
}
|
|
3939
3956
|
}
|
|
3940
3957
|
if (result.position === "") {
|
|
3941
|
-
|
|
3958
|
+
const lastStackString = stack[stack.length - 1].trim();
|
|
3942
3959
|
if (lastStackString.startsWith("at chrome-extension://")) {
|
|
3943
|
-
|
|
3960
|
+
const lastStackMatch = lastStackString.match(/^at[\s]+(.+)/);
|
|
3944
3961
|
if (lastStackMatch) {
|
|
3945
3962
|
result.position = lastStackMatch[lastStackMatch.length - 1];
|
|
3946
3963
|
}
|
|
@@ -3970,16 +3987,18 @@ class Log {
|
|
|
3970
3987
|
printContent(msg, color, otherStyle) {
|
|
3971
3988
|
this.checkClearConsole();
|
|
3972
3989
|
otherStyle = otherStyle || "";
|
|
3973
|
-
|
|
3990
|
+
const stackSplit = new Error().stack.split("\n");
|
|
3974
3991
|
stackSplit.splice(0, 2);
|
|
3975
|
-
|
|
3976
|
-
|
|
3977
|
-
|
|
3992
|
+
const { name: callerName, position: callerPosition } = this.parseErrorStack(stackSplit);
|
|
3993
|
+
const tagName = this.tag;
|
|
3994
|
+
const that = this;
|
|
3978
3995
|
/** tag的html输出格式 */
|
|
3979
|
-
|
|
3996
|
+
const tagNameHTML = `%c[${tagName}%c`;
|
|
3980
3997
|
/** 调用的函数名的html输出格式 */
|
|
3981
3998
|
let callerNameHTML = `%c${callerName}%c]%c`;
|
|
3982
|
-
callerName.trim()
|
|
3999
|
+
if (callerName.trim() === "") {
|
|
4000
|
+
callerNameHTML = `-${callerNameHTML}`;
|
|
4001
|
+
}
|
|
3983
4002
|
/**
|
|
3984
4003
|
* 输出消息到控制台
|
|
3985
4004
|
* @param message
|
|
@@ -4065,14 +4084,14 @@ class Log {
|
|
|
4065
4084
|
if (this.#disable)
|
|
4066
4085
|
return;
|
|
4067
4086
|
this.checkClearConsole();
|
|
4068
|
-
|
|
4087
|
+
const stack = new Error().stack.split("\n");
|
|
4069
4088
|
stack.splice(0, 1);
|
|
4070
|
-
|
|
4089
|
+
const errorStackParse = this.parseErrorStack(stack);
|
|
4071
4090
|
/** 堆栈函数名 */
|
|
4072
|
-
|
|
4091
|
+
const stackFunctionName = errorStackParse.name;
|
|
4073
4092
|
/** 堆栈位置 */
|
|
4074
|
-
|
|
4075
|
-
|
|
4093
|
+
const stackFunctionNamePosition = errorStackParse.position;
|
|
4094
|
+
const callerName = stackFunctionName;
|
|
4076
4095
|
this.#console.log(`%c[${this.tag}%c-%c${callerName}%c]%c`, ...this.#msgColorDetails, `color: ${this.#details.infoColor};`);
|
|
4077
4096
|
this.#console.table(msg);
|
|
4078
4097
|
if (this.#details.debug) {
|
|
@@ -4135,9 +4154,9 @@ class Progress {
|
|
|
4135
4154
|
*/
|
|
4136
4155
|
circleRadius: 50,
|
|
4137
4156
|
};
|
|
4138
|
-
#ctx
|
|
4139
|
-
#width
|
|
4140
|
-
#height
|
|
4157
|
+
#ctx;
|
|
4158
|
+
#width;
|
|
4159
|
+
#height;
|
|
4141
4160
|
/**
|
|
4142
4161
|
*
|
|
4143
4162
|
* @param paramConfig 配置信息
|
|
@@ -4147,14 +4166,8 @@ class Progress {
|
|
|
4147
4166
|
if (!(this.#config.canvasNode instanceof HTMLCanvasElement)) {
|
|
4148
4167
|
throw new Error("Utils.Progress 参数 canvasNode 必须是 HTMLCanvasElement");
|
|
4149
4168
|
}
|
|
4150
|
-
this.init();
|
|
4151
|
-
}
|
|
4152
|
-
/**
|
|
4153
|
-
* 初始化
|
|
4154
|
-
*/
|
|
4155
|
-
init() {
|
|
4156
4169
|
/* 获取画笔 */
|
|
4157
|
-
|
|
4170
|
+
const ctx = this.#config.canvasNode.getContext("2d");
|
|
4158
4171
|
if (ctx == null) {
|
|
4159
4172
|
throw new Error("Utils.Progress 获取画笔失败");
|
|
4160
4173
|
}
|
|
@@ -4165,8 +4178,8 @@ class Progress {
|
|
|
4165
4178
|
this.#height = this.#config.canvasNode.height;
|
|
4166
4179
|
/* 清除锯齿 */
|
|
4167
4180
|
if (window.devicePixelRatio) {
|
|
4168
|
-
this.#config.canvasNode.style.width = this.#width
|
|
4169
|
-
this.#config.canvasNode.style.height = this.#height
|
|
4181
|
+
this.#config.canvasNode.style.width = `${this.#width}px`;
|
|
4182
|
+
this.#config.canvasNode.style.height = `${this.#height}px`;
|
|
4170
4183
|
this.#config.canvasNode.height = this.#height * window.devicePixelRatio;
|
|
4171
4184
|
this.#config.canvasNode.width = this.#width * window.devicePixelRatio;
|
|
4172
4185
|
this.#ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
|
|
@@ -4178,7 +4191,7 @@ class Progress {
|
|
|
4178
4191
|
* 绘制
|
|
4179
4192
|
*/
|
|
4180
4193
|
draw() {
|
|
4181
|
-
|
|
4194
|
+
const degActive = (this.#config.progress * 360) / 100;
|
|
4182
4195
|
/* 清除画布 */
|
|
4183
4196
|
this.#ctx.clearRect(0, 0, this.#width, this.#height);
|
|
4184
4197
|
/* 开始绘制底圆 */
|
|
@@ -4192,11 +4205,11 @@ class Progress {
|
|
|
4192
4205
|
this.#ctx.strokeStyle = this.#config.lineColor;
|
|
4193
4206
|
this.#ctx.stroke();
|
|
4194
4207
|
/* 获取百分比 */
|
|
4195
|
-
|
|
4196
|
-
this.#ctx.font = this.#config.fontSize
|
|
4208
|
+
const txt = `${parseInt(this.#config.progress.toString())}%`;
|
|
4209
|
+
this.#ctx.font = `${this.#config.fontSize}px SimHei`;
|
|
4197
4210
|
/* 获取文本宽度 */
|
|
4198
|
-
|
|
4199
|
-
|
|
4211
|
+
const w = this.#ctx.measureText(txt).width;
|
|
4212
|
+
const h = this.#config.fontSize / 2;
|
|
4200
4213
|
this.#ctx.fillStyle = this.#config.textColor;
|
|
4201
4214
|
this.#ctx.fillText(txt, this.#width / 2 - w / 2, this.#height / 2 + h / 2);
|
|
4202
4215
|
}
|
|
@@ -4220,9 +4233,9 @@ class UtilsDictionary {
|
|
|
4220
4233
|
* 迭代器
|
|
4221
4234
|
*/
|
|
4222
4235
|
get entries() {
|
|
4223
|
-
|
|
4236
|
+
const that = this;
|
|
4224
4237
|
return function* () {
|
|
4225
|
-
|
|
4238
|
+
const itemKeys = Object.keys(that.getItems());
|
|
4226
4239
|
for (const keyName of itemKeys) {
|
|
4227
4240
|
yield [keyName, that.get(keyName)];
|
|
4228
4241
|
}
|
|
@@ -4232,9 +4245,8 @@ class UtilsDictionary {
|
|
|
4232
4245
|
* 是否可遍历
|
|
4233
4246
|
*/
|
|
4234
4247
|
get [Symbol.iterator]() {
|
|
4235
|
-
|
|
4236
|
-
|
|
4237
|
-
return that.entries();
|
|
4248
|
+
return () => {
|
|
4249
|
+
return this.entries();
|
|
4238
4250
|
};
|
|
4239
4251
|
}
|
|
4240
4252
|
/**
|
|
@@ -4321,7 +4333,7 @@ class UtilsDictionary {
|
|
|
4321
4333
|
* @param callbackfn 回调函数
|
|
4322
4334
|
*/
|
|
4323
4335
|
forEach(callbackfn) {
|
|
4324
|
-
this.items.forEach((value, key
|
|
4336
|
+
this.items.forEach((value, key) => {
|
|
4325
4337
|
callbackfn(value, key, this);
|
|
4326
4338
|
});
|
|
4327
4339
|
}
|
|
@@ -4413,6 +4425,7 @@ class WindowApi {
|
|
|
4413
4425
|
}
|
|
4414
4426
|
}
|
|
4415
4427
|
|
|
4428
|
+
// @ts-nocheck
|
|
4416
4429
|
const VueUtils = {
|
|
4417
4430
|
/** 标签 */
|
|
4418
4431
|
ReactiveFlags: {
|
|
@@ -4451,10 +4464,10 @@ class ReactiveEffect {
|
|
|
4451
4464
|
deps = [];
|
|
4452
4465
|
active = true;
|
|
4453
4466
|
fn;
|
|
4454
|
-
|
|
4467
|
+
scheduler;
|
|
4455
4468
|
constructor(fn, scheduler) {
|
|
4456
4469
|
this.fn = fn;
|
|
4457
|
-
|
|
4470
|
+
this.scheduler = scheduler;
|
|
4458
4471
|
}
|
|
4459
4472
|
run(cb) {
|
|
4460
4473
|
if (!this.active) {
|
|
@@ -4526,7 +4539,7 @@ class Vue {
|
|
|
4526
4539
|
if (VueUtils.isReactive(target)) {
|
|
4527
4540
|
return target;
|
|
4528
4541
|
}
|
|
4529
|
-
|
|
4542
|
+
const exisProxy = this.reactMap.get(target);
|
|
4530
4543
|
if (exisProxy) {
|
|
4531
4544
|
return exisProxy;
|
|
4532
4545
|
}
|
|
@@ -4539,8 +4552,8 @@ class Vue {
|
|
|
4539
4552
|
return Reflect.get(target, key, receiver);
|
|
4540
4553
|
},
|
|
4541
4554
|
set(target, key, value, receiver) {
|
|
4542
|
-
|
|
4543
|
-
|
|
4555
|
+
const oldValue = target[key];
|
|
4556
|
+
const result = Reflect.set(target, key, value, receiver);
|
|
4544
4557
|
if (oldValue !== value) {
|
|
4545
4558
|
that.trigger(target, "set", key, oldValue, value);
|
|
4546
4559
|
}
|
|
@@ -4590,11 +4603,12 @@ class Vue {
|
|
|
4590
4603
|
}
|
|
4591
4604
|
toRefs(object) {
|
|
4592
4605
|
const result = VueUtils.isArray(object) ? new Array(object.length) : {};
|
|
4593
|
-
for (
|
|
4606
|
+
for (const key in object) {
|
|
4594
4607
|
result[key] = this.toRef(object, key);
|
|
4595
4608
|
}
|
|
4596
4609
|
return result;
|
|
4597
4610
|
}
|
|
4611
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4598
4612
|
trigger(target, type, key, oldValue, value) {
|
|
4599
4613
|
const depsMap = this.targetMap.get(target);
|
|
4600
4614
|
if (!depsMap)
|
|
@@ -4602,8 +4616,9 @@ class Vue {
|
|
|
4602
4616
|
const effects = depsMap.get(key);
|
|
4603
4617
|
this.triggerEffect(effects, "effects");
|
|
4604
4618
|
}
|
|
4619
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4605
4620
|
triggerEffect(effects, name) {
|
|
4606
|
-
effects
|
|
4621
|
+
if (effects) {
|
|
4607
4622
|
effects.forEach((effect) => {
|
|
4608
4623
|
if (effect.scheduler) {
|
|
4609
4624
|
effect.scheduler();
|
|
@@ -4612,6 +4627,7 @@ class Vue {
|
|
|
4612
4627
|
effect.run();
|
|
4613
4628
|
}
|
|
4614
4629
|
});
|
|
4630
|
+
}
|
|
4615
4631
|
}
|
|
4616
4632
|
track(target, type, key) {
|
|
4617
4633
|
if (!this.activeEffect)
|
|
@@ -4628,7 +4644,7 @@ class Vue {
|
|
|
4628
4644
|
}
|
|
4629
4645
|
trackEffect(dep) {
|
|
4630
4646
|
if (this.activeEffect) {
|
|
4631
|
-
|
|
4647
|
+
const shouldTrack = !dep.has(this.activeEffect);
|
|
4632
4648
|
if (shouldTrack) {
|
|
4633
4649
|
dep.add(this.activeEffect);
|
|
4634
4650
|
this.activeEffect.deps.push(dep);
|
|
@@ -4642,7 +4658,7 @@ class Vue {
|
|
|
4642
4658
|
return value;
|
|
4643
4659
|
}
|
|
4644
4660
|
set.add(value);
|
|
4645
|
-
for (
|
|
4661
|
+
for (const key in value) {
|
|
4646
4662
|
this.traversal(value[key], set);
|
|
4647
4663
|
}
|
|
4648
4664
|
return value;
|
|
@@ -4894,6 +4910,7 @@ const clearTimeout$1 = (timerId) => loadOrReturnBroker().clearTimeout(timerId);
|
|
|
4894
4910
|
const setInterval = (...args) => loadOrReturnBroker().setInterval(...args);
|
|
4895
4911
|
const setTimeout$1 = (...args) => loadOrReturnBroker().setTimeout(...args);
|
|
4896
4912
|
|
|
4913
|
+
/* eslint-disable */
|
|
4897
4914
|
// ==UserScript==
|
|
4898
4915
|
// @name ModuleRaid.js
|
|
4899
4916
|
// @namespace http://tampermonkey.net/
|
|
@@ -5311,28 +5328,26 @@ class DOMUtils {
|
|
|
5311
5328
|
return $ele?.innerHTML?.trim() === "";
|
|
5312
5329
|
});
|
|
5313
5330
|
}
|
|
5314
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5315
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5331
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5316
5332
|
// contains 语法
|
|
5317
|
-
|
|
5318
|
-
|
|
5333
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5334
|
+
const text = textMatch[2];
|
|
5319
5335
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5320
5336
|
return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
|
|
5321
5337
|
return ($ele?.textContent || $ele?.innerText)?.includes(text);
|
|
5322
5338
|
});
|
|
5323
5339
|
}
|
|
5324
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5325
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5340
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5326
5341
|
// regexp 语法
|
|
5327
|
-
|
|
5342
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5328
5343
|
let pattern = textMatch[2];
|
|
5329
|
-
|
|
5344
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5330
5345
|
let flags = "";
|
|
5331
5346
|
if (flagMatch) {
|
|
5332
5347
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5333
5348
|
flags = flagMatch[3];
|
|
5334
5349
|
}
|
|
5335
|
-
|
|
5350
|
+
const regexp = new RegExp(pattern, flags);
|
|
5336
5351
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5337
5352
|
return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
|
|
5338
5353
|
return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
|
|
@@ -5374,11 +5389,10 @@ class DOMUtils {
|
|
|
5374
5389
|
selector = selector.replace(/:empty$/gi, "");
|
|
5375
5390
|
return $el.matches(selector) && $el?.innerHTML?.trim() === "";
|
|
5376
5391
|
}
|
|
5377
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5378
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5392
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5379
5393
|
// contains 语法
|
|
5380
|
-
|
|
5381
|
-
|
|
5394
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5395
|
+
const text = textMatch[2];
|
|
5382
5396
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5383
5397
|
let content = $el?.textContent || $el?.innerText;
|
|
5384
5398
|
if (typeof content !== "string") {
|
|
@@ -5386,18 +5400,17 @@ class DOMUtils {
|
|
|
5386
5400
|
}
|
|
5387
5401
|
return $el.matches(selector) && content?.includes(text);
|
|
5388
5402
|
}
|
|
5389
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5390
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5403
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5391
5404
|
// regexp 语法
|
|
5392
|
-
|
|
5405
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5393
5406
|
let pattern = textMatch[2];
|
|
5394
|
-
|
|
5407
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5395
5408
|
let flags = "";
|
|
5396
5409
|
if (flagMatch) {
|
|
5397
5410
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5398
5411
|
flags = flagMatch[3];
|
|
5399
5412
|
}
|
|
5400
|
-
|
|
5413
|
+
const regexp = new RegExp(pattern, flags);
|
|
5401
5414
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5402
5415
|
let content = $el?.textContent || $el?.innerText;
|
|
5403
5416
|
if (typeof content !== "string") {
|
|
@@ -5415,43 +5428,41 @@ class DOMUtils {
|
|
|
5415
5428
|
if (selector.match(/[^\s]{1}:empty$/gi)) {
|
|
5416
5429
|
// empty 语法
|
|
5417
5430
|
selector = selector.replace(/:empty$/gi, "");
|
|
5418
|
-
|
|
5431
|
+
const $closest = $el?.closest(selector);
|
|
5419
5432
|
if ($closest && $closest?.innerHTML?.trim() === "") {
|
|
5420
5433
|
return $closest;
|
|
5421
5434
|
}
|
|
5422
5435
|
return null;
|
|
5423
5436
|
}
|
|
5424
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5425
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5437
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5426
5438
|
// contains 语法
|
|
5427
|
-
|
|
5428
|
-
|
|
5439
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5440
|
+
const text = textMatch[2];
|
|
5429
5441
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5430
|
-
|
|
5442
|
+
const $closest = $el?.closest(selector);
|
|
5431
5443
|
if ($closest) {
|
|
5432
|
-
|
|
5444
|
+
const content = $el?.textContent || $el?.innerText;
|
|
5433
5445
|
if (typeof content === "string" && content.includes(text)) {
|
|
5434
5446
|
return $closest;
|
|
5435
5447
|
}
|
|
5436
5448
|
}
|
|
5437
5449
|
return null;
|
|
5438
5450
|
}
|
|
5439
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5440
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5451
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5441
5452
|
// regexp 语法
|
|
5442
|
-
|
|
5453
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5443
5454
|
let pattern = textMatch[2];
|
|
5444
|
-
|
|
5455
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5445
5456
|
let flags = "";
|
|
5446
5457
|
if (flagMatch) {
|
|
5447
5458
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5448
5459
|
flags = flagMatch[3];
|
|
5449
5460
|
}
|
|
5450
|
-
|
|
5461
|
+
const regexp = new RegExp(pattern, flags);
|
|
5451
5462
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5452
|
-
|
|
5463
|
+
const $closest = $el?.closest(selector);
|
|
5453
5464
|
if ($closest) {
|
|
5454
|
-
|
|
5465
|
+
const content = $el?.textContent || $el?.innerText;
|
|
5455
5466
|
if (typeof content === "string" && content.match(regexp)) {
|
|
5456
5467
|
return $closest;
|
|
5457
5468
|
}
|
|
@@ -5460,12 +5471,14 @@ class DOMUtils {
|
|
|
5460
5471
|
}
|
|
5461
5472
|
else {
|
|
5462
5473
|
// 普通语法
|
|
5463
|
-
|
|
5474
|
+
const $closest = $el?.closest(selector);
|
|
5464
5475
|
return $closest;
|
|
5465
5476
|
}
|
|
5466
5477
|
}
|
|
5467
5478
|
}
|
|
5468
|
-
|
|
5479
|
+
const domUtils = new DOMUtils();
|
|
5480
|
+
|
|
5481
|
+
const version = "2.8.2";
|
|
5469
5482
|
|
|
5470
5483
|
class Utils {
|
|
5471
5484
|
windowApi;
|
|
@@ -5473,12 +5486,12 @@ class Utils {
|
|
|
5473
5486
|
this.windowApi = new WindowApi(option);
|
|
5474
5487
|
}
|
|
5475
5488
|
/** 版本号 */
|
|
5476
|
-
version =
|
|
5489
|
+
version = version;
|
|
5477
5490
|
addStyle(cssText) {
|
|
5478
5491
|
if (typeof cssText !== "string") {
|
|
5479
5492
|
throw new Error("Utils.addStyle 参数cssText 必须为String类型");
|
|
5480
5493
|
}
|
|
5481
|
-
|
|
5494
|
+
const cssNode = this.windowApi.document.createElement("style");
|
|
5482
5495
|
cssNode.setAttribute("type", "text/css");
|
|
5483
5496
|
cssNode.innerHTML = cssText;
|
|
5484
5497
|
if (this.windowApi.document.head) {
|
|
@@ -5500,23 +5513,23 @@ class Utils {
|
|
|
5500
5513
|
return cssNode;
|
|
5501
5514
|
}
|
|
5502
5515
|
/**
|
|
5503
|
-
|
|
5504
|
-
|
|
5505
|
-
|
|
5506
|
-
|
|
5507
|
-
|
|
5508
|
-
|
|
5509
|
-
|
|
5510
|
-
|
|
5511
|
-
|
|
5512
|
-
|
|
5513
|
-
|
|
5514
|
-
|
|
5515
|
-
|
|
5516
|
-
|
|
5516
|
+
* JSON数据从源端替换到目标端中,如果目标端存在该数据则替换,不添加,返回结果为目标端替换完毕的结果
|
|
5517
|
+
* @param target 目标数据
|
|
5518
|
+
* @param source 源数据
|
|
5519
|
+
* @param isAdd 是否可以追加键,默认false
|
|
5520
|
+
* @example
|
|
5521
|
+
* Utils.assign({"1":1,"2":{"3":3}}, {"2":{"3":4}});
|
|
5522
|
+
* >
|
|
5523
|
+
* {
|
|
5524
|
+
"1": 1,
|
|
5525
|
+
"2": {
|
|
5526
|
+
"3": 4
|
|
5527
|
+
}
|
|
5528
|
+
}
|
|
5529
|
+
*/
|
|
5517
5530
|
assign = commonUtil.assign.bind(commonUtil);
|
|
5518
5531
|
async asyncReplaceAll(string, pattern, asyncFn) {
|
|
5519
|
-
|
|
5532
|
+
const UtilsContext = this;
|
|
5520
5533
|
if (typeof string !== "string") {
|
|
5521
5534
|
throw new TypeError("string必须是字符串");
|
|
5522
5535
|
}
|
|
@@ -5588,18 +5601,18 @@ class Utils {
|
|
|
5588
5601
|
canvasElement.dispatchEvent(new MouseEvent("mouseup", eventInit));
|
|
5589
5602
|
}
|
|
5590
5603
|
checkUserClickInNode(element) {
|
|
5591
|
-
|
|
5604
|
+
const UtilsContext = this;
|
|
5592
5605
|
if (!UtilsContext.isDOM(element)) {
|
|
5593
5606
|
throw new Error("Utils.checkUserClickInNode 参数 targetNode 必须为 Element|Node 类型");
|
|
5594
5607
|
}
|
|
5595
|
-
|
|
5596
|
-
|
|
5597
|
-
|
|
5608
|
+
const clickEvent = UtilsContext.windowApi.window.event;
|
|
5609
|
+
const touchEvent = UtilsContext.windowApi.window.event;
|
|
5610
|
+
const $click = clickEvent?.composedPath()?.[0];
|
|
5598
5611
|
// 点击的x坐标
|
|
5599
|
-
|
|
5612
|
+
const clickPosX = clickEvent?.clientX != null ? clickEvent.clientX : touchEvent.touches[0].clientX;
|
|
5600
5613
|
// 点击的y坐标
|
|
5601
|
-
|
|
5602
|
-
|
|
5614
|
+
const clickPosY = clickEvent?.clientY != null ? clickEvent.clientY : touchEvent.touches[0].clientY;
|
|
5615
|
+
const {
|
|
5603
5616
|
/* 要检测的元素的相对屏幕的横坐标最左边 */
|
|
5604
5617
|
left: elementPosXLeft,
|
|
5605
5618
|
/* 要检测的元素的相对屏幕的横坐标最右边 */
|
|
@@ -5627,32 +5640,32 @@ class Utils {
|
|
|
5627
5640
|
* @param formData 需要clone的数据
|
|
5628
5641
|
*/
|
|
5629
5642
|
cloneFormData(formData, filterFn) {
|
|
5630
|
-
|
|
5631
|
-
|
|
5632
|
-
|
|
5643
|
+
const clonedFormData = new FormData();
|
|
5644
|
+
formData.forEach((value, key) => {
|
|
5645
|
+
const isFilter = typeof filterFn === "function" ? filterFn(key, value) : false;
|
|
5633
5646
|
if (typeof isFilter === "boolean" && isFilter) {
|
|
5634
|
-
|
|
5647
|
+
return;
|
|
5635
5648
|
}
|
|
5636
5649
|
clonedFormData.append(key, value);
|
|
5637
|
-
}
|
|
5650
|
+
});
|
|
5638
5651
|
return clonedFormData;
|
|
5639
5652
|
}
|
|
5640
5653
|
createOverload() {
|
|
5641
|
-
|
|
5654
|
+
const fnMap = new Map();
|
|
5642
5655
|
function overload(...args) {
|
|
5643
|
-
|
|
5644
|
-
|
|
5656
|
+
const key = args.map((it) => typeof it).join(",");
|
|
5657
|
+
const fn = fnMap.get(key);
|
|
5645
5658
|
if (!fn) {
|
|
5646
5659
|
throw new TypeError("没有找到对应的实现");
|
|
5647
5660
|
}
|
|
5648
5661
|
return fn.apply(this, args);
|
|
5649
5662
|
}
|
|
5650
5663
|
overload.addImpl = function (...args) {
|
|
5651
|
-
|
|
5664
|
+
const fn = args.pop();
|
|
5652
5665
|
if (typeof fn !== "function") {
|
|
5653
5666
|
throw new TypeError("最后一个参数必须是函数");
|
|
5654
5667
|
}
|
|
5655
|
-
|
|
5668
|
+
const key = args.join(",");
|
|
5656
5669
|
fnMap.set(key, fn);
|
|
5657
5670
|
};
|
|
5658
5671
|
return overload;
|
|
@@ -5669,7 +5682,7 @@ class Utils {
|
|
|
5669
5682
|
deepClone = commonUtil.deepClone.bind(commonUtil);
|
|
5670
5683
|
debounce(fn, delay = 0) {
|
|
5671
5684
|
let timer = null;
|
|
5672
|
-
|
|
5685
|
+
const UtilsContext = this;
|
|
5673
5686
|
return function (...args) {
|
|
5674
5687
|
UtilsContext.workerClearTimeout(timer);
|
|
5675
5688
|
timer = UtilsContext.workerSetTimeout(function () {
|
|
@@ -5678,7 +5691,7 @@ class Utils {
|
|
|
5678
5691
|
};
|
|
5679
5692
|
}
|
|
5680
5693
|
deleteParentNode(element, targetSelector) {
|
|
5681
|
-
|
|
5694
|
+
const UtilsContext = this;
|
|
5682
5695
|
if (element == null) {
|
|
5683
5696
|
return;
|
|
5684
5697
|
}
|
|
@@ -5689,7 +5702,7 @@ class Utils {
|
|
|
5689
5702
|
throw new Error("Utils.deleteParentNode 参数 targetSelector 必须为 string 类型");
|
|
5690
5703
|
}
|
|
5691
5704
|
let result = false;
|
|
5692
|
-
|
|
5705
|
+
const needRemoveDOM = domUtils.closest(element, targetSelector);
|
|
5693
5706
|
if (needRemoveDOM) {
|
|
5694
5707
|
needRemoveDOM.remove();
|
|
5695
5708
|
result = true;
|
|
@@ -5719,7 +5732,7 @@ class Utils {
|
|
|
5719
5732
|
eventNameList = [...eventName];
|
|
5720
5733
|
}
|
|
5721
5734
|
eventNameList.forEach((_eventName_) => {
|
|
5722
|
-
|
|
5735
|
+
const event = new Event(_eventName_);
|
|
5723
5736
|
if (details) {
|
|
5724
5737
|
Object.assign(event, details);
|
|
5725
5738
|
}
|
|
@@ -5727,7 +5740,7 @@ class Utils {
|
|
|
5727
5740
|
});
|
|
5728
5741
|
}
|
|
5729
5742
|
downloadBase64(base64Data, fileName, isIFrame = false) {
|
|
5730
|
-
|
|
5743
|
+
const UtilsContext = this;
|
|
5731
5744
|
if (typeof base64Data !== "string") {
|
|
5732
5745
|
throw new Error("Utils.downloadBase64 参数 base64Data 必须为 string 类型");
|
|
5733
5746
|
}
|
|
@@ -5759,7 +5772,7 @@ class Utils {
|
|
|
5759
5772
|
let strFound;
|
|
5760
5773
|
if (this.windowApi.globalThis.find) {
|
|
5761
5774
|
/* CODE FOR BROWSERS THAT SUPPORT window.find */
|
|
5762
|
-
|
|
5775
|
+
const windowFind = this.windowApi.self.find;
|
|
5763
5776
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
5764
5777
|
if (strFound && this.windowApi.self.getSelection && !this.windowApi.self.getSelection().anchorNode) {
|
|
5765
5778
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
@@ -5793,19 +5806,19 @@ class Utils {
|
|
|
5793
5806
|
return strFound ? true : false;
|
|
5794
5807
|
}
|
|
5795
5808
|
*findElementsWithText(element, text, filter) {
|
|
5796
|
-
|
|
5809
|
+
const that = this;
|
|
5797
5810
|
if (element.outerHTML.includes(text)) {
|
|
5798
5811
|
if (element.children.length === 0) {
|
|
5799
|
-
|
|
5812
|
+
const filterResult = typeof filter === "function" ? filter(element) : false;
|
|
5800
5813
|
if (!filterResult) {
|
|
5801
5814
|
yield element;
|
|
5802
5815
|
}
|
|
5803
5816
|
}
|
|
5804
5817
|
else {
|
|
5805
|
-
|
|
5806
|
-
for (
|
|
5818
|
+
const textElement = Array.from(element.childNodes).filter((ele) => ele.nodeType === Node.TEXT_NODE);
|
|
5819
|
+
for (const $child of textElement) {
|
|
5807
5820
|
if ($child.textContent.includes(text)) {
|
|
5808
|
-
|
|
5821
|
+
const filterResult = typeof filter === "function" ? filter(element) : false;
|
|
5809
5822
|
if (!filterResult) {
|
|
5810
5823
|
yield $child;
|
|
5811
5824
|
}
|
|
@@ -5814,7 +5827,7 @@ class Utils {
|
|
|
5814
5827
|
}
|
|
5815
5828
|
}
|
|
5816
5829
|
for (let index = 0; index < element.children.length; index++) {
|
|
5817
|
-
|
|
5830
|
+
const $child = element.children[index];
|
|
5818
5831
|
yield* that.findElementsWithText($child, text, filter);
|
|
5819
5832
|
}
|
|
5820
5833
|
}
|
|
@@ -5828,8 +5841,8 @@ class Utils {
|
|
|
5828
5841
|
findVisibleElement(element) {
|
|
5829
5842
|
let currentElement = element;
|
|
5830
5843
|
while (currentElement) {
|
|
5831
|
-
|
|
5832
|
-
if (
|
|
5844
|
+
const elementRect = currentElement.getBoundingClientRect();
|
|
5845
|
+
if (elementRect.length) {
|
|
5833
5846
|
return currentElement;
|
|
5834
5847
|
}
|
|
5835
5848
|
currentElement = currentElement.parentElement;
|
|
@@ -5843,7 +5856,7 @@ class Utils {
|
|
|
5843
5856
|
}
|
|
5844
5857
|
let result = 0;
|
|
5845
5858
|
let resultType = "KB";
|
|
5846
|
-
|
|
5859
|
+
const sizeData = {};
|
|
5847
5860
|
sizeData.B = 1;
|
|
5848
5861
|
sizeData.KB = 1024;
|
|
5849
5862
|
sizeData.MB = sizeData.KB * sizeData.KB;
|
|
@@ -5856,7 +5869,7 @@ class Utils {
|
|
|
5856
5869
|
sizeData.BB = sizeData.YB * sizeData.KB;
|
|
5857
5870
|
sizeData.NB = sizeData.BB * sizeData.KB;
|
|
5858
5871
|
sizeData.DB = sizeData.NB * sizeData.KB;
|
|
5859
|
-
for (
|
|
5872
|
+
for (const key in sizeData) {
|
|
5860
5873
|
result = byteSize / sizeData[key];
|
|
5861
5874
|
resultType = key;
|
|
5862
5875
|
if (sizeData.KB >= result) {
|
|
@@ -5869,7 +5882,7 @@ class Utils {
|
|
|
5869
5882
|
}
|
|
5870
5883
|
getNodeListValue(...args) {
|
|
5871
5884
|
let resultArray = [];
|
|
5872
|
-
for (
|
|
5885
|
+
for (const arg of args) {
|
|
5873
5886
|
let value = arg;
|
|
5874
5887
|
if (typeof arg === "function") {
|
|
5875
5888
|
/* 方法 */
|
|
@@ -5884,7 +5897,7 @@ class Utils {
|
|
|
5884
5897
|
}
|
|
5885
5898
|
getNonNullValue(...args) {
|
|
5886
5899
|
let resultValue = args[args.length - 1];
|
|
5887
|
-
|
|
5900
|
+
const UtilsContext = this;
|
|
5888
5901
|
for (const argValue of args) {
|
|
5889
5902
|
if (UtilsContext.isNotNull(argValue)) {
|
|
5890
5903
|
resultValue = argValue;
|
|
@@ -5894,7 +5907,7 @@ class Utils {
|
|
|
5894
5907
|
return resultValue;
|
|
5895
5908
|
}
|
|
5896
5909
|
formatTime(text = new Date(), formatType = "yyyy-MM-dd HH:mm:ss") {
|
|
5897
|
-
|
|
5910
|
+
const time = text == null ? new Date() : new Date(text);
|
|
5898
5911
|
/**
|
|
5899
5912
|
* 校验时间补0
|
|
5900
5913
|
* @param timeNum
|
|
@@ -5902,7 +5915,7 @@ class Utils {
|
|
|
5902
5915
|
*/
|
|
5903
5916
|
function checkTime(timeNum) {
|
|
5904
5917
|
if (timeNum < 10)
|
|
5905
|
-
return
|
|
5918
|
+
return `0${timeNum}`;
|
|
5906
5919
|
return timeNum;
|
|
5907
5920
|
}
|
|
5908
5921
|
/**
|
|
@@ -5913,7 +5926,7 @@ class Utils {
|
|
|
5913
5926
|
function timeSystemChange(hourNum) {
|
|
5914
5927
|
return hourNum > 12 ? hourNum - 12 : hourNum;
|
|
5915
5928
|
}
|
|
5916
|
-
|
|
5929
|
+
const timeRegexp = {
|
|
5917
5930
|
yyyy: time.getFullYear(),
|
|
5918
5931
|
/* 年 */
|
|
5919
5932
|
MM: checkTime(time.getMonth() + 1),
|
|
@@ -5930,7 +5943,7 @@ class Utils {
|
|
|
5930
5943
|
/* 秒 */
|
|
5931
5944
|
};
|
|
5932
5945
|
Object.keys(timeRegexp).forEach(function (key) {
|
|
5933
|
-
|
|
5946
|
+
const replaecRegexp = new RegExp(key, "g");
|
|
5934
5947
|
formatType = formatType.replace(replaecRegexp, timeRegexp[key]);
|
|
5935
5948
|
});
|
|
5936
5949
|
return formatType;
|
|
@@ -5942,12 +5955,12 @@ class Utils {
|
|
|
5942
5955
|
}
|
|
5943
5956
|
if (text.length === 8) {
|
|
5944
5957
|
/* 该字符串只有时分秒 */
|
|
5945
|
-
|
|
5946
|
-
text = today.getFullYear()
|
|
5958
|
+
const today = new Date();
|
|
5959
|
+
text = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()} ${text}`;
|
|
5947
5960
|
}
|
|
5948
5961
|
text = text.substring(0, 19);
|
|
5949
5962
|
text = text.replace(/-/g, "/");
|
|
5950
|
-
|
|
5963
|
+
const timestamp = new Date(text).getTime();
|
|
5951
5964
|
return timestamp;
|
|
5952
5965
|
}
|
|
5953
5966
|
/**
|
|
@@ -5997,16 +6010,16 @@ class Utils {
|
|
|
5997
6010
|
if (timestamp2.toString().length === 10) {
|
|
5998
6011
|
timestamp2 = timestamp2 * 1000;
|
|
5999
6012
|
}
|
|
6000
|
-
|
|
6001
|
-
|
|
6002
|
-
|
|
6003
|
-
|
|
6004
|
-
|
|
6005
|
-
|
|
6006
|
-
|
|
6007
|
-
|
|
6008
|
-
|
|
6009
|
-
|
|
6013
|
+
const smallTimeStamp = timestamp1 > timestamp2 ? timestamp2 : timestamp1;
|
|
6014
|
+
const bigTimeStamp = timestamp1 > timestamp2 ? timestamp1 : timestamp2;
|
|
6015
|
+
const oneSecond = 1000; /* 一秒的毫秒数 */
|
|
6016
|
+
const oneMinute = 60 * oneSecond; /* 一分钟的毫秒数 */
|
|
6017
|
+
const oneHour = 60 * oneMinute; /* 一小时的毫秒数 */
|
|
6018
|
+
const oneDay = 24 * oneHour; /* 一天的毫秒数 */
|
|
6019
|
+
const oneMonth = 30 * oneDay; /* 一个月的毫秒数(30天) */
|
|
6020
|
+
const oneYear = 12 * oneMonth; /* 一年的毫秒数 */
|
|
6021
|
+
const bigDate = new Date(bigTimeStamp);
|
|
6022
|
+
const smallDate = new Date(smallTimeStamp);
|
|
6010
6023
|
let remainderValue = 1;
|
|
6011
6024
|
if (type === "年") {
|
|
6012
6025
|
remainderValue = oneYear;
|
|
@@ -6028,30 +6041,30 @@ class Utils {
|
|
|
6028
6041
|
}
|
|
6029
6042
|
let diffValue = Math.round(Math.abs((bigDate - smallDate) / remainderValue));
|
|
6030
6043
|
if (type === "auto") {
|
|
6031
|
-
|
|
6044
|
+
const timeDifference = bigTimeStamp - smallTimeStamp;
|
|
6032
6045
|
diffValue = Math.floor(timeDifference / (24 * 3600 * 1000));
|
|
6033
6046
|
if (diffValue > 0) {
|
|
6034
|
-
diffValue = diffValue
|
|
6047
|
+
diffValue = `${diffValue}天`;
|
|
6035
6048
|
}
|
|
6036
6049
|
else {
|
|
6037
6050
|
/* 计算出小时数 */
|
|
6038
|
-
|
|
6039
|
-
|
|
6051
|
+
const leave1 = timeDifference % (24 * 3600 * 1000); /* 计算天数后剩余的毫秒数 */
|
|
6052
|
+
const hours = Math.floor(leave1 / (3600 * 1000));
|
|
6040
6053
|
if (hours > 0) {
|
|
6041
|
-
diffValue = hours
|
|
6054
|
+
diffValue = `${hours}小时`;
|
|
6042
6055
|
}
|
|
6043
6056
|
else {
|
|
6044
6057
|
/* 计算相差分钟数 */
|
|
6045
|
-
|
|
6046
|
-
|
|
6058
|
+
const leave2 = leave1 % (3600 * 1000); /* 计算小时数后剩余的毫秒数 */
|
|
6059
|
+
const minutes = Math.floor(leave2 / (60 * 1000));
|
|
6047
6060
|
if (minutes > 0) {
|
|
6048
|
-
diffValue = minutes
|
|
6061
|
+
diffValue = `${minutes}分钟`;
|
|
6049
6062
|
}
|
|
6050
6063
|
else {
|
|
6051
6064
|
/* 计算相差秒数 */
|
|
6052
|
-
|
|
6053
|
-
|
|
6054
|
-
diffValue = seconds
|
|
6065
|
+
const leave3 = leave2 % (60 * 1000); /* 计算分钟数后剩余的毫秒数 */
|
|
6066
|
+
const seconds = Math.round(leave3 / 1000);
|
|
6067
|
+
diffValue = `${seconds}秒`;
|
|
6055
6068
|
}
|
|
6056
6069
|
}
|
|
6057
6070
|
}
|
|
@@ -6059,14 +6072,14 @@ class Utils {
|
|
|
6059
6072
|
return diffValue;
|
|
6060
6073
|
}
|
|
6061
6074
|
getElementSelector(element) {
|
|
6062
|
-
|
|
6075
|
+
const UtilsContext = this;
|
|
6063
6076
|
if (!element)
|
|
6064
6077
|
return void 0;
|
|
6065
6078
|
if (!element.parentElement)
|
|
6066
6079
|
return void 0;
|
|
6067
6080
|
/* 如果元素有id属性,则直接返回id选择器 */
|
|
6068
6081
|
if (element.id)
|
|
6069
|
-
return
|
|
6082
|
+
return `#${element.id}`;
|
|
6070
6083
|
/* 递归地获取父元素的选择器 */
|
|
6071
6084
|
let selector = UtilsContext.getElementSelector(element.parentElement);
|
|
6072
6085
|
if (!selector) {
|
|
@@ -6074,11 +6087,11 @@ class Utils {
|
|
|
6074
6087
|
}
|
|
6075
6088
|
/* 如果有多个相同类型的兄弟元素,则需要添加索引 */
|
|
6076
6089
|
if (element.parentElement.querySelectorAll(element.tagName).length > 1) {
|
|
6077
|
-
|
|
6078
|
-
selector +=
|
|
6090
|
+
const index = Array.prototype.indexOf.call(element.parentElement.children, element) + 1;
|
|
6091
|
+
selector += ` > ${element.tagName.toLowerCase()}:nth-child(${index})`;
|
|
6079
6092
|
}
|
|
6080
6093
|
else {
|
|
6081
|
-
selector +=
|
|
6094
|
+
selector += ` > ${element.tagName.toLowerCase()}`;
|
|
6082
6095
|
}
|
|
6083
6096
|
return selector;
|
|
6084
6097
|
}
|
|
@@ -6089,15 +6102,15 @@ class Utils {
|
|
|
6089
6102
|
* > 2
|
|
6090
6103
|
*/
|
|
6091
6104
|
getMaxValue(...args) {
|
|
6092
|
-
|
|
6105
|
+
const result = [...args];
|
|
6093
6106
|
let newResult = [];
|
|
6094
6107
|
if (result.length === 0) {
|
|
6095
6108
|
return void 0;
|
|
6096
6109
|
}
|
|
6097
6110
|
if (result.length > 1) {
|
|
6098
6111
|
if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
|
|
6099
|
-
|
|
6100
|
-
|
|
6112
|
+
const data = result[0];
|
|
6113
|
+
const handleDataFunc = result[1];
|
|
6101
6114
|
Object.keys(data).forEach((keyName) => {
|
|
6102
6115
|
newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
|
|
6103
6116
|
});
|
|
@@ -6145,7 +6158,7 @@ class Utils {
|
|
|
6145
6158
|
*/
|
|
6146
6159
|
function queryMaxZIndex($ele) {
|
|
6147
6160
|
if (typeof ignoreCallBack === "function") {
|
|
6148
|
-
|
|
6161
|
+
const ignoreResult = ignoreCallBack($ele);
|
|
6149
6162
|
if (typeof ignoreResult === "boolean" && !ignoreResult) {
|
|
6150
6163
|
return;
|
|
6151
6164
|
}
|
|
@@ -6154,7 +6167,7 @@ class Utils {
|
|
|
6154
6167
|
const nodeStyle = UtilsContext.windowApi.window.getComputedStyle($ele);
|
|
6155
6168
|
/* 不对position为static和display为none的元素进行获取它们的z-index */
|
|
6156
6169
|
if (isVisibleNode(nodeStyle)) {
|
|
6157
|
-
|
|
6170
|
+
const nodeZIndex = parseInt(nodeStyle.zIndex);
|
|
6158
6171
|
if (!isNaN(nodeZIndex)) {
|
|
6159
6172
|
if (nodeZIndex > zIndex) {
|
|
6160
6173
|
// 赋值到全局
|
|
@@ -6170,7 +6183,7 @@ class Utils {
|
|
|
6170
6183
|
}
|
|
6171
6184
|
}
|
|
6172
6185
|
}
|
|
6173
|
-
target.querySelectorAll("*").forEach(($ele
|
|
6186
|
+
target.querySelectorAll("*").forEach(($ele) => {
|
|
6174
6187
|
queryMaxZIndex($ele);
|
|
6175
6188
|
});
|
|
6176
6189
|
zIndex += deviation;
|
|
@@ -6187,15 +6200,15 @@ class Utils {
|
|
|
6187
6200
|
return this.getMaxZIndexNodeInfo(deviation, target, ignoreCallBack).zIndex;
|
|
6188
6201
|
}
|
|
6189
6202
|
getMinValue(...args) {
|
|
6190
|
-
|
|
6203
|
+
const result = [...args];
|
|
6191
6204
|
let newResult = [];
|
|
6192
6205
|
if (result.length === 0) {
|
|
6193
6206
|
return void 0;
|
|
6194
6207
|
}
|
|
6195
6208
|
if (result.length > 1) {
|
|
6196
6209
|
if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
|
|
6197
|
-
|
|
6198
|
-
|
|
6210
|
+
const data = result[0];
|
|
6211
|
+
const handleDataFunc = result[1];
|
|
6199
6212
|
Object.keys(data).forEach((keyName) => {
|
|
6200
6213
|
newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
|
|
6201
6214
|
});
|
|
@@ -6225,8 +6238,8 @@ class Utils {
|
|
|
6225
6238
|
* > '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'
|
|
6226
6239
|
**/
|
|
6227
6240
|
getRandomAndroidUA() {
|
|
6228
|
-
|
|
6229
|
-
|
|
6241
|
+
const UtilsContext = this;
|
|
6242
|
+
const mobileNameList = [
|
|
6230
6243
|
"LDN-LX3",
|
|
6231
6244
|
"RNE-L03",
|
|
6232
6245
|
"ASUS_X00ID Build/NMF26F",
|
|
@@ -6243,14 +6256,14 @@ class Utils {
|
|
|
6243
6256
|
"MI 13 Build/OPR1.170623.027; wv",
|
|
6244
6257
|
];
|
|
6245
6258
|
/* 安卓版本 */
|
|
6246
|
-
|
|
6259
|
+
const androidVersion = UtilsContext.getRandomValue(12, 14);
|
|
6247
6260
|
/* 手机型号 */
|
|
6248
|
-
|
|
6261
|
+
const randomMobile = UtilsContext.getRandomValue(mobileNameList);
|
|
6249
6262
|
/* chrome大版本号 */
|
|
6250
|
-
|
|
6251
|
-
|
|
6252
|
-
|
|
6253
|
-
|
|
6263
|
+
const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
|
|
6264
|
+
const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
|
|
6265
|
+
const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
|
|
6266
|
+
const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
|
|
6254
6267
|
return `Mozilla/5.0 (Linux; Android ${androidVersion}; ${randomMobile}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Mobile Safari/537.36`;
|
|
6255
6268
|
}
|
|
6256
6269
|
/**
|
|
@@ -6272,20 +6285,20 @@ class Utils {
|
|
|
6272
6285
|
* > 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5068.19 Safari/537.36'
|
|
6273
6286
|
**/
|
|
6274
6287
|
getRandomPCUA() {
|
|
6275
|
-
|
|
6288
|
+
const UtilsContext = this;
|
|
6276
6289
|
/* chrome大版本号 */
|
|
6277
|
-
|
|
6278
|
-
|
|
6279
|
-
|
|
6280
|
-
|
|
6290
|
+
const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
|
|
6291
|
+
const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
|
|
6292
|
+
const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
|
|
6293
|
+
const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
|
|
6281
6294
|
return `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Safari/537.36`;
|
|
6282
6295
|
}
|
|
6283
6296
|
getRandomValue(...args) {
|
|
6284
|
-
|
|
6297
|
+
const result = [...args];
|
|
6285
6298
|
if (result.length > 1) {
|
|
6286
6299
|
if (result.length === 2 && typeof result[0] === "number" && typeof result[1] === "number") {
|
|
6287
|
-
|
|
6288
|
-
|
|
6300
|
+
const leftNumber = result[0] > result[1] ? result[1] : result[0];
|
|
6301
|
+
const rightNumber = result[0] > result[1] ? result[0] : result[1];
|
|
6289
6302
|
return Math.round(Math.random() * (rightNumber - leftNumber)) + leftNumber;
|
|
6290
6303
|
}
|
|
6291
6304
|
else {
|
|
@@ -6293,12 +6306,12 @@ class Utils {
|
|
|
6293
6306
|
}
|
|
6294
6307
|
}
|
|
6295
6308
|
else if (result.length === 1) {
|
|
6296
|
-
|
|
6309
|
+
const paramData = result[0];
|
|
6297
6310
|
if (Array.isArray(paramData)) {
|
|
6298
6311
|
return paramData[Math.floor(Math.random() * paramData.length)];
|
|
6299
6312
|
}
|
|
6300
6313
|
else if (typeof paramData === "object" && Object.keys(paramData).length > 0) {
|
|
6301
|
-
|
|
6314
|
+
const paramObjDataKey = Object.keys(paramData)[Math.floor(Math.random() * Object.keys(paramData).length)];
|
|
6302
6315
|
return paramData[paramObjDataKey];
|
|
6303
6316
|
}
|
|
6304
6317
|
else {
|
|
@@ -6314,7 +6327,7 @@ class Utils {
|
|
|
6314
6327
|
* Utils.getReactObj(document.querySelector("input"))?.reactProps?.onChange({target:{value:"123"}});
|
|
6315
6328
|
*/
|
|
6316
6329
|
getReactObj(element) {
|
|
6317
|
-
|
|
6330
|
+
const result = {};
|
|
6318
6331
|
if (element == null) {
|
|
6319
6332
|
return result;
|
|
6320
6333
|
}
|
|
@@ -6340,9 +6353,9 @@ class Utils {
|
|
|
6340
6353
|
if (typeof target !== "object") {
|
|
6341
6354
|
throw new TypeError("target不是一个对象");
|
|
6342
6355
|
}
|
|
6343
|
-
|
|
6356
|
+
const objectsSymbols = Object.getOwnPropertySymbols(target);
|
|
6344
6357
|
if (typeof keyName === "string") {
|
|
6345
|
-
|
|
6358
|
+
const findSymbol = objectsSymbols.find((key) => {
|
|
6346
6359
|
return key.toString() === keyName;
|
|
6347
6360
|
});
|
|
6348
6361
|
if (findSymbol) {
|
|
@@ -6350,7 +6363,7 @@ class Utils {
|
|
|
6350
6363
|
}
|
|
6351
6364
|
}
|
|
6352
6365
|
else if (typeof keyName === "symbol") {
|
|
6353
|
-
|
|
6366
|
+
const findSymbol = objectsSymbols.find((key) => {
|
|
6354
6367
|
return key === keyName;
|
|
6355
6368
|
});
|
|
6356
6369
|
if (findSymbol) {
|
|
@@ -6358,7 +6371,7 @@ class Utils {
|
|
|
6358
6371
|
}
|
|
6359
6372
|
}
|
|
6360
6373
|
else {
|
|
6361
|
-
|
|
6374
|
+
const result = {};
|
|
6362
6375
|
objectsSymbols.forEach((item) => {
|
|
6363
6376
|
result[item] = target[item];
|
|
6364
6377
|
});
|
|
@@ -6373,12 +6386,12 @@ class Utils {
|
|
|
6373
6386
|
* > 12
|
|
6374
6387
|
*/
|
|
6375
6388
|
getTextLength(text) {
|
|
6376
|
-
|
|
6377
|
-
|
|
6389
|
+
const encoder = new TextEncoder();
|
|
6390
|
+
const bytes = encoder.encode(text);
|
|
6378
6391
|
return bytes.length;
|
|
6379
6392
|
}
|
|
6380
6393
|
getTextStorageSize(text, addType = true) {
|
|
6381
|
-
|
|
6394
|
+
const UtilsContext = this;
|
|
6382
6395
|
return UtilsContext.formatByteToSize(UtilsContext.getTextLength(text), addType);
|
|
6383
6396
|
}
|
|
6384
6397
|
getThunderUrl(url) {
|
|
@@ -6391,88 +6404,75 @@ class Utils {
|
|
|
6391
6404
|
if (url.trim() === "") {
|
|
6392
6405
|
throw new TypeError("url不能为空字符串或纯空格");
|
|
6393
6406
|
}
|
|
6394
|
-
return `thunder://${this.windowApi.globalThis.btoa(
|
|
6407
|
+
return `thunder://${this.windowApi.globalThis.btoa(`AA${url}ZZ`)}`;
|
|
6395
6408
|
}
|
|
6396
6409
|
/**
|
|
6397
|
-
|
|
6398
|
-
|
|
6399
|
-
|
|
6400
|
-
|
|
6401
|
-
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
|
|
6407
|
-
|
|
6408
|
-
|
|
6409
|
-
|
|
6410
|
-
|
|
6411
|
-
|
|
6412
|
-
|
|
6413
|
-
|
|
6414
|
-
|
|
6415
|
-
|
|
6416
|
-
|
|
6417
|
-
|
|
6418
|
-
|
|
6419
|
-
|
|
6420
|
-
|
|
6421
|
-
|
|
6422
|
-
|
|
6410
|
+
* 对于GM_cookie的兼容写法,当无法使用GM_cookie时可以使用这个,但是并不完全兼容,有些写不出来且限制了httponly是无法访问的
|
|
6411
|
+
* @example
|
|
6412
|
+
let GM_cookie = new Utils.GM_Cookie();
|
|
6413
|
+
GM_cookie.list({name:"xxx_cookie_xxx"},function(cookies,error){
|
|
6414
|
+
if (!error) {
|
|
6415
|
+
console.log(cookies);
|
|
6416
|
+
console.log(cookies.value);
|
|
6417
|
+
} else {
|
|
6418
|
+
console.error(error);
|
|
6419
|
+
}
|
|
6420
|
+
});
|
|
6421
|
+
GM_cookie.set({name:"xxx_cookie_test_xxx",value:"这是Cookie测试值"},function(error){
|
|
6422
|
+
if (error) {
|
|
6423
|
+
console.error(error);
|
|
6424
|
+
} else {
|
|
6425
|
+
console.log('Cookie set successfully.');
|
|
6426
|
+
}
|
|
6427
|
+
})
|
|
6428
|
+
GM_cookie.delete({name:"xxx_cookie_test_xxx"},function(error){
|
|
6429
|
+
if (error) {
|
|
6430
|
+
console.error(error);
|
|
6431
|
+
} else {
|
|
6432
|
+
console.log('Cookie set successfully.');
|
|
6433
|
+
}
|
|
6434
|
+
})
|
|
6435
|
+
**/
|
|
6423
6436
|
GM_Cookie = UtilsGMCookie;
|
|
6424
6437
|
/**
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
|
|
6428
|
-
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
|
|
6432
|
-
|
|
6433
|
-
|
|
6434
|
-
|
|
6435
|
-
|
|
6436
|
-
|
|
6438
|
+
* 注册油猴菜单,要求本地存储的键名不能存在其它键名`GM_Menu_Local_Map`会冲突/覆盖
|
|
6439
|
+
* @example
|
|
6440
|
+
let GM_Menu = new Utils.GM_Menu({
|
|
6441
|
+
data: [
|
|
6442
|
+
{
|
|
6443
|
+
menu_key: "menu_key",
|
|
6444
|
+
text: "测试按钮",
|
|
6445
|
+
enable: true,
|
|
6446
|
+
accessKey: "a",
|
|
6447
|
+
autoClose: false,
|
|
6448
|
+
showText(text, enable) {
|
|
6449
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6450
|
+
},
|
|
6451
|
+
callback(data) {
|
|
6452
|
+
console.log("点击菜单,值修改为", data.enable);
|
|
6453
|
+
},
|
|
6437
6454
|
},
|
|
6438
|
-
|
|
6439
|
-
|
|
6440
|
-
|
|
6441
|
-
|
|
6442
|
-
|
|
6443
|
-
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
|
|
6447
|
-
|
|
6448
|
-
|
|
6449
|
-
|
|
6450
|
-
|
|
6451
|
-
|
|
6452
|
-
|
|
6453
|
-
|
|
6454
|
-
|
|
6455
|
-
|
|
6456
|
-
|
|
6457
|
-
|
|
6458
|
-
|
|
6459
|
-
// 添加键为menu_key2的菜单项
|
|
6460
|
-
GM_Menu.add({
|
|
6461
|
-
key:"menu_key2",
|
|
6462
|
-
text: "测试按钮2",
|
|
6463
|
-
enable: false,
|
|
6464
|
-
showText(text,enable){
|
|
6465
|
-
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6466
|
-
},
|
|
6467
|
-
callback(data){
|
|
6468
|
-
console.log("点击菜单,值修改为",data.enable);
|
|
6469
|
-
}
|
|
6470
|
-
});
|
|
6471
|
-
// 使用数组的方式添加多个菜单,如menu_key3、menu_key4
|
|
6472
|
-
GM_Menu.add([
|
|
6473
|
-
{
|
|
6474
|
-
key:"menu_key3",
|
|
6475
|
-
text: "测试按钮3",
|
|
6455
|
+
],
|
|
6456
|
+
autoReload: false,
|
|
6457
|
+
GM_getValue,
|
|
6458
|
+
GM_setValue,
|
|
6459
|
+
GM_registerMenuCommand,
|
|
6460
|
+
GM_unregisterMenuCommand,
|
|
6461
|
+
});
|
|
6462
|
+
|
|
6463
|
+
|
|
6464
|
+
// 获取某个菜单项的值
|
|
6465
|
+
GM_Menu.get("menu_key");
|
|
6466
|
+
> true
|
|
6467
|
+
|
|
6468
|
+
// 获取某个菜单项的开启/关闭后显示的文本
|
|
6469
|
+
GM_Menu.getShowTextValue("menu_key");
|
|
6470
|
+
> √测试按钮
|
|
6471
|
+
|
|
6472
|
+
// 添加键为menu_key2的菜单项
|
|
6473
|
+
GM_Menu.add({
|
|
6474
|
+
key:"menu_key2",
|
|
6475
|
+
text: "测试按钮2",
|
|
6476
6476
|
enable: false,
|
|
6477
6477
|
showText(text,enable){
|
|
6478
6478
|
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
@@ -6480,152 +6480,165 @@ class Utils {
|
|
|
6480
6480
|
callback(data){
|
|
6481
6481
|
console.log("点击菜单,值修改为",data.enable);
|
|
6482
6482
|
}
|
|
6483
|
-
}
|
|
6484
|
-
|
|
6485
|
-
|
|
6486
|
-
|
|
6487
|
-
|
|
6488
|
-
|
|
6489
|
-
|
|
6483
|
+
});
|
|
6484
|
+
// 使用数组的方式添加多个菜单,如menu_key3、menu_key4
|
|
6485
|
+
GM_Menu.add([
|
|
6486
|
+
{
|
|
6487
|
+
key:"menu_key3",
|
|
6488
|
+
text: "测试按钮3",
|
|
6489
|
+
enable: false,
|
|
6490
|
+
showText(text,enable){
|
|
6491
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6492
|
+
},
|
|
6493
|
+
callback(data){
|
|
6494
|
+
console.log("点击菜单,值修改为",data.enable);
|
|
6495
|
+
}
|
|
6490
6496
|
},
|
|
6491
|
-
|
|
6492
|
-
|
|
6497
|
+
{
|
|
6498
|
+
key:"menu_key4",
|
|
6499
|
+
text: "测试按钮4",
|
|
6500
|
+
enable: false,
|
|
6501
|
+
showText(text,enable){
|
|
6502
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6503
|
+
},
|
|
6504
|
+
callback(data){
|
|
6505
|
+
console.log("点击菜单,值修改为",data.enable);
|
|
6506
|
+
}
|
|
6493
6507
|
}
|
|
6494
|
-
|
|
6495
|
-
|
|
6496
|
-
|
|
6497
|
-
|
|
6498
|
-
|
|
6499
|
-
|
|
6500
|
-
|
|
6501
|
-
|
|
6502
|
-
|
|
6503
|
-
|
|
6504
|
-
|
|
6505
|
-
|
|
6506
|
-
|
|
6508
|
+
]);
|
|
6509
|
+
|
|
6510
|
+
// 更新键为menu_key的显示文字和点击回调
|
|
6511
|
+
GM_Menu.update({
|
|
6512
|
+
menu_key:{
|
|
6513
|
+
text: "更新后的测试按钮",
|
|
6514
|
+
enable: true,
|
|
6515
|
+
showText(text,enable){
|
|
6516
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6517
|
+
},
|
|
6518
|
+
callback(data){
|
|
6519
|
+
console.log("点击菜单更新后的测试按钮,新值修改为",data.enable);
|
|
6520
|
+
}
|
|
6507
6521
|
}
|
|
6508
|
-
}
|
|
6509
|
-
|
|
6510
|
-
|
|
6511
|
-
|
|
6512
|
-
|
|
6513
|
-
**/
|
|
6522
|
+
});
|
|
6523
|
+
|
|
6524
|
+
// 删除键为menu_key的菜单
|
|
6525
|
+
GM_Menu.delete("menu_key");
|
|
6526
|
+
**/
|
|
6514
6527
|
GM_Menu = GMMenu;
|
|
6515
6528
|
/**
|
|
6516
|
-
|
|
6517
|
-
|
|
6518
|
-
|
|
6519
|
-
|
|
6520
|
-
|
|
6521
|
-
|
|
6522
|
-
|
|
6523
|
-
|
|
6524
|
-
|
|
6525
|
-
|
|
6526
|
-
|
|
6527
|
-
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
|
|
6534
|
-
|
|
6535
|
-
|
|
6536
|
-
|
|
6537
|
-
|
|
6538
|
-
|
|
6529
|
+
* 基于Function prototype,能够勾住和释放任何函数
|
|
6530
|
+
*
|
|
6531
|
+
* .hook
|
|
6532
|
+
* + realFunc {string} 用于保存原始函数的函数名称,用于unHook
|
|
6533
|
+
* + hookFunc {string} 替换的hook函数
|
|
6534
|
+
* + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
|
|
6535
|
+
* + methodName {string} 匿名函数需显式传入目标函数名eg:this.Begin = function(){....};}
|
|
6536
|
+
*
|
|
6537
|
+
* .unhook
|
|
6538
|
+
* + realFunc {string} 用于保存原始函数的函数名称,用于unHook
|
|
6539
|
+
* + funcName {string} 被Hook的函数名称
|
|
6540
|
+
* + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
|
|
6541
|
+
* @example
|
|
6542
|
+
let hook = new Utils.Hooks();
|
|
6543
|
+
hook.initEnv();
|
|
6544
|
+
function myFunction(){
|
|
6545
|
+
console.log("我自己需要执行的函数");
|
|
6546
|
+
}
|
|
6547
|
+
function testFunction(){
|
|
6548
|
+
console.log("正常执行的函数");
|
|
6549
|
+
}
|
|
6550
|
+
testFunction.hook(testFunction,myFunction,window);
|
|
6551
|
+
**/
|
|
6539
6552
|
Hooks = Hooks;
|
|
6540
6553
|
/**
|
|
6541
|
-
|
|
6542
|
-
|
|
6543
|
-
|
|
6544
|
-
|
|
6545
|
-
|
|
6546
|
-
|
|
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
|
-
|
|
6554
|
+
* 为减少代码量和回调,把GM_xmlhttpRequest封装
|
|
6555
|
+
* 文档地址: https://www.tampermonkey.net/documentation.php?ext=iikm
|
|
6556
|
+
* 其中onloadstart、onprogress、onreadystatechange是回调形式,onabort、ontimeout、onerror可以设置全局回调函数
|
|
6557
|
+
* @param _GM_xmlHttpRequest_ 油猴中的GM_xmlhttpRequest
|
|
6558
|
+
* @example
|
|
6559
|
+
let httpx = new Utils.Httpx(GM_xmlhttpRequest);
|
|
6560
|
+
let postResp = await httpx.post({
|
|
6561
|
+
url:url,
|
|
6562
|
+
data:JSON.stringify({
|
|
6563
|
+
test:1
|
|
6564
|
+
}),
|
|
6565
|
+
timeout: 5000
|
|
6566
|
+
});
|
|
6567
|
+
console.log(postResp);
|
|
6568
|
+
> {
|
|
6569
|
+
status: true,
|
|
6570
|
+
data: {responseText: "...", response: xxx,...},
|
|
6571
|
+
msg: "请求完毕",
|
|
6572
|
+
type: "onload",
|
|
6573
|
+
}
|
|
6574
|
+
|
|
6575
|
+
if(postResp === "onload" && postResp.status){
|
|
6576
|
+
// onload
|
|
6577
|
+
}else if(postResp === "ontimeout"){
|
|
6578
|
+
// ontimeout
|
|
6579
|
+
}
|
|
6580
|
+
* @example
|
|
6581
|
+
// 也可以先配置全局参数
|
|
6582
|
+
let httpx = new Utils.Httpx(GM_xmlhttpRequest);
|
|
6583
|
+
httpx.config({
|
|
6584
|
+
timeout: 5000,
|
|
6585
|
+
async: false,
|
|
6586
|
+
responseType: "html",
|
|
6587
|
+
redirect: "follow",
|
|
6588
|
+
})
|
|
6589
|
+
// 优先级为 默认details < 全局details < 单独的details
|
|
6590
|
+
*/
|
|
6578
6591
|
Httpx = Httpx;
|
|
6579
6592
|
/**
|
|
6580
|
-
|
|
6581
|
-
|
|
6582
|
-
|
|
6583
|
-
|
|
6584
|
-
|
|
6585
|
-
|
|
6586
|
-
|
|
6587
|
-
|
|
6588
|
-
|
|
6589
|
-
|
|
6590
|
-
|
|
6591
|
-
|
|
6592
|
-
|
|
6593
|
-
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
|
|
6600
|
-
|
|
6601
|
-
|
|
6602
|
-
|
|
6603
|
-
|
|
6593
|
+
* 浏览器端的indexedDB操作封装
|
|
6594
|
+
* @example
|
|
6595
|
+
let db = new Utils.indexedDB('web_DB', 'nav_text')
|
|
6596
|
+
let data = {name:'管理员', roleId: 1, type: 1};
|
|
6597
|
+
db.save('list',data).then((resolve)=>{
|
|
6598
|
+
console.log(resolve,'存储成功')
|
|
6599
|
+
})
|
|
6600
|
+
|
|
6601
|
+
db.get('list').then((resolve)=>{
|
|
6602
|
+
console.log(resolve,'查询成功')
|
|
6603
|
+
})
|
|
6604
|
+
|
|
6605
|
+
db.getPaging('list',20,10).then((resolve)=>{
|
|
6606
|
+
console.log(resolve,'查询分页偏移第20,一共10行成功');
|
|
6607
|
+
})
|
|
6608
|
+
|
|
6609
|
+
db.delete('list').then(resolve=>{
|
|
6610
|
+
console.log(resolve,'删除成功---->>>>>>name')
|
|
6611
|
+
})
|
|
6612
|
+
|
|
6613
|
+
db.deleteAll().then(resolve=>{
|
|
6614
|
+
console.log(resolve,'清除数据库---->>>>>>name')
|
|
6615
|
+
})
|
|
6616
|
+
**/
|
|
6604
6617
|
indexedDB = indexedDB;
|
|
6605
6618
|
isNativeFunc(target) {
|
|
6606
6619
|
return Boolean(target.toString().match(/^function .*\(\) { \[native code\] }$/));
|
|
6607
6620
|
}
|
|
6608
6621
|
isNearBottom(...args) {
|
|
6609
6622
|
let nearBottomHeight = 50;
|
|
6610
|
-
|
|
6623
|
+
const checkWindow = () => {
|
|
6611
6624
|
// 已滚动的距离
|
|
6612
|
-
|
|
6625
|
+
const scrollTop = this.windowApi.window.pageYOffset || this.windowApi.document.documentElement.scrollTop;
|
|
6613
6626
|
// 视窗高度
|
|
6614
|
-
|
|
6627
|
+
const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
|
|
6615
6628
|
// 最大滚动距离
|
|
6616
|
-
|
|
6629
|
+
const maxScrollHeight = this.windowApi.document.documentElement.scrollHeight - nearBottomHeight;
|
|
6617
6630
|
return scrollTop + viewportHeight >= maxScrollHeight;
|
|
6618
6631
|
};
|
|
6619
|
-
|
|
6632
|
+
const checkNode = ($ele) => {
|
|
6620
6633
|
// 已滚动的距离
|
|
6621
|
-
|
|
6634
|
+
const scrollTop = $ele.scrollTop;
|
|
6622
6635
|
// 视窗高度
|
|
6623
|
-
|
|
6636
|
+
const viewportHeight = $ele.clientHeight;
|
|
6624
6637
|
// 最大滚动距离
|
|
6625
|
-
|
|
6638
|
+
const maxScrollHeight = $ele.scrollHeight - viewportHeight - nearBottomHeight;
|
|
6626
6639
|
return scrollTop >= maxScrollHeight;
|
|
6627
6640
|
};
|
|
6628
|
-
|
|
6641
|
+
const firstArg = args[0];
|
|
6629
6642
|
if (args.length === 0 || typeof args[0] === "number") {
|
|
6630
6643
|
// nearBottomHeight
|
|
6631
6644
|
//
|
|
@@ -6640,7 +6653,7 @@ class Utils {
|
|
|
6640
6653
|
return checkNode(args[0]);
|
|
6641
6654
|
}
|
|
6642
6655
|
else {
|
|
6643
|
-
throw new TypeError(
|
|
6656
|
+
throw new TypeError(`参数1类型错误${typeof firstArg}`);
|
|
6644
6657
|
}
|
|
6645
6658
|
}
|
|
6646
6659
|
/**
|
|
@@ -6670,7 +6683,7 @@ class Utils {
|
|
|
6670
6683
|
}
|
|
6671
6684
|
if (typeof target === "object") {
|
|
6672
6685
|
/* 也有种可能,这个jQuery对象是1.8.3版本的,页面中的jQuery是3.4.1版本的 */
|
|
6673
|
-
|
|
6686
|
+
const jQueryProps = [
|
|
6674
6687
|
"add",
|
|
6675
6688
|
"addBack",
|
|
6676
6689
|
"addClass",
|
|
@@ -6854,50 +6867,50 @@ class Utils {
|
|
|
6854
6867
|
*/
|
|
6855
6868
|
isNotNull = commonUtil.isNotNull.bind(commonUtil);
|
|
6856
6869
|
/**
|
|
6857
|
-
|
|
6858
|
-
|
|
6859
|
-
|
|
6860
|
-
|
|
6861
|
-
|
|
6862
|
-
|
|
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
|
-
|
|
6870
|
+
* 判断对象或数据是否为空
|
|
6871
|
+
* + `String`判空的值,如 ""、"null"、"undefined"、" "
|
|
6872
|
+
* + `Number`判空的值,如 0
|
|
6873
|
+
* + `Object`判空的值,如 {}、null、undefined
|
|
6874
|
+
* + `Array`(存在属性Symbol.iterator)判空的值,如 []
|
|
6875
|
+
* + `Boolean`判空的值,如false
|
|
6876
|
+
* + `Function`判空的值,如()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){}
|
|
6877
|
+
* @returns
|
|
6878
|
+
* + true 为空
|
|
6879
|
+
* + false 不为空
|
|
6880
|
+
* @example
|
|
6881
|
+
Utils.isNull({});
|
|
6882
|
+
> true
|
|
6883
|
+
* @example
|
|
6884
|
+
Utils.isNull([]);
|
|
6885
|
+
> true
|
|
6886
|
+
* @example
|
|
6887
|
+
Utils.isNull(" ");
|
|
6888
|
+
> true
|
|
6889
|
+
* @example
|
|
6890
|
+
Utils.isNull(function(){});
|
|
6891
|
+
> true
|
|
6892
|
+
* @example
|
|
6893
|
+
Utils.isNull(()=>{}));
|
|
6894
|
+
> true
|
|
6895
|
+
* @example
|
|
6896
|
+
Utils.isNull("undefined");
|
|
6897
|
+
> true
|
|
6898
|
+
* @example
|
|
6899
|
+
Utils.isNull("null");
|
|
6900
|
+
> true
|
|
6901
|
+
* @example
|
|
6902
|
+
Utils.isNull(" ", false);
|
|
6903
|
+
> true
|
|
6904
|
+
* @example
|
|
6905
|
+
Utils.isNull([1],[]);
|
|
6906
|
+
> false
|
|
6907
|
+
* @example
|
|
6908
|
+
Utils.isNull([],[1]);
|
|
6909
|
+
> false
|
|
6910
|
+
* @example
|
|
6911
|
+
Utils.isNull(false,[123]);
|
|
6912
|
+
> false
|
|
6913
|
+
**/
|
|
6901
6914
|
isNull = commonUtil.isNull.bind(commonUtil);
|
|
6902
6915
|
isThemeDark() {
|
|
6903
6916
|
return this.windowApi.globalThis.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
@@ -6926,15 +6939,15 @@ class Utils {
|
|
|
6926
6939
|
}
|
|
6927
6940
|
let result = true;
|
|
6928
6941
|
for (const domItem of needCheckDomList) {
|
|
6929
|
-
|
|
6942
|
+
const domDisplay = this.windowApi.window.getComputedStyle(domItem);
|
|
6930
6943
|
if (domDisplay.display === "none") {
|
|
6931
6944
|
result = false;
|
|
6932
6945
|
}
|
|
6933
6946
|
else {
|
|
6934
|
-
|
|
6947
|
+
const domClientRect = domItem.getBoundingClientRect();
|
|
6935
6948
|
if (inView) {
|
|
6936
|
-
|
|
6937
|
-
|
|
6949
|
+
const viewportWidth = this.windowApi.window.innerWidth || this.windowApi.document.documentElement.clientWidth;
|
|
6950
|
+
const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
|
|
6938
6951
|
result = !(domClientRect.right < 0 ||
|
|
6939
6952
|
domClientRect.left > viewportWidth ||
|
|
6940
6953
|
domClientRect.bottom < 0 ||
|
|
@@ -6953,11 +6966,11 @@ class Utils {
|
|
|
6953
6966
|
}
|
|
6954
6967
|
isWebView_Via() {
|
|
6955
6968
|
let result = true;
|
|
6956
|
-
|
|
6969
|
+
const UtilsContext = this;
|
|
6957
6970
|
if (typeof this.windowApi.top.window.via === "object") {
|
|
6958
6971
|
for (const key in Object.values(this.windowApi.top.window.via)) {
|
|
6959
6972
|
if (Reflect.has(this.windowApi.top.window.via, key)) {
|
|
6960
|
-
|
|
6973
|
+
const objValueFunc = this.windowApi.top.window.via[key];
|
|
6961
6974
|
if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
|
|
6962
6975
|
result = true;
|
|
6963
6976
|
}
|
|
@@ -6975,11 +6988,11 @@ class Utils {
|
|
|
6975
6988
|
}
|
|
6976
6989
|
isWebView_X() {
|
|
6977
6990
|
let result = true;
|
|
6978
|
-
|
|
6991
|
+
const UtilsContext = this;
|
|
6979
6992
|
if (typeof this.windowApi.top.window.mbrowser === "object") {
|
|
6980
6993
|
for (const key in Object.values(this.windowApi.top.window.mbrowser)) {
|
|
6981
6994
|
if (Reflect.has(this.windowApi.top.window.mbrowser, key)) {
|
|
6982
|
-
|
|
6995
|
+
const objValueFunc = this.windowApi.top.window.mbrowser[key];
|
|
6983
6996
|
if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
|
|
6984
6997
|
result = true;
|
|
6985
6998
|
}
|
|
@@ -7006,46 +7019,46 @@ class Utils {
|
|
|
7006
7019
|
return result;
|
|
7007
7020
|
}
|
|
7008
7021
|
/**
|
|
7009
|
-
|
|
7010
|
-
|
|
7011
|
-
|
|
7012
|
-
|
|
7013
|
-
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
|
|
7018
|
-
|
|
7022
|
+
* 自动锁对象,用于循环判断运行的函数,在循环外new后使用,注意,如果函数内部存在异步操作,需要使用await
|
|
7023
|
+
* @example
|
|
7024
|
+
let lock = new Utils.LockFunction(()=>{console.log(1)}))
|
|
7025
|
+
lock.run();
|
|
7026
|
+
> 1
|
|
7027
|
+
* @example
|
|
7028
|
+
let lock = new Utils.LockFunction(()=>{console.log(1)}),true) -- 异步操作
|
|
7029
|
+
await lock.run();
|
|
7030
|
+
> 1
|
|
7031
|
+
**/
|
|
7019
7032
|
LockFunction = LockFunction;
|
|
7020
7033
|
/**
|
|
7021
|
-
|
|
7022
|
-
|
|
7023
|
-
|
|
7024
|
-
|
|
7025
|
-
|
|
7026
|
-
|
|
7027
|
-
|
|
7028
|
-
|
|
7029
|
-
|
|
7030
|
-
|
|
7031
|
-
|
|
7032
|
-
|
|
7033
|
-
|
|
7034
|
-
|
|
7035
|
-
|
|
7036
|
-
|
|
7037
|
-
|
|
7038
|
-
|
|
7039
|
-
|
|
7040
|
-
|
|
7041
|
-
|
|
7042
|
-
|
|
7043
|
-
|
|
7044
|
-
|
|
7045
|
-
|
|
7046
|
-
|
|
7047
|
-
|
|
7048
|
-
|
|
7034
|
+
* 日志对象
|
|
7035
|
+
* @param _GM_info_ 油猴管理器的API GM_info,或者是一个对象,如{"script":{name:"Utils.Log"}}
|
|
7036
|
+
* @example
|
|
7037
|
+
let log = new Utils.Log(GM_info);
|
|
7038
|
+
log.info("普通输出");
|
|
7039
|
+
> 普通输出
|
|
7040
|
+
|
|
7041
|
+
log.success("成功输出");
|
|
7042
|
+
> 成功输出
|
|
7043
|
+
|
|
7044
|
+
log.error("错误输出");
|
|
7045
|
+
> 错误输出
|
|
7046
|
+
|
|
7047
|
+
log.warn("警告输出");
|
|
7048
|
+
> 警告输出
|
|
7049
|
+
|
|
7050
|
+
log.tag = "自定义tag信息";
|
|
7051
|
+
log.info("自定义info的颜色","#e0e0e0");
|
|
7052
|
+
> 自定义info的颜色
|
|
7053
|
+
|
|
7054
|
+
log.config({
|
|
7055
|
+
successColor: "#31dc02",
|
|
7056
|
+
errorColor: "#e02d2d",
|
|
7057
|
+
infoColor: "black",
|
|
7058
|
+
})
|
|
7059
|
+
log.success("颜色为#31dc02");
|
|
7060
|
+
> 颜色为#31dc02
|
|
7061
|
+
*/
|
|
7049
7062
|
Log = Log;
|
|
7050
7063
|
mergeArrayToString(data, handleFunc) {
|
|
7051
7064
|
if (!(data instanceof Array)) {
|
|
@@ -7074,8 +7087,8 @@ class Utils {
|
|
|
7074
7087
|
return content;
|
|
7075
7088
|
}
|
|
7076
7089
|
mutationObserver(target, observer_config) {
|
|
7077
|
-
|
|
7078
|
-
|
|
7090
|
+
const UtilsContext = this;
|
|
7091
|
+
const default_obverser_config = {
|
|
7079
7092
|
/* 监听到元素有反馈,需执行的函数 */
|
|
7080
7093
|
callback: () => { },
|
|
7081
7094
|
config: {
|
|
@@ -7117,11 +7130,11 @@ class Utils {
|
|
|
7117
7130
|
immediate: false,
|
|
7118
7131
|
};
|
|
7119
7132
|
observer_config = UtilsContext.assign(default_obverser_config, observer_config);
|
|
7120
|
-
|
|
7133
|
+
const windowMutationObserver = this.windowApi.window.MutationObserver ||
|
|
7121
7134
|
this.windowApi.window.webkitMutationObserver ||
|
|
7122
7135
|
this.windowApi.window.MozMutationObserver;
|
|
7123
7136
|
// 观察者对象
|
|
7124
|
-
|
|
7137
|
+
const mutationObserver = new windowMutationObserver(function (mutations, observer) {
|
|
7125
7138
|
if (typeof observer_config.callback === "function") {
|
|
7126
7139
|
observer_config.callback(mutations, observer);
|
|
7127
7140
|
}
|
|
@@ -7134,7 +7147,7 @@ class Utils {
|
|
|
7134
7147
|
}
|
|
7135
7148
|
else if (UtilsContext.isJQuery(target)) {
|
|
7136
7149
|
/* 传入的参数是jQuery对象 */
|
|
7137
|
-
target.each((
|
|
7150
|
+
target.each((_, item) => {
|
|
7138
7151
|
mutationObserver.observe(item, observer_config.config);
|
|
7139
7152
|
});
|
|
7140
7153
|
}
|
|
@@ -7172,7 +7185,7 @@ class Utils {
|
|
|
7172
7185
|
threshold: [0.01, 0.99],
|
|
7173
7186
|
};
|
|
7174
7187
|
defaultOptions = this.assign(defaultOptions, options || {});
|
|
7175
|
-
|
|
7188
|
+
const intersectionObserver = new IntersectionObserver((entries, observer) => {
|
|
7176
7189
|
if (entries[0].isIntersecting) {
|
|
7177
7190
|
if (typeof callback === "function") {
|
|
7178
7191
|
callback(entries, observer);
|
|
@@ -7202,7 +7215,7 @@ class Utils {
|
|
|
7202
7215
|
return utils;
|
|
7203
7216
|
}
|
|
7204
7217
|
noConflictFunc(needReleaseObject, needReleaseName, functionNameList = [], release = true) {
|
|
7205
|
-
|
|
7218
|
+
const UtilsContext = this;
|
|
7206
7219
|
if (typeof needReleaseObject !== "object") {
|
|
7207
7220
|
throw new Error("Utils.noConflictFunc 参数 needReleaseObject 必须为 object 类型");
|
|
7208
7221
|
}
|
|
@@ -7212,7 +7225,7 @@ class Utils {
|
|
|
7212
7225
|
if (!Array.isArray(functionNameList)) {
|
|
7213
7226
|
throw new Error("Utils.noConflictFunc 参数 functionNameList 必须为 Array 类型");
|
|
7214
7227
|
}
|
|
7215
|
-
|
|
7228
|
+
const needReleaseKey = `__${needReleaseName}`;
|
|
7216
7229
|
/**
|
|
7217
7230
|
* 释放所有
|
|
7218
7231
|
*/
|
|
@@ -7300,7 +7313,9 @@ class Utils {
|
|
|
7300
7313
|
if (typeof dataUri !== "string") {
|
|
7301
7314
|
throw new Error("Utils.parseBase64ToBlob 参数 dataUri 必须为 string 类型");
|
|
7302
7315
|
}
|
|
7303
|
-
|
|
7316
|
+
const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
|
|
7317
|
+
let dataUriLength = dataUriBase64Str.length;
|
|
7318
|
+
const u8arr = new Uint8Array(dataUriLength);
|
|
7304
7319
|
while (dataUriLength--) {
|
|
7305
7320
|
u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
|
|
7306
7321
|
}
|
|
@@ -7315,7 +7330,9 @@ class Utils {
|
|
|
7315
7330
|
if (typeof fileName !== "string") {
|
|
7316
7331
|
throw new Error("Utils.parseBase64ToFile 参数 fileName 必须为 string 类型");
|
|
7317
7332
|
}
|
|
7318
|
-
|
|
7333
|
+
const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
|
|
7334
|
+
let dataUriLength = dataUriBase64Str.length;
|
|
7335
|
+
const u8arr = new Uint8Array(dataUriLength);
|
|
7319
7336
|
while (dataUriLength--) {
|
|
7320
7337
|
u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
|
|
7321
7338
|
}
|
|
@@ -7349,15 +7366,15 @@ class Utils {
|
|
|
7349
7366
|
}
|
|
7350
7367
|
parseCDATA(text = "") {
|
|
7351
7368
|
let result = "";
|
|
7352
|
-
|
|
7353
|
-
|
|
7369
|
+
const cdataRegexp = /<!\[CDATA\[([\s\S]*)\]\]>/;
|
|
7370
|
+
const cdataMatch = cdataRegexp.exec(text.trim());
|
|
7354
7371
|
if (cdataMatch && cdataMatch.length > 1) {
|
|
7355
7372
|
result = cdataMatch[cdataMatch.length - 1];
|
|
7356
7373
|
}
|
|
7357
7374
|
return result;
|
|
7358
7375
|
}
|
|
7359
7376
|
async parseFileToBase64(fileObj) {
|
|
7360
|
-
|
|
7377
|
+
const reader = new FileReader();
|
|
7361
7378
|
reader.readAsDataURL(fileObj);
|
|
7362
7379
|
return new Promise((resolve) => {
|
|
7363
7380
|
reader.onload = function (event) {
|
|
@@ -7366,14 +7383,14 @@ class Utils {
|
|
|
7366
7383
|
});
|
|
7367
7384
|
}
|
|
7368
7385
|
parseFromString(text, mimeType = "text/html") {
|
|
7369
|
-
|
|
7386
|
+
const parser = new DOMParser();
|
|
7370
7387
|
return parser.parseFromString(text, mimeType);
|
|
7371
7388
|
}
|
|
7372
7389
|
parseStringToRegExpString(text) {
|
|
7373
7390
|
if (typeof text !== "string") {
|
|
7374
7391
|
throw new TypeError("string必须是字符串");
|
|
7375
7392
|
}
|
|
7376
|
-
|
|
7393
|
+
const regString = text.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
|
|
7377
7394
|
return regString;
|
|
7378
7395
|
}
|
|
7379
7396
|
preventEvent(element, eventNameList = [], capture) {
|
|
@@ -7388,6 +7405,7 @@ class Utils {
|
|
|
7388
7405
|
}
|
|
7389
7406
|
if (arguments.length === 1) {
|
|
7390
7407
|
/* 直接阻止事件 */
|
|
7408
|
+
// eslint-disable-next-line prefer-rest-params
|
|
7391
7409
|
return stopEvent(arguments[0]);
|
|
7392
7410
|
}
|
|
7393
7411
|
else {
|
|
@@ -7403,11 +7421,11 @@ class Utils {
|
|
|
7403
7421
|
}
|
|
7404
7422
|
}
|
|
7405
7423
|
/**
|
|
7406
|
-
|
|
7407
|
-
|
|
7408
|
-
|
|
7409
|
-
|
|
7410
|
-
|
|
7424
|
+
* 在canvas元素节点上绘制进度圆圈
|
|
7425
|
+
* @example
|
|
7426
|
+
let progress = new Utils.Process({canvasNode:document.querySelector("canvas")});
|
|
7427
|
+
progress.draw();
|
|
7428
|
+
* **/
|
|
7411
7429
|
Progress = Progress;
|
|
7412
7430
|
registerTrustClickEvent(isTrustValue = true, filter) {
|
|
7413
7431
|
function trustEvent(event) {
|
|
@@ -7429,8 +7447,8 @@ class Utils {
|
|
|
7429
7447
|
}
|
|
7430
7448
|
const originalListener = EventTarget.prototype.addEventListener;
|
|
7431
7449
|
EventTarget.prototype.addEventListener = function (...args) {
|
|
7432
|
-
|
|
7433
|
-
|
|
7450
|
+
const type = args[0];
|
|
7451
|
+
const callback = args[1];
|
|
7434
7452
|
// let options = args[2];
|
|
7435
7453
|
if (filter(type)) {
|
|
7436
7454
|
if (typeof callback === "function") {
|
|
@@ -7439,7 +7457,7 @@ class Utils {
|
|
|
7439
7457
|
};
|
|
7440
7458
|
}
|
|
7441
7459
|
else if (typeof callback === "object" && "handleEvent" in callback) {
|
|
7442
|
-
|
|
7460
|
+
const oldHandleEvent = callback["handleEvent"];
|
|
7443
7461
|
args[1]["handleEvent"] = function (event) {
|
|
7444
7462
|
if (event == null) {
|
|
7445
7463
|
return;
|
|
@@ -7450,7 +7468,7 @@ class Utils {
|
|
|
7450
7468
|
event instanceof Proxy;
|
|
7451
7469
|
oldHandleEvent.call(this, trustEvent(event));
|
|
7452
7470
|
}
|
|
7453
|
-
catch
|
|
7471
|
+
catch {
|
|
7454
7472
|
Reflect.set(event, "isTrusted", isTrustValue);
|
|
7455
7473
|
}
|
|
7456
7474
|
};
|
|
@@ -7473,7 +7491,7 @@ class Utils {
|
|
|
7473
7491
|
return isNegative ? -reversedNum : reversedNum;
|
|
7474
7492
|
}
|
|
7475
7493
|
selectElementText(element, childTextNode, startIndex, endIndex) {
|
|
7476
|
-
|
|
7494
|
+
const range = this.windowApi.document.createRange();
|
|
7477
7495
|
range.selectNodeContents(element);
|
|
7478
7496
|
if (childTextNode) {
|
|
7479
7497
|
if (childTextNode.nodeType !== Node.TEXT_NODE) {
|
|
@@ -7484,7 +7502,7 @@ class Utils {
|
|
|
7484
7502
|
range.setEnd(childTextNode, endIndex);
|
|
7485
7503
|
}
|
|
7486
7504
|
}
|
|
7487
|
-
|
|
7505
|
+
const selection = this.windowApi.globalThis.getSelection();
|
|
7488
7506
|
if (selection) {
|
|
7489
7507
|
selection.removeAllRanges();
|
|
7490
7508
|
selection.addRange(range);
|
|
@@ -7512,7 +7530,7 @@ class Utils {
|
|
|
7512
7530
|
else {
|
|
7513
7531
|
textType = "text/plain";
|
|
7514
7532
|
}
|
|
7515
|
-
|
|
7533
|
+
const UtilsContext = this;
|
|
7516
7534
|
class UtilsClipboard {
|
|
7517
7535
|
#resolve;
|
|
7518
7536
|
#copyData;
|
|
@@ -7524,7 +7542,7 @@ class Utils {
|
|
|
7524
7542
|
}
|
|
7525
7543
|
async init() {
|
|
7526
7544
|
let copyStatus = false;
|
|
7527
|
-
|
|
7545
|
+
const requestPermissionStatus = await this.requestClipboardPermission();
|
|
7528
7546
|
console.log(requestPermissionStatus);
|
|
7529
7547
|
if (this.hasClipboard() && (this.hasClipboardWrite() || this.hasClipboardWriteText())) {
|
|
7530
7548
|
try {
|
|
@@ -7563,7 +7581,7 @@ class Utils {
|
|
|
7563
7581
|
*/
|
|
7564
7582
|
copyTextByTextArea() {
|
|
7565
7583
|
try {
|
|
7566
|
-
|
|
7584
|
+
const copyElement = UtilsContext.windowApi.document.createElement("textarea");
|
|
7567
7585
|
copyElement.value = this.#copyData;
|
|
7568
7586
|
copyElement.setAttribute("type", "text");
|
|
7569
7587
|
copyElement.setAttribute("style", "opacity:0;position:absolute;");
|
|
@@ -7583,20 +7601,17 @@ class Utils {
|
|
|
7583
7601
|
* 申请剪贴板权限
|
|
7584
7602
|
*/
|
|
7585
7603
|
requestClipboardPermission() {
|
|
7586
|
-
return new Promise((resolve
|
|
7604
|
+
return new Promise((resolve) => {
|
|
7587
7605
|
if (navigator.permissions && navigator.permissions.query) {
|
|
7588
7606
|
navigator.permissions
|
|
7589
7607
|
.query({
|
|
7590
7608
|
name: "clipboard-write",
|
|
7591
7609
|
})
|
|
7592
|
-
.then((
|
|
7610
|
+
.then(() => {
|
|
7593
7611
|
resolve(true);
|
|
7594
7612
|
})
|
|
7595
7613
|
.catch((error) => {
|
|
7596
|
-
console.error([
|
|
7597
|
-
"申请剪贴板权限失败,尝试直接写入👉",
|
|
7598
|
-
error.message ?? error.name ?? error.stack,
|
|
7599
|
-
]);
|
|
7614
|
+
console.error(["申请剪贴板权限失败,尝试直接写入👉", error.message ?? error.name ?? error.stack]);
|
|
7600
7615
|
resolve(false);
|
|
7601
7616
|
});
|
|
7602
7617
|
}
|
|
@@ -7623,7 +7638,7 @@ class Utils {
|
|
|
7623
7638
|
}
|
|
7624
7639
|
else {
|
|
7625
7640
|
/* 可复制对象 */
|
|
7626
|
-
|
|
7641
|
+
const textBlob = new Blob([this.#copyData], {
|
|
7627
7642
|
type: this.#copyDataType,
|
|
7628
7643
|
});
|
|
7629
7644
|
navigator.clipboard
|
|
@@ -7655,7 +7670,7 @@ class Utils {
|
|
|
7655
7670
|
});
|
|
7656
7671
|
}
|
|
7657
7672
|
setTimeout(callback, delayTime = 0) {
|
|
7658
|
-
|
|
7673
|
+
const UtilsContext = this;
|
|
7659
7674
|
if (typeof callback !== "function" && typeof callback !== "string") {
|
|
7660
7675
|
throw new TypeError("Utils.setTimeout 参数 callback 必须为 function|string 类型");
|
|
7661
7676
|
}
|
|
@@ -7669,7 +7684,7 @@ class Utils {
|
|
|
7669
7684
|
});
|
|
7670
7685
|
}
|
|
7671
7686
|
sleep(delayTime = 0) {
|
|
7672
|
-
|
|
7687
|
+
const UtilsContext = this;
|
|
7673
7688
|
if (typeof delayTime !== "number") {
|
|
7674
7689
|
throw new Error("Utils.sleep 参数 delayTime 必须为 number 类型");
|
|
7675
7690
|
}
|
|
@@ -7680,18 +7695,18 @@ class Utils {
|
|
|
7680
7695
|
});
|
|
7681
7696
|
}
|
|
7682
7697
|
dragSlider(selector, offsetX = this.windowApi.window.innerWidth) {
|
|
7683
|
-
|
|
7698
|
+
const UtilsContext = this;
|
|
7684
7699
|
function initMouseEvent(eventName, offSetX, offSetY) {
|
|
7685
|
-
|
|
7686
|
-
|
|
7700
|
+
const win = typeof unsafeWindow === "undefined" ? globalThis : unsafeWindow;
|
|
7701
|
+
const mouseEvent = UtilsContext.windowApi.document.createEvent("MouseEvents");
|
|
7687
7702
|
mouseEvent.initMouseEvent(eventName, true, true, win, 0, offSetX, offSetY, offSetX, offSetY, false, false, false, false, 0, null);
|
|
7688
7703
|
return mouseEvent;
|
|
7689
7704
|
}
|
|
7690
|
-
|
|
7705
|
+
const sliderElement = typeof selector === "string" ? domUtils.selector(selector) : selector;
|
|
7691
7706
|
if (!(sliderElement instanceof Node) || !(sliderElement instanceof Element)) {
|
|
7692
7707
|
throw new Error("Utils.dragSlider 参数selector 必须为Node/Element类型");
|
|
7693
7708
|
}
|
|
7694
|
-
|
|
7709
|
+
const rect = sliderElement.getBoundingClientRect(), x0 = rect.x || rect.left, y0 = rect.y || rect.top, x1 = x0 + offsetX, y1 = y0;
|
|
7695
7710
|
sliderElement.dispatchEvent(initMouseEvent("mousedown", x0, y0));
|
|
7696
7711
|
sliderElement.dispatchEvent(initMouseEvent("mousemove", x1, y1));
|
|
7697
7712
|
sliderElement.dispatchEvent(initMouseEvent("mouseleave", x1, y1));
|
|
@@ -7719,34 +7734,34 @@ class Utils {
|
|
|
7719
7734
|
console.error(err);
|
|
7720
7735
|
}
|
|
7721
7736
|
}
|
|
7722
|
-
exitFullScreen(
|
|
7723
|
-
if (
|
|
7724
|
-
return
|
|
7737
|
+
exitFullScreen($el = this.windowApi.document.documentElement) {
|
|
7738
|
+
if ($el.exitFullscreen) {
|
|
7739
|
+
return $el.exitFullscreen();
|
|
7725
7740
|
}
|
|
7726
|
-
else if (
|
|
7727
|
-
return
|
|
7741
|
+
else if ($el.msExitFullscreen) {
|
|
7742
|
+
return $el.msExitFullscreen();
|
|
7728
7743
|
}
|
|
7729
|
-
else if (
|
|
7730
|
-
return
|
|
7744
|
+
else if ($el.mozCancelFullScreen) {
|
|
7745
|
+
return $el.mozCancelFullScreen();
|
|
7731
7746
|
}
|
|
7732
|
-
else if (
|
|
7733
|
-
return
|
|
7747
|
+
else if ($el.webkitCancelFullScreen) {
|
|
7748
|
+
return $el.webkitCancelFullScreen();
|
|
7734
7749
|
}
|
|
7735
7750
|
else {
|
|
7736
|
-
return new Promise((
|
|
7751
|
+
return new Promise((_, reject) => {
|
|
7737
7752
|
reject(new TypeError("该浏览器不支持全屏API"));
|
|
7738
7753
|
});
|
|
7739
7754
|
}
|
|
7740
7755
|
}
|
|
7741
7756
|
sortListByProperty(data, getPropertyValueFunc, sortByDesc = true) {
|
|
7742
|
-
|
|
7757
|
+
const UtilsContext = this;
|
|
7743
7758
|
if (typeof getPropertyValueFunc !== "function" && typeof getPropertyValueFunc !== "string") {
|
|
7744
7759
|
throw new Error("Utils.sortListByProperty 参数 getPropertyValueFunc 必须为 function|string 类型");
|
|
7745
7760
|
}
|
|
7746
7761
|
if (typeof sortByDesc !== "boolean") {
|
|
7747
7762
|
throw new Error("Utils.sortListByProperty 参数 sortByDesc 必须为 boolean 类型");
|
|
7748
7763
|
}
|
|
7749
|
-
|
|
7764
|
+
const getObjValue = function (obj) {
|
|
7750
7765
|
return typeof getPropertyValueFunc === "string" ? obj[getPropertyValueFunc] : getPropertyValueFunc(obj);
|
|
7751
7766
|
};
|
|
7752
7767
|
/**
|
|
@@ -7755,9 +7770,9 @@ class Utils {
|
|
|
7755
7770
|
* @param {any} before_obj
|
|
7756
7771
|
* @returns
|
|
7757
7772
|
*/
|
|
7758
|
-
|
|
7759
|
-
|
|
7760
|
-
|
|
7773
|
+
const sortFunc = function (after_obj, before_obj) {
|
|
7774
|
+
const beforeValue = getObjValue(before_obj); /* 前 */
|
|
7775
|
+
const afterValue = getObjValue(after_obj); /* 后 */
|
|
7761
7776
|
if (sortByDesc) {
|
|
7762
7777
|
if (afterValue > beforeValue) {
|
|
7763
7778
|
return -1;
|
|
@@ -7786,19 +7801,18 @@ class Utils {
|
|
|
7786
7801
|
* @param nodeList 元素列表
|
|
7787
7802
|
* @param getNodeListFunc 获取元素列表的函数
|
|
7788
7803
|
*/
|
|
7789
|
-
|
|
7790
|
-
|
|
7804
|
+
const sortNodeFunc = function (nodeList, getNodeListFunc) {
|
|
7805
|
+
const nodeListLength = nodeList.length;
|
|
7791
7806
|
for (let i = 0; i < nodeListLength - 1; i++) {
|
|
7792
7807
|
for (let j = 0; j < nodeListLength - 1 - i; j++) {
|
|
7793
|
-
|
|
7794
|
-
|
|
7795
|
-
|
|
7796
|
-
|
|
7797
|
-
if ((sortByDesc == true && beforeValue < afterValue) ||
|
|
7798
|
-
(sortByDesc == false && beforeValue > afterValue)) {
|
|
7808
|
+
const beforeNode = nodeList[j];
|
|
7809
|
+
const afterNode = nodeList[j + 1];
|
|
7810
|
+
const beforeValue = getObjValue(beforeNode); /* 前 */
|
|
7811
|
+
const afterValue = getObjValue(afterNode); /* 后 */
|
|
7812
|
+
if ((sortByDesc == true && beforeValue < afterValue) || (sortByDesc == false && beforeValue > afterValue)) {
|
|
7799
7813
|
/* 升序/降序 */
|
|
7800
7814
|
/* 相邻元素两两对比 */
|
|
7801
|
-
|
|
7815
|
+
const temp = beforeNode.nextElementSibling;
|
|
7802
7816
|
afterNode.after(beforeNode);
|
|
7803
7817
|
if (temp == null) {
|
|
7804
7818
|
/* 如果为空,那么是最后一个元素,使用append */
|
|
@@ -7856,7 +7870,7 @@ class Utils {
|
|
|
7856
7870
|
return newTargetString;
|
|
7857
7871
|
}
|
|
7858
7872
|
startsWith(target, searchString, position = 0) {
|
|
7859
|
-
|
|
7873
|
+
const UtilsContext = this;
|
|
7860
7874
|
if (position > target.length) {
|
|
7861
7875
|
/* 超出目标字符串的长度 */
|
|
7862
7876
|
return false;
|
|
@@ -7900,7 +7914,7 @@ class Utils {
|
|
|
7900
7914
|
*/
|
|
7901
7915
|
toJSON = commonUtil.toJSON.bind(commonUtil);
|
|
7902
7916
|
toSearchParamsStr(obj, addPrefix) {
|
|
7903
|
-
|
|
7917
|
+
const UtilsContext = this;
|
|
7904
7918
|
let searhParamsStr = "";
|
|
7905
7919
|
if (Array.isArray(obj)) {
|
|
7906
7920
|
obj.forEach((item) => {
|
|
@@ -7908,7 +7922,7 @@ class Utils {
|
|
|
7908
7922
|
searhParamsStr += UtilsContext.toSearchParamsStr(item);
|
|
7909
7923
|
}
|
|
7910
7924
|
else {
|
|
7911
|
-
searhParamsStr +=
|
|
7925
|
+
searhParamsStr += `&${UtilsContext.toSearchParamsStr(item)}`;
|
|
7912
7926
|
}
|
|
7913
7927
|
});
|
|
7914
7928
|
}
|
|
@@ -7916,7 +7930,7 @@ class Utils {
|
|
|
7916
7930
|
searhParamsStr = new URLSearchParams(Object.entries(obj)).toString();
|
|
7917
7931
|
}
|
|
7918
7932
|
if (addPrefix && !searhParamsStr.startsWith("?")) {
|
|
7919
|
-
searhParamsStr =
|
|
7933
|
+
searhParamsStr = `?${searhParamsStr}`;
|
|
7920
7934
|
}
|
|
7921
7935
|
return searhParamsStr;
|
|
7922
7936
|
}
|
|
@@ -7964,7 +7978,7 @@ class Utils {
|
|
|
7964
7978
|
}
|
|
7965
7979
|
}
|
|
7966
7980
|
waitArrayLoopToEnd(data, handleFunc) {
|
|
7967
|
-
|
|
7981
|
+
const UtilsContext = this;
|
|
7968
7982
|
if (typeof handleFunc !== "function" && typeof handleFunc !== "string") {
|
|
7969
7983
|
throw new Error("Utils.waitArrayLoopToEnd 参数 handleDataFunction 必须为 function|string 类型");
|
|
7970
7984
|
}
|
|
@@ -7974,17 +7988,17 @@ class Utils {
|
|
|
7974
7988
|
}
|
|
7975
7989
|
wait(checkFn, timeout, parent) {
|
|
7976
7990
|
const UtilsContext = this;
|
|
7977
|
-
|
|
7991
|
+
const __timeout__ = typeof timeout === "number" ? timeout : 0;
|
|
7978
7992
|
return new Promise((resolve) => {
|
|
7979
|
-
|
|
7993
|
+
const observer = UtilsContext.mutationObserver(parent || UtilsContext.windowApi.document, {
|
|
7980
7994
|
config: {
|
|
7981
7995
|
subtree: true,
|
|
7982
7996
|
childList: true,
|
|
7983
7997
|
attributes: true,
|
|
7984
7998
|
},
|
|
7985
7999
|
immediate: true,
|
|
7986
|
-
callback(
|
|
7987
|
-
|
|
8000
|
+
callback(_, __observer__) {
|
|
8001
|
+
const result = checkFn();
|
|
7988
8002
|
if (result.success) {
|
|
7989
8003
|
// 取消观察器
|
|
7990
8004
|
if (typeof __observer__?.disconnect === "function") {
|
|
@@ -8008,9 +8022,9 @@ class Utils {
|
|
|
8008
8022
|
waitNode(...args) {
|
|
8009
8023
|
// 过滤掉undefined
|
|
8010
8024
|
args = args.filter((arg) => arg !== void 0);
|
|
8011
|
-
|
|
8025
|
+
const UtilsContext = this;
|
|
8012
8026
|
// 选择器
|
|
8013
|
-
|
|
8027
|
+
const selector = args[0];
|
|
8014
8028
|
// 父元素(监听的元素)
|
|
8015
8029
|
let parent = UtilsContext.windowApi.document;
|
|
8016
8030
|
// 超时时间
|
|
@@ -8020,7 +8034,7 @@ class Utils {
|
|
|
8020
8034
|
}
|
|
8021
8035
|
if (args.length === 1) ;
|
|
8022
8036
|
else if (args.length === 2) {
|
|
8023
|
-
|
|
8037
|
+
const secondParam = args[1];
|
|
8024
8038
|
if (typeof secondParam === "number") {
|
|
8025
8039
|
// "div",10000
|
|
8026
8040
|
timeout = secondParam;
|
|
@@ -8036,9 +8050,9 @@ class Utils {
|
|
|
8036
8050
|
else if (args.length === 3) {
|
|
8037
8051
|
// "div",document,10000
|
|
8038
8052
|
// 第二个参数,parent
|
|
8039
|
-
|
|
8053
|
+
const secondParam = args[1];
|
|
8040
8054
|
// 第三个参数,timeout
|
|
8041
|
-
|
|
8055
|
+
const thirdParam = args[2];
|
|
8042
8056
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8043
8057
|
parent = secondParam;
|
|
8044
8058
|
if (typeof thirdParam === "number") {
|
|
@@ -8057,9 +8071,9 @@ class Utils {
|
|
|
8057
8071
|
}
|
|
8058
8072
|
function getNode() {
|
|
8059
8073
|
if (Array.isArray(selector)) {
|
|
8060
|
-
|
|
8074
|
+
const result = [];
|
|
8061
8075
|
for (let index = 0; index < selector.length; index++) {
|
|
8062
|
-
|
|
8076
|
+
const node = domUtils.selector(selector[index]);
|
|
8063
8077
|
if (node) {
|
|
8064
8078
|
result.push(node);
|
|
8065
8079
|
}
|
|
@@ -8076,7 +8090,7 @@ class Utils {
|
|
|
8076
8090
|
}
|
|
8077
8091
|
}
|
|
8078
8092
|
return UtilsContext.wait(() => {
|
|
8079
|
-
|
|
8093
|
+
const node = getNode();
|
|
8080
8094
|
if (node) {
|
|
8081
8095
|
return {
|
|
8082
8096
|
success: true,
|
|
@@ -8094,9 +8108,9 @@ class Utils {
|
|
|
8094
8108
|
waitAnyNode(...args) {
|
|
8095
8109
|
// 过滤掉undefined
|
|
8096
8110
|
args = args.filter((arg) => arg !== void 0);
|
|
8097
|
-
|
|
8111
|
+
const UtilsContext = this;
|
|
8098
8112
|
// 选择器
|
|
8099
|
-
|
|
8113
|
+
const selectorList = args[0];
|
|
8100
8114
|
// 父元素(监听的元素)
|
|
8101
8115
|
let parent = UtilsContext.windowApi.document;
|
|
8102
8116
|
// 超时时间
|
|
@@ -8106,7 +8120,7 @@ class Utils {
|
|
|
8106
8120
|
}
|
|
8107
8121
|
if (args.length === 1) ;
|
|
8108
8122
|
else if (args.length === 2) {
|
|
8109
|
-
|
|
8123
|
+
const secondParam = args[1];
|
|
8110
8124
|
if (typeof secondParam === "number") {
|
|
8111
8125
|
// "div",10000
|
|
8112
8126
|
timeout = secondParam;
|
|
@@ -8122,9 +8136,9 @@ class Utils {
|
|
|
8122
8136
|
else if (args.length === 3) {
|
|
8123
8137
|
// "div",document,10000
|
|
8124
8138
|
// 第二个参数,parent
|
|
8125
|
-
|
|
8139
|
+
const secondParam = args[1];
|
|
8126
8140
|
// 第三个参数,timeout
|
|
8127
|
-
|
|
8141
|
+
const thirdParam = args[2];
|
|
8128
8142
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8129
8143
|
parent = secondParam;
|
|
8130
8144
|
if (typeof thirdParam === "number") {
|
|
@@ -8141,7 +8155,7 @@ class Utils {
|
|
|
8141
8155
|
else {
|
|
8142
8156
|
throw new TypeError("Utils.waitAnyNode 参数个数错误");
|
|
8143
8157
|
}
|
|
8144
|
-
|
|
8158
|
+
const promiseList = selectorList.map((selector) => {
|
|
8145
8159
|
return UtilsContext.waitNode(selector, parent, timeout);
|
|
8146
8160
|
});
|
|
8147
8161
|
return Promise.any(promiseList);
|
|
@@ -8149,9 +8163,9 @@ class Utils {
|
|
|
8149
8163
|
waitNodeList(...args) {
|
|
8150
8164
|
// 过滤掉undefined
|
|
8151
8165
|
args = args.filter((arg) => arg !== void 0);
|
|
8152
|
-
|
|
8166
|
+
const UtilsContext = this;
|
|
8153
8167
|
// 选择器数组
|
|
8154
|
-
|
|
8168
|
+
const selector = args[0];
|
|
8155
8169
|
// 父元素(监听的元素)
|
|
8156
8170
|
let parent = UtilsContext.windowApi.document;
|
|
8157
8171
|
// 超时时间
|
|
@@ -8161,7 +8175,7 @@ class Utils {
|
|
|
8161
8175
|
}
|
|
8162
8176
|
if (args.length === 1) ;
|
|
8163
8177
|
else if (args.length === 2) {
|
|
8164
|
-
|
|
8178
|
+
const secondParam = args[1];
|
|
8165
8179
|
if (typeof secondParam === "number") {
|
|
8166
8180
|
// "div",10000
|
|
8167
8181
|
timeout = secondParam;
|
|
@@ -8177,9 +8191,9 @@ class Utils {
|
|
|
8177
8191
|
else if (args.length === 3) {
|
|
8178
8192
|
// "div",document,10000
|
|
8179
8193
|
// 第二个参数,parent
|
|
8180
|
-
|
|
8194
|
+
const secondParam = args[1];
|
|
8181
8195
|
// 第三个参数,timeout
|
|
8182
|
-
|
|
8196
|
+
const thirdParam = args[2];
|
|
8183
8197
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8184
8198
|
parent = secondParam;
|
|
8185
8199
|
if (typeof thirdParam === "number") {
|
|
@@ -8198,9 +8212,9 @@ class Utils {
|
|
|
8198
8212
|
}
|
|
8199
8213
|
function getNodeList() {
|
|
8200
8214
|
if (Array.isArray(selector)) {
|
|
8201
|
-
|
|
8215
|
+
const result = [];
|
|
8202
8216
|
for (let index = 0; index < selector.length; index++) {
|
|
8203
|
-
|
|
8217
|
+
const nodeList = domUtils.selectorAll(selector[index], parent);
|
|
8204
8218
|
if (nodeList.length) {
|
|
8205
8219
|
result.push(nodeList);
|
|
8206
8220
|
}
|
|
@@ -8210,14 +8224,14 @@ class Utils {
|
|
|
8210
8224
|
}
|
|
8211
8225
|
}
|
|
8212
8226
|
else {
|
|
8213
|
-
|
|
8227
|
+
const nodeList = domUtils.selectorAll(selector, parent);
|
|
8214
8228
|
if (nodeList.length) {
|
|
8215
8229
|
return nodeList;
|
|
8216
8230
|
}
|
|
8217
8231
|
}
|
|
8218
8232
|
}
|
|
8219
8233
|
return UtilsContext.wait(() => {
|
|
8220
|
-
|
|
8234
|
+
const node = getNodeList();
|
|
8221
8235
|
if (node) {
|
|
8222
8236
|
return {
|
|
8223
8237
|
success: true,
|
|
@@ -8235,9 +8249,9 @@ class Utils {
|
|
|
8235
8249
|
waitAnyNodeList(...args) {
|
|
8236
8250
|
// 过滤掉undefined
|
|
8237
8251
|
args = args.filter((arg) => arg !== void 0);
|
|
8238
|
-
|
|
8252
|
+
const UtilsContext = this;
|
|
8239
8253
|
// 选择器数组
|
|
8240
|
-
|
|
8254
|
+
const selectorList = args[0];
|
|
8241
8255
|
// 父元素(监听的元素)
|
|
8242
8256
|
let parent = UtilsContext.windowApi.document;
|
|
8243
8257
|
// 超时时间
|
|
@@ -8247,7 +8261,7 @@ class Utils {
|
|
|
8247
8261
|
}
|
|
8248
8262
|
if (args.length === 1) ;
|
|
8249
8263
|
else if (args.length === 2) {
|
|
8250
|
-
|
|
8264
|
+
const secondParam = args[1];
|
|
8251
8265
|
if (typeof secondParam === "number") {
|
|
8252
8266
|
// "div",10000
|
|
8253
8267
|
timeout = secondParam;
|
|
@@ -8263,9 +8277,9 @@ class Utils {
|
|
|
8263
8277
|
else if (args.length === 3) {
|
|
8264
8278
|
// "div",document,10000
|
|
8265
8279
|
// 第二个参数,parent
|
|
8266
|
-
|
|
8280
|
+
const secondParam = args[1];
|
|
8267
8281
|
// 第三个参数,timeout
|
|
8268
|
-
|
|
8282
|
+
const thirdParam = args[2];
|
|
8269
8283
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8270
8284
|
parent = secondParam;
|
|
8271
8285
|
if (typeof thirdParam === "number") {
|
|
@@ -8282,7 +8296,7 @@ class Utils {
|
|
|
8282
8296
|
else {
|
|
8283
8297
|
throw new TypeError("Utils.waitAnyNodeList 参数个数错误");
|
|
8284
8298
|
}
|
|
8285
|
-
|
|
8299
|
+
const promiseList = selectorList.map((selector) => {
|
|
8286
8300
|
return UtilsContext.waitNodeList(selector, parent, timeout);
|
|
8287
8301
|
});
|
|
8288
8302
|
return Promise.any(promiseList);
|
|
@@ -8311,13 +8325,13 @@ class Utils {
|
|
|
8311
8325
|
});
|
|
8312
8326
|
}
|
|
8313
8327
|
waitPropertyByInterval(checkObj, checkPropertyName, intervalTimer = 250, maxTime = -1) {
|
|
8314
|
-
|
|
8328
|
+
const UtilsContext = this;
|
|
8315
8329
|
if (checkObj == null) {
|
|
8316
8330
|
throw new TypeError("checkObj 不能为空对象 ");
|
|
8317
8331
|
}
|
|
8318
8332
|
let isResolve = false;
|
|
8319
8333
|
return new Promise((resolve, reject) => {
|
|
8320
|
-
|
|
8334
|
+
const interval = UtilsContext.workerSetInterval(() => {
|
|
8321
8335
|
let obj = checkObj;
|
|
8322
8336
|
if (typeof checkObj === "function") {
|
|
8323
8337
|
obj = checkObj();
|
|
@@ -8350,7 +8364,7 @@ class Utils {
|
|
|
8350
8364
|
throw new Error("Utils.waitVueByInterval 参数element 不能为空");
|
|
8351
8365
|
}
|
|
8352
8366
|
let flag = false;
|
|
8353
|
-
|
|
8367
|
+
const UtilsContext = this;
|
|
8354
8368
|
try {
|
|
8355
8369
|
await UtilsContext.waitPropertyByInterval(element, function (targetElement) {
|
|
8356
8370
|
if (targetElement == null) {
|
|
@@ -8362,7 +8376,7 @@ class Utils {
|
|
|
8362
8376
|
if (propertyName == null) {
|
|
8363
8377
|
return true;
|
|
8364
8378
|
}
|
|
8365
|
-
|
|
8379
|
+
const vueObject = targetElement[vueName];
|
|
8366
8380
|
if (typeof propertyName === "string") {
|
|
8367
8381
|
if (propertyName in vueObject) {
|
|
8368
8382
|
flag = true;
|
|
@@ -8378,6 +8392,7 @@ class Utils {
|
|
|
8378
8392
|
}
|
|
8379
8393
|
return false;
|
|
8380
8394
|
}, timer, maxTime);
|
|
8395
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8381
8396
|
}
|
|
8382
8397
|
catch (error) {
|
|
8383
8398
|
return flag;
|
|
@@ -8436,7 +8451,7 @@ class Utils {
|
|
|
8436
8451
|
if (target == null) {
|
|
8437
8452
|
return;
|
|
8438
8453
|
}
|
|
8439
|
-
|
|
8454
|
+
const handleResult = handler(target);
|
|
8440
8455
|
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
|
|
8441
8456
|
return handleResult.data;
|
|
8442
8457
|
}
|
|
@@ -8449,10 +8464,10 @@ class Utils {
|
|
|
8449
8464
|
*/
|
|
8450
8465
|
async asyncQueryProperty(target, handler) {
|
|
8451
8466
|
if (target == null) {
|
|
8452
|
-
// @ts-
|
|
8467
|
+
// @ts-expect-error 空返回
|
|
8453
8468
|
return;
|
|
8454
8469
|
}
|
|
8455
|
-
|
|
8470
|
+
const handleResult = await handler(target);
|
|
8456
8471
|
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
|
|
8457
8472
|
return handleResult.data;
|
|
8458
8473
|
}
|
|
@@ -8560,6 +8575,7 @@ class Utils {
|
|
|
8560
8575
|
workerSetTimeout(callback, timeout = 0) {
|
|
8561
8576
|
try {
|
|
8562
8577
|
return setTimeout$1(callback, timeout);
|
|
8578
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8563
8579
|
}
|
|
8564
8580
|
catch (error) {
|
|
8565
8581
|
return this.windowApi.setTimeout(callback, timeout);
|
|
@@ -8574,8 +8590,10 @@ class Utils {
|
|
|
8574
8590
|
if (timeId != null) {
|
|
8575
8591
|
clearTimeout$1(timeId);
|
|
8576
8592
|
}
|
|
8593
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8577
8594
|
}
|
|
8578
8595
|
catch (error) {
|
|
8596
|
+
// console.log(error);
|
|
8579
8597
|
}
|
|
8580
8598
|
finally {
|
|
8581
8599
|
this.windowApi.clearTimeout(timeId);
|
|
@@ -8589,6 +8607,7 @@ class Utils {
|
|
|
8589
8607
|
workerSetInterval(callback, timeout = 0) {
|
|
8590
8608
|
try {
|
|
8591
8609
|
return setInterval(callback, timeout);
|
|
8610
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8592
8611
|
}
|
|
8593
8612
|
catch (error) {
|
|
8594
8613
|
return this.windowApi.setInterval(callback, timeout);
|
|
@@ -8603,8 +8622,10 @@ class Utils {
|
|
|
8603
8622
|
if (timeId != null) {
|
|
8604
8623
|
clearInterval(timeId);
|
|
8605
8624
|
}
|
|
8625
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8606
8626
|
}
|
|
8607
8627
|
catch (error) {
|
|
8628
|
+
// console.log(error);
|
|
8608
8629
|
}
|
|
8609
8630
|
finally {
|
|
8610
8631
|
this.windowApi.clearInterval(timeId);
|
|
@@ -8638,10 +8659,10 @@ class Utils {
|
|
|
8638
8659
|
.query({
|
|
8639
8660
|
name: "clipboard-read",
|
|
8640
8661
|
})
|
|
8641
|
-
.then((
|
|
8662
|
+
.then(() => {
|
|
8642
8663
|
readClipboardText();
|
|
8643
8664
|
})
|
|
8644
|
-
.catch((
|
|
8665
|
+
.catch(() => {
|
|
8645
8666
|
/* 该权限申请Api可能在该环境下不生效,尝试直接读取剪贴板 */
|
|
8646
8667
|
readClipboardText();
|
|
8647
8668
|
});
|
|
@@ -8678,7 +8699,7 @@ class Utils {
|
|
|
8678
8699
|
});
|
|
8679
8700
|
}
|
|
8680
8701
|
}
|
|
8681
|
-
|
|
8702
|
+
const utils = new Utils();
|
|
8682
8703
|
|
|
8683
8704
|
export { utils as default };
|
|
8684
8705
|
//# sourceMappingURL=index.esm.js.map
|