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