@dan-uni/dan-any 0.2.4 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,11 +1,12 @@
1
- import * as __WEBPACK_EXTERNAL_MODULE_fast_xml_parser_1c5d6bda__ from "fast-xml-parser";
2
- import * as __WEBPACK_EXTERNAL_MODULE_canvas__ from "canvas";
3
- import * as __WEBPACK_EXTERNAL_MODULE_jssha__ from "jssha";
4
- import * as __WEBPACK_EXTERNAL_MODULE_node_zlib_a5bb16fc__ from "node:zlib";
5
- import * as __WEBPACK_EXTERNAL_MODULE_base16384__ from "base16384";
1
+ import { XMLParser } from "fast-xml-parser";
2
+ import hh_mm_ss from "hh-mm-ss";
3
+ import jssha from "jssha";
4
+ import { createCanvas } from "canvas";
5
+ import { brotliCompressSync, brotliDecompressSync, gunzipSync, gzipSync } from "node:zlib";
6
+ import { decode, encode as external_base16384_encode } from "base16384";
6
7
  var __webpack_require__ = {};
7
8
  (()=>{
8
- __webpack_require__.d = function(exports, definition) {
9
+ __webpack_require__.d = (exports, definition)=>{
9
10
  for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, {
10
11
  enumerable: true,
11
12
  get: definition[key]
@@ -13,12 +14,10 @@ var __webpack_require__ = {};
13
14
  };
14
15
  })();
15
16
  (()=>{
16
- __webpack_require__.o = function(obj, prop) {
17
- return Object.prototype.hasOwnProperty.call(obj, prop);
18
- };
17
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
19
18
  })();
20
19
  (()=>{
21
- __webpack_require__.r = function(exports) {
20
+ __webpack_require__.r = (exports)=>{
22
21
  if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports, Symbol.toStringTag, {
23
22
  value: 'Module'
24
23
  });
@@ -27,13 +26,23 @@ var __webpack_require__ = {};
27
26
  });
28
27
  };
29
28
  })();
29
+ var platform_namespaceObject = {};
30
+ __webpack_require__.r(platform_namespaceObject);
31
+ __webpack_require__.d(platform_namespaceObject, {
32
+ PlatformDanmakuOnlySource: ()=>platform_PlatformDanmakuOnlySource,
33
+ PlatformDanmakuOnlySources: ()=>PlatformDanmakuOnlySources,
34
+ PlatformDanmakuSources: ()=>PlatformDanmakuSources,
35
+ PlatformInfoSource: ()=>platform_PlatformInfoSource,
36
+ PlatformInfoSources: ()=>PlatformInfoSources,
37
+ PlatformSources: ()=>PlatformSources,
38
+ PlatformVideoSource: ()=>platform_PlatformVideoSource,
39
+ PlatformVideoSources: ()=>PlatformVideoSources
40
+ });
30
41
  var id_gen_namespaceObject = {};
31
42
  __webpack_require__.r(id_gen_namespaceObject);
32
43
  __webpack_require__.d(id_gen_namespaceObject, {
33
44
  UniID: ()=>UniID,
34
- createDMID: ()=>createDMID,
35
- domainPreset: ()=>domainPreset,
36
- platforms: ()=>platforms
45
+ createDMID: ()=>createDMID
37
46
  });
38
47
  var dm_gen_namespaceObject = {};
39
48
  __webpack_require__.r(dm_gen_namespaceObject);
@@ -243,7 +252,10 @@ function makeInt64Support() {
243
252
  const dv = new DataView(new ArrayBuffer(8));
244
253
  const ok = "function" == typeof BigInt && "function" == typeof dv.getBigInt64 && "function" == typeof dv.getBigUint64 && "function" == typeof dv.setBigInt64 && "function" == typeof dv.setBigUint64 && ("object" != typeof process || "object" != typeof process.env || "1" !== process.env.BUF_BIGINT_DISABLE);
245
254
  if (ok) {
246
- const MIN = BigInt("-9223372036854775808"), MAX = BigInt("9223372036854775807"), UMIN = BigInt("0"), UMAX = BigInt("18446744073709551615");
255
+ const MIN = BigInt("-9223372036854775808");
256
+ const MAX = BigInt("9223372036854775807");
257
+ const UMIN = BigInt("0");
258
+ const UMAX = BigInt("18446744073709551615");
247
259
  return {
248
260
  zero: BigInt(0),
249
261
  supported: true,
@@ -326,8 +338,6 @@ function scalarZeroValue(type, longAsString) {
326
338
  return "";
327
339
  case descriptors_ScalarType.BOOL:
328
340
  return false;
329
- default:
330
- return 0;
331
341
  case descriptors_ScalarType.DOUBLE:
332
342
  case descriptors_ScalarType.FLOAT:
333
343
  return 0.0;
@@ -339,6 +349,8 @@ function scalarZeroValue(type, longAsString) {
339
349
  return longAsString ? "0" : protoInt64.zero;
340
350
  case descriptors_ScalarType.BYTES:
341
351
  return new Uint8Array(0);
352
+ default:
353
+ return 0;
342
354
  }
343
355
  }
344
356
  function isScalarZeroValue(type, value) {
@@ -437,8 +449,9 @@ function isReflectList(arg, field) {
437
449
  var _a, _b, _c, _d;
438
450
  if (isObject(arg) && unsafeLocal in arg && "add" in arg && "field" in arg && "function" == typeof arg.field) {
439
451
  if (void 0 !== field) {
440
- const a = field, b = arg.field();
441
- return a.listKind == b.listKind && a.scalar === b.scalar && (null === (_a = a.message) || void 0 === _a ? void 0 : _a.typeName) === (null === (_b = b.message) || void 0 === _b ? void 0 : _b.typeName) && (null === (_c = a.enum) || void 0 === _c ? void 0 : _c.typeName) === (null === (_d = b.enum) || void 0 === _d ? void 0 : _d.typeName);
452
+ const a = field;
453
+ const b = arg.field();
454
+ return a.listKind == b.listKind && a.scalar === b.scalar && (null == (_a = a.message) ? void 0 : _a.typeName) === (null == (_b = b.message) ? void 0 : _b.typeName) && (null == (_c = a.enum) ? void 0 : _c.typeName) === (null == (_d = b.enum) ? void 0 : _d.typeName);
442
455
  }
443
456
  return true;
444
457
  }
@@ -449,7 +462,7 @@ function isReflectMap(arg, field) {
449
462
  if (isObject(arg) && unsafeLocal in arg && "has" in arg && "field" in arg && "function" == typeof arg.field) {
450
463
  if (void 0 !== field) {
451
464
  const a = field, b = arg.field();
452
- return a.mapKey === b.mapKey && a.mapKind == b.mapKind && a.scalar === b.scalar && (null === (_a = a.message) || void 0 === _a ? void 0 : _a.typeName) === (null === (_b = b.message) || void 0 === _b ? void 0 : _b.typeName) && (null === (_c = a.enum) || void 0 === _c ? void 0 : _c.typeName) === (null === (_d = b.enum) || void 0 === _d ? void 0 : _d.typeName);
465
+ return a.mapKey === b.mapKey && a.mapKind == b.mapKind && a.scalar === b.scalar && (null == (_a = a.message) ? void 0 : _a.typeName) === (null == (_b = b.message) ? void 0 : _b.typeName) && (null == (_c = a.enum) ? void 0 : _c.typeName) === (null == (_d = b.enum) ? void 0 : _d.typeName);
453
466
  }
454
467
  return true;
455
468
  }
@@ -474,7 +487,7 @@ function getTextEncoding() {
474
487
  try {
475
488
  encodeURIComponent(text);
476
489
  return true;
477
- } catch (e) {
490
+ } catch (_) {
478
491
  return false;
479
492
  }
480
493
  }
@@ -492,7 +505,7 @@ var binary_encoding_WireType;
492
505
  WireType[WireType["Bit32"] = 5] = "Bit32";
493
506
  })(binary_encoding_WireType || (binary_encoding_WireType = {}));
494
507
  const FLOAT32_MAX = 3.4028234663852886e38;
495
- const FLOAT32_MIN = -340282346638528860000000000000000000000;
508
+ const FLOAT32_MIN = -3.4028234663852886e+38;
496
509
  const UINT32_MAX = 0xffffffff;
497
510
  const INT32_MAX = 0x7fffffff;
498
511
  const INT32_MIN = -2147483648;
@@ -622,12 +635,12 @@ class BinaryWriter {
622
635
  return this;
623
636
  }
624
637
  sint64(value) {
625
- let tc = protoInt64.enc(value), sign = tc.hi >> 31, lo = tc.lo << 1 ^ sign, hi = (tc.hi << 1 | tc.lo >>> 31) ^ sign;
638
+ const tc = protoInt64.enc(value), sign = tc.hi >> 31, lo = tc.lo << 1 ^ sign, hi = (tc.hi << 1 | tc.lo >>> 31) ^ sign;
626
639
  varint64write(lo, hi, this.buf);
627
640
  return this;
628
641
  }
629
642
  uint64(value) {
630
- let tc = protoInt64.uEnc(value);
643
+ const tc = protoInt64.uEnc(value);
631
644
  varint64write(tc.lo, tc.hi, this.buf);
632
645
  return this;
633
646
  }
@@ -750,7 +763,7 @@ function assertFloat32(arg) {
750
763
  if ("string" == typeof arg) {
751
764
  const o = arg;
752
765
  arg = Number(arg);
753
- if (isNaN(arg) && "NaN" !== o) throw new Error("invalid float32: " + o);
766
+ if (Number.isNaN(arg) && "NaN" !== o) throw new Error("invalid float32: " + o);
754
767
  } else if ("number" != typeof arg) throw new Error("invalid float32: " + typeof arg);
755
768
  if (Number.isFinite(arg) && (arg > FLOAT32_MAX || arg < FLOAT32_MIN)) throw new Error("invalid float32: " + arg);
756
769
  }
@@ -820,22 +833,22 @@ function checkScalarValue(value, scalar) {
820
833
  case descriptors_ScalarType.INT64:
821
834
  case descriptors_ScalarType.SFIXED64:
822
835
  case descriptors_ScalarType.SINT64:
823
- if ("string" != typeof value && "bigint" != typeof value && "number" != typeof value) return false;
824
- try {
836
+ if ("bigint" == typeof value || "number" == typeof value || "string" == typeof value && value.length > 0) try {
825
837
  protoInt64.parse(value);
826
- } catch (e) {
838
+ return true;
839
+ } catch (_) {
827
840
  return `${value} out of range`;
828
841
  }
829
- return true;
842
+ return false;
830
843
  case descriptors_ScalarType.FIXED64:
831
844
  case descriptors_ScalarType.UINT64:
832
- if ("string" != typeof value && "bigint" != typeof value && "number" != typeof value) return false;
833
- try {
845
+ if ("bigint" == typeof value || "number" == typeof value || "string" == typeof value && value.length > 0) try {
834
846
  protoInt64.uParse(value);
835
- } catch (e) {
847
+ return true;
848
+ } catch (_) {
836
849
  return `${value} out of range`;
837
850
  }
838
- return true;
851
+ return false;
839
852
  }
840
853
  }
841
854
  function reasonSingular(field, val, details) {
@@ -1083,7 +1096,7 @@ function reflect_reflect(messageDesc, message, check = true) {
1083
1096
  class ReflectMessageImpl {
1084
1097
  get sortedFields() {
1085
1098
  var _a;
1086
- return null !== (_a = this._sortedFields) && void 0 !== _a ? _a : this._sortedFields = this.desc.fields.concat().sort((a, b)=>a.number - b.number);
1099
+ return null != (_a = this._sortedFields) ? _a : this._sortedFields = this.desc.fields.concat().sort((a, b)=>a.number - b.number);
1087
1100
  }
1088
1101
  constructor(messageDesc, message, check = true){
1089
1102
  this.lists = new Map();
@@ -1452,8 +1465,9 @@ function fromBinary(schema, bytes, options) {
1452
1465
  function readMessage(message, reader, options, delimited, lengthOrDelimitedFieldNo) {
1453
1466
  var _a;
1454
1467
  const end = delimited ? reader.len : reader.pos + lengthOrDelimitedFieldNo;
1455
- let fieldNo, wireType;
1456
- const unknownFields = null !== (_a = message.getUnknown()) && void 0 !== _a ? _a : [];
1468
+ let fieldNo;
1469
+ let wireType;
1470
+ const unknownFields = null != (_a = message.getUnknown()) ? _a : [];
1457
1471
  while(reader.pos < end){
1458
1472
  [fieldNo, wireType] = reader.tag();
1459
1473
  if (delimited && wireType == binary_encoding_WireType.EndGroup) break;
@@ -1495,7 +1509,8 @@ function readField(message, reader, field, wireType, options) {
1495
1509
  }
1496
1510
  function readMapEntry(reader, map, options) {
1497
1511
  const field = map.field();
1498
- let key, val;
1512
+ let key;
1513
+ let val;
1499
1514
  const end = reader.pos + reader.uint32();
1500
1515
  while(reader.pos < end){
1501
1516
  const [fieldNo] = reader.tag();
@@ -1535,16 +1550,10 @@ function readMapEntry(reader, map, options) {
1535
1550
  function readListField(reader, wireType, list, options) {
1536
1551
  var _a;
1537
1552
  const field = list.field();
1538
- if ("message" === field.listKind) {
1539
- list.add(readMessageField(reader, options, field));
1540
- return;
1541
- }
1542
- const scalarType = null !== (_a = field.scalar) && void 0 !== _a ? _a : descriptors_ScalarType.INT32;
1553
+ if ("message" === field.listKind) return void list.add(readMessageField(reader, options, field));
1554
+ const scalarType = null != (_a = field.scalar) ? _a : descriptors_ScalarType.INT32;
1543
1555
  const packed = wireType == binary_encoding_WireType.LengthDelimited && scalarType != descriptors_ScalarType.STRING && scalarType != descriptors_ScalarType.BYTES;
1544
- if (!packed) {
1545
- list.add(readScalar(reader, scalarType));
1546
- return;
1547
- }
1556
+ if (!packed) return void list.add(readScalar(reader, scalarType));
1548
1557
  const e = reader.uint32() + reader.pos;
1549
1558
  while(reader.pos < e)list.add(readScalar(reader, scalarType));
1550
1559
  }
@@ -1602,12 +1611,12 @@ function writeFields(writer, opts, msg) {
1602
1611
  var _a;
1603
1612
  for (const f of msg.sortedFields){
1604
1613
  if (!msg.isSet(f)) {
1605
- if (f.presence == LEGACY_REQUIRED) throw new Error(`cannot encode field ${msg.desc.typeName}.${f.name} to binary: required field not set`);
1614
+ if (f.presence == LEGACY_REQUIRED) throw new Error(`cannot encode ${f} to binary: required field not set`);
1606
1615
  continue;
1607
1616
  }
1608
1617
  writeField(writer, opts, msg, f);
1609
1618
  }
1610
- if (opts.writeUnknownFields) for (const { no, wireType, data } of null !== (_a = msg.getUnknown()) && void 0 !== _a ? _a : [])writer.tag(no, wireType).raw(data);
1619
+ if (opts.writeUnknownFields) for (const { no, wireType, data } of null != (_a = msg.getUnknown()) ? _a : [])writer.tag(no, wireType).raw(data);
1611
1620
  return writer;
1612
1621
  }
1613
1622
  function writeField(writer, opts, msg, field) {
@@ -1615,7 +1624,7 @@ function writeField(writer, opts, msg, field) {
1615
1624
  switch(field.fieldKind){
1616
1625
  case "scalar":
1617
1626
  case "enum":
1618
- writeScalar(writer, null !== (_a = field.scalar) && void 0 !== _a ? _a : descriptors_ScalarType.INT32, field.number, msg.get(field));
1627
+ writeScalar(writer, msg.desc.typeName, field.name, null != (_a = field.scalar) ? _a : descriptors_ScalarType.INT32, field.number, msg.get(field));
1619
1628
  break;
1620
1629
  case "list":
1621
1630
  writeListField(writer, opts, field, msg.get(field));
@@ -1628,8 +1637,8 @@ function writeField(writer, opts, msg, field) {
1628
1637
  break;
1629
1638
  }
1630
1639
  }
1631
- function writeScalar(writer, scalarType, fieldNo, value) {
1632
- writeScalarValue(writer.tag(fieldNo, writeTypeOfScalar(scalarType)), scalarType, value);
1640
+ function writeScalar(writer, msgName, fieldName, scalarType, fieldNo, value) {
1641
+ writeScalarValue(writer.tag(fieldNo, writeTypeOfScalar(scalarType)), msgName, fieldName, scalarType, value);
1633
1642
  }
1634
1643
  function writeMessageField(writer, opts, field, message) {
1635
1644
  if (field.delimitedEncoding) writeFields(writer.tag(field.number, binary_encoding_WireType.StartGroup), opts, message).tag(field.number, binary_encoding_WireType.EndGroup);
@@ -1641,24 +1650,24 @@ function writeListField(writer, opts, field, list) {
1641
1650
  for (const item of list)writeMessageField(writer, opts, field, item);
1642
1651
  return;
1643
1652
  }
1644
- const scalarType = null !== (_a = field.scalar) && void 0 !== _a ? _a : descriptors_ScalarType.INT32;
1653
+ const scalarType = null != (_a = field.scalar) ? _a : descriptors_ScalarType.INT32;
1645
1654
  if (field.packed) {
1646
1655
  if (!list.size) return;
1647
1656
  writer.tag(field.number, binary_encoding_WireType.LengthDelimited).fork();
1648
- for (const item of list)writeScalarValue(writer, scalarType, item);
1657
+ for (const item of list)writeScalarValue(writer, field.parent.typeName, field.name, scalarType, item);
1649
1658
  writer.join();
1650
1659
  return;
1651
1660
  }
1652
- for (const item of list)writeScalar(writer, scalarType, field.number, item);
1661
+ for (const item of list)writeScalar(writer, field.parent.typeName, field.name, scalarType, field.number, item);
1653
1662
  }
1654
1663
  function writeMapEntry(writer, opts, field, key, value) {
1655
1664
  var _a;
1656
1665
  writer.tag(field.number, binary_encoding_WireType.LengthDelimited).fork();
1657
- writeScalar(writer, field.mapKey, 1, key);
1666
+ writeScalar(writer, field.parent.typeName, field.name, field.mapKey, 1, key);
1658
1667
  switch(field.mapKind){
1659
1668
  case "scalar":
1660
1669
  case "enum":
1661
- writeScalar(writer, null !== (_a = field.scalar) && void 0 !== _a ? _a : descriptors_ScalarType.INT32, 2, value);
1670
+ writeScalar(writer, field.parent.typeName, field.name, null != (_a = field.scalar) ? _a : descriptors_ScalarType.INT32, 2, value);
1662
1671
  break;
1663
1672
  case "message":
1664
1673
  writeFields(writer.tag(2, binary_encoding_WireType.LengthDelimited).fork(), opts, value).join();
@@ -1666,53 +1675,58 @@ function writeMapEntry(writer, opts, field, key, value) {
1666
1675
  }
1667
1676
  writer.join();
1668
1677
  }
1669
- function writeScalarValue(writer, type, value) {
1670
- switch(type){
1671
- case descriptors_ScalarType.STRING:
1672
- writer.string(value);
1673
- break;
1674
- case descriptors_ScalarType.BOOL:
1675
- writer.bool(value);
1676
- break;
1677
- case descriptors_ScalarType.DOUBLE:
1678
- writer.double(value);
1679
- break;
1680
- case descriptors_ScalarType.FLOAT:
1681
- writer.float(value);
1682
- break;
1683
- case descriptors_ScalarType.INT32:
1684
- writer.int32(value);
1685
- break;
1686
- case descriptors_ScalarType.INT64:
1687
- writer.int64(value);
1688
- break;
1689
- case descriptors_ScalarType.UINT64:
1690
- writer.uint64(value);
1691
- break;
1692
- case descriptors_ScalarType.FIXED64:
1693
- writer.fixed64(value);
1694
- break;
1695
- case descriptors_ScalarType.BYTES:
1696
- writer.bytes(value);
1697
- break;
1698
- case descriptors_ScalarType.FIXED32:
1699
- writer.fixed32(value);
1700
- break;
1701
- case descriptors_ScalarType.SFIXED32:
1702
- writer.sfixed32(value);
1703
- break;
1704
- case descriptors_ScalarType.SFIXED64:
1705
- writer.sfixed64(value);
1706
- break;
1707
- case descriptors_ScalarType.SINT64:
1708
- writer.sint64(value);
1709
- break;
1710
- case descriptors_ScalarType.UINT32:
1711
- writer.uint32(value);
1712
- break;
1713
- case descriptors_ScalarType.SINT32:
1714
- writer.sint32(value);
1715
- break;
1678
+ function writeScalarValue(writer, msgName, fieldName, type, value) {
1679
+ try {
1680
+ switch(type){
1681
+ case descriptors_ScalarType.STRING:
1682
+ writer.string(value);
1683
+ break;
1684
+ case descriptors_ScalarType.BOOL:
1685
+ writer.bool(value);
1686
+ break;
1687
+ case descriptors_ScalarType.DOUBLE:
1688
+ writer.double(value);
1689
+ break;
1690
+ case descriptors_ScalarType.FLOAT:
1691
+ writer.float(value);
1692
+ break;
1693
+ case descriptors_ScalarType.INT32:
1694
+ writer.int32(value);
1695
+ break;
1696
+ case descriptors_ScalarType.INT64:
1697
+ writer.int64(value);
1698
+ break;
1699
+ case descriptors_ScalarType.UINT64:
1700
+ writer.uint64(value);
1701
+ break;
1702
+ case descriptors_ScalarType.FIXED64:
1703
+ writer.fixed64(value);
1704
+ break;
1705
+ case descriptors_ScalarType.BYTES:
1706
+ writer.bytes(value);
1707
+ break;
1708
+ case descriptors_ScalarType.FIXED32:
1709
+ writer.fixed32(value);
1710
+ break;
1711
+ case descriptors_ScalarType.SFIXED32:
1712
+ writer.sfixed32(value);
1713
+ break;
1714
+ case descriptors_ScalarType.SFIXED64:
1715
+ writer.sfixed64(value);
1716
+ break;
1717
+ case descriptors_ScalarType.SINT64:
1718
+ writer.sint64(value);
1719
+ break;
1720
+ case descriptors_ScalarType.UINT32:
1721
+ writer.uint32(value);
1722
+ break;
1723
+ case descriptors_ScalarType.SINT32:
1724
+ writer.sint32(value);
1725
+ break;
1726
+ }
1727
+ } catch (e) {
1728
+ if (e instanceof Error) throw new Error(`cannot encode field ${msgName}.${fieldName} to binary: ${e.message}`);
1729
+ throw e;
1716
1730
  }
1717
1731
  }
1718
1732
  function writeTypeOfScalar(type) {
@@ -1867,11 +1881,11 @@ function parseTextFormatScalarValue(type, value) {
1867
1881
  case descriptors_ScalarType.FLOAT:
1868
1882
  switch(value){
1869
1883
  case "inf":
1870
- return Number.POSITIVE_INFINITY;
1884
+ return 1 / 0;
1871
1885
  case "-inf":
1872
- return Number.NEGATIVE_INFINITY;
1886
+ return -1 / 0;
1873
1887
  case "nan":
1874
- return Number.NaN;
1888
+ return NaN;
1875
1889
  default:
1876
1890
  return parseFloat(value);
1877
1891
  }
@@ -1942,7 +1956,7 @@ function unescapeBytesDefaultValue(str) {
1942
1956
  const t = input.take(2);
1943
1957
  if (false === t) return false;
1944
1958
  const n = parseInt(s + t, 8);
1945
- if (isNaN(n)) return false;
1959
+ if (Number.isNaN(n)) return false;
1946
1960
  b.push(n);
1947
1961
  break;
1948
1962
  }
@@ -1952,7 +1966,7 @@ function unescapeBytesDefaultValue(str) {
1952
1966
  const t = input.take(2);
1953
1967
  if (false === t) return false;
1954
1968
  const n = parseInt(s + t, 16);
1955
- if (isNaN(n)) return false;
1969
+ if (Number.isNaN(n)) return false;
1956
1970
  b.push(n);
1957
1971
  break;
1958
1972
  }
@@ -1962,7 +1976,7 @@ function unescapeBytesDefaultValue(str) {
1962
1976
  const t = input.take(4);
1963
1977
  if (false === t) return false;
1964
1978
  const n = parseInt(s + t, 16);
1965
- if (isNaN(n)) return false;
1979
+ if (Number.isNaN(n)) return false;
1966
1980
  const chunk = new Uint8Array(4);
1967
1981
  const view = new DataView(chunk.buffer);
1968
1982
  view.setInt32(0, n, true);
@@ -2090,7 +2104,7 @@ function createBaseRegistry() {
2090
2104
  },
2091
2105
  getExtensionFor (extendee, no) {
2092
2106
  var _a;
2093
- return null === (_a = extendees.get(extendee.typeName)) || void 0 === _a ? void 0 : _a.get(no);
2107
+ return null == (_a = extendees.get(extendee.typeName)) ? void 0 : _a.get(no);
2094
2108
  },
2095
2109
  getService (typeName) {
2096
2110
  const t = types.get(typeName);
@@ -2122,7 +2136,8 @@ const featureDefaults = {
2122
2136
  repeatedFieldEncoding: 2,
2123
2137
  utf8Validation: 3,
2124
2138
  messageEncoding: 1,
2125
- jsonFormat: 2
2139
+ jsonFormat: 2,
2140
+ enforceNamingStyle: 2
2126
2141
  },
2127
2142
  999: {
2128
2143
  fieldPresence: 2,
@@ -2130,7 +2145,8 @@ const featureDefaults = {
2130
2145
  repeatedFieldEncoding: 1,
2131
2146
  utf8Validation: 2,
2132
2147
  messageEncoding: 1,
2133
- jsonFormat: 1
2148
+ jsonFormat: 1,
2149
+ enforceNamingStyle: 2
2134
2150
  },
2135
2151
  1000: {
2136
2152
  fieldPresence: 1,
@@ -2138,7 +2154,8 @@ const featureDefaults = {
2138
2154
  repeatedFieldEncoding: 1,
2139
2155
  utf8Validation: 2,
2140
2156
  messageEncoding: 1,
2141
- jsonFormat: 1
2157
+ jsonFormat: 1,
2158
+ enforceNamingStyle: 2
2142
2159
  }
2143
2160
  };
2144
2161
  function addFile(proto, reg) {
@@ -2146,7 +2163,7 @@ function addFile(proto, reg) {
2146
2163
  const file = {
2147
2164
  kind: "file",
2148
2165
  proto,
2149
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2166
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2150
2167
  edition: getFileEdition(proto),
2151
2168
  name: proto.name.replace(/\.proto$/, ""),
2152
2169
  dependencies: findFileDependencies(proto, reg),
@@ -2165,7 +2182,7 @@ function addFile(proto, reg) {
2165
2182
  },
2166
2183
  add (desc) {
2167
2184
  var _a;
2168
- assert((null === (_a = desc.proto.options) || void 0 === _a ? void 0 : _a.mapEntry) === true);
2185
+ assert((null == (_a = desc.proto.options) ? void 0 : _a.mapEntry) === true);
2169
2186
  mapEntriesStore.set(desc.typeName, desc);
2170
2187
  }
2171
2188
  };
@@ -2220,12 +2237,12 @@ function addFields(message, reg, mapEntries) {
2220
2237
  for (const child of message.nestedMessages)addFields(child, reg, mapEntries);
2221
2238
  }
2222
2239
  function addEnum(proto, file, parent, reg) {
2223
- var _a, _b, _c;
2240
+ var _a, _b, _c, _d, _e;
2224
2241
  const sharedPrefix = findEnumSharedPrefix(proto.name, proto.value);
2225
2242
  const desc = {
2226
2243
  kind: "enum",
2227
2244
  proto,
2228
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2245
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2229
2246
  file,
2230
2247
  parent,
2231
2248
  open: true,
@@ -2240,30 +2257,29 @@ function addEnum(proto, file, parent, reg) {
2240
2257
  };
2241
2258
  desc.open = isEnumOpen(desc);
2242
2259
  reg.add(desc);
2243
- proto.value.forEach((proto)=>{
2244
- var _a, _b;
2245
- const name = proto.name;
2246
- desc.values.push(desc.value[proto.number] = {
2260
+ for (const p of proto.value){
2261
+ const name = p.name;
2262
+ desc.values.push(desc.value[p.number] = {
2247
2263
  kind: "enum_value",
2248
- proto,
2249
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2264
+ proto: p,
2265
+ deprecated: null != (_d = null == (_c = p.options) ? void 0 : _c.deprecated) ? _d : false,
2250
2266
  parent: desc,
2251
2267
  name,
2252
2268
  localName: safeObjectProperty(void 0 == sharedPrefix ? name : name.substring(sharedPrefix.length)),
2253
- number: proto.number,
2269
+ number: p.number,
2254
2270
  toString () {
2255
2271
  return `enum value ${desc.typeName}.${name}`;
2256
2272
  }
2257
2273
  });
2258
- });
2259
- (null !== (_c = null == parent ? void 0 : parent.nestedEnums) && void 0 !== _c ? _c : file.enums).push(desc);
2274
+ }
2275
+ (null != (_e = null == parent ? void 0 : parent.nestedEnums) ? _e : file.enums).push(desc);
2260
2276
  }
2261
2277
  function addMessage(proto, file, parent, reg, mapEntries) {
2262
2278
  var _a, _b, _c, _d;
2263
2279
  const desc = {
2264
2280
  kind: "message",
2265
2281
  proto,
2266
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2282
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2267
2283
  file,
2268
2284
  parent,
2269
2285
  name: proto.name,
@@ -2279,9 +2295,9 @@ function addMessage(proto, file, parent, reg, mapEntries) {
2279
2295
  return `message ${this.typeName}`;
2280
2296
  }
2281
2297
  };
2282
- if ((null === (_c = proto.options) || void 0 === _c ? void 0 : _c.mapEntry) === true) mapEntries.add(desc);
2298
+ if ((null == (_c = proto.options) ? void 0 : _c.mapEntry) === true) mapEntries.add(desc);
2283
2299
  else {
2284
- (null !== (_d = null == parent ? void 0 : parent.nestedMessages) && void 0 !== _d ? _d : file.messages).push(desc);
2300
+ (null != (_d = null == parent ? void 0 : parent.nestedMessages) ? _d : file.messages).push(desc);
2285
2301
  reg.add(desc);
2286
2302
  }
2287
2303
  for (const enumProto of proto.enumType)addEnum(enumProto, file, desc, reg);
@@ -2292,7 +2308,7 @@ function addService(proto, file, reg) {
2292
2308
  const desc = {
2293
2309
  kind: "service",
2294
2310
  proto,
2295
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2311
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2296
2312
  file,
2297
2313
  name: proto.name,
2298
2314
  typeName: makeTypeName(proto, void 0, file),
@@ -2322,14 +2338,14 @@ function newMethod(proto, parent, reg) {
2322
2338
  return {
2323
2339
  kind: "rpc",
2324
2340
  proto,
2325
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2341
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2326
2342
  parent,
2327
2343
  name,
2328
2344
  localName: safeObjectProperty(name.length ? safeObjectProperty(name[0].toLowerCase() + name.substring(1)) : name),
2329
2345
  methodKind,
2330
2346
  input,
2331
2347
  output,
2332
- idempotency: null !== (_d = null === (_c = proto.options) || void 0 === _c ? void 0 : _c.idempotencyLevel) && void 0 !== _d ? _d : IDEMPOTENCY_UNKNOWN,
2348
+ idempotency: null != (_d = null == (_c = proto.options) ? void 0 : _c.idempotencyLevel) ? _d : IDEMPOTENCY_UNKNOWN,
2333
2349
  toString () {
2334
2350
  return `rpc ${parent.typeName}.${name}`;
2335
2351
  }
@@ -2355,7 +2371,7 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
2355
2371
  const field = {
2356
2372
  kind: "field",
2357
2373
  proto,
2358
- deprecated: null !== (_b = null === (_a = proto.options) || void 0 === _a ? void 0 : _a.deprecated) && void 0 !== _b && _b,
2374
+ deprecated: null != (_b = null == (_a = proto.options) ? void 0 : _a.deprecated) ? _b : false,
2359
2375
  name: proto.name,
2360
2376
  number: proto.number,
2361
2377
  scalar: void 0,
@@ -2395,7 +2411,7 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
2395
2411
  }
2396
2412
  const label = proto.label;
2397
2413
  const type = proto.type;
2398
- const jstype = null === (_c = proto.options) || void 0 === _c ? void 0 : _c.jstype;
2414
+ const jstype = null == (_c = proto.options) ? void 0 : _c.jstype;
2399
2415
  if (label === LABEL_REPEATED) {
2400
2416
  const mapEntry = type == TYPE_MESSAGE ? null == mapEntries ? void 0 : mapEntries.get(trimLeadingDot(proto.typeName)) : void 0;
2401
2417
  if (mapEntry) {
@@ -2512,12 +2528,13 @@ function getFieldPresence(proto, oneof, isExtension, parent) {
2512
2528
  if (proto.label == LABEL_REQUIRED) return registry_LEGACY_REQUIRED;
2513
2529
  if (proto.label == LABEL_REPEATED) return registry_IMPLICIT;
2514
2530
  if (!!oneof || proto.proto3Optional) return EXPLICIT;
2515
- if (proto.type == TYPE_MESSAGE) return EXPLICIT;
2516
2531
  if (isExtension) return EXPLICIT;
2517
- return resolveFeature("fieldPresence", {
2532
+ const resolved = resolveFeature("fieldPresence", {
2518
2533
  proto,
2519
2534
  parent
2520
2535
  });
2536
+ if (resolved == registry_IMPLICIT && (proto.type == TYPE_MESSAGE || proto.type == TYPE_GROUP)) return EXPLICIT;
2537
+ return resolved;
2521
2538
  }
2522
2539
  function isPackedField(proto, parent) {
2523
2540
  if (proto.label != LABEL_REPEATED) return false;
@@ -2548,7 +2565,7 @@ function isEnumOpen(desc) {
2548
2565
  var _a;
2549
2566
  return OPEN == resolveFeature("enumType", {
2550
2567
  proto: desc.proto,
2551
- parent: null !== (_a = desc.parent) && void 0 !== _a ? _a : desc.file
2568
+ parent: null != (_a = desc.parent) ? _a : desc.file
2552
2569
  });
2553
2570
  }
2554
2571
  function isDelimitedEncoding(proto, parent) {
@@ -2560,13 +2577,13 @@ function isDelimitedEncoding(proto, parent) {
2560
2577
  }
2561
2578
  function resolveFeature(name, ref) {
2562
2579
  var _a, _b;
2563
- const featureSet = null === (_a = ref.proto.options) || void 0 === _a ? void 0 : _a.features;
2580
+ const featureSet = null == (_a = ref.proto.options) ? void 0 : _a.features;
2564
2581
  if (featureSet) {
2565
2582
  const val = featureSet[name];
2566
2583
  if (0 != val) return val;
2567
2584
  }
2568
2585
  if ("kind" in ref) {
2569
- if ("message" == ref.kind) return resolveFeature(name, null !== (_b = ref.parent) && void 0 !== _b ? _b : ref.file);
2586
+ if ("message" == ref.kind) return resolveFeature(name, null != (_b = ref.parent) ? _b : ref.file);
2570
2587
  const editionDefaults = featureDefaults[ref.edition];
2571
2588
  if (!editionDefaults) throw new Error(`feature default for edition ${ref.edition} not found`);
2572
2589
  return editionDefaults[name];
@@ -2604,13 +2621,13 @@ function bootDescriptorProto(init) {
2604
2621
  return {
2605
2622
  $typeName: "google.protobuf.DescriptorProto",
2606
2623
  name: init.name,
2607
- field: null !== (_b = null === (_a = init.field) || void 0 === _a ? void 0 : _a.map(bootFieldDescriptorProto)) && void 0 !== _b ? _b : [],
2624
+ field: null != (_b = null == (_a = init.field) ? void 0 : _a.map(bootFieldDescriptorProto)) ? _b : [],
2608
2625
  extension: [],
2609
- nestedType: null !== (_d = null === (_c = init.nestedType) || void 0 === _c ? void 0 : _c.map(bootDescriptorProto)) && void 0 !== _d ? _d : [],
2610
- enumType: null !== (_f = null === (_e = init.enumType) || void 0 === _e ? void 0 : _e.map(bootEnumDescriptorProto)) && void 0 !== _f ? _f : [],
2611
- extensionRange: null !== (_h = null === (_g = init.extensionRange) || void 0 === _g ? void 0 : _g.map((e)=>Object.assign({
2626
+ nestedType: null != (_d = null == (_c = init.nestedType) ? void 0 : _c.map(bootDescriptorProto)) ? _d : [],
2627
+ enumType: null != (_f = null == (_e = init.enumType) ? void 0 : _e.map(bootEnumDescriptorProto)) ? _f : [],
2628
+ extensionRange: null != (_h = null == (_g = init.extensionRange) ? void 0 : _g.map((e)=>Object.assign({
2612
2629
  $typeName: "google.protobuf.DescriptorProto.ExtensionRange"
2613
- }, e))) && void 0 !== _h ? _h : [],
2630
+ }, e))) ? _h : [],
2614
2631
  oneofDecl: [],
2615
2632
  reservedRange: [],
2616
2633
  reservedName: []
@@ -2648,10 +2665,10 @@ function bootFieldOptions(init) {
2648
2665
  return Object.assign(proto, Object.assign(Object.assign({
2649
2666
  $typeName: "google.protobuf.FieldOptions"
2650
2667
  }, init), {
2651
- targets: null !== (_a = init.targets) && void 0 !== _a ? _a : [],
2652
- editionDefaults: null !== (_c = null === (_b = init.editionDefaults) || void 0 === _b ? void 0 : _b.map((e)=>Object.assign({
2668
+ targets: null != (_a = init.targets) ? _a : [],
2669
+ editionDefaults: null != (_c = null == (_b = init.editionDefaults) ? void 0 : _b.map((e)=>Object.assign({
2653
2670
  $typeName: "google.protobuf.FieldOptions.EditionDefault"
2654
- }, e))) && void 0 !== _c ? _c : [],
2671
+ }, e))) ? _c : [],
2655
2672
  uninterpretedOption: []
2656
2673
  }));
2657
2674
  }
@@ -2683,6 +2700,12 @@ const file_google_protobuf_descriptor = /*@__PURE__*/ boot_boot({
2683
2700
  label: 3,
2684
2701
  typeName: ".google.protobuf.FileDescriptorProto"
2685
2702
  }
2703
+ ],
2704
+ extensionRange: [
2705
+ {
2706
+ start: 536000000,
2707
+ end: 536000001
2708
+ }
2686
2709
  ]
2687
2710
  },
2688
2711
  {
@@ -4241,6 +4264,37 @@ const file_google_protobuf_descriptor = /*@__PURE__*/ boot_boot({
4241
4264
  }
4242
4265
  ]
4243
4266
  }
4267
+ },
4268
+ {
4269
+ name: "enforce_naming_style",
4270
+ number: 7,
4271
+ type: 14,
4272
+ label: 1,
4273
+ typeName: ".google.protobuf.FeatureSet.EnforceNamingStyle",
4274
+ options: {
4275
+ retention: 2,
4276
+ targets: [
4277
+ 1,
4278
+ 2,
4279
+ 3,
4280
+ 4,
4281
+ 5,
4282
+ 6,
4283
+ 7,
4284
+ 8,
4285
+ 9
4286
+ ],
4287
+ editionDefaults: [
4288
+ {
4289
+ value: "STYLE_LEGACY",
4290
+ edition: 900
4291
+ },
4292
+ {
4293
+ value: "STYLE2024",
4294
+ edition: 1001
4295
+ }
4296
+ ]
4297
+ }
4244
4298
  }
4245
4299
  ],
4246
4300
  enumType: [
@@ -4349,6 +4403,23 @@ const file_google_protobuf_descriptor = /*@__PURE__*/ boot_boot({
4349
4403
  number: 2
4350
4404
  }
4351
4405
  ]
4406
+ },
4407
+ {
4408
+ name: "EnforceNamingStyle",
4409
+ value: [
4410
+ {
4411
+ name: "ENFORCE_NAMING_STYLE_UNKNOWN",
4412
+ number: 0
4413
+ },
4414
+ {
4415
+ name: "STYLE2024",
4416
+ number: 1
4417
+ },
4418
+ {
4419
+ name: "STYLE_LEGACY",
4420
+ number: 2
4421
+ }
4422
+ ]
4352
4423
  }
4353
4424
  ],
4354
4425
  extensionRange: [
@@ -4473,6 +4544,12 @@ const file_google_protobuf_descriptor = /*@__PURE__*/ boot_boot({
4473
4544
  }
4474
4545
  ]
4475
4546
  }
4547
+ ],
4548
+ extensionRange: [
4549
+ {
4550
+ start: 536000000,
4551
+ end: 536000001
4552
+ }
4476
4553
  ]
4477
4554
  },
4478
4555
  {
@@ -4717,6 +4794,12 @@ var descriptor_pb_FeatureSet_JsonFormat;
4717
4794
  FeatureSet_JsonFormat[FeatureSet_JsonFormat["ALLOW"] = 1] = "ALLOW";
4718
4795
  FeatureSet_JsonFormat[FeatureSet_JsonFormat["LEGACY_BEST_EFFORT"] = 2] = "LEGACY_BEST_EFFORT";
4719
4796
  })(descriptor_pb_FeatureSet_JsonFormat || (descriptor_pb_FeatureSet_JsonFormat = {}));
4797
+ var descriptor_pb_FeatureSet_EnforceNamingStyle;
4798
+ (function(FeatureSet_EnforceNamingStyle) {
4799
+ FeatureSet_EnforceNamingStyle[FeatureSet_EnforceNamingStyle["ENFORCE_NAMING_STYLE_UNKNOWN"] = 0] = "ENFORCE_NAMING_STYLE_UNKNOWN";
4800
+ FeatureSet_EnforceNamingStyle[FeatureSet_EnforceNamingStyle["STYLE2024"] = 1] = "STYLE2024";
4801
+ FeatureSet_EnforceNamingStyle[FeatureSet_EnforceNamingStyle["STYLE_LEGACY"] = 2] = "STYLE_LEGACY";
4802
+ })(descriptor_pb_FeatureSet_EnforceNamingStyle || (descriptor_pb_FeatureSet_EnforceNamingStyle = {}));
4720
4803
  var descriptor_pb_GeneratedCodeInfo_Annotation_Semantic;
4721
4804
  (function(GeneratedCodeInfo_Annotation_Semantic) {
4722
4805
  GeneratedCodeInfo_Annotation_Semantic[GeneratedCodeInfo_Annotation_Semantic["NONE"] = 0] = "NONE";
@@ -4742,7 +4825,7 @@ function fileDesc(b64, imports) {
4742
4825
  var _a;
4743
4826
  const root = fromBinary(FileDescriptorProtoSchema, base64Decode(b64));
4744
4827
  root.messageType.forEach(restoreJsonNames);
4745
- root.dependency = null !== (_a = null == imports ? void 0 : imports.map((f)=>f.proto.name)) && void 0 !== _a ? _a : [];
4828
+ root.dependency = null != (_a = null == imports ? void 0 : imports.map((f)=>f.proto.name)) ? _a : [];
4746
4829
  const reg = createFileRegistry(root, (protoFileName)=>null == imports ? void 0 : imports.find((f)=>f.proto.name === protoFileName));
4747
4830
  return reg.getFile(root.name);
4748
4831
  }
@@ -4758,70 +4841,53 @@ function timestampDate(timestamp) {
4758
4841
  return new Date(timestamp_timestampMs(timestamp));
4759
4842
  }
4760
4843
  function timestampFromMs(timestampMs) {
4844
+ const seconds = Math.floor(timestampMs / 1000);
4761
4845
  return create(TimestampSchema, {
4762
- seconds: protoInt64.parse(Math.floor(timestampMs / 1000)),
4763
- nanos: timestampMs % 1000 * 1000000
4846
+ seconds: protoInt64.parse(seconds),
4847
+ nanos: (timestampMs - 1000 * seconds) * 1000000
4764
4848
  });
4765
4849
  }
4766
4850
  function timestamp_timestampMs(timestamp) {
4767
4851
  return 1000 * Number(timestamp.seconds) + Math.ceil(timestamp.nanos / 1000000);
4768
4852
  }
4769
- const color_pad = (s)=>s.length < 2 ? `0${s}` : s;
4770
- const decimalToHex = (n)=>color_pad(n.toString(16));
4771
- const isDarkColor = ({ r, g, b })=>0.299 * r + 0.587 * g + 0.114 * b < 0x30;
4772
- const WHITE = {
4773
- r: 255,
4774
- g: 255,
4775
- b: 255
4776
- };
4777
- const BLACK = {
4778
- r: 0,
4779
- g: 0,
4780
- b: 0
4781
- };
4782
- const hexColorToRGB = (hex)=>{
4783
- if (0 === hex.indexOf('#')) hex = hex.slice(1);
4784
- const [r, g, b] = 3 === hex.length ? hex.split('').map((c)=>c + c) : hex.match(/../g) || [];
4785
- return {
4786
- r: Number.parseInt(r, 16),
4787
- g: Number.parseInt(g, 16),
4788
- b: Number.parseInt(b, 16)
4789
- };
4790
- };
4791
- const formatColor = ({ r, g, b }, opacity)=>{
4792
- const color = [
4793
- b,
4794
- g,
4795
- r
4796
- ];
4797
- if (void 0 !== opacity) {
4798
- const alpha = Math.round((1 - opacity) * 255);
4799
- color.unshift(alpha);
4800
- }
4801
- return `&H${color.map(decimalToHex).join('').toUpperCase()}`;
4802
- };
4803
- const getDecoratingColor = (color)=>isDarkColor(color) ? WHITE : BLACK;
4804
- const isWhite = (color)=>255 === color.r && 255 === color.g && 255 === color.b;
4805
- const DanmakuType = {
4806
- SCROLL: 1,
4807
- BOTTOM: 2,
4808
- TOP: 3
4809
- };
4810
- const FontSize = {
4811
- SMALL: 0,
4812
- NORMAL: 1,
4813
- LARGE: 2
4814
- };
4815
- const domainPreset = {
4816
- acfun: 'acfun',
4817
- baha: 'baha',
4818
- bgm: 'bgm',
4819
- bili: 'bili',
4820
- bglobal: 'bglobal',
4821
- ddplay: 'ddplay',
4822
- tucao: 'tucao'
4823
- };
4824
- const platforms = Object.keys(domainPreset);
4853
+ const file_bili_dm = /*@__PURE__*/ fileDesc("Cg1iaWxpL2RtLnByb3RvEiBiaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MSJkCgZBdmF0YXISCgoCaWQYASABKAkSCwoDdXJsGAIgASgJEkEKC2F2YXRhcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyVHlwZSIjCgZCdWJibGUSDAoEdGV4dBgBIAEoCRILCgN1cmwYAiABKAkixgEKCEJ1YmJsZVYyEgwKBHRleHQYASABKAkSCwoDdXJsGAIgASgJEkEKC2J1YmJsZV90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnViYmxlVHlwZRIVCg1leHBvc3VyZV9vbmNlGAQgASgIEkUKDWV4cG9zdXJlX3R5cGUYBSABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGUiWwoGQnV0dG9uEgwKBHRleHQYASABKAkSQwoGYWN0aW9uGAIgASgOMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGUiWAoOQnV6endvcmRDb25maWcSRgoIa2V5d29yZHMYASADKAsyNC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdXp6d29yZFNob3dDb25maWcieAoSQnV6endvcmRTaG93Q29uZmlnEgwKBG5hbWUYASABKAkSDgoGc2NoZW1hGAIgASgJEg4KBnNvdXJjZRgDIAEoBRIKCgJpZBgEIAEoAxITCgtidXp6d29yZF9pZBgFIAEoAxITCgtzY2hlbWFfdHlwZRgGIAEoBSJ7CghDaGVja0JveBIMCgR0ZXh0GAEgASgJEjwKBHR5cGUYAiABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja2JveFR5cGUSFQoNZGVmYXVsdF92YWx1ZRgDIAEoCBIMCgRzaG93GAQgASgIIm8KCkNoZWNrQm94VjISDAoEdGV4dBgBIAEoCRI8CgR0eXBlGAIgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2hlY2tib3hUeXBlEhUKDWRlZmF1bHRfdmFsdWUYAyABKAgiggIKC0NsaWNrQnV0dG9uEhUKDXBvcnRyYWl0X3RleHQYASADKAkSFgoObGFuZHNjYXBlX3RleHQYAiADKAkSGwoTcG9ydHJhaXRfdGV4dF9mb2N1cxgDIAMoCRIcChRsYW5kc2NhcGVfdGV4dF9mb2N1cxgEIAMoCRJBCgtyZW5kZXJfdHlwZRgFIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlbmRlclR5cGUSDAoEc2hvdxgGIAEoCBI4CgZidWJibGUYByABKAsyKC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdWJibGUiswIKDUNsaWNrQnV0dG9uVjISFQoNcG9ydHJhaXRfdGV4dBgBIAMoCRIWCg5sYW5kc2NhcGVfdGV4dBgCIAMoCRIbChNwb3J0cmFpdF90ZXh0X2ZvY3VzGAMgAygJEhwKFGxhbmRzY2FwZV90ZXh0X2ZvY3VzGAQgAygJEkEKC3JlbmRlcl90eXBlGAUgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIXCg90ZXh0X2lucHV0X3Bvc3QYBiABKAgSFQoNZXhwb3N1cmVfb25jZRgHIAEoCBJFCg1leHBvc3VyZV90eXBlGAggASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb3N1cmVUeXBlIksKB0NvbW1hbmQSQAoLY29tbWFuZF9kbXMYASADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Db21tYW5kRG0i5gEKCUNvbW1hbmREbRIKCgJpZBgBIAEoAxILCgNvaWQYAiABKAMSCwoDbWlkGAMgASgDEg8KB2NvbW1hbmQYBCABKAkSDwoHY29udGVudBgFIAEoCRIQCghwcm9ncmVzcxgGIAEoBRINCgVjdGltZRgHIAEoCRINCgVtdGltZRgIIAEoCRINCgVleHRyYRgJIAEoCRINCgVpZFN0chgKIAEoCRIMCgR0eXBlGAsgASgFEhMKC2F1dG9fY3JlYXRlGAwgASgIEhIKCmNvdW50X2Rvd24YDSABKAUSDAoEYXR0chgOIAEoBSJQCg1EYW5tYWt1QUlGbGFnEj8KCGRtX2ZsYWdzGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUZsYWciiwMKC0Rhbm1ha3VFbGVtEgoKAmlkGAEgASgDEhAKCHByb2dyZXNzGAIgASgFEgwKBG1vZGUYAyABKAUSEAoIZm9udHNpemUYBCABKAUSPwoFY29sb3IYBSABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRIQCghtaWRfaGFzaBgGIAEoCRIPCgdjb250ZW50GAcgASgJEg0KBWN0aW1lGAggASgDEg4KBndlaWdodBgJIAEoBRIOCgZhY3Rpb24YCiABKAkSDAoEcG9vbBgLIAEoBRIOCgZpZF9zdHIYDCABKAkSDAoEYXR0chgNIAEoBRIRCglhbmltYXRpb24YFiABKAkSDQoFZXh0cmEYFyABKAkSQgoIY29sb3JmdWwYGCABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRIMCgR0eXBlGBkgASgFEgsKA29pZBgaIAEoAyIpCgtEYW5tYWt1RmxhZxIMCgRkbWlkGAEgASgDEgwKBGZsYWcYAiABKAUiSwoRRGFubWFrdUZsYWdDb25maWcSEAoIcmVjX2ZsYWcYASABKAUSEAoIcmVjX3RleHQYAiABKAkSEgoKcmVjX3N3aXRjaBgDIAEoBSKLBwoYRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnEikKIXBsYXllcl9kYW5tYWt1X3VzZV9kZWZhdWx0X2NvbmZpZxgBIAEoCBIsCiRwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9zd2l0Y2gYBCABKAgSKwojcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWwYBSABKAUSHwoXcGxheWVyX2Rhbm1ha3VfYmxvY2t0b3AYBiABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tzY3JvbGwYByABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tib3R0b20YCCABKAgSJAoccGxheWVyX2Rhbm1ha3VfYmxvY2tjb2xvcmZ1bBgJIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9ibG9ja3JlcGVhdBgKIAEoCBIjChtwbGF5ZXJfZGFubWFrdV9ibG9ja3NwZWNpYWwYCyABKAgSHgoWcGxheWVyX2Rhbm1ha3Vfb3BhY2l0eRgMIAEoAhIkChxwbGF5ZXJfZGFubWFrdV9zY2FsaW5nZmFjdG9yGA0gASgCEh0KFXBsYXllcl9kYW5tYWt1X2RvbWFpbhgOIAEoAhIcChRwbGF5ZXJfZGFubWFrdV9zcGVlZBgPIAEoBRIkChxpbmxpbmVfcGxheWVyX2Rhbm1ha3Vfc3dpdGNoGBAgASgIEikKIXBsYXllcl9kYW5tYWt1X3Nlbmlvcl9tb2RlX3N3aXRjaBgRIAEoBRIuCiZwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92MhgSIAEoBRKYAQoqcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWxfdjJfbWFwGBMgAygLMmQuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnLlBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EiUKHXBsYXllcl9kYW5tYWt1X2VuYWJsZV9oZXJkX2RtGBQgASgIGksKKVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEi7AkKEURhbm11UGxheWVyQ29uZmlnEh0KFXBsYXllcl9kYW5tYWt1X3N3aXRjaBgBIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9zd2l0Y2hfc2F2ZRgCIAEoCBIpCiFwbGF5ZXJfZGFubWFrdV91c2VfZGVmYXVsdF9jb25maWcYAyABKAgSLAokcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfc3dpdGNoGAQgASgIEisKI3BsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsGAUgASgFEh8KF3BsYXllcl9kYW5tYWt1X2Jsb2NrdG9wGAYgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2Nrc2Nyb2xsGAcgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2NrYm90dG9tGAggASgIEiQKHHBsYXllcl9kYW5tYWt1X2Jsb2NrY29sb3JmdWwYCSABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tyZXBlYXQYCiABKAgSIwobcGxheWVyX2Rhbm1ha3VfYmxvY2tzcGVjaWFsGAsgASgIEh4KFnBsYXllcl9kYW5tYWt1X29wYWNpdHkYDCABKAISJAoccGxheWVyX2Rhbm1ha3Vfc2NhbGluZ2ZhY3RvchgNIAEoAhIdChVwbGF5ZXJfZGFubWFrdV9kb21haW4YDiABKAISHAoUcGxheWVyX2Rhbm1ha3Vfc3BlZWQYDyABKAUSJgoecGxheWVyX2Rhbm1ha3VfZW5hYmxlYmxvY2tsaXN0GBAgASgIEiQKHGlubGluZV9wbGF5ZXJfZGFubWFrdV9zd2l0Y2gYESABKAgSJAocaW5saW5lX3BsYXllcl9kYW5tYWt1X2NvbmZpZxgSIAEoBRImCh5wbGF5ZXJfZGFubWFrdV9pb3Nfc3dpdGNoX3NhdmUYEyABKAUSKQohcGxheWVyX2Rhbm1ha3Vfc2VuaW9yX21vZGVfc3dpdGNoGBQgASgFEi4KJnBsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsX3YyGBUgASgFEpEBCipwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92Ml9tYXAYFiADKAsyXS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckNvbmZpZy5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRIlCh1wbGF5ZXJfZGFubWFrdV9lbmFibGVfaGVyZF9kbRgXIAEoCBImCh5wbGF5ZXJfZGFubWFrdV9ibG9ja3RvcF9ib3R0b20YGCABKAgSIAoYcGxheWVyX2Rhbm1ha3VfZG9tYWluX3YyGBkgASgFEh4KFnBsYXllcl9kYW5tYWt1X2RlbnNpdHkYGiABKAUSJQodcGxheWVyX2Rhbm1ha3Vfc3VidGl0bGVfcHJvb2YYGyABKAgSIwobcGxheWVyX2Rhbm1ha3VfcGVvcGxlX3Byb29mGBwgASgIGksKKVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEiMAoWRGFubXVQbGF5ZXJDb25maWdQYW5lbBIWCg5zZWxlY3Rpb25fdGV4dBgBIAEoCSJLChhEYW5tdVBsYXllckR5bmFtaWNDb25maWcSEAoIcHJvZ3Jlc3MYASABKAUSHQoVcGxheWVyX2Rhbm1ha3VfZG9tYWluGA4gASgCIpADChVEYW5tdVBsYXllclZpZXdDb25maWcSYQodZGFubXVrdV9kZWZhdWx0X3BsYXllcl9jb25maWcYASABKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdURlZmF1bHRQbGF5ZXJDb25maWcSUgoVZGFubXVrdV9wbGF5ZXJfY29uZmlnGAIgASgLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWcSYQodZGFubXVrdV9wbGF5ZXJfZHluYW1pY19jb25maWcYAyADKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckR5bmFtaWNDb25maWcSXQobZGFubXVrdV9wbGF5ZXJfY29uZmlnX3BhbmVsGAQgASgLMjguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWdQYW5lbCKZBQoURGFubXVXZWJQbGF5ZXJDb25maWcSEQoJZG1fc3dpdGNoGAEgASgIEhEKCWFpX3N3aXRjaBgCIAEoCBIQCghhaV9sZXZlbBgDIAEoBRIQCghibG9ja3RvcBgEIAEoCBITCgtibG9ja3Njcm9sbBgFIAEoCBITCgtibG9ja2JvdHRvbRgGIAEoCBISCgpibG9ja2NvbG9yGAcgASgIEhQKDGJsb2Nrc3BlY2lhbBgIIAEoCBIUCgxwcmV2ZW50c2hhZGUYCSABKAgSDQoFZG1hc2sYCiABKAgSDwoHb3BhY2l0eRgLIAEoAhIOCgZkbWFyZWEYDCABKAUSEQoJc3BlZWRwbHVzGA0gASgCEhAKCGZvbnRzaXplGA4gASgCEhIKCnNjcmVlbnN5bmMYDyABKAgSEQoJc3BlZWRzeW5jGBAgASgIEhIKCmZvbnRmYW1pbHkYESABKAkSDAoEYm9sZBgSIAEoCBISCgpmb250Ym9yZGVyGBMgASgFEhEKCWRyYXdfdHlwZRgUIAEoCRIaChJzZW5pb3JfbW9kZV9zd2l0Y2gYFSABKAUSEwoLYWlfbGV2ZWxfdjIYFiABKAUSYQoPYWlfbGV2ZWxfdjJfbWFwGBcgAygLMkguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVXZWJQbGF5ZXJDb25maWcuQWlMZXZlbFYyTWFwRW50cnkSFwoPYmxvY2t0b3BfYm90dG9tGBggASgIEhIKCmRtX2FyZWFfdjIYGSABKAUSEgoKZG1fZGVuc2l0eRgaIAEoBRozChFBaUxldmVsVjJNYXBFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBIlkKCkRtQ29sb3JmdWwSPgoEdHlwZRgBIAEoDjIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29sb3JmdWxUeXBlEgsKA3NyYxgCIAEoCSJQCg9EbUV4cG9SZXBvcnRSZXESEgoKc2Vzc2lvbl9pZBgBIAEoCRILCgNvaWQYAiABKAMSDQoFZG1pZHMYAyABKAwSDQoFc3BtaWQYBCABKAkiEQoPRG1FeHBvUmVwb3J0UmVzIm0KCkRtSGVyZFZpZXcSGwoTZGlzcGxheV9oZXJkX2RtX251bRgBIAEoBRJCCghoZXJkX2RtcxgCIAMoCzIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlZpZXdIZXJkRG1FbGVtIpYCCgpEbU1hc2tXYWxsEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAxIPCgdjb250ZW50GAMgASgJEk0KDGNvbnRlbnRfdHlwZRgEIAEoDjI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZRJFCghiaXpfdHlwZRgFIAEoDjIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxCaXpUeXBlEkUKCGNvbnRlbnRzGAYgAygLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1NYXNrV2FsbENvbnRlbnQiawoRRG1NYXNrV2FsbENvbnRlbnQSRQoEdHlwZRgBIAEoDjI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZRIPCgdjb250ZW50GAIgASgJIs0QChFEbVBsYXllckNvbmZpZ1JlcRIKCgJ0cxgBIAEoAxJFCgZzd2l0Y2gYAiABKAsyNS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U3dpdGNoEk4KC3N3aXRjaF9zYXZlGAMgASgLMjkuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVN3aXRjaFNhdmUSWwoSdXNlX2RlZmF1bHRfY29uZmlnGAQgASgLMj8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVVzZURlZmF1bHRDb25maWcSYQoVYWlfcmVjb21tZW5kZWRfc3dpdGNoGAUgASgLMkIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRTd2l0Y2gSXwoUYWlfcmVjb21tZW5kZWRfbGV2ZWwYBiABKAsyQS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEkkKCGJsb2NrdG9wGAcgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrdG9wEk8KC2Jsb2Nrc2Nyb2xsGAggASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2Nrc2Nyb2xsEk8KC2Jsb2NrYm90dG9tGAkgASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrYm90dG9tElMKDWJsb2NrY29sb3JmdWwYCiABKAsyPC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tjb2xvcmZ1bBJPCgtibG9ja3JlcGVhdBgLIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja3JlcGVhdBJRCgxibG9ja3NwZWNpYWwYDCABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEkcKB29wYWNpdHkYDSABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1T3BhY2l0eRJTCg1zY2FsaW5nZmFjdG9yGA4gASgLMjwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVNjYWxpbmdmYWN0b3ISRQoGZG9tYWluGA8gASgLMjUuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURvbWFpbhJDCgVzcGVlZBgQIAEoCzI0LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTcGVlZBJXCg9lbmFibGVibG9ja2xpc3QYESABKAsyPi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0El4KGWlubGluZVBsYXllckRhbm1ha3VTd2l0Y2gYEiABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5JbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoElsKEnNlbmlvcl9tb2RlX3N3aXRjaBgTIAEoCzI/LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTZW5pb3JNb2RlU3dpdGNoEmQKF2FpX3JlY29tbWVuZGVkX2xldmVsX3YyGBQgASgLMkMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbFYyElMKDmVuYWJsZV9oZXJkX2RtGBUgASgLMjsuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUVuYWJsZUhlcmREbRJWCg9ibG9ja3RvcF9ib3R0b20YFiABKAsyPS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SSgoJZG9tYWluX3YyGBcgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURvbWFpblYyEkcKB2RlbnNpdHkYGCABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RGVuc2l0eRJUCg5zdWJ0aXRsZV9wcm9vZhgZIAEoCzI8LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTdWJ0aXRsZVByb29mElAKDHBlb3BsZV9wcm9vZhgaIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VQZW9wbGVQcm9vZiIvCgtEbVNlZ0NvbmZpZxIRCglwYWdlX3NpemUYASABKAMSDQoFdG90YWwYAiABKAMikQIKEERtU2VnTW9iaWxlUmVwbHkSPAoFZWxlbXMYASADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbRINCgVzdGF0ZRgCIAEoBRJACgdhaV9mbGFnGAMgASgLMi8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUFJRmxhZxIVCg1zZWdtZW50X3J1bGVzGAQgAygDEkIKDGNvbG9yZnVsX3NyYxgFIAMoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29sb3JmdWwSEwoLY29udGV4dF9zcmMYBiABKAkiygEKDkRtU2VnTW9iaWxlUmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRIVCg1zZWdtZW50X2luZGV4GAQgASgDEhYKDnRlZW5hZ2Vyc19tb2RlGAUgASgFEgoKAnBzGAYgASgDEgoKAnBlGAcgASgDEhEKCXB1bGxfbW9kZRgIIAEoBRISCgpmcm9tX3NjZW5lGAkgASgFEg0KBXNwbWlkGAogASgJEhMKC2NvbnRleHRfZXh0GAsgASgJIlwKDURtU2VnT3R0UmVwbHkSPAoFZWxlbXMYASADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbRINCgVzdGF0ZRgCIAEoBSJMCgtEbVNlZ090dFJlcRILCgNwaWQYASABKAMSCwoDb2lkGAIgASgDEgwKBHR5cGUYAyABKAUSFQoNc2VnbWVudF9pbmRleBgEIAEoAyJdCg1EbVNlZ1NES1JlcGx5Eg4KBmNsb3NlZBgBIAEoCBI8CgVlbGVtcxgCIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VFbGVtIkwKC0RtU2VnU0RLUmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRIVCg1zZWdtZW50X2luZGV4GAQgASgDIncKCURtU3ViVmlldxIMCgR0eXBlGAEgASgFEgsKA29pZBgCIAEoAxILCgNwaWQYAyABKAMSQgoLcG9zdF9wYW5lbDIYBCADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxWMiKhCQoLRG1WaWV3UmVwbHkSDgoGY2xvc2VkGAEgASgIEjkKBG1hc2sYAiABKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWRlb01hc2sSQQoIc3VidGl0bGUYAyABKAsyLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWRlb1N1YnRpdGxlEhMKC3NwZWNpYWxfZG1zGAQgAygJEkQKB2FpX2ZsYWcYBSABKAsyMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RmxhZ0NvbmZpZxJOCg1wbGF5ZXJfY29uZmlnGAYgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJWaWV3Q29uZmlnEhYKDnNlbmRfYm94X3N0eWxlGAcgASgFEg0KBWFsbG93GAggASgIEhEKCWNoZWNrX2JveBgJIAEoCBIaChJjaGVja19ib3hfc2hvd19tc2cYCiABKAkSGAoQdGV4dF9wbGFjZWhvbGRlchgLIAEoCRIZChFpbnB1dF9wbGFjZWhvbGRlchgMIAEoCRIdChVyZXBvcnRfZmlsdGVyX2NvbnRlbnQYDSADKAkSQQoLZXhwb19yZXBvcnQYDiABKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvUmVwb3J0EkkKD2J1enp3b3JkX2NvbmZpZxgPIAEoCzIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1enp3b3JkQ29uZmlnEkIKC2V4cHJlc3Npb25zGBAgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnMSPwoKcG9zdF9wYW5lbBgRIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbBIVCg1hY3Rpdml0eV9tZXRhGBIgAygJEkIKC3Bvc3RfcGFuZWwyGBMgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjISQgoMZG1fbWFza193YWxsGBQgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1NYXNrV2FsbBI9CgdkbV9oZXJkGBUgASgLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1IZXJkVmlldxI6Cgdjb21tYW5kGBYgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ29tbWFuZBIKCgJrdhgXIAEoCRI+CglzdWJfdmlld3MYGCADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVN1YlZpZXcSNgoDcW9lGBkgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUW9lSW5mbyJtCglEbVZpZXdSZXESCwoDcGlkGAEgASgDEgsKA29pZBgCIAEoAxIMCgR0eXBlGAMgASgFEg0KBXNwbWlkGAQgASgJEhQKDGlzX2hhcmRfYm9vdBgFIAEoBRITCgtjb250ZXh0X2V4dBgGIAEoCSKBBgoORG1XZWJWaWV3UmVwbHkSDQoFc3RhdGUYASABKAUSDAoEdGV4dBgCIAEoCRIRCgl0ZXh0X3NpZGUYAyABKAkSPQoGZG1fc2dlGAQgASgLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdDb25maWcSQQoEZmxhZxgFIAEoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VGbGFnQ29uZmlnEhMKC3NwZWNpYWxfZG1zGAYgAygJEhEKCWNoZWNrX2JveBgHIAEoCBINCgVjb3VudBgIIAEoAxJACgtjb21tYW5kX2RtcxgJIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNvbW1hbmREbRJNCg1wbGF5ZXJfY29uZmlnGAogASgLMjYuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVXZWJQbGF5ZXJDb25maWcSHQoVcmVwb3J0X2ZpbHRlcl9jb250ZW50GAsgAygJEkIKC2V4cHJlc3Npb25zGAwgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnMSPwoKcG9zdF9wYW5lbBgNIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbBIVCg1hY3Rpdml0eV9tZXRhGA4gAygJEkIKC3Bvc3RfcGFuZWwyGA8gAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjISPgoJc3ViX3ZpZXdzGBAgAygLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TdWJWaWV3EjYKA3FvZRgRIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlFvZUluZm8iKgoKRXhwb1JlcG9ydBIcChRzaG91bGRfcmVwb3J0X2F0X2VuZBgBIAEoCCJkCgpFeHByZXNzaW9uEg8KB2tleXdvcmQYASADKAkSCwoDdXJsGAIgASgJEjgKBnBlcmlvZBgDIAMoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBlcmlvZCJJCgtFeHByZXNzaW9ucxI6CgRkYXRhGAEgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbiIqChlJbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoEg0KBXZhbHVlGAEgASgIIicKBUxhYmVsEg0KBXRpdGxlGAEgASgJEg8KB2NvbnRlbnQYAiADKAkihwEKB0xhYmVsVjISDQoFdGl0bGUYASABKAkSDwoHY29udGVudBgCIAMoCRIVCg1leHBvc3VyZV9vbmNlGAMgASgIEkUKDWV4cG9zdXJlX3R5cGUYBCABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGUiJAoGUGVyaW9kEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAyIwCh9QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEg0KBXZhbHVlGAEgASgFIjIKIVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMhINCgV2YWx1ZRgBIAEoBSIxCiBQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZFN3aXRjaBINCgV2YWx1ZRgBIAEoCCIpChhQbGF5ZXJEYW5tYWt1QmxvY2tib3R0b20SDQoFdmFsdWUYASABKAgiKwoaUGxheWVyRGFubWFrdUJsb2NrY29sb3JmdWwSDQoFdmFsdWUYASABKAgiKQoYUGxheWVyRGFubWFrdUJsb2NrcmVwZWF0Eg0KBXZhbHVlGAEgASgIIikKGFBsYXllckRhbm1ha3VCbG9ja3Njcm9sbBINCgV2YWx1ZRgBIAEoCCIqChlQbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEg0KBXZhbHVlGAEgASgIIiYKFVBsYXllckRhbm1ha3VCbG9ja3RvcBINCgV2YWx1ZRgBIAEoCCIsChtQbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SDQoFdmFsdWUYASABKAgiJQoUUGxheWVyRGFubWFrdURlbnNpdHkSDQoFdmFsdWUYASABKAUiJAoTUGxheWVyRGFubWFrdURvbWFpbhINCgV2YWx1ZRgBIAEoAiImChVQbGF5ZXJEYW5tYWt1RG9tYWluVjISDQoFdmFsdWUYASABKAUiKgoZUGxheWVyRGFubWFrdUVuYWJsZUhlcmREbRINCgV2YWx1ZRgBIAEoCCItChxQbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0Eg0KBXZhbHVlGAEgASgIIiUKFFBsYXllckRhbm1ha3VPcGFjaXR5Eg0KBXZhbHVlGAEgASgCIikKGFBsYXllckRhbm1ha3VQZW9wbGVQcm9vZhINCgV2YWx1ZRgBIAEoCCIrChpQbGF5ZXJEYW5tYWt1U2NhbGluZ2ZhY3RvchINCgV2YWx1ZRgBIAEoAiIuCh1QbGF5ZXJEYW5tYWt1U2VuaW9yTW9kZVN3aXRjaBINCgV2YWx1ZRgBIAEoBSIjChJQbGF5ZXJEYW5tYWt1U3BlZWQSDQoFdmFsdWUYASABKAUiKwoaUGxheWVyRGFubWFrdVN1YnRpdGxlUHJvb2YSDQoFdmFsdWUYASABKAgiOAoTUGxheWVyRGFubWFrdVN3aXRjaBINCgV2YWx1ZRgBIAEoCBISCgpjYW5faWdub3JlGAIgASgIIigKF1BsYXllckRhbm1ha3VTd2l0Y2hTYXZlEg0KBXZhbHVlGAEgASgIIi4KHVBsYXllckRhbm1ha3VVc2VEZWZhdWx0Q29uZmlnEg0KBXZhbHVlGAEgASgIIowDCglQb3N0UGFuZWwSDQoFc3RhcnQYASABKAMSCwoDZW5kGAIgASgDEhAKCHByaW9yaXR5GAMgASgDEg4KBmJpel9pZBgEIAEoAxJECghiaXpfdHlwZRgFIAEoDjIyLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbEJpelR5cGUSQwoMY2xpY2tfYnV0dG9uGAYgASgLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2xpY2tCdXR0b24SPwoKdGV4dF9pbnB1dBgHIAEoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dBI9CgljaGVja19ib3gYCCABKAsyKi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja0JveBI2CgV0b2FzdBgJIAEoCzInLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0Iq0ECgtQb3N0UGFuZWxWMhINCgVzdGFydBgBIAEoAxILCgNlbmQYAiABKAMSRAoIYml6X3R5cGUYAyABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxCaXpUeXBlEkUKDGNsaWNrX2J1dHRvbhgEIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNsaWNrQnV0dG9uVjISQQoKdGV4dF9pbnB1dBgFIAEoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dFYyEj8KCWNoZWNrX2JveBgGIAEoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNoZWNrQm94VjISOAoFdG9hc3QYByABKAsyKS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Ub2FzdFYyEjoKBmJ1YmJsZRgIIAEoCzIqLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1YmJsZVYyEjgKBWxhYmVsGAkgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuTGFiZWxWMhJBCgtwb3N0X3N0YXR1cxgKIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RTdGF0dXMiFwoHUW9lSW5mbxIMCgRpbmZvGAEgASgJIikKCFJlc3BvbnNlEgwKBGNvZGUYASABKAUSDwoHbWVzc2FnZRgCIAEoCSL5AgoMU3VidGl0bGVJdGVtEgoKAmlkGAEgASgDEg4KBmlkX3N0chgCIAEoCRILCgNsYW4YAyABKAkSDwoHbGFuX2RvYxgEIAEoCRIUCgxzdWJ0aXRsZV91cmwYBSABKAkSOgoGYXV0aG9yGAYgASgLMiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVXNlckluZm8SPAoEdHlwZRgHIAEoDjIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlVHlwZRIVCg1sYW5fZG9jX2JyaWVmGAggASgJEkEKB2FpX3R5cGUYCSABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpVHlwZRJFCglhaV9zdGF0dXMYCiABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpU3RhdHVzIugCCglUZXh0SW5wdXQSHAoUcG9ydHJhaXRfcGxhY2Vob2xkZXIYASADKAkSHQoVbGFuZHNjYXBlX3BsYWNlaG9sZGVyGAIgAygJEkEKC3JlbmRlcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIYChBwbGFjZWhvbGRlcl9wb3N0GAQgASgIEgwKBHNob3cYBSABKAgSOAoGYXZhdGFyGAYgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyEkEKC3Bvc3Rfc3RhdHVzGAcgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFN0YXR1cxI2CgVsYWJlbBgIIAEoCzInLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkxhYmVsIvsBCgtUZXh0SW5wdXRWMhIcChRwb3J0cmFpdF9wbGFjZWhvbGRlchgBIAMoCRIdChVsYW5kc2NhcGVfcGxhY2Vob2xkZXIYAiADKAkSQQoLcmVuZGVyX3R5cGUYAyABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5SZW5kZXJUeXBlEhgKEHBsYWNlaG9sZGVyX3Bvc3QYBCABKAgSOAoGYXZhdGFyGAUgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyEhgKEHRleHRfaW5wdXRfbGltaXQYBiABKAUibwoFVG9hc3QSDAoEdGV4dBgBIAEoCRIQCghkdXJhdGlvbhgCIAEoBRIMCgRzaG93GAMgASgIEjgKBmJ1dHRvbhgEIAEoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1dHRvbiJiCg1Ub2FzdEJ1dHRvblYyEgwKBHRleHQYASABKAkSQwoGYWN0aW9uGAIgASgOMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGUicwoHVG9hc3RWMhIMCgR0ZXh0GAEgASgJEhAKCGR1cmF0aW9uGAIgASgFEkgKD3RvYXN0X2J1dHRvbl92MhgDIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0QnV0dG9uVjIiXAoIVXNlckluZm8SCwoDbWlkGAEgASgDEgwKBG5hbWUYAiABKAkSCwoDc2V4GAMgASgJEgwKBGZhY2UYBCABKAkSDAoEc2lnbhgFIAEoCRIMCgRyYW5rGAYgASgFIlMKCVZpZGVvTWFzaxILCgNjaWQYASABKAMSDAoEcGxhdBgCIAEoBRILCgNmcHMYAyABKAUSDAoEdGltZRgEIAEoAxIQCghtYXNrX3VybBgFIAEoCSJwCg1WaWRlb1N1YnRpdGxlEgsKA2xhbhgBIAEoCRIPCgdsYW5fZG9jGAIgASgJEkEKCXN1YnRpdGxlcxgDIAMoCzIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlSXRlbSKSAQoOVmlld0hlcmREbUVsZW0SEAoIaGVyZF9tc2cYASABKAkSFgoOaGVyZF9zdGFydF9jbnQYAiABKAUSFAoMaGVyZF9lbmRfY250GAMgASgFEhIKCnJlZ2V4X3J1bGUYBCABKAkSFgoOc3RhcnRfcHJvZ3Jlc3MYBSABKAUSFAoMZW5kX3Byb2dyZXNzGAYgASgFKjMKCkF2YXRhclR5cGUSEgoOQXZhdGFyVHlwZU5vbmUQABIRCg1BdmF0YXJUeXBlTkZUEAEqWQoKQnViYmxlVHlwZRISCg5CdWJibGVUeXBlTm9uZRAAEhkKFUJ1YmJsZVR5cGVDbGlja0J1dHRvbhABEhwKGEJ1YmJsZVR5cGVEbVNldHRpbmdQYW5lbBACKlgKDENoZWNrYm94VHlwZRIUChBDaGVja2JveFR5cGVOb25lEAASGQoVQ2hlY2tib3hUeXBlRW5jb3VyYWdlEAESFwoTQ2hlY2tib3hUeXBlQ29sb3JETRACKjUKDkRtQ29sb3JmdWxUeXBlEgwKCE5vbmVUeXBlEAASFQoPVmlwR3JhZHVhbENvbG9yEOHUAypgChFEbU1hc2tXYWxsQml6VHlwZRILCgdVbmtub3duEAASBwoDT0dWEAESCgoGQml6UGljEAISCAoETXV0ZRADEgoKBlJlY29yZBAEEgkKBUNsb3VkEAUSCAoEQUlHQxAGKnYKFURtTWFza1dhbGxDb250ZW50VHlwZRIgChxEbU1hc2tXYWxsQ29udGVudFR5cGVVbmtub3duEAASHQoZRG1NYXNrV2FsbENvbnRlbnRUeXBlVGV4dBABEhwKGERtTWFza1dhbGxDb250ZW50VHlwZVBpYxACKjwKDEV4cG9zdXJlVHlwZRIUChBFeHBvc3VyZVR5cGVOb25lEAASFgoSRXhwb3N1cmVUeXBlRE1TZW5kEAEqgwIKEFBvc3RQYW5lbEJpelR5cGUSGAoUUG9zdFBhbmVsQml6VHlwZU5vbmUQABIdChlQb3N0UGFuZWxCaXpUeXBlRW5jb3VyYWdlEAESGwoXUG9zdFBhbmVsQml6VHlwZUNvbG9yRE0QAhIZChVQb3N0UGFuZWxCaXpUeXBlTkZURE0QAxIdChlQb3N0UGFuZWxCaXpUeXBlRnJhZ0Nsb3NlEAQSHQoZUG9zdFBhbmVsQml6VHlwZVJlY29tbWVuZBAFEhwKGFBvc3RQYW5lbEJpelR5cGVQbG90TGVhaxAGEiIKHlBvc3RQYW5lbEJpelR5cGVBbnRpSGFyYXNzbWVudBAHKjgKClBvc3RTdGF0dXMSFAoQUG9zdFN0YXR1c05vcm1hbBAAEhQKEFBvc3RTdGF0dXNDbG9zZWQQASpOCgpSZW5kZXJUeXBlEhIKDlJlbmRlclR5cGVOb25lEAASFAoQUmVuZGVyVHlwZVNpbmdsZRABEhYKElJlbmRlclR5cGVSb3RhdGlvbhACKjYKEFN1YnRpdGxlQWlTdGF0dXMSCAoETm9uZRAAEgwKCEV4cG9zdXJlEAESCgoGQXNzaXN0EAIqKwoOU3VidGl0bGVBaVR5cGUSCgoGTm9ybWFsEAASDQoJVHJhbnNsYXRlEAEqHgoMU3VidGl0bGVUeXBlEgYKAkNDEAASBgoCQUkQASpOChFUb2FzdEZ1bmN0aW9uVHlwZRIZChVUb2FzdEZ1bmN0aW9uVHlwZU5vbmUQABIeChpUb2FzdEZ1bmN0aW9uVHlwZVBvc3RQYW5lbBABMqAFCgJETRJzCgtEbVNlZ01vYmlsZRIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnTW9iaWxlUmVxGjIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdNb2JpbGVSZXBseRJkCgZEbVZpZXcSKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVZpZXdSZXEaLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVZpZXdSZXBseRJxCg5EbVBsYXllckNvbmZpZxIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtUGxheWVyQ29uZmlnUmVxGiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVzcG9uc2USagoIRG1TZWdPdHQSLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ090dFJlcRovLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnT3R0UmVwbHkSagoIRG1TZWdTREsSLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ1NES1JlcRovLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnU0RLUmVwbHkSdAoMRG1FeHBvUmVwb3J0EjEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1FeHBvUmVwb3J0UmVxGjEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1FeHBvUmVwb3J0UmVzYgZwcm90bzM");
4854
+ const DmSegMobileReplySchema = /*@__PURE__*/ message_messageDesc(file_bili_dm, 30);
4855
+ const DmWebViewReplySchema = /*@__PURE__*/ message_messageDesc(file_bili_dm, 39);
4856
+ const file_danuni = /*@__PURE__*/ fileDesc("CgxkYW51bmkucHJvdG8SEWRhbnVuaS5kYW5tYWt1LnYxIjIKCmxpc3REYW5SZXESCgoCSUQYASABKAkSEAoDc2VnGAIgASgFSACIAQFCBgoEX3NlZyLCAgoHRGFubWFrdRIMCgRTT0lEGAEgASgJEgwKBERNSUQYAiABKAkSEAoIcHJvZ3Jlc3MYAyABKAUSJQoEbW9kZRgEIAEoDjIXLmRhbnVuaS5kYW5tYWt1LnYxLk1vZGUSEAoIZm9udHNpemUYBSABKAUSDQoFY29sb3IYBiABKAUSEAoIc2VuZGVySUQYByABKAkSDwoHY29udGVudBgIIAEoCRIpCgVjdGltZRgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDgoGd2VpZ2h0GAogASgFEiUKBHBvb2wYCyABKA4yFy5kYW51bmkuZGFubWFrdS52MS5Qb29sEgwKBGF0dHIYDCADKAkSEAoIcGxhdGZvcm0YDSABKAkSEgoFZXh0cmEYDiABKAlIAIgBAUIICgZfZXh0cmEiPAoMRGFubWFrdVJlcGx5EiwKCGRhbm1ha3VzGAEgAygLMhouZGFudW5pLmRhbm1ha3UudjEuRGFubWFrdSo9CgRNb2RlEgoKBk5vcm1hbBAAEgoKBkJvdHRvbRABEgcKA1RvcBACEgsKB1JldmVyc2UQAxIHCgNFeHQQBCopCgRQb29sEgcKA0RlZhAAEgcKA1N1YhABEgcKA0FkdhACEgYKAkl4EAMyXQoORGFubWFrdVNlcnZpY2USSwoHbGlzdERhbhIdLmRhbnVuaS5kYW5tYWt1LnYxLmxpc3REYW5SZXEaHy5kYW51bmkuZGFubWFrdS52MS5EYW5tYWt1UmVwbHkiAFAAYgZwcm90bzM", [
4857
+ file_google_protobuf_timestamp
4858
+ ]);
4859
+ const DanmakuReplySchema = /*@__PURE__*/ message_messageDesc(file_danuni, 2);
4860
+ var platform_PlatformInfoSource = /*#__PURE__*/ function(PlatformInfoSource) {
4861
+ PlatformInfoSource["Bangumi"] = "bgm";
4862
+ PlatformInfoSource["TMDB"] = "tmdb";
4863
+ return PlatformInfoSource;
4864
+ }({});
4865
+ const PlatformInfoSources = Object.values(platform_PlatformInfoSource);
4866
+ var platform_PlatformVideoSource = /*#__PURE__*/ function(PlatformVideoSource) {
4867
+ PlatformVideoSource["Acfun"] = "acfun";
4868
+ PlatformVideoSource["Baha"] = "baha";
4869
+ PlatformVideoSource["Bilibili"] = "bili";
4870
+ PlatformVideoSource["BilibiliGlobal"] = "bglobal";
4871
+ PlatformVideoSource["Iqiyi"] = "iqiyi";
4872
+ PlatformVideoSource["Tencent"] = "tencent";
4873
+ PlatformVideoSource["Youku"] = "youku";
4874
+ return PlatformVideoSource;
4875
+ }({});
4876
+ const PlatformVideoSources = Object.values(platform_PlatformVideoSource);
4877
+ var platform_PlatformDanmakuOnlySource = /*#__PURE__*/ function(PlatformDanmakuOnlySource) {
4878
+ PlatformDanmakuOnlySource["DanDanPlay"] = "ddplay";
4879
+ PlatformDanmakuOnlySource["TuCao"] = "tucao";
4880
+ return PlatformDanmakuOnlySource;
4881
+ }({});
4882
+ const PlatformDanmakuOnlySources = Object.values(platform_PlatformDanmakuOnlySource);
4883
+ const PlatformDanmakuSources = [
4884
+ ...PlatformVideoSources,
4885
+ ...PlatformDanmakuOnlySources
4886
+ ];
4887
+ const PlatformSources = [
4888
+ ...PlatformInfoSources,
4889
+ ...PlatformDanmakuSources
4890
+ ];
4825
4891
  class UniID {
4826
4892
  id;
4827
4893
  domain;
@@ -4833,13 +4899,13 @@ class UniID {
4833
4899
  return `${this.id}@${this.domain}`;
4834
4900
  }
4835
4901
  static fromNull(domain) {
4836
- return new UniID('anonymous', domain || 'danuni');
4902
+ return new UniID('runtime' === domain ? 'runtime' : 'anonymous', domain || 'danuni');
4837
4903
  }
4838
4904
  static fromBili({ cid, mid, midHash }) {
4839
- if (cid) return new UniID(cid.toString(), domainPreset.bili);
4840
- if (mid) return new UniID(mid.toString(), domainPreset.bili);
4841
- if (midHash) return new UniID(midHash, domainPreset.bili);
4842
- return this.fromNull(domainPreset.bili);
4905
+ if (cid) return new UniID(cid.toString(), platform_PlatformVideoSource.Bilibili);
4906
+ if (mid) return new UniID(mid.toString(), platform_PlatformVideoSource.Bilibili);
4907
+ if (midHash) return new UniID(midHash, platform_PlatformVideoSource.Bilibili);
4908
+ return this.fromNull(platform_PlatformVideoSource.Bilibili);
4843
4909
  }
4844
4910
  static fromUnknown(id, domain) {
4845
4911
  if (id) return new UniID(id, domain);
@@ -4847,7 +4913,7 @@ class UniID {
4847
4913
  }
4848
4914
  }
4849
4915
  function createDMID(content = '', senderID, ctime, slice = 8) {
4850
- return new __WEBPACK_EXTERNAL_MODULE_jssha__["default"]('SHA3-256', 'TEXT').update(content + senderID + UniDM.transCtime(ctime).toISOString()).getHash('HEX').slice(0, slice);
4916
+ return new jssha('SHA3-256', 'TEXT').update(content + senderID + UniDM.transCtime(ctime).toISOString()).getHash('HEX').slice(0, slice);
4851
4917
  }
4852
4918
  const BigIntSerializer = (k, v)=>'bigint' == typeof v ? v.toString() : v;
4853
4919
  function cleanEmptyObjects(obj) {
@@ -4856,7 +4922,7 @@ function cleanEmptyObjects(obj) {
4856
4922
  const cleaned = {};
4857
4923
  for (const [key, value] of Object.entries(obj)){
4858
4924
  const cleanedValue = cleanEmptyObjects(value);
4859
- if (void 0 !== cleanedValue && !('object' == typeof cleanedValue && 0 === Object.keys(cleanedValue).length)) cleaned[key] = cleanedValue;
4925
+ if (void 0 !== cleanedValue && ('object' != typeof cleanedValue || 0 !== Object.keys(cleanedValue).length)) cleaned[key] = cleanedValue;
4860
4926
  }
4861
4927
  return Object.keys(cleaned).length > 0 ? cleaned : {};
4862
4928
  }
@@ -4908,11 +4974,25 @@ var dm_gen_ExtraDanUniChapterType = /*#__PURE__*/ function(ExtraDanUniChapterTyp
4908
4974
  ExtraDanUniChapterType["ED"] = "ed";
4909
4975
  ExtraDanUniChapterType["Preview"] = "prvw";
4910
4976
  ExtraDanUniChapterType["Cut"] = "cut";
4911
- ExtraDanUniChapterType["Duplicates"] = "dup";
4977
+ ExtraDanUniChapterType["Duplicate"] = "dup";
4912
4978
  ExtraDanUniChapterType["AdBiz"] = "biz";
4913
4979
  ExtraDanUniChapterType["AdUnpaid"] = "promo";
4914
4980
  return ExtraDanUniChapterType;
4915
4981
  }({});
4982
+ const ExtraDanUniChapterTypeDict = {
4983
+ chs: {
4984
+ ch: "\u5176\u5B83\u7247\u6BB5",
4985
+ rev: "\u56DE\u987E",
4986
+ op: "\u7247\u5934",
4987
+ int: "\u4E2D\u573A",
4988
+ ed: "\u7247\u5C3E",
4989
+ prvw: "\u9884\u544A",
4990
+ cut: "\u5220\u51CF",
4991
+ dup: "\u8865\u6863",
4992
+ biz: "\u5546\u4E1A\u5E7F\u544A",
4993
+ promo: "\u63A8\u5E7F"
4994
+ }
4995
+ };
4916
4996
  var dm_gen_ExtraDanUniChapterAction = /*#__PURE__*/ function(ExtraDanUniChapterAction) {
4917
4997
  ExtraDanUniChapterAction[ExtraDanUniChapterAction["Disabled"] = -1] = "Disabled";
4918
4998
  ExtraDanUniChapterAction[ExtraDanUniChapterAction["ShowOverlay"] = 0] = "ShowOverlay";
@@ -4936,7 +5016,7 @@ var dm_gen_Pools = /*#__PURE__*/ function(Pools) {
4936
5016
  return Pools;
4937
5017
  }({});
4938
5018
  class UniDM {
4939
- FCID;
5019
+ SOID;
4940
5020
  progress;
4941
5021
  mode;
4942
5022
  fontsize;
@@ -4948,11 +5028,10 @@ class UniDM {
4948
5028
  pool;
4949
5029
  attr;
4950
5030
  platform;
4951
- SPMO;
4952
5031
  extraStr;
4953
5032
  DMID;
4954
- constructor(FCID, progress = 0, mode = 0, fontsize = 25, color = 16777215, senderID = UniID.fromNull().toString(), content = '', ctime = new Date(), weight = 5, pool = 0, attr = [], platform, SPMO, extraStr, DMID){
4955
- this.FCID = FCID;
5033
+ constructor(SOID, progress = 0, mode = 0, fontsize = 25, color = 16777215, senderID = UniID.fromNull().toString(), content = '', ctime = new Date(), weight = 0, pool = 0, attr = [], platform, extraStr, DMID){
5034
+ this.SOID = SOID;
4956
5035
  this.progress = progress;
4957
5036
  this.mode = mode;
4958
5037
  this.fontsize = fontsize;
@@ -4964,14 +5043,13 @@ class UniDM {
4964
5043
  this.pool = pool;
4965
5044
  this.attr = attr;
4966
5045
  this.platform = platform;
4967
- this.SPMO = SPMO;
4968
5046
  this.extraStr = extraStr;
4969
5047
  this.DMID = DMID;
4970
5048
  if (progress < 0) this.progress = 0;
4971
5049
  if (mode < 0 || mode > 4) this.mode = 0;
4972
5050
  if (fontsize <= 0) this.fontsize = 25;
4973
5051
  if (color <= 0) this.color = 16777215;
4974
- if (weight <= 0 || weight > 10) this.weight = 5;
5052
+ if (weight < 0 || weight > 10) this.weight = 5;
4975
5053
  if (pool < 0 || pool > 3) this.pool = 0;
4976
5054
  if (!DMID) DMID = this.toDMID();
4977
5055
  this.progress = Number.parseFloat(progress.toFixed(3));
@@ -4979,14 +5057,14 @@ class UniDM {
4979
5057
  if ('{}' === extraStr) this.extraStr = void 0;
4980
5058
  }
4981
5059
  static create(args) {
4982
- return args ? new UniDM(args.FCID || UniID.fromNull().toString(), args.progress, args.mode, args.fontsize, args.color, args.senderID, args.content, args.ctime, args.weight, args.pool, args.attr, args.platform, args.SPMO, 'object' == typeof args.extra ? JSON.stringify(args.extra) : args.extra || args.extraStr, args.DMID) : new UniDM(UniID.fromNull().toString());
5060
+ return args ? new UniDM(args.SOID || UniID.fromNull().toString(), args.progress, args.mode, args.fontsize, args.color, args.senderID, args.content, args.ctime, args.weight, args.pool, args.attr, args.platform, 'object' == typeof args.extra ? JSON.stringify(args.extra) : args.extra || args.extraStr, args.DMID) : new UniDM(UniID.fromNull().toString());
4983
5061
  }
4984
5062
  get extra() {
4985
5063
  const extra = JSON.parse(this.extraStr || '{}');
4986
5064
  return extra;
4987
5065
  }
4988
5066
  get isFrom3rdPlatform() {
4989
- if (this.platform && platforms.includes(this.platform)) return true;
5067
+ if (this.platform && PlatformDanmakuSources.includes(this.platform)) return true;
4990
5068
  return false;
4991
5069
  }
4992
5070
  toDMID() {
@@ -4994,12 +5072,11 @@ class UniDM {
4994
5072
  }
4995
5073
  isSameAs(dan, _check2 = false) {
4996
5074
  const isSame = (k)=>this[k] === dan[k], checks = [
4997
- 'FCID',
5075
+ 'SOID',
4998
5076
  'content',
4999
5077
  'mode',
5000
5078
  'platform',
5001
- 'pool',
5002
- 'SPMO'
5079
+ 'pool'
5003
5080
  ].every((k)=>isSame(k));
5004
5081
  if ('{}' === JSON.stringify(this.extra) && '{}' === JSON.stringify(dan.extra)) return checks;
5005
5082
  const thisHasOnlyMerge = this.extra.danuni?.merge && !this.extra.artplayer && !this.extra.bili && !this.extra.danuni.chapter;
@@ -5026,20 +5103,51 @@ class UniDM {
5026
5103
  const def = UniDM.create(), dan = UniDM.create(this);
5027
5104
  for(const key in dan){
5028
5105
  const k = key, v = dan[k];
5029
- if ('FCID' !== key) {
5030
- if (v) {
5031
- if (v === def[k]) delete dan[k];
5032
- else {
5033
- if ('attr' === k && Array.isArray(v) && 0 === v.length) delete dan[k];
5034
- if ('extraStr' === k && '{}' === v) delete dan[k];
5035
- }
5036
- } else delete dan[k];
5106
+ if ('SOID' !== key) if (v) if (v === def[k]) delete dan[k];
5107
+ else {
5108
+ if ('attr' === k && Array.isArray(v) && 0 === v.length) delete dan[k];
5109
+ if ('extraStr' === k && '{}' === v) delete dan[k];
5037
5110
  }
5111
+ else delete dan[k];
5038
5112
  }
5039
5113
  return JSON.parse(JSON.stringify(dan));
5040
5114
  }
5041
- downgradeAdvcancedDan() {
5115
+ downgradeAdvcancedDan({ include, exclude, cleanExtra = false } = {
5116
+ include: [],
5117
+ exclude: []
5118
+ }) {
5042
5119
  if (!this.extra) return this;
5120
+ {
5121
+ if (!include) include = [];
5122
+ if (!exclude) exclude = [];
5123
+ const check = (k)=>include?.includes(k) || !exclude?.includes(k);
5124
+ const clone = UniDM.create(this);
5125
+ clone.mode = 2;
5126
+ if (check('danuni') && clone.extra.danuni) {
5127
+ const danuni = clone.extra.danuni;
5128
+ if (danuni.merge) {
5129
+ const merge = danuni.merge;
5130
+ clone.content = `${this.content} x${merge.count}`;
5131
+ } else if (danuni.chapter) {
5132
+ const chapter = danuni.chapter;
5133
+ if ("cut" === chapter.type) clone.content = `[\u{63D0}\u{793A}]${clone.platform}\u{6E90}${ExtraDanUniChapterTypeDict.chs[chapter.type]}\u{4E86}${chapter.duration}\u{79D2}`;
5134
+ else if ("dup" === chapter.type) clone.content = `[\u{63D0}\u{793A}(${ExtraDanUniChapterTypeDict.chs[chapter.type]})]${clone.platform}\u{6E90}-${chapter.duration}\u{79D2}`;
5135
+ else clone.content = `[\u{7A7A}\u{964D}(${ExtraDanUniChapterTypeDict.chs[chapter.type]})]${hh_mm_ss.fromS(clone.progress + chapter.duration)}`;
5136
+ }
5137
+ } else if (check('bili') && clone.extra.bili) {
5138
+ const bili = clone.extra.bili;
5139
+ if (7 === bili.mode && bili.adv) clone.content = `[B\u{7AD9}\u{9AD8}\u{7EA7}\u{5F39}\u{5E55}]${JSON.parse(bili.adv)[4] || ''}`;
5140
+ else if (bili.command) {
5141
+ const command = bili.command;
5142
+ clone.content = `[B\u{7AD9}\u{6307}\u{4EE4}\u{5F39}\u{5E55}]${command.content}`;
5143
+ clone.fontsize = 36;
5144
+ }
5145
+ }
5146
+ clone.senderID = 'compat[bot]@dan-any';
5147
+ clone.attr.push('Compatible');
5148
+ if (cleanExtra) clone.extraStr = void 0;
5149
+ return clone;
5150
+ }
5043
5151
  }
5044
5152
  static transCtime(oriCtime, tsUnit) {
5045
5153
  function isMsTs(ts) {
@@ -5047,10 +5155,8 @@ class UniDM {
5047
5155
  if ('s' === tsUnit) return false;
5048
5156
  return ts < 100000000;
5049
5157
  }
5050
- if ('number' == typeof oriCtime || 'bigint' == typeof oriCtime) {
5051
- if (isMsTs(oriCtime)) return new Date(Number(oriCtime));
5052
- return new Date(1000 * Number(oriCtime));
5053
- }
5158
+ if ('number' == typeof oriCtime || 'bigint' == typeof oriCtime) if (isMsTs(oriCtime)) return new Date(Number(oriCtime));
5159
+ else return new Date(1000 * Number(oriCtime));
5054
5160
  if ('string' != typeof oriCtime) return oriCtime;
5055
5161
  if (/^\d+n$/.test(oriCtime)) return new Date(Number(oriCtime.slice(0, -1)));
5056
5162
  return new Date(oriCtime);
@@ -5097,11 +5203,11 @@ class UniDM {
5097
5203
  }
5098
5204
  return mode;
5099
5205
  }
5100
- static fromBili(args, SPMO, cid) {
5206
+ static fromBili(args, cid) {
5101
5207
  if (args.oid && !cid) cid = args.oid;
5102
- const FCID = UniID.fromBili({
5208
+ const SOID = `def::${UniID.fromBili({
5103
5209
  cid
5104
- }), senderID = UniID.fromBili({
5210
+ })}`, senderID = UniID.fromBili({
5105
5211
  midHash: args.midHash
5106
5212
  });
5107
5213
  let mode = 0;
@@ -5139,28 +5245,27 @@ class UniDM {
5139
5245
  }
5140
5246
  return this.create({
5141
5247
  ...args,
5142
- FCID: FCID.toString(),
5248
+ SOID: SOID.toString(),
5143
5249
  mode,
5144
5250
  senderID: senderID.toString(),
5145
5251
  ctime: this.transCtime(args.ctime, 's'),
5146
5252
  weight: args.weight ? args.weight : 3 === pool ? 1 : 0,
5147
5253
  pool,
5148
- attr: DMAttrUtils.fromBin(args.attr, 'bili'),
5149
- platform: domainPreset.bili,
5150
- SPMO,
5254
+ attr: DMAttrUtils.fromBin(args.attr, platform_PlatformVideoSource.Bilibili),
5255
+ platform: platform_PlatformVideoSource.Bilibili,
5151
5256
  extra: args.mode >= 7 ? JSON.stringify(extra, BigIntSerializer) : void 0
5152
5257
  });
5153
5258
  }
5154
- static fromBiliCommand(args, SPMO, cid) {
5259
+ static fromBiliCommand(args, cid) {
5155
5260
  if (args.oid && !cid) cid = args.oid;
5156
- const FCID = UniID.fromBili({
5261
+ const SOID = UniID.fromBili({
5157
5262
  cid
5158
5263
  }), senderID = UniID.fromBili({
5159
5264
  mid: args.mid
5160
5265
  });
5161
5266
  return this.create({
5162
5267
  ...args,
5163
- FCID: FCID.toString(),
5268
+ SOID: SOID.toString(),
5164
5269
  mode: 4,
5165
5270
  senderID: senderID.toString(),
5166
5271
  ctime: new Date(`${args.ctime} GMT+0800`),
@@ -5169,8 +5274,7 @@ class UniDM {
5169
5274
  attr: [
5170
5275
  'Protect'
5171
5276
  ],
5172
- platform: domainPreset.bili,
5173
- SPMO,
5277
+ platform: platform_PlatformVideoSource.Bilibili,
5174
5278
  extra: JSON.stringify({
5175
5279
  bili: {
5176
5280
  command: args
@@ -5179,10 +5283,10 @@ class UniDM {
5179
5283
  });
5180
5284
  }
5181
5285
  static fromDplayer(args, playerID, domain) {
5182
- const FCID = UniID.fromUnknown(playerID, domain), senderID = UniID.fromUnknown(args.midHash, domain);
5286
+ const SOID = UniID.fromUnknown(playerID, domain), senderID = UniID.fromUnknown(args.midHash, domain);
5183
5287
  return this.create({
5184
5288
  ...args,
5185
- FCID: FCID.toString(),
5289
+ SOID: SOID.toString(),
5186
5290
  mode: this.transMode(args.mode, 'dplayer'),
5187
5291
  senderID: senderID.toString(),
5188
5292
  platform: domain
@@ -5201,7 +5305,7 @@ class UniDM {
5201
5305
  };
5202
5306
  }
5203
5307
  static fromArtplayer(args, playerID, domain) {
5204
- const FCID = UniID.fromUnknown(playerID, domain), senderID = UniID.fromUnknown('', domain);
5308
+ const SOID = UniID.fromUnknown(playerID, domain), senderID = UniID.fromUnknown('', domain);
5205
5309
  let extra = args.border ? {
5206
5310
  artplayer: {
5207
5311
  border: args.border,
@@ -5221,7 +5325,7 @@ class UniDM {
5221
5325
  };
5222
5326
  return this.create({
5223
5327
  ...args,
5224
- FCID: FCID.toString(),
5328
+ SOID: SOID.toString(),
5225
5329
  mode: this.transMode(args.mode, 'artplayer'),
5226
5330
  senderID: senderID.toString(),
5227
5331
  platform: domain,
@@ -5240,11 +5344,11 @@ class UniDM {
5240
5344
  style: this.extra.artplayer?.style
5241
5345
  };
5242
5346
  }
5243
- static fromDDplay(args, episodeId, domain = domainPreset.ddplay) {
5244
- const FCID = UniID.fromUnknown(episodeId, domain);
5347
+ static fromDDplay(args, episodeId, domain = platform_PlatformDanmakuOnlySource.DanDanPlay) {
5348
+ const SOID = UniID.fromUnknown(`def::${episodeId}`, domain);
5245
5349
  return this.create({
5246
5350
  ...args,
5247
- FCID: FCID.toString(),
5351
+ SOID: SOID.toString(),
5248
5352
  mode: this.transMode(args.mode, 'ddplay'),
5249
5353
  senderID: args.uid,
5250
5354
  content: args.m,
@@ -5266,85 +5370,583 @@ class UniDM {
5266
5370
  };
5267
5371
  }
5268
5372
  }
5269
- function decimalToRGB888(decimal) {
5270
- const r = decimal >> 16 & 0xff;
5271
- const g = decimal >> 8 & 0xff;
5272
- const b = 0xff & decimal;
5273
- return {
5274
- r,
5275
- g,
5276
- b
5277
- };
5278
- }
5279
- function UniPool2DanmakuLists(UP) {
5280
- const dans = UP.dans;
5281
- let type = DanmakuType.SCROLL;
5282
- return dans.map((d)=>{
5283
- if (d.mode === dm_gen_Modes.Bottom) type = DanmakuType.BOTTOM;
5284
- else if (d.mode === dm_gen_Modes.Top) type = DanmakuType.TOP;
5373
+ class UniPool {
5374
+ dans;
5375
+ options;
5376
+ constructor(dans, options = {}){
5377
+ this.dans = dans;
5378
+ this.options = options;
5379
+ if (false !== options.dedupe) options.dedupe = true;
5380
+ if (this.options.dedupe) this.dedupe();
5381
+ }
5382
+ async pipe(fn) {
5383
+ return fn(this);
5384
+ }
5385
+ pipeSync(fn) {
5386
+ return fn(this);
5387
+ }
5388
+ get shared() {
5389
+ const isShared = (key)=>this.dans.every((d)=>d[key]);
5285
5390
  return {
5286
- time: d.progress,
5287
- type,
5288
- fontSizeType: d.fontsize,
5289
- content: d.content,
5290
- color: decimalToRGB888(d.color),
5291
- extra: d
5391
+ SOID: isShared('SOID') ? this.dans[0].SOID : void 0,
5392
+ senderID: isShared('senderID') ? this.dans[0].senderID : void 0,
5393
+ platform: isShared('platform') ? this.dans[0].platform : void 0,
5394
+ pool: isShared('pool') ? this.dans[0].pool : void 0,
5395
+ mode: isShared('mode') ? this.dans[0].mode : void 0,
5396
+ color: isShared('color') ? this.dans[0].color : void 0
5292
5397
  };
5293
- });
5294
- }
5295
- function DanmakuList2UniPool(d) {
5296
- return new UniPool(d.map((d)=>d.extra));
5297
- }
5298
- const lang_assign = (source, ...targets)=>{
5299
- for (const target of targets)for (const key of Object.keys(target))source[key] = target[key];
5300
- return source;
5301
- };
5302
- const arrayOfLength = (length, defaultValue)=>{
5303
- const array = new Array(length);
5304
- for(let i = 0; i < length; i++)array[i] = defaultValue;
5305
- return array;
5306
- };
5307
- const computeScrollInTime = (rectWidth, screenWidth, scrollTime)=>{
5308
- const speed = (screenWidth + rectWidth) / scrollTime;
5309
- return rectWidth / speed;
5310
- };
5311
- const computeScrollOverTime = (rectWidth, screenWidth, scrollTime)=>{
5312
- const speed = (screenWidth + rectWidth) / scrollTime;
5313
- return screenWidth / speed;
5314
- };
5315
- const splitGrids = ({ fontSize, padding, playResY, bottomSpace })=>{
5316
- const defaultFontSize = fontSize[FontSize.NORMAL];
5317
- const paddingTop = padding[0];
5318
- const paddingBottom = padding[2];
5319
- const linesCount = Math.floor((playResY - bottomSpace) / (defaultFontSize + paddingTop + paddingBottom));
5320
- return {
5321
- 1: arrayOfLength(linesCount, {
5322
- start: 0,
5323
- end: 0,
5324
- width: 0
5325
- }),
5326
- 3: arrayOfLength(linesCount, 0),
5327
- 2: arrayOfLength(linesCount, 0)
5328
- };
5329
- };
5330
- const measureTextWidth = (()=>{
5331
- const canvasContext = (0, __WEBPACK_EXTERNAL_MODULE_canvas__.createCanvas)(50, 50).getContext('2d');
5332
- const supportTextMeasure = !!canvasContext.measureText('中');
5333
- if (supportTextMeasure) return (fontName, fontSize, bold, text)=>{
5334
- canvasContext.font = `${bold ? 'bold' : 'normal'} ${fontSize}px ${fontName}`;
5335
- const textWidth = canvasContext.measureText(text).width;
5336
- return Math.round(textWidth);
5337
- };
5338
- console.warn('[Warn] node-canvas is installed without text measure support, layout may not be correct');
5339
- return (_fontName, fontSize, _bold, text)=>text.length * fontSize;
5340
- })();
5341
- const resolveAvailableFixGrid = (grids, time)=>{
5342
- for (const [i, grid] of grids.entries())if (grid <= time) return i;
5343
- return -1;
5344
- };
5345
- const resolveAvailableScrollGrid = (grids, rectWidth, screenWidth, time, duration)=>{
5346
- for (const [i, previous] of grids.entries()){
5347
- const previousInTime = previous.start + computeScrollInTime(previous.width, screenWidth, duration);
5398
+ }
5399
+ get stat() {
5400
+ const default_stat = {
5401
+ SOID: [],
5402
+ mode: [
5403
+ {
5404
+ val: dm_gen_Modes.Normal,
5405
+ count: 0
5406
+ },
5407
+ {
5408
+ val: dm_gen_Modes.Bottom,
5409
+ count: 0
5410
+ },
5411
+ {
5412
+ val: dm_gen_Modes.Top,
5413
+ count: 0
5414
+ },
5415
+ {
5416
+ val: dm_gen_Modes.Reverse,
5417
+ count: 0
5418
+ },
5419
+ {
5420
+ val: dm_gen_Modes.Ext,
5421
+ count: 0
5422
+ }
5423
+ ],
5424
+ fontsize: [],
5425
+ color: [],
5426
+ senderID: [],
5427
+ content: [],
5428
+ weight: [],
5429
+ pool: [
5430
+ {
5431
+ val: dm_gen_Pools.Def,
5432
+ count: 0
5433
+ },
5434
+ {
5435
+ val: dm_gen_Pools.Sub,
5436
+ count: 0
5437
+ },
5438
+ {
5439
+ val: dm_gen_Pools.Adv,
5440
+ count: 0
5441
+ },
5442
+ {
5443
+ val: dm_gen_Pools.Ix,
5444
+ count: 0
5445
+ }
5446
+ ],
5447
+ platform: []
5448
+ };
5449
+ const stat = this.dans.reduce((s, d)=>{
5450
+ const SOID = s.SOID.find((i)=>i.val === d.SOID);
5451
+ if (SOID) SOID.count++;
5452
+ else s.SOID.push({
5453
+ val: d.SOID,
5454
+ count: 1
5455
+ });
5456
+ const mode = s.mode.find((i)=>i.val === d.mode);
5457
+ if (mode) mode.count++;
5458
+ else s.mode.push({
5459
+ val: d.mode,
5460
+ count: 1
5461
+ });
5462
+ const fontsize = s.fontsize.find((i)=>i.val === d.fontsize);
5463
+ if (fontsize) fontsize.count++;
5464
+ else s.fontsize.push({
5465
+ val: d.fontsize,
5466
+ count: 1
5467
+ });
5468
+ const color = s.color.find((i)=>i.val === d.color);
5469
+ if (color) color.count++;
5470
+ else s.color.push({
5471
+ val: d.color,
5472
+ count: 1
5473
+ });
5474
+ const senderID = s.senderID.find((i)=>i.val === d.senderID);
5475
+ if (senderID) senderID.count++;
5476
+ else s.senderID.push({
5477
+ val: d.senderID,
5478
+ count: 1
5479
+ });
5480
+ const content = s.content.find((i)=>i.val === d.content);
5481
+ if (content) content.count++;
5482
+ else s.content.push({
5483
+ val: d.content,
5484
+ count: 1
5485
+ });
5486
+ const weight = s.weight.find((i)=>i.val === d.weight);
5487
+ if (weight) weight.count++;
5488
+ else s.weight.push({
5489
+ val: d.weight,
5490
+ count: 1
5491
+ });
5492
+ const pool = s.pool.find((i)=>i.val === d.pool);
5493
+ if (pool) pool.count++;
5494
+ else s.pool.push({
5495
+ val: d.pool,
5496
+ count: 1
5497
+ });
5498
+ const platform = s.platform.find((i)=>i.val === d.platform);
5499
+ if (platform) platform.count++;
5500
+ else s.platform.push({
5501
+ val: d.platform,
5502
+ count: 1
5503
+ });
5504
+ return s;
5505
+ }, default_stat);
5506
+ return stat;
5507
+ }
5508
+ get most() {
5509
+ const s = this.stat;
5510
+ return {
5511
+ mode: s.mode.sort((a, b)=>b.count - a.count)[0].val,
5512
+ fontsize: s.fontsize.sort((a, b)=>b.count - a.count)[0].val,
5513
+ color: s.color.sort((a, b)=>b.count - a.count)[0].val,
5514
+ senderID: s.senderID.sort((a, b)=>b.count - a.count)[0].val,
5515
+ content: s.content.sort((a, b)=>b.count - a.count)[0].val,
5516
+ weight: s.weight.sort((a, b)=>b.count - a.count)[0].val,
5517
+ pool: s.pool.sort((a, b)=>b.count - a.count)[0].val,
5518
+ platform: s.platform.sort((a, b)=>b.count - a.count)[0].val
5519
+ };
5520
+ }
5521
+ static create() {
5522
+ return new UniPool([]);
5523
+ }
5524
+ assign(dans) {
5525
+ if (dans instanceof UniPool) return new UniPool([
5526
+ ...this.dans,
5527
+ ...dans.dans
5528
+ ]);
5529
+ if (dans instanceof UniDM) return new UniPool([
5530
+ ...this.dans,
5531
+ dans
5532
+ ]);
5533
+ if (Array.isArray(dans) && dans.every((d)=>d instanceof UniDM)) return new UniPool([
5534
+ ...this.dans,
5535
+ ...dans
5536
+ ]);
5537
+ return this;
5538
+ }
5539
+ split(key) {
5540
+ if (this.shared[key]) return [
5541
+ this
5542
+ ];
5543
+ const set = new Set(this.dans.map((d)=>d[key]));
5544
+ return [
5545
+ ...set
5546
+ ].map((v)=>new UniPool(this.dans.filter((d)=>d[key] === v), {
5547
+ dedupe: false
5548
+ }));
5549
+ }
5550
+ dedupe() {
5551
+ const map = new Map();
5552
+ this.dans.forEach((d)=>map.set(d.DMID || d.toDMID(), d));
5553
+ this.dans = [
5554
+ ...map.values()
5555
+ ];
5556
+ this.options.dedupe = false;
5557
+ }
5558
+ merge(lifetime = 0) {
5559
+ if (!this.shared.SOID) {
5560
+ console.error("\u672C\u529F\u80FD\u4EC5\u652F\u6301\u540C\u5F39\u5E55\u5E93\u5185\u4F7F\u7528\uFF0C\u53EF\u5148 .split('SOID') \u5728\u5206\u522B\u4F7F\u7528");
5561
+ return this;
5562
+ }
5563
+ if (lifetime <= 0) return this;
5564
+ const mergeContext = this.dans.reduce(([result, cache, mergeObj], danmaku)=>{
5565
+ const key = [
5566
+ 'SOID',
5567
+ 'content',
5568
+ 'mode',
5569
+ 'platform',
5570
+ 'pool'
5571
+ ].map((k)=>danmaku[k]).join('|');
5572
+ const cached = cache[key];
5573
+ const lastAppearTime = cached?.progress || 0;
5574
+ if (cached && danmaku.progress - lastAppearTime <= lifetime && danmaku.isSameAs(cached)) {
5575
+ const senders = mergeObj[key].senders;
5576
+ senders.push(danmaku.senderID);
5577
+ const extra = danmaku.extra;
5578
+ extra.danuni = extra.danuni || {};
5579
+ extra.danuni.merge = {
5580
+ count: senders.length,
5581
+ duration: danmaku.progress - cached.progress,
5582
+ senders,
5583
+ taolu_count: senders.length,
5584
+ taolu_senders: senders
5585
+ };
5586
+ danmaku.extraStr = JSON.stringify(extra);
5587
+ cache[key] = danmaku;
5588
+ mergeObj[key] = extra.danuni.merge;
5589
+ return [
5590
+ result,
5591
+ cache,
5592
+ mergeObj
5593
+ ];
5594
+ }
5595
+ {
5596
+ mergeObj[key] = {
5597
+ count: 1,
5598
+ duration: 0,
5599
+ senders: [
5600
+ danmaku.senderID
5601
+ ],
5602
+ taolu_count: 1,
5603
+ taolu_senders: [
5604
+ danmaku.senderID
5605
+ ]
5606
+ };
5607
+ cache[key] = danmaku;
5608
+ const extra = danmaku.extra;
5609
+ extra.danuni = extra.danuni || {};
5610
+ extra.danuni.merge = mergeObj[key];
5611
+ danmaku.extraStr = JSON.stringify(extra);
5612
+ result.push(danmaku);
5613
+ return [
5614
+ result,
5615
+ cache,
5616
+ mergeObj
5617
+ ];
5618
+ }
5619
+ }, [
5620
+ [],
5621
+ {},
5622
+ {}
5623
+ ]);
5624
+ const [result, _cache, mergeObj] = mergeContext;
5625
+ result.forEach((danmaku, i)=>{
5626
+ const key = [
5627
+ 'SOID',
5628
+ 'content',
5629
+ 'mode',
5630
+ 'platform',
5631
+ 'pool'
5632
+ ].map((k)=>danmaku[k]).join('|');
5633
+ const extra = result[i].extra, mergeData = mergeObj[key];
5634
+ result[i].extraStr = JSON.stringify({
5635
+ ...extra,
5636
+ danuni: {
5637
+ ...extra.danuni,
5638
+ merge: mergeData
5639
+ }
5640
+ });
5641
+ if (mergeData?.count) if (mergeData.count <= 1) {
5642
+ const updatedExtra = {
5643
+ ...extra
5644
+ };
5645
+ if (updatedExtra.danuni) {
5646
+ delete updatedExtra.danuni.merge;
5647
+ if (0 === Object.keys(updatedExtra.danuni).length) delete updatedExtra.danuni;
5648
+ }
5649
+ result[i].extraStr = Object.keys(updatedExtra).length > 0 ? JSON.stringify(updatedExtra) : void 0;
5650
+ } else {
5651
+ result[i].senderID = 'merge[bot]@dan-any';
5652
+ result[i].attr ? result[i].attr.push('Protect') : result[i].attr = [
5653
+ 'Protect'
5654
+ ];
5655
+ }
5656
+ });
5657
+ return new UniPool(result);
5658
+ }
5659
+ minify() {
5660
+ return this.dans.map((d)=>d.minify());
5661
+ }
5662
+ convert2(format, continue_on_error = false) {
5663
+ switch(format){
5664
+ case 'danuni.json':
5665
+ return this.dans;
5666
+ case 'danuni.bin':
5667
+ return this.toPb();
5668
+ case 'dplayer.json':
5669
+ return this.toDplayer();
5670
+ case 'artplayer.json':
5671
+ return this.toArtplayer();
5672
+ case 'ddplay.json':
5673
+ return this.toDDplay();
5674
+ case 'common.ass':
5675
+ return this.toASS();
5676
+ default:
5677
+ {
5678
+ const message = '(err) Unknown format or unsupported now!';
5679
+ if (continue_on_error) return message;
5680
+ throw new Error(message);
5681
+ }
5682
+ }
5683
+ }
5684
+ static fromPb(bin) {
5685
+ const data = fromBinary(DanmakuReplySchema, new Uint8Array(bin));
5686
+ return new UniPool(data.danmakus.map((d)=>new UniDM(d.SOID, d.progress, d.mode, d.fontsize, d.color, d.senderID, d.content, timestampDate(d.ctime || timestampNow()), d.weight, d.pool, d.attr, d.platform, d.extra, d.DMID)));
5687
+ }
5688
+ toPb() {
5689
+ return toBinary(DanmakuReplySchema, create(DanmakuReplySchema, {
5690
+ danmakus: this.dans.map((d)=>({
5691
+ SOID: d.SOID,
5692
+ DMID: d.DMID,
5693
+ progress: d.progress,
5694
+ mode: d.mode,
5695
+ fontsize: d.fontsize,
5696
+ color: d.color,
5697
+ senderID: d.senderID,
5698
+ content: d.content,
5699
+ ctime: timestampFromDate(d.ctime),
5700
+ weight: d.weight,
5701
+ pool: d.pool,
5702
+ attr: d.attr,
5703
+ platform: d.platform,
5704
+ extra: d.extraStr
5705
+ }))
5706
+ }));
5707
+ }
5708
+ static fromBiliXML(xml) {
5709
+ const parser = new XMLParser({
5710
+ ignoreAttributes: false
5711
+ }), oriData = parser.parse(xml), dans = oriData.i.d;
5712
+ return new UniPool(dans.map((d)=>{
5713
+ const p_str = d['@_p'], p_arr = p_str.split(',');
5714
+ return UniDM.fromBili({
5715
+ content: d['#text'],
5716
+ progress: Number.parseFloat(p_arr[0]),
5717
+ mode: Number.parseInt(p_arr[1]),
5718
+ fontsize: Number.parseInt(p_arr[2]),
5719
+ color: Number.parseInt(p_arr[3]),
5720
+ ctime: BigInt(p_arr[4]),
5721
+ pool: Number.parseInt(p_arr[5]),
5722
+ midHash: p_arr[6],
5723
+ id: BigInt(p_arr[7]),
5724
+ weight: Number.parseInt(p_arr[8])
5725
+ }, BigInt(oriData.i.chatid));
5726
+ }));
5727
+ }
5728
+ static fromBiliGrpc(bin) {
5729
+ const data = fromBinary(DmSegMobileReplySchema, new Uint8Array(bin)), json = data.elems;
5730
+ return new UniPool(json.map((d)=>UniDM.fromBili({
5731
+ ...d,
5732
+ progress: d.progress / 1000
5733
+ })));
5734
+ }
5735
+ static fromBiliCommandGrpc(bin) {
5736
+ const data = fromBinary(DmWebViewReplySchema, new Uint8Array(bin)), json = data.commandDms;
5737
+ return new UniPool(json.map((d)=>UniDM.fromBiliCommand(d)));
5738
+ }
5739
+ static fromDplayer(json, playerID, domain = 'other') {
5740
+ return new UniPool(json.data.map((d)=>UniDM.fromDplayer({
5741
+ content: d[4],
5742
+ progress: d[0],
5743
+ mode: d[1],
5744
+ color: d[2],
5745
+ midHash: d[3]
5746
+ }, playerID, domain)));
5747
+ }
5748
+ toDplayer() {
5749
+ return {
5750
+ code: 0,
5751
+ data: this.dans.map((dan)=>{
5752
+ const d = dan.toDplayer();
5753
+ return [
5754
+ d.progress,
5755
+ d.mode,
5756
+ d.color,
5757
+ d.midHash,
5758
+ d.content
5759
+ ];
5760
+ })
5761
+ };
5762
+ }
5763
+ static fromArtplayer(json, playerID, domain = 'other') {
5764
+ return new UniPool(json.map((d)=>UniDM.fromArtplayer({
5765
+ content: d.text,
5766
+ progress: d.time || 0,
5767
+ mode: d.mode || 0,
5768
+ color: Number((d.color || 'FFFFFF').replace('#', '0x')),
5769
+ style: d.style
5770
+ }, playerID, domain)));
5771
+ }
5772
+ toArtplayer() {
5773
+ return this.dans.map((dan)=>{
5774
+ const d = dan.toArtplayer();
5775
+ return {
5776
+ text: d.content,
5777
+ time: d.progress,
5778
+ mode: d.mode,
5779
+ color: `#${d.color.toString(16).toUpperCase() || 'FFFFFF'}`,
5780
+ border: d.border,
5781
+ style: d.style
5782
+ };
5783
+ });
5784
+ }
5785
+ static fromDDPlay(json, episodeId) {
5786
+ return new UniPool(json.comments.map((d)=>{
5787
+ const p_arr = d.p.split(',');
5788
+ return UniDM.fromDDplay({
5789
+ cid: d.cid,
5790
+ color: Number.parseInt(p_arr[2]),
5791
+ m: d.m,
5792
+ mode: Number.parseInt(p_arr[1]),
5793
+ progress: Number.parseFloat(p_arr[0]),
5794
+ uid: p_arr[3]
5795
+ }, episodeId);
5796
+ }));
5797
+ }
5798
+ toDDplay() {
5799
+ return {
5800
+ count: this.dans.length,
5801
+ comments: this.dans.map((dan)=>{
5802
+ const d = dan.toDDplay();
5803
+ return {
5804
+ cid: d.cid,
5805
+ p: `${d.progress},${d.mode},${d.color},${d.uid}`,
5806
+ m: d.m
5807
+ };
5808
+ })
5809
+ };
5810
+ }
5811
+ static fromASS(ass) {
5812
+ return parseAssRawField(ass);
5813
+ }
5814
+ toASS(options = {
5815
+ substyle: {}
5816
+ }) {
5817
+ const fn = this.shared.SOID;
5818
+ return generateASS(this, {
5819
+ filename: fn,
5820
+ title: fn,
5821
+ ...options
5822
+ });
5823
+ }
5824
+ }
5825
+ const color_pad = (s)=>s.length < 2 ? `0${s}` : s;
5826
+ const decimalToHex = (n)=>color_pad(n.toString(16));
5827
+ const isDarkColor = ({ r, g, b })=>0.299 * r + 0.587 * g + 0.114 * b < 0x30;
5828
+ const WHITE = {
5829
+ r: 255,
5830
+ g: 255,
5831
+ b: 255
5832
+ };
5833
+ const BLACK = {
5834
+ r: 0,
5835
+ g: 0,
5836
+ b: 0
5837
+ };
5838
+ const hexColorToRGB = (hex)=>{
5839
+ if (0 === hex.indexOf('#')) hex = hex.slice(1);
5840
+ const [r, g, b] = 3 === hex.length ? hex.split('').map((c)=>c + c) : hex.match(/../g) || [];
5841
+ return {
5842
+ r: Number.parseInt(r, 16),
5843
+ g: Number.parseInt(g, 16),
5844
+ b: Number.parseInt(b, 16)
5845
+ };
5846
+ };
5847
+ const formatColor = ({ r, g, b }, opacity)=>{
5848
+ const color = [
5849
+ b,
5850
+ g,
5851
+ r
5852
+ ];
5853
+ if (void 0 !== opacity) {
5854
+ const alpha = Math.round((1 - opacity) * 255);
5855
+ color.unshift(alpha);
5856
+ }
5857
+ return `&H${color.map(decimalToHex).join('').toUpperCase()}`;
5858
+ };
5859
+ const getDecoratingColor = (color)=>isDarkColor(color) ? WHITE : BLACK;
5860
+ const isWhite = (color)=>255 === color.r && 255 === color.g && 255 === color.b;
5861
+ const DanmakuType = {
5862
+ SCROLL: 1,
5863
+ BOTTOM: 2,
5864
+ TOP: 3
5865
+ };
5866
+ const FontSize = {
5867
+ SMALL: 0,
5868
+ NORMAL: 1,
5869
+ LARGE: 2
5870
+ };
5871
+ function decimalToRGB888(decimal) {
5872
+ const r = decimal >> 16 & 0xff;
5873
+ const g = decimal >> 8 & 0xff;
5874
+ const b = 0xff & decimal;
5875
+ return {
5876
+ r,
5877
+ g,
5878
+ b
5879
+ };
5880
+ }
5881
+ function UniPool2DanmakuLists(UP) {
5882
+ const dans = UP.dans;
5883
+ let type = DanmakuType.SCROLL;
5884
+ return dans.map((d)=>{
5885
+ if (d.mode === dm_gen_Modes.Bottom) type = DanmakuType.BOTTOM;
5886
+ else if (d.mode === dm_gen_Modes.Top) type = DanmakuType.TOP;
5887
+ return {
5888
+ time: d.progress,
5889
+ type,
5890
+ fontSizeType: d.fontsize,
5891
+ content: d.content,
5892
+ color: decimalToRGB888(d.color),
5893
+ extra: d
5894
+ };
5895
+ });
5896
+ }
5897
+ function DanmakuList2UniPool(d) {
5898
+ return new UniPool(d.map((d)=>UniDM.create(d.extra)));
5899
+ }
5900
+ const lang_assign = (source, ...targets)=>{
5901
+ for (const target of targets)for (const key of Object.keys(target))source[key] = target[key];
5902
+ return source;
5903
+ };
5904
+ const arrayOfLength = (length, defaultValue)=>{
5905
+ const array = new Array(length);
5906
+ for(let i = 0; i < length; i++)array[i] = defaultValue;
5907
+ return array;
5908
+ };
5909
+ const computeScrollInTime = (rectWidth, screenWidth, scrollTime)=>{
5910
+ const speed = (screenWidth + rectWidth) / scrollTime;
5911
+ return rectWidth / speed;
5912
+ };
5913
+ const computeScrollOverTime = (rectWidth, screenWidth, scrollTime)=>{
5914
+ const speed = (screenWidth + rectWidth) / scrollTime;
5915
+ return screenWidth / speed;
5916
+ };
5917
+ const splitGrids = ({ fontSize, padding, playResY, bottomSpace })=>{
5918
+ const defaultFontSize = fontSize[FontSize.NORMAL];
5919
+ const paddingTop = padding[0];
5920
+ const paddingBottom = padding[2];
5921
+ const linesCount = Math.floor((playResY - bottomSpace) / (defaultFontSize + paddingTop + paddingBottom));
5922
+ return {
5923
+ 1: arrayOfLength(linesCount, {
5924
+ start: 0,
5925
+ end: 0,
5926
+ width: 0
5927
+ }),
5928
+ 3: arrayOfLength(linesCount, 0),
5929
+ 2: arrayOfLength(linesCount, 0)
5930
+ };
5931
+ };
5932
+ const measureTextWidth = (()=>{
5933
+ const canvasContext = createCanvas(50, 50).getContext('2d');
5934
+ const supportTextMeasure = !!canvasContext.measureText("\u4E2D");
5935
+ if (supportTextMeasure) return (fontName, fontSize, bold, text)=>{
5936
+ canvasContext.font = `${bold ? 'bold' : 'normal'} ${fontSize}px ${fontName}`;
5937
+ const textWidth = canvasContext.measureText(text).width;
5938
+ return Math.round(textWidth);
5939
+ };
5940
+ console.warn('[Warn] node-canvas is installed without text measure support, layout may not be correct');
5941
+ return (_fontName, fontSize, _bold, text)=>text.length * fontSize;
5942
+ })();
5943
+ const resolveAvailableFixGrid = (grids, time)=>{
5944
+ for (const [i, grid] of grids.entries())if (grid <= time) return i;
5945
+ return -1;
5946
+ };
5947
+ const resolveAvailableScrollGrid = (grids, rectWidth, screenWidth, time, duration)=>{
5948
+ for (const [i, previous] of grids.entries()){
5949
+ const previousInTime = previous.start + computeScrollInTime(previous.width, screenWidth, duration);
5348
5950
  const currentOverTime = time + computeScrollOverTime(rectWidth, screenWidth, duration);
5349
5951
  if (time >= previousInTime && currentOverTime >= previous.end) return i;
5350
5952
  }
@@ -5421,7 +6023,7 @@ const formatTime = (seconds)=>{
5421
6023
  const minorSecond = Math.floor((seconds - integer) * 100);
5422
6024
  return `${hour}:${pad(minute)}:${pad(second)}.${minorSecond}`;
5423
6025
  };
5424
- const encode = (text)=>text.toString().replaceAll('{', '{').replaceAll('}', '}').replaceAll(/\r|\n/g, '');
6026
+ const encode = (text)=>text.toString().replaceAll('{', "\uFF5B").replaceAll('}', "\uFF5D").replaceAll(/\r|\n/g, '');
5425
6027
  const scrollCommand = ({ start, end, top })=>`\\move(${start},${top},${end},${top})`;
5426
6028
  const fixCommand = ({ top, left })=>`\\an8\\pos(${left},${top})`;
5427
6029
  const colorCommand = (color)=>`\\c${formatColor(color)}`;
@@ -5506,7 +6108,7 @@ const info = ({ playResX, playResY }, { filename, title })=>{
5506
6108
  const content = [
5507
6109
  '[Script Info]',
5508
6110
  `Title: ${title}`,
5509
- `Original Script: 根据 ${filename} 的弹幕信息,由 ${package_namespaceObject.e8} 生成`,
6111
+ `Original Script: \u{6839}\u{636E} ${filename} \u{7684}\u{5F39}\u{5E55}\u{4FE1}\u{606F}\u{FF0C}\u{7531} ${package_namespaceObject.e8} \u{751F}\u{6210}`,
5510
6112
  'ScriptType: v4.00+',
5511
6113
  'Collisions: Reverse',
5512
6114
  `PlayResX: ${playResX}`,
@@ -5527,16 +6129,16 @@ function fromUint16Array(array) {
5527
6129
  for (const element of array)result += String.fromCharCode(element);
5528
6130
  return result;
5529
6131
  }
5530
- const ass_raw = (list, config, context, compressType = 'brotli', baseType = 'base18384')=>{
5531
- const raw = {
6132
+ function raw_raw(list, config, context, compressType = 'brotli', baseType = 'base18384') {
6133
+ const raw1 = {
5532
6134
  list,
5533
6135
  config,
5534
6136
  context
5535
- }, rawText = JSON.stringify(raw);
6137
+ }, rawText = JSON.stringify(raw1);
5536
6138
  let compress = Buffer.from('');
5537
- compress = 'brotli' === compressType ? (0, __WEBPACK_EXTERNAL_MODULE_node_zlib_a5bb16fc__.brotliCompressSync)(rawText) : (0, __WEBPACK_EXTERNAL_MODULE_node_zlib_a5bb16fc__.gzipSync)(rawText);
5538
- return `;RawCompressType: ${compressType}\n;RawBaseType: ${baseType}\n;Raw: ${'base64' === baseType ? compress.toString('base64') : fromUint16Array(__WEBPACK_EXTERNAL_MODULE_base16384__.encode(compress))}`;
5539
- };
6139
+ compress = 'brotli' === compressType ? brotliCompressSync(rawText) : gzipSync(rawText);
6140
+ return `;RawCompressType: ${compressType}\n;RawBaseType: ${baseType}\n;Raw: ${'base64' === baseType ? compress.toString('base64') : fromUint16Array(external_base16384_encode(compress))}`;
6141
+ }
5540
6142
  function deRaw(ass) {
5541
6143
  const arr = ass.split('\n'), lineCompressType = arr.find((line)=>line.startsWith(';RawCompressType:')), lineBaseType = arr.find((line)=>line.startsWith(';RawBaseType:')), lineRaw = arr.find((line)=>line.startsWith(';Raw:'));
5542
6144
  if (!lineCompressType || !lineBaseType || !lineRaw) return;
@@ -5544,9 +6146,9 @@ function deRaw(ass) {
5544
6146
  let compressType = lineCompressType.replace(';RawCompressType: ', '').trim(), baseType = lineBaseType.replace(';RawBaseType: ', '').trim();
5545
6147
  if (!compressTypes.includes(compressType)) compressType = 'gzip';
5546
6148
  if (!baseTypes.includes(baseType)) baseType = 'base64';
5547
- const text = lineRaw.replace(';Raw: ', '').trim(), buffer = 'base64' === baseType ? Buffer.from(text, 'base64') : Buffer.from(__WEBPACK_EXTERNAL_MODULE_base16384__.decode(Buffer.from(text, 'utf-8').toString('utf-8')));
6149
+ const text = lineRaw.replace(';Raw: ', '').trim(), buffer = 'base64' === baseType ? Buffer.from(text, 'base64') : Buffer.from(decode(Buffer.from(text, 'utf-8').toString('utf-8')));
5548
6150
  let decompress = Buffer.from('');
5549
- decompress = 'brotli' === compressType ? (0, __WEBPACK_EXTERNAL_MODULE_node_zlib_a5bb16fc__.brotliDecompressSync)(buffer) : (0, __WEBPACK_EXTERNAL_MODULE_node_zlib_a5bb16fc__.gzipSync)(buffer);
6151
+ decompress = 'brotli' === compressType ? brotliDecompressSync(buffer) : gunzipSync(buffer);
5550
6152
  try {
5551
6153
  return JSON.parse(decompress.toString('utf-8'));
5552
6154
  } catch {
@@ -5598,14 +6200,14 @@ const style = ({ fontName, fontSize, color: configColor, outlineColor, backColor
5598
6200
  const ass_create = (list, rawList, config, context = {
5599
6201
  filename: 'unknown',
5600
6202
  title: 'unknown'
5601
- })=>{
6203
+ }, rawConfig)=>{
5602
6204
  const Elist = UniPool2DanmakuLists(list), ErawList = UniPool2DanmakuLists(rawList);
5603
6205
  const content = [
5604
6206
  info(config, context),
5605
6207
  style(config),
5606
6208
  ass_event(Elist, config)
5607
6209
  ];
5608
- if (config.includeRaw) content.push(ass_raw(ErawList, config, context));
6210
+ if (config.includeRaw) content.push(raw_raw(ErawList, config, context, rawConfig?.compressType, rawConfig?.baseType));
5609
6211
  return `${content.join('\n\n')}\n`;
5610
6212
  };
5611
6213
  const ass_gen_config = (overrides = {})=>{
@@ -5650,7 +6252,7 @@ function generateASS(danmaku, options) {
5650
6252
  const content = ass_create(layoutList, danmaku, config, {
5651
6253
  filename: options?.filename || 'unknown',
5652
6254
  title: options?.title || 'unknown'
5653
- });
6255
+ }, options.raw);
5654
6256
  return content;
5655
6257
  }
5656
6258
  function parseAssRawField(ass) {
@@ -5658,42 +6260,167 @@ function parseAssRawField(ass) {
5658
6260
  if (!raw) return UniPool.create();
5659
6261
  return DanmakuList2UniPool(raw.list);
5660
6262
  }
5661
- const file_bili_dm = /*@__PURE__*/ fileDesc("Cg1iaWxpL2RtLnByb3RvEiBiaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MSJkCgZBdmF0YXISCgoCaWQYASABKAkSCwoDdXJsGAIgASgJEkEKC2F2YXRhcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyVHlwZSIjCgZCdWJibGUSDAoEdGV4dBgBIAEoCRILCgN1cmwYAiABKAkixgEKCEJ1YmJsZVYyEgwKBHRleHQYASABKAkSCwoDdXJsGAIgASgJEkEKC2J1YmJsZV90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnViYmxlVHlwZRIVCg1leHBvc3VyZV9vbmNlGAQgASgIEkUKDWV4cG9zdXJlX3R5cGUYBSABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGUiWwoGQnV0dG9uEgwKBHRleHQYASABKAkSQwoGYWN0aW9uGAIgASgOMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGUiWAoOQnV6endvcmRDb25maWcSRgoIa2V5d29yZHMYASADKAsyNC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdXp6d29yZFNob3dDb25maWcieAoSQnV6endvcmRTaG93Q29uZmlnEgwKBG5hbWUYASABKAkSDgoGc2NoZW1hGAIgASgJEg4KBnNvdXJjZRgDIAEoBRIKCgJpZBgEIAEoAxITCgtidXp6d29yZF9pZBgFIAEoAxITCgtzY2hlbWFfdHlwZRgGIAEoBSJ7CghDaGVja0JveBIMCgR0ZXh0GAEgASgJEjwKBHR5cGUYAiABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja2JveFR5cGUSFQoNZGVmYXVsdF92YWx1ZRgDIAEoCBIMCgRzaG93GAQgASgIIm8KCkNoZWNrQm94VjISDAoEdGV4dBgBIAEoCRI8CgR0eXBlGAIgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2hlY2tib3hUeXBlEhUKDWRlZmF1bHRfdmFsdWUYAyABKAgiggIKC0NsaWNrQnV0dG9uEhUKDXBvcnRyYWl0X3RleHQYASADKAkSFgoObGFuZHNjYXBlX3RleHQYAiADKAkSGwoTcG9ydHJhaXRfdGV4dF9mb2N1cxgDIAMoCRIcChRsYW5kc2NhcGVfdGV4dF9mb2N1cxgEIAMoCRJBCgtyZW5kZXJfdHlwZRgFIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlbmRlclR5cGUSDAoEc2hvdxgGIAEoCBI4CgZidWJibGUYByABKAsyKC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdWJibGUiswIKDUNsaWNrQnV0dG9uVjISFQoNcG9ydHJhaXRfdGV4dBgBIAMoCRIWCg5sYW5kc2NhcGVfdGV4dBgCIAMoCRIbChNwb3J0cmFpdF90ZXh0X2ZvY3VzGAMgAygJEhwKFGxhbmRzY2FwZV90ZXh0X2ZvY3VzGAQgAygJEkEKC3JlbmRlcl90eXBlGAUgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIXCg90ZXh0X2lucHV0X3Bvc3QYBiABKAgSFQoNZXhwb3N1cmVfb25jZRgHIAEoCBJFCg1leHBvc3VyZV90eXBlGAggASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb3N1cmVUeXBlIksKB0NvbW1hbmQSQAoLY29tbWFuZF9kbXMYASADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Db21tYW5kRG0i5gEKCUNvbW1hbmREbRIKCgJpZBgBIAEoAxILCgNvaWQYAiABKAMSCwoDbWlkGAMgASgDEg8KB2NvbW1hbmQYBCABKAkSDwoHY29udGVudBgFIAEoCRIQCghwcm9ncmVzcxgGIAEoBRINCgVjdGltZRgHIAEoCRINCgVtdGltZRgIIAEoCRINCgVleHRyYRgJIAEoCRINCgVpZFN0chgKIAEoCRIMCgR0eXBlGAsgASgFEhMKC2F1dG9fY3JlYXRlGAwgASgIEhIKCmNvdW50X2Rvd24YDSABKAUSDAoEYXR0chgOIAEoBSJQCg1EYW5tYWt1QUlGbGFnEj8KCGRtX2ZsYWdzGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUZsYWciiwMKC0Rhbm1ha3VFbGVtEgoKAmlkGAEgASgDEhAKCHByb2dyZXNzGAIgASgFEgwKBG1vZGUYAyABKAUSEAoIZm9udHNpemUYBCABKAUSPwoFY29sb3IYBSABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRIQCghtaWRfaGFzaBgGIAEoCRIPCgdjb250ZW50GAcgASgJEg0KBWN0aW1lGAggASgDEg4KBndlaWdodBgJIAEoBRIOCgZhY3Rpb24YCiABKAkSDAoEcG9vbBgLIAEoBRIOCgZpZF9zdHIYDCABKAkSDAoEYXR0chgNIAEoBRIRCglhbmltYXRpb24YFiABKAkSDQoFZXh0cmEYFyABKAkSQgoIY29sb3JmdWwYGCABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRIMCgR0eXBlGBkgASgFEgsKA29pZBgaIAEoAyIpCgtEYW5tYWt1RmxhZxIMCgRkbWlkGAEgASgDEgwKBGZsYWcYAiABKAUiSwoRRGFubWFrdUZsYWdDb25maWcSEAoIcmVjX2ZsYWcYASABKAUSEAoIcmVjX3RleHQYAiABKAkSEgoKcmVjX3N3aXRjaBgDIAEoBSKLBwoYRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnEikKIXBsYXllcl9kYW5tYWt1X3VzZV9kZWZhdWx0X2NvbmZpZxgBIAEoCBIsCiRwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9zd2l0Y2gYBCABKAgSKwojcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWwYBSABKAUSHwoXcGxheWVyX2Rhbm1ha3VfYmxvY2t0b3AYBiABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tzY3JvbGwYByABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tib3R0b20YCCABKAgSJAoccGxheWVyX2Rhbm1ha3VfYmxvY2tjb2xvcmZ1bBgJIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9ibG9ja3JlcGVhdBgKIAEoCBIjChtwbGF5ZXJfZGFubWFrdV9ibG9ja3NwZWNpYWwYCyABKAgSHgoWcGxheWVyX2Rhbm1ha3Vfb3BhY2l0eRgMIAEoAhIkChxwbGF5ZXJfZGFubWFrdV9zY2FsaW5nZmFjdG9yGA0gASgCEh0KFXBsYXllcl9kYW5tYWt1X2RvbWFpbhgOIAEoAhIcChRwbGF5ZXJfZGFubWFrdV9zcGVlZBgPIAEoBRIkChxpbmxpbmVfcGxheWVyX2Rhbm1ha3Vfc3dpdGNoGBAgASgIEikKIXBsYXllcl9kYW5tYWt1X3Nlbmlvcl9tb2RlX3N3aXRjaBgRIAEoBRIuCiZwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92MhgSIAEoBRKYAQoqcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWxfdjJfbWFwGBMgAygLMmQuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnLlBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EiUKHXBsYXllcl9kYW5tYWt1X2VuYWJsZV9oZXJkX2RtGBQgASgIGksKKVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEi7AkKEURhbm11UGxheWVyQ29uZmlnEh0KFXBsYXllcl9kYW5tYWt1X3N3aXRjaBgBIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9zd2l0Y2hfc2F2ZRgCIAEoCBIpCiFwbGF5ZXJfZGFubWFrdV91c2VfZGVmYXVsdF9jb25maWcYAyABKAgSLAokcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfc3dpdGNoGAQgASgIEisKI3BsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsGAUgASgFEh8KF3BsYXllcl9kYW5tYWt1X2Jsb2NrdG9wGAYgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2Nrc2Nyb2xsGAcgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2NrYm90dG9tGAggASgIEiQKHHBsYXllcl9kYW5tYWt1X2Jsb2NrY29sb3JmdWwYCSABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tyZXBlYXQYCiABKAgSIwobcGxheWVyX2Rhbm1ha3VfYmxvY2tzcGVjaWFsGAsgASgIEh4KFnBsYXllcl9kYW5tYWt1X29wYWNpdHkYDCABKAISJAoccGxheWVyX2Rhbm1ha3Vfc2NhbGluZ2ZhY3RvchgNIAEoAhIdChVwbGF5ZXJfZGFubWFrdV9kb21haW4YDiABKAISHAoUcGxheWVyX2Rhbm1ha3Vfc3BlZWQYDyABKAUSJgoecGxheWVyX2Rhbm1ha3VfZW5hYmxlYmxvY2tsaXN0GBAgASgIEiQKHGlubGluZV9wbGF5ZXJfZGFubWFrdV9zd2l0Y2gYESABKAgSJAocaW5saW5lX3BsYXllcl9kYW5tYWt1X2NvbmZpZxgSIAEoBRImCh5wbGF5ZXJfZGFubWFrdV9pb3Nfc3dpdGNoX3NhdmUYEyABKAUSKQohcGxheWVyX2Rhbm1ha3Vfc2VuaW9yX21vZGVfc3dpdGNoGBQgASgFEi4KJnBsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsX3YyGBUgASgFEpEBCipwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92Ml9tYXAYFiADKAsyXS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckNvbmZpZy5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRIlCh1wbGF5ZXJfZGFubWFrdV9lbmFibGVfaGVyZF9kbRgXIAEoCBImCh5wbGF5ZXJfZGFubWFrdV9ibG9ja3RvcF9ib3R0b20YGCABKAgSIAoYcGxheWVyX2Rhbm1ha3VfZG9tYWluX3YyGBkgASgFEh4KFnBsYXllcl9kYW5tYWt1X2RlbnNpdHkYGiABKAUSJQodcGxheWVyX2Rhbm1ha3Vfc3VidGl0bGVfcHJvb2YYGyABKAgSIwobcGxheWVyX2Rhbm1ha3VfcGVvcGxlX3Byb29mGBwgASgIGksKKVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEiMAoWRGFubXVQbGF5ZXJDb25maWdQYW5lbBIWCg5zZWxlY3Rpb25fdGV4dBgBIAEoCSJLChhEYW5tdVBsYXllckR5bmFtaWNDb25maWcSEAoIcHJvZ3Jlc3MYASABKAUSHQoVcGxheWVyX2Rhbm1ha3VfZG9tYWluGA4gASgCIpADChVEYW5tdVBsYXllclZpZXdDb25maWcSYQodZGFubXVrdV9kZWZhdWx0X3BsYXllcl9jb25maWcYASABKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdURlZmF1bHRQbGF5ZXJDb25maWcSUgoVZGFubXVrdV9wbGF5ZXJfY29uZmlnGAIgASgLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWcSYQodZGFubXVrdV9wbGF5ZXJfZHluYW1pY19jb25maWcYAyADKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckR5bmFtaWNDb25maWcSXQobZGFubXVrdV9wbGF5ZXJfY29uZmlnX3BhbmVsGAQgASgLMjguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWdQYW5lbCKZBQoURGFubXVXZWJQbGF5ZXJDb25maWcSEQoJZG1fc3dpdGNoGAEgASgIEhEKCWFpX3N3aXRjaBgCIAEoCBIQCghhaV9sZXZlbBgDIAEoBRIQCghibG9ja3RvcBgEIAEoCBITCgtibG9ja3Njcm9sbBgFIAEoCBITCgtibG9ja2JvdHRvbRgGIAEoCBISCgpibG9ja2NvbG9yGAcgASgIEhQKDGJsb2Nrc3BlY2lhbBgIIAEoCBIUCgxwcmV2ZW50c2hhZGUYCSABKAgSDQoFZG1hc2sYCiABKAgSDwoHb3BhY2l0eRgLIAEoAhIOCgZkbWFyZWEYDCABKAUSEQoJc3BlZWRwbHVzGA0gASgCEhAKCGZvbnRzaXplGA4gASgCEhIKCnNjcmVlbnN5bmMYDyABKAgSEQoJc3BlZWRzeW5jGBAgASgIEhIKCmZvbnRmYW1pbHkYESABKAkSDAoEYm9sZBgSIAEoCBISCgpmb250Ym9yZGVyGBMgASgFEhEKCWRyYXdfdHlwZRgUIAEoCRIaChJzZW5pb3JfbW9kZV9zd2l0Y2gYFSABKAUSEwoLYWlfbGV2ZWxfdjIYFiABKAUSYQoPYWlfbGV2ZWxfdjJfbWFwGBcgAygLMkguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVXZWJQbGF5ZXJDb25maWcuQWlMZXZlbFYyTWFwRW50cnkSFwoPYmxvY2t0b3BfYm90dG9tGBggASgIEhIKCmRtX2FyZWFfdjIYGSABKAUSEgoKZG1fZGVuc2l0eRgaIAEoBRozChFBaUxldmVsVjJNYXBFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBIlkKCkRtQ29sb3JmdWwSPgoEdHlwZRgBIAEoDjIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29sb3JmdWxUeXBlEgsKA3NyYxgCIAEoCSJQCg9EbUV4cG9SZXBvcnRSZXESEgoKc2Vzc2lvbl9pZBgBIAEoCRILCgNvaWQYAiABKAMSDQoFZG1pZHMYAyABKAwSDQoFc3BtaWQYBCABKAkiEQoPRG1FeHBvUmVwb3J0UmVzIm0KCkRtSGVyZFZpZXcSGwoTZGlzcGxheV9oZXJkX2RtX251bRgBIAEoBRJCCghoZXJkX2RtcxgCIAMoCzIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlZpZXdIZXJkRG1FbGVtIpYCCgpEbU1hc2tXYWxsEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAxIPCgdjb250ZW50GAMgASgJEk0KDGNvbnRlbnRfdHlwZRgEIAEoDjI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZRJFCghiaXpfdHlwZRgFIAEoDjIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxCaXpUeXBlEkUKCGNvbnRlbnRzGAYgAygLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1NYXNrV2FsbENvbnRlbnQiawoRRG1NYXNrV2FsbENvbnRlbnQSRQoEdHlwZRgBIAEoDjI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZRIPCgdjb250ZW50GAIgASgJIs0QChFEbVBsYXllckNvbmZpZ1JlcRIKCgJ0cxgBIAEoAxJFCgZzd2l0Y2gYAiABKAsyNS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U3dpdGNoEk4KC3N3aXRjaF9zYXZlGAMgASgLMjkuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVN3aXRjaFNhdmUSWwoSdXNlX2RlZmF1bHRfY29uZmlnGAQgASgLMj8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVVzZURlZmF1bHRDb25maWcSYQoVYWlfcmVjb21tZW5kZWRfc3dpdGNoGAUgASgLMkIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRTd2l0Y2gSXwoUYWlfcmVjb21tZW5kZWRfbGV2ZWwYBiABKAsyQS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEkkKCGJsb2NrdG9wGAcgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrdG9wEk8KC2Jsb2Nrc2Nyb2xsGAggASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2Nrc2Nyb2xsEk8KC2Jsb2NrYm90dG9tGAkgASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrYm90dG9tElMKDWJsb2NrY29sb3JmdWwYCiABKAsyPC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tjb2xvcmZ1bBJPCgtibG9ja3JlcGVhdBgLIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja3JlcGVhdBJRCgxibG9ja3NwZWNpYWwYDCABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEkcKB29wYWNpdHkYDSABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1T3BhY2l0eRJTCg1zY2FsaW5nZmFjdG9yGA4gASgLMjwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVNjYWxpbmdmYWN0b3ISRQoGZG9tYWluGA8gASgLMjUuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURvbWFpbhJDCgVzcGVlZBgQIAEoCzI0LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTcGVlZBJXCg9lbmFibGVibG9ja2xpc3QYESABKAsyPi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0El4KGWlubGluZVBsYXllckRhbm1ha3VTd2l0Y2gYEiABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5JbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoElsKEnNlbmlvcl9tb2RlX3N3aXRjaBgTIAEoCzI/LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTZW5pb3JNb2RlU3dpdGNoEmQKF2FpX3JlY29tbWVuZGVkX2xldmVsX3YyGBQgASgLMkMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbFYyElMKDmVuYWJsZV9oZXJkX2RtGBUgASgLMjsuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUVuYWJsZUhlcmREbRJWCg9ibG9ja3RvcF9ib3R0b20YFiABKAsyPS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SSgoJZG9tYWluX3YyGBcgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURvbWFpblYyEkcKB2RlbnNpdHkYGCABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RGVuc2l0eRJUCg5zdWJ0aXRsZV9wcm9vZhgZIAEoCzI8LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTdWJ0aXRsZVByb29mElAKDHBlb3BsZV9wcm9vZhgaIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VQZW9wbGVQcm9vZiIvCgtEbVNlZ0NvbmZpZxIRCglwYWdlX3NpemUYASABKAMSDQoFdG90YWwYAiABKAMikQIKEERtU2VnTW9iaWxlUmVwbHkSPAoFZWxlbXMYASADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbRINCgVzdGF0ZRgCIAEoBRJACgdhaV9mbGFnGAMgASgLMi8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUFJRmxhZxIVCg1zZWdtZW50X3J1bGVzGAQgAygDEkIKDGNvbG9yZnVsX3NyYxgFIAMoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29sb3JmdWwSEwoLY29udGV4dF9zcmMYBiABKAkiygEKDkRtU2VnTW9iaWxlUmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRIVCg1zZWdtZW50X2luZGV4GAQgASgDEhYKDnRlZW5hZ2Vyc19tb2RlGAUgASgFEgoKAnBzGAYgASgDEgoKAnBlGAcgASgDEhEKCXB1bGxfbW9kZRgIIAEoBRISCgpmcm9tX3NjZW5lGAkgASgFEg0KBXNwbWlkGAogASgJEhMKC2NvbnRleHRfZXh0GAsgASgJIlwKDURtU2VnT3R0UmVwbHkSPAoFZWxlbXMYASADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbRINCgVzdGF0ZRgCIAEoBSJMCgtEbVNlZ090dFJlcRILCgNwaWQYASABKAMSCwoDb2lkGAIgASgDEgwKBHR5cGUYAyABKAUSFQoNc2VnbWVudF9pbmRleBgEIAEoAyJdCg1EbVNlZ1NES1JlcGx5Eg4KBmNsb3NlZBgBIAEoCBI8CgVlbGVtcxgCIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VFbGVtIkwKC0RtU2VnU0RLUmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRIVCg1zZWdtZW50X2luZGV4GAQgASgDIncKCURtU3ViVmlldxIMCgR0eXBlGAEgASgFEgsKA29pZBgCIAEoAxILCgNwaWQYAyABKAMSQgoLcG9zdF9wYW5lbDIYBCADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxWMiKhCQoLRG1WaWV3UmVwbHkSDgoGY2xvc2VkGAEgASgIEjkKBG1hc2sYAiABKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWRlb01hc2sSQQoIc3VidGl0bGUYAyABKAsyLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWRlb1N1YnRpdGxlEhMKC3NwZWNpYWxfZG1zGAQgAygJEkQKB2FpX2ZsYWcYBSABKAsyMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RmxhZ0NvbmZpZxJOCg1wbGF5ZXJfY29uZmlnGAYgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJWaWV3Q29uZmlnEhYKDnNlbmRfYm94X3N0eWxlGAcgASgFEg0KBWFsbG93GAggASgIEhEKCWNoZWNrX2JveBgJIAEoCBIaChJjaGVja19ib3hfc2hvd19tc2cYCiABKAkSGAoQdGV4dF9wbGFjZWhvbGRlchgLIAEoCRIZChFpbnB1dF9wbGFjZWhvbGRlchgMIAEoCRIdChVyZXBvcnRfZmlsdGVyX2NvbnRlbnQYDSADKAkSQQoLZXhwb19yZXBvcnQYDiABKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvUmVwb3J0EkkKD2J1enp3b3JkX2NvbmZpZxgPIAEoCzIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1enp3b3JkQ29uZmlnEkIKC2V4cHJlc3Npb25zGBAgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnMSPwoKcG9zdF9wYW5lbBgRIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbBIVCg1hY3Rpdml0eV9tZXRhGBIgAygJEkIKC3Bvc3RfcGFuZWwyGBMgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjISQgoMZG1fbWFza193YWxsGBQgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1NYXNrV2FsbBI9CgdkbV9oZXJkGBUgASgLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1IZXJkVmlldxI6Cgdjb21tYW5kGBYgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ29tbWFuZBIKCgJrdhgXIAEoCRI+CglzdWJfdmlld3MYGCADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVN1YlZpZXcSNgoDcW9lGBkgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUW9lSW5mbyJtCglEbVZpZXdSZXESCwoDcGlkGAEgASgDEgsKA29pZBgCIAEoAxIMCgR0eXBlGAMgASgFEg0KBXNwbWlkGAQgASgJEhQKDGlzX2hhcmRfYm9vdBgFIAEoBRITCgtjb250ZXh0X2V4dBgGIAEoCSKBBgoORG1XZWJWaWV3UmVwbHkSDQoFc3RhdGUYASABKAUSDAoEdGV4dBgCIAEoCRIRCgl0ZXh0X3NpZGUYAyABKAkSPQoGZG1fc2dlGAQgASgLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdDb25maWcSQQoEZmxhZxgFIAEoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VGbGFnQ29uZmlnEhMKC3NwZWNpYWxfZG1zGAYgAygJEhEKCWNoZWNrX2JveBgHIAEoCBINCgVjb3VudBgIIAEoAxJACgtjb21tYW5kX2RtcxgJIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNvbW1hbmREbRJNCg1wbGF5ZXJfY29uZmlnGAogASgLMjYuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVXZWJQbGF5ZXJDb25maWcSHQoVcmVwb3J0X2ZpbHRlcl9jb250ZW50GAsgAygJEkIKC2V4cHJlc3Npb25zGAwgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnMSPwoKcG9zdF9wYW5lbBgNIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbBIVCg1hY3Rpdml0eV9tZXRhGA4gAygJEkIKC3Bvc3RfcGFuZWwyGA8gAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjISPgoJc3ViX3ZpZXdzGBAgAygLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TdWJWaWV3EjYKA3FvZRgRIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlFvZUluZm8iKgoKRXhwb1JlcG9ydBIcChRzaG91bGRfcmVwb3J0X2F0X2VuZBgBIAEoCCJkCgpFeHByZXNzaW9uEg8KB2tleXdvcmQYASADKAkSCwoDdXJsGAIgASgJEjgKBnBlcmlvZBgDIAMoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBlcmlvZCJJCgtFeHByZXNzaW9ucxI6CgRkYXRhGAEgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbiIqChlJbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoEg0KBXZhbHVlGAEgASgIIicKBUxhYmVsEg0KBXRpdGxlGAEgASgJEg8KB2NvbnRlbnQYAiADKAkihwEKB0xhYmVsVjISDQoFdGl0bGUYASABKAkSDwoHY29udGVudBgCIAMoCRIVCg1leHBvc3VyZV9vbmNlGAMgASgIEkUKDWV4cG9zdXJlX3R5cGUYBCABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGUiJAoGUGVyaW9kEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAyIwCh9QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEg0KBXZhbHVlGAEgASgFIjIKIVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMhINCgV2YWx1ZRgBIAEoBSIxCiBQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZFN3aXRjaBINCgV2YWx1ZRgBIAEoCCIpChhQbGF5ZXJEYW5tYWt1QmxvY2tib3R0b20SDQoFdmFsdWUYASABKAgiKwoaUGxheWVyRGFubWFrdUJsb2NrY29sb3JmdWwSDQoFdmFsdWUYASABKAgiKQoYUGxheWVyRGFubWFrdUJsb2NrcmVwZWF0Eg0KBXZhbHVlGAEgASgIIikKGFBsYXllckRhbm1ha3VCbG9ja3Njcm9sbBINCgV2YWx1ZRgBIAEoCCIqChlQbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEg0KBXZhbHVlGAEgASgIIiYKFVBsYXllckRhbm1ha3VCbG9ja3RvcBINCgV2YWx1ZRgBIAEoCCIsChtQbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SDQoFdmFsdWUYASABKAgiJQoUUGxheWVyRGFubWFrdURlbnNpdHkSDQoFdmFsdWUYASABKAUiJAoTUGxheWVyRGFubWFrdURvbWFpbhINCgV2YWx1ZRgBIAEoAiImChVQbGF5ZXJEYW5tYWt1RG9tYWluVjISDQoFdmFsdWUYASABKAUiKgoZUGxheWVyRGFubWFrdUVuYWJsZUhlcmREbRINCgV2YWx1ZRgBIAEoCCItChxQbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0Eg0KBXZhbHVlGAEgASgIIiUKFFBsYXllckRhbm1ha3VPcGFjaXR5Eg0KBXZhbHVlGAEgASgCIikKGFBsYXllckRhbm1ha3VQZW9wbGVQcm9vZhINCgV2YWx1ZRgBIAEoCCIrChpQbGF5ZXJEYW5tYWt1U2NhbGluZ2ZhY3RvchINCgV2YWx1ZRgBIAEoAiIuCh1QbGF5ZXJEYW5tYWt1U2VuaW9yTW9kZVN3aXRjaBINCgV2YWx1ZRgBIAEoBSIjChJQbGF5ZXJEYW5tYWt1U3BlZWQSDQoFdmFsdWUYASABKAUiKwoaUGxheWVyRGFubWFrdVN1YnRpdGxlUHJvb2YSDQoFdmFsdWUYASABKAgiOAoTUGxheWVyRGFubWFrdVN3aXRjaBINCgV2YWx1ZRgBIAEoCBISCgpjYW5faWdub3JlGAIgASgIIigKF1BsYXllckRhbm1ha3VTd2l0Y2hTYXZlEg0KBXZhbHVlGAEgASgIIi4KHVBsYXllckRhbm1ha3VVc2VEZWZhdWx0Q29uZmlnEg0KBXZhbHVlGAEgASgIIowDCglQb3N0UGFuZWwSDQoFc3RhcnQYASABKAMSCwoDZW5kGAIgASgDEhAKCHByaW9yaXR5GAMgASgDEg4KBmJpel9pZBgEIAEoAxJECghiaXpfdHlwZRgFIAEoDjIyLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbEJpelR5cGUSQwoMY2xpY2tfYnV0dG9uGAYgASgLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2xpY2tCdXR0b24SPwoKdGV4dF9pbnB1dBgHIAEoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dBI9CgljaGVja19ib3gYCCABKAsyKi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja0JveBI2CgV0b2FzdBgJIAEoCzInLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0Iq0ECgtQb3N0UGFuZWxWMhINCgVzdGFydBgBIAEoAxILCgNlbmQYAiABKAMSRAoIYml6X3R5cGUYAyABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxCaXpUeXBlEkUKDGNsaWNrX2J1dHRvbhgEIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNsaWNrQnV0dG9uVjISQQoKdGV4dF9pbnB1dBgFIAEoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dFYyEj8KCWNoZWNrX2JveBgGIAEoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNoZWNrQm94VjISOAoFdG9hc3QYByABKAsyKS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Ub2FzdFYyEjoKBmJ1YmJsZRgIIAEoCzIqLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1YmJsZVYyEjgKBWxhYmVsGAkgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuTGFiZWxWMhJBCgtwb3N0X3N0YXR1cxgKIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RTdGF0dXMiFwoHUW9lSW5mbxIMCgRpbmZvGAEgASgJIikKCFJlc3BvbnNlEgwKBGNvZGUYASABKAUSDwoHbWVzc2FnZRgCIAEoCSL5AgoMU3VidGl0bGVJdGVtEgoKAmlkGAEgASgDEg4KBmlkX3N0chgCIAEoCRILCgNsYW4YAyABKAkSDwoHbGFuX2RvYxgEIAEoCRIUCgxzdWJ0aXRsZV91cmwYBSABKAkSOgoGYXV0aG9yGAYgASgLMiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVXNlckluZm8SPAoEdHlwZRgHIAEoDjIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlVHlwZRIVCg1sYW5fZG9jX2JyaWVmGAggASgJEkEKB2FpX3R5cGUYCSABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpVHlwZRJFCglhaV9zdGF0dXMYCiABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpU3RhdHVzIugCCglUZXh0SW5wdXQSHAoUcG9ydHJhaXRfcGxhY2Vob2xkZXIYASADKAkSHQoVbGFuZHNjYXBlX3BsYWNlaG9sZGVyGAIgAygJEkEKC3JlbmRlcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIYChBwbGFjZWhvbGRlcl9wb3N0GAQgASgIEgwKBHNob3cYBSABKAgSOAoGYXZhdGFyGAYgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyEkEKC3Bvc3Rfc3RhdHVzGAcgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFN0YXR1cxI2CgVsYWJlbBgIIAEoCzInLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkxhYmVsIvsBCgtUZXh0SW5wdXRWMhIcChRwb3J0cmFpdF9wbGFjZWhvbGRlchgBIAMoCRIdChVsYW5kc2NhcGVfcGxhY2Vob2xkZXIYAiADKAkSQQoLcmVuZGVyX3R5cGUYAyABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5SZW5kZXJUeXBlEhgKEHBsYWNlaG9sZGVyX3Bvc3QYBCABKAgSOAoGYXZhdGFyGAUgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyEhgKEHRleHRfaW5wdXRfbGltaXQYBiABKAUibwoFVG9hc3QSDAoEdGV4dBgBIAEoCRIQCghkdXJhdGlvbhgCIAEoBRIMCgRzaG93GAMgASgIEjgKBmJ1dHRvbhgEIAEoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1dHRvbiJiCg1Ub2FzdEJ1dHRvblYyEgwKBHRleHQYASABKAkSQwoGYWN0aW9uGAIgASgOMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGUicwoHVG9hc3RWMhIMCgR0ZXh0GAEgASgJEhAKCGR1cmF0aW9uGAIgASgFEkgKD3RvYXN0X2J1dHRvbl92MhgDIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0QnV0dG9uVjIiXAoIVXNlckluZm8SCwoDbWlkGAEgASgDEgwKBG5hbWUYAiABKAkSCwoDc2V4GAMgASgJEgwKBGZhY2UYBCABKAkSDAoEc2lnbhgFIAEoCRIMCgRyYW5rGAYgASgFIlMKCVZpZGVvTWFzaxILCgNjaWQYASABKAMSDAoEcGxhdBgCIAEoBRILCgNmcHMYAyABKAUSDAoEdGltZRgEIAEoAxIQCghtYXNrX3VybBgFIAEoCSJwCg1WaWRlb1N1YnRpdGxlEgsKA2xhbhgBIAEoCRIPCgdsYW5fZG9jGAIgASgJEkEKCXN1YnRpdGxlcxgDIAMoCzIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlSXRlbSKSAQoOVmlld0hlcmREbUVsZW0SEAoIaGVyZF9tc2cYASABKAkSFgoOaGVyZF9zdGFydF9jbnQYAiABKAUSFAoMaGVyZF9lbmRfY250GAMgASgFEhIKCnJlZ2V4X3J1bGUYBCABKAkSFgoOc3RhcnRfcHJvZ3Jlc3MYBSABKAUSFAoMZW5kX3Byb2dyZXNzGAYgASgFKjMKCkF2YXRhclR5cGUSEgoOQXZhdGFyVHlwZU5vbmUQABIRCg1BdmF0YXJUeXBlTkZUEAEqWQoKQnViYmxlVHlwZRISCg5CdWJibGVUeXBlTm9uZRAAEhkKFUJ1YmJsZVR5cGVDbGlja0J1dHRvbhABEhwKGEJ1YmJsZVR5cGVEbVNldHRpbmdQYW5lbBACKlgKDENoZWNrYm94VHlwZRIUChBDaGVja2JveFR5cGVOb25lEAASGQoVQ2hlY2tib3hUeXBlRW5jb3VyYWdlEAESFwoTQ2hlY2tib3hUeXBlQ29sb3JETRACKjUKDkRtQ29sb3JmdWxUeXBlEgwKCE5vbmVUeXBlEAASFQoPVmlwR3JhZHVhbENvbG9yEOHUAypgChFEbU1hc2tXYWxsQml6VHlwZRILCgdVbmtub3duEAASBwoDT0dWEAESCgoGQml6UGljEAISCAoETXV0ZRADEgoKBlJlY29yZBAEEgkKBUNsb3VkEAUSCAoEQUlHQxAGKnYKFURtTWFza1dhbGxDb250ZW50VHlwZRIgChxEbU1hc2tXYWxsQ29udGVudFR5cGVVbmtub3duEAASHQoZRG1NYXNrV2FsbENvbnRlbnRUeXBlVGV4dBABEhwKGERtTWFza1dhbGxDb250ZW50VHlwZVBpYxACKjwKDEV4cG9zdXJlVHlwZRIUChBFeHBvc3VyZVR5cGVOb25lEAASFgoSRXhwb3N1cmVUeXBlRE1TZW5kEAEqgwIKEFBvc3RQYW5lbEJpelR5cGUSGAoUUG9zdFBhbmVsQml6VHlwZU5vbmUQABIdChlQb3N0UGFuZWxCaXpUeXBlRW5jb3VyYWdlEAESGwoXUG9zdFBhbmVsQml6VHlwZUNvbG9yRE0QAhIZChVQb3N0UGFuZWxCaXpUeXBlTkZURE0QAxIdChlQb3N0UGFuZWxCaXpUeXBlRnJhZ0Nsb3NlEAQSHQoZUG9zdFBhbmVsQml6VHlwZVJlY29tbWVuZBAFEhwKGFBvc3RQYW5lbEJpelR5cGVQbG90TGVhaxAGEiIKHlBvc3RQYW5lbEJpelR5cGVBbnRpSGFyYXNzbWVudBAHKjgKClBvc3RTdGF0dXMSFAoQUG9zdFN0YXR1c05vcm1hbBAAEhQKEFBvc3RTdGF0dXNDbG9zZWQQASpOCgpSZW5kZXJUeXBlEhIKDlJlbmRlclR5cGVOb25lEAASFAoQUmVuZGVyVHlwZVNpbmdsZRABEhYKElJlbmRlclR5cGVSb3RhdGlvbhACKjYKEFN1YnRpdGxlQWlTdGF0dXMSCAoETm9uZRAAEgwKCEV4cG9zdXJlEAESCgoGQXNzaXN0EAIqKwoOU3VidGl0bGVBaVR5cGUSCgoGTm9ybWFsEAASDQoJVHJhbnNsYXRlEAEqHgoMU3VidGl0bGVUeXBlEgYKAkNDEAASBgoCQUkQASpOChFUb2FzdEZ1bmN0aW9uVHlwZRIZChVUb2FzdEZ1bmN0aW9uVHlwZU5vbmUQABIeChpUb2FzdEZ1bmN0aW9uVHlwZVBvc3RQYW5lbBABMqAFCgJETRJzCgtEbVNlZ01vYmlsZRIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnTW9iaWxlUmVxGjIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdNb2JpbGVSZXBseRJkCgZEbVZpZXcSKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVZpZXdSZXEaLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVZpZXdSZXBseRJxCg5EbVBsYXllckNvbmZpZxIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtUGxheWVyQ29uZmlnUmVxGiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVzcG9uc2USagoIRG1TZWdPdHQSLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ090dFJlcRovLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnT3R0UmVwbHkSagoIRG1TZWdTREsSLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ1NES1JlcRovLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnU0RLUmVwbHkSdAoMRG1FeHBvUmVwb3J0EjEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1FeHBvUmVwb3J0UmVxGjEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1FeHBvUmVwb3J0UmVzYgZwcm90bzM");
5662
- const DmSegMobileReplySchema = /*@__PURE__*/ message_messageDesc(file_bili_dm, 30);
5663
- const DmWebViewReplySchema = /*@__PURE__*/ message_messageDesc(file_bili_dm, 39);
5664
- const file_danuni = /*@__PURE__*/ fileDesc("CgxkYW51bmkucHJvdG8SEWRhbnVuaS5kYW5tYWt1LnYxIt4CCgdEYW5tYWt1EgwKBEZDSUQYASABKAkSDAoERE1JRBgCIAEoCRIQCghwcm9ncmVzcxgDIAEoBRIlCgRtb2RlGAQgASgOMhcuZGFudW5pLmRhbm1ha3UudjEuTW9kZRIQCghmb250c2l6ZRgFIAEoBRINCgVjb2xvchgGIAEoBRIQCghzZW5kZXJJRBgHIAEoCRIPCgdjb250ZW50GAggASgJEikKBWN0aW1lGAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIOCgZ3ZWlnaHQYCiABKAUSJQoEcG9vbBgLIAEoDjIXLmRhbnVuaS5kYW5tYWt1LnYxLlBvb2wSDAoEYXR0chgMIAMoCRIQCghwbGF0Zm9ybRgNIAEoCRIRCgRTUE1PGA4gASgJSACIAQESEgoFZXh0cmEYDyABKAlIAYgBAUIHCgVfU1BNT0IICgZfZXh0cmEiPAoMRGFubWFrdVJlcGx5EiwKCGRhbm1ha3VzGAEgAygLMhouZGFudW5pLmRhbm1ha3UudjEuRGFubWFrdSo9CgRNb2RlEgoKBk5vcm1hbBAAEgoKBkJvdHRvbRABEgcKA1RvcBACEgsKB1JldmVyc2UQAxIHCgNFeHQQBCopCgRQb29sEgcKA0RlZhAAEgcKA1N1YhABEgcKA0FkdhACEgYKAkl4EANQAGIGcHJvdG8z", [
5665
- file_google_protobuf_timestamp
5666
- ]);
5667
- const DanmakuReplySchema = /*@__PURE__*/ message_messageDesc(file_danuni, 1);
5668
- class UniPool {
6263
+ class src_UniPool {
5669
6264
  dans;
5670
- shared;
5671
- constructor(dans){
6265
+ options;
6266
+ constructor(dans, options = {}){
5672
6267
  this.dans = dans;
5673
- this.shared = {};
5674
- function isShared(key) {
5675
- return 1 === new Set(dans.map((d)=>d[key])).size;
5676
- }
5677
- if (isShared('FCID')) this.shared.FCID = dans[0].FCID;
5678
- if (isShared('senderID')) this.shared.senderID = dans[0].senderID;
5679
- if (isShared('platform')) this.shared.platform = dans[0].platform;
5680
- if (isShared('SPMO')) this.shared.SPMO = dans[0].SPMO;
5681
- if (isShared('pool')) this.shared.pool = dans[0].pool;
5682
- if (isShared('mode')) this.shared.mode = dans[0].mode;
6268
+ this.options = options;
6269
+ if (false !== options.dedupe) options.dedupe = true;
6270
+ if (this.options.dedupe) this.dedupe();
6271
+ }
6272
+ async pipe(fn) {
6273
+ return fn(this);
6274
+ }
6275
+ pipeSync(fn) {
6276
+ return fn(this);
6277
+ }
6278
+ get shared() {
6279
+ const isShared = (key)=>this.dans.every((d)=>d[key]);
6280
+ return {
6281
+ SOID: isShared('SOID') ? this.dans[0].SOID : void 0,
6282
+ senderID: isShared('senderID') ? this.dans[0].senderID : void 0,
6283
+ platform: isShared('platform') ? this.dans[0].platform : void 0,
6284
+ pool: isShared('pool') ? this.dans[0].pool : void 0,
6285
+ mode: isShared('mode') ? this.dans[0].mode : void 0,
6286
+ color: isShared('color') ? this.dans[0].color : void 0
6287
+ };
6288
+ }
6289
+ get stat() {
6290
+ const default_stat = {
6291
+ SOID: [],
6292
+ mode: [
6293
+ {
6294
+ val: dm_gen_Modes.Normal,
6295
+ count: 0
6296
+ },
6297
+ {
6298
+ val: dm_gen_Modes.Bottom,
6299
+ count: 0
6300
+ },
6301
+ {
6302
+ val: dm_gen_Modes.Top,
6303
+ count: 0
6304
+ },
6305
+ {
6306
+ val: dm_gen_Modes.Reverse,
6307
+ count: 0
6308
+ },
6309
+ {
6310
+ val: dm_gen_Modes.Ext,
6311
+ count: 0
6312
+ }
6313
+ ],
6314
+ fontsize: [],
6315
+ color: [],
6316
+ senderID: [],
6317
+ content: [],
6318
+ weight: [],
6319
+ pool: [
6320
+ {
6321
+ val: dm_gen_Pools.Def,
6322
+ count: 0
6323
+ },
6324
+ {
6325
+ val: dm_gen_Pools.Sub,
6326
+ count: 0
6327
+ },
6328
+ {
6329
+ val: dm_gen_Pools.Adv,
6330
+ count: 0
6331
+ },
6332
+ {
6333
+ val: dm_gen_Pools.Ix,
6334
+ count: 0
6335
+ }
6336
+ ],
6337
+ platform: []
6338
+ };
6339
+ const stat = this.dans.reduce((s, d)=>{
6340
+ const SOID = s.SOID.find((i)=>i.val === d.SOID);
6341
+ if (SOID) SOID.count++;
6342
+ else s.SOID.push({
6343
+ val: d.SOID,
6344
+ count: 1
6345
+ });
6346
+ const mode = s.mode.find((i)=>i.val === d.mode);
6347
+ if (mode) mode.count++;
6348
+ else s.mode.push({
6349
+ val: d.mode,
6350
+ count: 1
6351
+ });
6352
+ const fontsize = s.fontsize.find((i)=>i.val === d.fontsize);
6353
+ if (fontsize) fontsize.count++;
6354
+ else s.fontsize.push({
6355
+ val: d.fontsize,
6356
+ count: 1
6357
+ });
6358
+ const color = s.color.find((i)=>i.val === d.color);
6359
+ if (color) color.count++;
6360
+ else s.color.push({
6361
+ val: d.color,
6362
+ count: 1
6363
+ });
6364
+ const senderID = s.senderID.find((i)=>i.val === d.senderID);
6365
+ if (senderID) senderID.count++;
6366
+ else s.senderID.push({
6367
+ val: d.senderID,
6368
+ count: 1
6369
+ });
6370
+ const content = s.content.find((i)=>i.val === d.content);
6371
+ if (content) content.count++;
6372
+ else s.content.push({
6373
+ val: d.content,
6374
+ count: 1
6375
+ });
6376
+ const weight = s.weight.find((i)=>i.val === d.weight);
6377
+ if (weight) weight.count++;
6378
+ else s.weight.push({
6379
+ val: d.weight,
6380
+ count: 1
6381
+ });
6382
+ const pool = s.pool.find((i)=>i.val === d.pool);
6383
+ if (pool) pool.count++;
6384
+ else s.pool.push({
6385
+ val: d.pool,
6386
+ count: 1
6387
+ });
6388
+ const platform = s.platform.find((i)=>i.val === d.platform);
6389
+ if (platform) platform.count++;
6390
+ else s.platform.push({
6391
+ val: d.platform,
6392
+ count: 1
6393
+ });
6394
+ return s;
6395
+ }, default_stat);
6396
+ return stat;
6397
+ }
6398
+ get most() {
6399
+ const s = this.stat;
6400
+ return {
6401
+ mode: s.mode.sort((a, b)=>b.count - a.count)[0].val,
6402
+ fontsize: s.fontsize.sort((a, b)=>b.count - a.count)[0].val,
6403
+ color: s.color.sort((a, b)=>b.count - a.count)[0].val,
6404
+ senderID: s.senderID.sort((a, b)=>b.count - a.count)[0].val,
6405
+ content: s.content.sort((a, b)=>b.count - a.count)[0].val,
6406
+ weight: s.weight.sort((a, b)=>b.count - a.count)[0].val,
6407
+ pool: s.pool.sort((a, b)=>b.count - a.count)[0].val,
6408
+ platform: s.platform.sort((a, b)=>b.count - a.count)[0].val
6409
+ };
5683
6410
  }
5684
6411
  static create() {
5685
- return new UniPool([]);
6412
+ return new src_UniPool([]);
5686
6413
  }
5687
6414
  assign(dans) {
5688
- if (dans instanceof UniPool) return new UniPool([
6415
+ if (dans instanceof src_UniPool) return new src_UniPool([
5689
6416
  ...this.dans,
5690
6417
  ...dans.dans
5691
6418
  ]);
5692
- if (dans instanceof UniDM) return new UniPool([
6419
+ if (dans instanceof UniDM) return new src_UniPool([
5693
6420
  ...this.dans,
5694
6421
  dans
5695
6422
  ]);
5696
- if (Array.isArray(dans) && dans.every((d)=>d instanceof UniDM)) return new UniPool([
6423
+ if (Array.isArray(dans) && dans.every((d)=>d instanceof UniDM)) return new src_UniPool([
5697
6424
  ...this.dans,
5698
6425
  ...dans
5699
6426
  ]);
@@ -5706,21 +6433,31 @@ class UniPool {
5706
6433
  const set = new Set(this.dans.map((d)=>d[key]));
5707
6434
  return [
5708
6435
  ...set
5709
- ].map((v)=>new UniPool(this.dans.filter((d)=>d[key] === v)));
6436
+ ].map((v)=>new src_UniPool(this.dans.filter((d)=>d[key] === v), {
6437
+ dedupe: false
6438
+ }));
6439
+ }
6440
+ dedupe() {
6441
+ const map = new Map();
6442
+ this.dans.forEach((d)=>map.set(d.DMID || d.toDMID(), d));
6443
+ this.dans = [
6444
+ ...map.values()
6445
+ ];
6446
+ this.options.dedupe = false;
5710
6447
  }
5711
6448
  merge(lifetime = 0) {
5712
- if (!this.shared.FCID) {
5713
- console.error("本功能仅支持同弹幕库内使用,可先 .split('FCID') 在分别使用");
6449
+ if (!this.shared.SOID) {
6450
+ console.error("\u672C\u529F\u80FD\u4EC5\u652F\u6301\u540C\u5F39\u5E55\u5E93\u5185\u4F7F\u7528\uFF0C\u53EF\u5148 .split('SOID') \u5728\u5206\u522B\u4F7F\u7528");
5714
6451
  return this;
5715
6452
  }
5716
6453
  if (lifetime <= 0) return this;
5717
6454
  const mergeContext = this.dans.reduce(([result, cache, mergeObj], danmaku)=>{
5718
6455
  const key = [
6456
+ 'SOID',
5719
6457
  'content',
5720
6458
  'mode',
5721
6459
  'platform',
5722
- 'pool',
5723
- 'SPMO'
6460
+ 'pool'
5724
6461
  ].map((k)=>danmaku[k]).join('|');
5725
6462
  const cached = cache[key];
5726
6463
  const lastAppearTime = cached?.progress || 0;
@@ -5732,7 +6469,9 @@ class UniPool {
5732
6469
  extra.danuni.merge = {
5733
6470
  count: senders.length,
5734
6471
  duration: danmaku.progress - cached.progress,
5735
- senders
6472
+ senders,
6473
+ taolu_count: senders.length,
6474
+ taolu_senders: senders
5736
6475
  };
5737
6476
  danmaku.extraStr = JSON.stringify(extra);
5738
6477
  cache[key] = danmaku;
@@ -5749,6 +6488,10 @@ class UniPool {
5749
6488
  duration: 0,
5750
6489
  senders: [
5751
6490
  danmaku.senderID
6491
+ ],
6492
+ taolu_count: 1,
6493
+ taolu_senders: [
6494
+ danmaku.senderID
5752
6495
  ]
5753
6496
  };
5754
6497
  cache[key] = danmaku;
@@ -5771,11 +6514,11 @@ class UniPool {
5771
6514
  const [result, _cache, mergeObj] = mergeContext;
5772
6515
  result.forEach((danmaku, i)=>{
5773
6516
  const key = [
6517
+ 'SOID',
5774
6518
  'content',
5775
6519
  'mode',
5776
6520
  'platform',
5777
- 'pool',
5778
- 'SPMO'
6521
+ 'pool'
5779
6522
  ].map((k)=>danmaku[k]).join('|');
5780
6523
  const extra = result[i].extra, mergeData = mergeObj[key];
5781
6524
  result[i].extraStr = JSON.stringify({
@@ -5785,20 +6528,23 @@ class UniPool {
5785
6528
  merge: mergeData
5786
6529
  }
5787
6530
  });
5788
- if (mergeData?.count) {
5789
- if (mergeData.count <= 1) {
5790
- const updatedExtra = {
5791
- ...extra
5792
- };
5793
- if (updatedExtra.danuni) {
5794
- delete updatedExtra.danuni.merge;
5795
- if (0 === Object.keys(updatedExtra.danuni).length) delete updatedExtra.danuni;
5796
- }
5797
- result[i].extraStr = Object.keys(updatedExtra).length > 0 ? JSON.stringify(updatedExtra) : void 0;
5798
- } else result[i].senderID = 'merge@bot';
6531
+ if (mergeData?.count) if (mergeData.count <= 1) {
6532
+ const updatedExtra = {
6533
+ ...extra
6534
+ };
6535
+ if (updatedExtra.danuni) {
6536
+ delete updatedExtra.danuni.merge;
6537
+ if (0 === Object.keys(updatedExtra.danuni).length) delete updatedExtra.danuni;
6538
+ }
6539
+ result[i].extraStr = Object.keys(updatedExtra).length > 0 ? JSON.stringify(updatedExtra) : void 0;
6540
+ } else {
6541
+ result[i].senderID = 'merge[bot]@dan-any';
6542
+ result[i].attr ? result[i].attr.push('Protect') : result[i].attr = [
6543
+ 'Protect'
6544
+ ];
5799
6545
  }
5800
6546
  });
5801
- return new UniPool(result);
6547
+ return new src_UniPool(result);
5802
6548
  }
5803
6549
  minify() {
5804
6550
  return this.dans.map((d)=>d.minify());
@@ -5806,7 +6552,7 @@ class UniPool {
5806
6552
  convert2(format, continue_on_error = false) {
5807
6553
  switch(format){
5808
6554
  case 'danuni.json':
5809
- return JSON.stringify(this.dans);
6555
+ return this.dans;
5810
6556
  case 'danuni.bin':
5811
6557
  return this.toPb();
5812
6558
  case 'dplayer.json':
@@ -5819,7 +6565,7 @@ class UniPool {
5819
6565
  return this.toASS();
5820
6566
  default:
5821
6567
  {
5822
- const message = 'unknown format or unsupported now!';
6568
+ const message = '(err) Unknown format or unsupported now!';
5823
6569
  if (continue_on_error) return message;
5824
6570
  throw new Error(message);
5825
6571
  }
@@ -5827,12 +6573,12 @@ class UniPool {
5827
6573
  }
5828
6574
  static fromPb(bin) {
5829
6575
  const data = fromBinary(DanmakuReplySchema, new Uint8Array(bin));
5830
- return new UniPool(data.danmakus.map((d)=>new UniDM(d.FCID, d.progress, d.mode, d.fontsize, d.color, d.senderID, d.content, timestampDate(d.ctime || timestampNow()), d.weight, d.pool, d.attr, d.platform, d.SPMO, d.extra, d.DMID)));
6576
+ return new src_UniPool(data.danmakus.map((d)=>new UniDM(d.SOID, d.progress, d.mode, d.fontsize, d.color, d.senderID, d.content, timestampDate(d.ctime || timestampNow()), d.weight, d.pool, d.attr, d.platform, d.extra, d.DMID)));
5831
6577
  }
5832
6578
  toPb() {
5833
6579
  return toBinary(DanmakuReplySchema, create(DanmakuReplySchema, {
5834
6580
  danmakus: this.dans.map((d)=>({
5835
- FCID: d.FCID,
6581
+ SOID: d.SOID,
5836
6582
  DMID: d.DMID,
5837
6583
  progress: d.progress,
5838
6584
  mode: d.mode,
@@ -5845,16 +6591,15 @@ class UniPool {
5845
6591
  pool: d.pool,
5846
6592
  attr: d.attr,
5847
6593
  platform: d.platform,
5848
- SPMO: d.SPMO,
5849
6594
  extra: d.extraStr
5850
6595
  }))
5851
6596
  }));
5852
6597
  }
5853
- static fromBiliXML(xml, SPMO) {
5854
- const parser = new __WEBPACK_EXTERNAL_MODULE_fast_xml_parser_1c5d6bda__.XMLParser({
6598
+ static fromBiliXML(xml) {
6599
+ const parser = new XMLParser({
5855
6600
  ignoreAttributes: false
5856
6601
  }), oriData = parser.parse(xml), dans = oriData.i.d;
5857
- return new UniPool(dans.map((d)=>{
6602
+ return new src_UniPool(dans.map((d)=>{
5858
6603
  const p_str = d['@_p'], p_arr = p_str.split(',');
5859
6604
  return UniDM.fromBili({
5860
6605
  content: d['#text'],
@@ -5867,19 +6612,22 @@ class UniPool {
5867
6612
  midHash: p_arr[6],
5868
6613
  id: BigInt(p_arr[7]),
5869
6614
  weight: Number.parseInt(p_arr[8])
5870
- }, SPMO, BigInt(oriData.i.chatid));
6615
+ }, BigInt(oriData.i.chatid));
5871
6616
  }));
5872
6617
  }
5873
- static fromBiliGrpc(bin, SPMO) {
6618
+ static fromBiliGrpc(bin) {
5874
6619
  const data = fromBinary(DmSegMobileReplySchema, new Uint8Array(bin)), json = data.elems;
5875
- return new UniPool(json.map((d)=>UniDM.fromBili(d, SPMO)));
6620
+ return new src_UniPool(json.map((d)=>UniDM.fromBili({
6621
+ ...d,
6622
+ progress: d.progress / 1000
6623
+ })));
5876
6624
  }
5877
- static fromBiliCommandGrpc(bin, SPMO) {
6625
+ static fromBiliCommandGrpc(bin) {
5878
6626
  const data = fromBinary(DmWebViewReplySchema, new Uint8Array(bin)), json = data.commandDms;
5879
- return new UniPool(json.map((d)=>UniDM.fromBiliCommand(d, SPMO)));
6627
+ return new src_UniPool(json.map((d)=>UniDM.fromBiliCommand(d)));
5880
6628
  }
5881
6629
  static fromDplayer(json, playerID, domain = 'other') {
5882
- return new UniPool(json.data.map((d)=>UniDM.fromDplayer({
6630
+ return new src_UniPool(json.data.map((d)=>UniDM.fromDplayer({
5883
6631
  content: d[4],
5884
6632
  progress: d[0],
5885
6633
  mode: d[1],
@@ -5903,7 +6651,7 @@ class UniPool {
5903
6651
  };
5904
6652
  }
5905
6653
  static fromArtplayer(json, playerID, domain = 'other') {
5906
- return new UniPool(json.map((d)=>UniDM.fromArtplayer({
6654
+ return new src_UniPool(json.map((d)=>UniDM.fromArtplayer({
5907
6655
  content: d.text,
5908
6656
  progress: d.time || 0,
5909
6657
  mode: d.mode || 0,
@@ -5924,8 +6672,8 @@ class UniPool {
5924
6672
  };
5925
6673
  });
5926
6674
  }
5927
- static fromDDPlay(json, episodeId, domain) {
5928
- return new UniPool(json.comments.map((d)=>{
6675
+ static fromDDPlay(json, episodeId) {
6676
+ return new src_UniPool(json.comments.map((d)=>{
5929
6677
  const p_arr = d.p.split(',');
5930
6678
  return UniDM.fromDDplay({
5931
6679
  cid: d.cid,
@@ -5934,7 +6682,7 @@ class UniPool {
5934
6682
  mode: Number.parseInt(p_arr[1]),
5935
6683
  progress: Number.parseFloat(p_arr[0]),
5936
6684
  uid: p_arr[3]
5937
- }, episodeId, domain);
6685
+ }, episodeId);
5938
6686
  }));
5939
6687
  }
5940
6688
  toDDplay() {
@@ -5956,7 +6704,7 @@ class UniPool {
5956
6704
  toASS(options = {
5957
6705
  substyle: {}
5958
6706
  }) {
5959
- const fn = this.shared.FCID;
6707
+ const fn = this.shared.SOID;
5960
6708
  return generateASS(this, {
5961
6709
  filename: fn,
5962
6710
  title: fn,
@@ -5964,4 +6712,4 @@ class UniPool {
5964
6712
  });
5965
6713
  }
5966
6714
  }
5967
- export { UniDM, dm_gen_namespaceObject as UniDMTools, id_gen_namespaceObject as UniIDTools, UniPool };
6715
+ export { UniDM, dm_gen_namespaceObject as UniDMTools, id_gen_namespaceObject as UniIDTools, src_UniPool as UniPool, platform_namespaceObject as platform };