melo-example-robot 1.7.6

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.
@@ -0,0 +1,1103 @@
1
+ "use strict";
2
+ //////////////////////////////////////////////////////////////////////////////////////
3
+ //
4
+ // Copyright (c) 2014-present, Egret Technology.
5
+ // All rights reserved.
6
+ // Redistribution and use in source and binary forms, with or without
7
+ // modification, are permitted provided that the following conditions are met:
8
+ //
9
+ // * Redistributions of source code must retain the above copyright
10
+ // notice, this list of conditions and the following disclaimer.
11
+ // * Redistributions in binary form must reproduce the above copyright
12
+ // notice, this list of conditions and the following disclaimer in the
13
+ // documentation and/or other materials provided with the distribution.
14
+ // * Neither the name of the Egret nor the
15
+ // names of its contributors may be used to endorse or promote products
16
+ // derived from this software without specific prior written permission.
17
+ //
18
+ // THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
19
+ // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
+ // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
+ // IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22
+ // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA,
24
+ // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25
+ // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26
+ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27
+ // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ //
29
+ //////////////////////////////////////////////////////////////////////////////////////
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.ByteArray = exports.Endian = void 0;
32
+ /**
33
+ * The Endian class contains values that denote the byte order used to represent multibyte numbers.
34
+ * The byte order is either bigEndian (most significant byte first) or littleEndian (least significant byte first).
35
+ * @version Egret 2.4
36
+ * @platform Web,Native
37
+ * @language en_US
38
+ */
39
+ /**
40
+ * Endian 类中包含一些值,它们表示用于表示多字节数字的字节顺序。
41
+ * 字节顺序为 bigEndian(最高有效字节位于最前)或 littleEndian(最低有效字节位于最前)。
42
+ * @version Egret 2.4
43
+ * @platform Web,Native
44
+ * @language zh_CN
45
+ */
46
+ class Endian {
47
+ }
48
+ exports.Endian = Endian;
49
+ /**
50
+ * Indicates the least significant byte of the multibyte number appears first in the sequence of bytes.
51
+ * The hexadecimal number 0x12345678 has 4 bytes (2 hexadecimal digits per byte). The most significant byte is 0x12. The least significant byte is 0x78. (For the equivalent decimal number, 305419896, the most significant digit is 3, and the least significant digit is 6).
52
+ * @version Egret 2.4
53
+ * @platform Web,Native
54
+ * @language en_US
55
+ */
56
+ /**
57
+ * 表示多字节数字的最低有效字节位于字节序列的最前面。
58
+ * 十六进制数字 0x12345678 包含 4 个字节(每个字节包含 2 个十六进制数字)。最高有效字节为 0x12。最低有效字节为 0x78。(对于等效的十进制数字 305419896,最高有效数字是 3,最低有效数字是 6)。
59
+ * @version Egret 2.4
60
+ * @platform Web,Native
61
+ * @language zh_CN
62
+ */
63
+ Endian.LITTLE_ENDIAN = 'littleEndian';
64
+ /**
65
+ * Indicates the most significant byte of the multibyte number appears first in the sequence of bytes.
66
+ * The hexadecimal number 0x12345678 has 4 bytes (2 hexadecimal digits per byte). The most significant byte is 0x12. The least significant byte is 0x78. (For the equivalent decimal number, 305419896, the most significant digit is 3, and the least significant digit is 6).
67
+ * @version Egret 2.4
68
+ * @platform Web,Native
69
+ * @language en_US
70
+ */
71
+ /**
72
+ * 表示多字节数字的最高有效字节位于字节序列的最前面。
73
+ * 十六进制数字 0x12345678 包含 4 个字节(每个字节包含 2 个十六进制数字)。最高有效字节为 0x12。最低有效字节为 0x78。(对于等效的十进制数字 305419896,最高有效数字是 3,最低有效数字是 6)。
74
+ * @version Egret 2.4
75
+ * @platform Web,Native
76
+ * @language zh_CN
77
+ */
78
+ Endian.BIG_ENDIAN = 'bigEndian';
79
+ /**
80
+ * The ByteArray class provides methods and attributes for optimized reading and writing as well as dealing with binary data.
81
+ * Note: The ByteArray class is applied to the advanced developers who need to access data at the byte layer.
82
+ * @version Egret 2.4
83
+ * @platform Web,Native
84
+ * @includeExample egret/utils/ByteArray.ts
85
+ * @language en_US
86
+ */
87
+ /**
88
+ * ByteArray 类提供用于优化读取、写入以及处理二进制数据的方法和属性。
89
+ * 注意:ByteArray 类适用于需要在字节层访问数据的高级开发人员。
90
+ * @version Egret 2.4
91
+ * @platform Web,Native
92
+ * @includeExample egret/utils/ByteArray.ts
93
+ * @language zh_CN
94
+ */
95
+ class ByteArray {
96
+ /**
97
+ * Changes or reads the byte order; egret.EndianConst.BIG_ENDIAN or egret.EndianConst.LITTLE_EndianConst.
98
+ * @default egret.EndianConst.BIG_ENDIAN
99
+ * @version Egret 2.4
100
+ * @platform Web,Native
101
+ * @language en_US
102
+ */
103
+ /**
104
+ * 更改或读取数据的字节顺序;egret.EndianConst.BIG_ENDIAN 或 egret.EndianConst.LITTLE_ENDIAN。
105
+ * @default egret.EndianConst.BIG_ENDIAN
106
+ * @version Egret 2.4
107
+ * @platform Web,Native
108
+ * @language zh_CN
109
+ */
110
+ get endian() {
111
+ return this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */ ? Endian.LITTLE_ENDIAN : Endian.BIG_ENDIAN;
112
+ }
113
+ set endian(value) {
114
+ this.$endian = value === Endian.LITTLE_ENDIAN ? 0 /* EndianConst.LITTLE_ENDIAN */ : 1 /* EndianConst.BIG_ENDIAN */;
115
+ }
116
+ /**
117
+ * @version Egret 2.4
118
+ * @platform Web,Native
119
+ */
120
+ constructor(buffer, bufferExtSize = 0) {
121
+ /**
122
+ * @private
123
+ */
124
+ this.bufferExtSize = 0; // Buffer expansion size
125
+ /**
126
+ * @private
127
+ */
128
+ this.EOF_byte = -1;
129
+ /**
130
+ * @private
131
+ */
132
+ this.EOF_code_point = -1;
133
+ if (bufferExtSize < 0) {
134
+ bufferExtSize = 0;
135
+ }
136
+ this.bufferExtSize = bufferExtSize;
137
+ let bytes, wpos = 0;
138
+ if (buffer) { // 有数据,则可写字节数从字节尾开始
139
+ let uint8;
140
+ if (buffer instanceof Uint8Array) {
141
+ uint8 = buffer;
142
+ wpos = buffer.length;
143
+ }
144
+ else {
145
+ wpos = buffer.byteLength;
146
+ uint8 = new Uint8Array(buffer);
147
+ }
148
+ if (bufferExtSize === 0) {
149
+ bytes = new Uint8Array(wpos);
150
+ }
151
+ else {
152
+ let multi = (wpos / bufferExtSize | 0) + 1;
153
+ bytes = new Uint8Array(multi * bufferExtSize);
154
+ }
155
+ bytes.set(uint8);
156
+ }
157
+ else {
158
+ bytes = new Uint8Array(bufferExtSize);
159
+ }
160
+ this.write_position = wpos;
161
+ this._position = 0;
162
+ this._bytes = bytes;
163
+ this.data = new DataView(bytes.buffer);
164
+ this.endian = Endian.BIG_ENDIAN;
165
+ }
166
+ /**
167
+ * @deprecated
168
+ * @version Egret 2.4
169
+ * @platform Web,Native
170
+ */
171
+ setArrayBuffer(buffer) {
172
+ }
173
+ /**
174
+ * 可读的剩余字节数
175
+ *
176
+ * @returns
177
+ *
178
+ * @memberOf ByteArray
179
+ */
180
+ get readAvailable() {
181
+ return this.write_position - this._position;
182
+ }
183
+ get buffer() {
184
+ return this.data.buffer.slice(0, this.write_position);
185
+ }
186
+ get rawBuffer() {
187
+ return this.data.buffer;
188
+ }
189
+ /**
190
+ * @private
191
+ */
192
+ set buffer(value) {
193
+ let wpos = value.byteLength;
194
+ let uint8 = new Uint8Array(value);
195
+ let bufferExtSize = this.bufferExtSize;
196
+ let bytes;
197
+ if (bufferExtSize === 0) {
198
+ bytes = new Uint8Array(wpos);
199
+ }
200
+ else {
201
+ let multi = (wpos / bufferExtSize | 0) + 1;
202
+ bytes = new Uint8Array(multi * bufferExtSize);
203
+ }
204
+ bytes.set(uint8);
205
+ this.write_position = wpos;
206
+ this._bytes = bytes;
207
+ this.data = new DataView(bytes.buffer);
208
+ }
209
+ get bytes() {
210
+ return this._bytes;
211
+ }
212
+ /**
213
+ * @private
214
+ * @version Egret 2.4
215
+ * @platform Web,Native
216
+ */
217
+ get dataView() {
218
+ return this.data;
219
+ }
220
+ /**
221
+ * @private
222
+ */
223
+ set dataView(value) {
224
+ this.buffer = value.buffer;
225
+ }
226
+ /**
227
+ * @private
228
+ */
229
+ get bufferOffset() {
230
+ return this.data.byteOffset;
231
+ }
232
+ /**
233
+ * The current position of the file pointer (in bytes) to move or return to the ByteArray object. The next time you start reading reading method call in this position, or will start writing in this position next time call a write method.
234
+ * @version Egret 2.4
235
+ * @platform Web,Native
236
+ * @language en_US
237
+ */
238
+ /**
239
+ * 将文件指针的当前位置(以字节为单位)移动或返回到 ByteArray 对象中。下一次调用读取方法时将在此位置开始读取,或者下一次调用写入方法时将在此位置开始写入。
240
+ * @version Egret 2.4
241
+ * @platform Web,Native
242
+ * @language zh_CN
243
+ */
244
+ get position() {
245
+ return this._position;
246
+ }
247
+ set position(value) {
248
+ this._position = value;
249
+ if (value > this.write_position) {
250
+ this.write_position = value;
251
+ }
252
+ }
253
+ /**
254
+ * The length of the ByteArray object (in bytes).
255
+ * If the length is set to be larger than the current length, the right-side zero padding byte array.
256
+ * If the length is set smaller than the current length, the byte array is truncated.
257
+ * @version Egret 2.4
258
+ * @platform Web,Native
259
+ * @language en_US
260
+ */
261
+ /**
262
+ * ByteArray 对象的长度(以字节为单位)。
263
+ * 如果将长度设置为大于当前长度的值,则用零填充字节数组的右侧。
264
+ * 如果将长度设置为小于当前长度的值,将会截断该字节数组。
265
+ * @version Egret 2.4
266
+ * @platform Web,Native
267
+ * @language zh_CN
268
+ */
269
+ get length() {
270
+ return this.write_position;
271
+ }
272
+ set length(value) {
273
+ this.write_position = value;
274
+ if (this.data.byteLength > value) {
275
+ this._position = value;
276
+ }
277
+ this._validateBuffer(value);
278
+ }
279
+ _validateBuffer(value) {
280
+ if (this.data.byteLength < value) {
281
+ let be = this.bufferExtSize;
282
+ let tmp;
283
+ if (be === 0) {
284
+ tmp = new Uint8Array(value);
285
+ }
286
+ else {
287
+ let nLen = ((value / be >> 0) + 1) * be;
288
+ tmp = new Uint8Array(nLen);
289
+ }
290
+ tmp.set(this._bytes);
291
+ this._bytes = tmp;
292
+ this.data = new DataView(tmp.buffer);
293
+ }
294
+ }
295
+ /**
296
+ * The number of bytes that can be read from the current position of the byte array to the end of the array data.
297
+ * When you access a ByteArray object, the bytesAvailable property in conjunction with the read methods each use to make sure you are reading valid data.
298
+ * @version Egret 2.4
299
+ * @platform Web,Native
300
+ * @language en_US
301
+ */
302
+ /**
303
+ * 可从字节数组的当前位置到数组末尾读取的数据的字节数。
304
+ * 每次访问 ByteArray 对象时,将 bytesAvailable 属性与读取方法结合使用,以确保读取有效的数据。
305
+ * @version Egret 2.4
306
+ * @platform Web,Native
307
+ * @language zh_CN
308
+ */
309
+ get bytesAvailable() {
310
+ return this.data.byteLength - this._position;
311
+ }
312
+ /**
313
+ * Clears the contents of the byte array and resets the length and position properties to 0.
314
+ * @version Egret 2.4
315
+ * @platform Web,Native
316
+ * @language en_US
317
+ */
318
+ /**
319
+ * 清除字节数组的内容,并将 length 和 position 属性重置为 0。
320
+ * @version Egret 2.4
321
+ * @platform Web,Native
322
+ * @language zh_CN
323
+ */
324
+ clear() {
325
+ let buffer = new ArrayBuffer(this.bufferExtSize);
326
+ this.data = new DataView(buffer);
327
+ this._bytes = new Uint8Array(buffer);
328
+ this._position = 0;
329
+ this.write_position = 0;
330
+ }
331
+ /**
332
+ * Read a Boolean value from the byte stream. Read a simple byte. If the byte is non-zero, it returns true; otherwise, it returns false.
333
+ * @return If the byte is non-zero, it returns true; otherwise, it returns false.
334
+ * @version Egret 2.4
335
+ * @platform Web,Native
336
+ * @language en_US
337
+ */
338
+ /**
339
+ * 从字节流中读取布尔值。读取单个字节,如果字节非零,则返回 true,否则返回 false
340
+ * @return 如果字节不为零,则返回 true,否则返回 false
341
+ * @version Egret 2.4
342
+ * @platform Web,Native
343
+ * @language zh_CN
344
+ */
345
+ readBoolean() {
346
+ if (this.validate(1 /* ByteArraySize.SIZE_OF_BOOLEAN */))
347
+ return !!this._bytes[this.position++];
348
+ }
349
+ /**
350
+ * Read signed bytes from the byte stream.
351
+ * @return An integer ranging from -128 to 127
352
+ * @version Egret 2.4
353
+ * @platform Web,Native
354
+ * @language en_US
355
+ */
356
+ /**
357
+ * 从字节流中读取带符号的字节
358
+ * @return 介于 -128 和 127 之间的整数
359
+ * @version Egret 2.4
360
+ * @platform Web,Native
361
+ * @language zh_CN
362
+ */
363
+ readByte() {
364
+ if (this.validate(1 /* ByteArraySize.SIZE_OF_INT8 */))
365
+ return this.data.getInt8(this.position++);
366
+ }
367
+ /**
368
+ * Read data byte number specified by the length parameter from the byte stream. Starting from the position specified by offset, read bytes into the ByteArray object specified by the bytes parameter, and write bytes into the target ByteArray
369
+ * @param bytes ByteArray object that data is read into
370
+ * @param offset Offset (position) in bytes. Read data should be written from this position
371
+ * @param length Byte number to be read Default value 0 indicates reading all available data
372
+ * @version Egret 2.4
373
+ * @platform Web,Native
374
+ * @language en_US
375
+ */
376
+ /**
377
+ * 从字节流中读取 length 参数指定的数据字节数。从 offset 指定的位置开始,将字节读入 bytes 参数指定的 ByteArray 对象中,并将字节写入目标 ByteArray 中
378
+ * @param bytes 要将数据读入的 ByteArray 对象
379
+ * @param offset bytes 中的偏移(位置),应从该位置写入读取的数据
380
+ * @param length 要读取的字节数。默认值 0 导致读取所有可用的数据
381
+ * @version Egret 2.4
382
+ * @platform Web,Native
383
+ * @language zh_CN
384
+ */
385
+ readBytes(bytes, offset = 0, length = 0) {
386
+ if (!bytes) { // 由于bytes不返回,所以new新的无意义
387
+ return;
388
+ }
389
+ let pos = this._position;
390
+ let available = this.write_position - pos;
391
+ if (available < 0) {
392
+ throw new Error('1025');
393
+ // return;
394
+ }
395
+ if (length === 0) {
396
+ length = available;
397
+ }
398
+ else if (length > available) {
399
+ throw new Error('1025');
400
+ // return;
401
+ }
402
+ bytes.validateBuffer(offset + length);
403
+ bytes._bytes.set(this._bytes.subarray(pos, pos + length), offset);
404
+ this.position += length;
405
+ }
406
+ /**
407
+ * Read an IEEE 754 double-precision (64 bit) floating point number from the byte stream
408
+ * @return Double-precision (64 bit) floating point number
409
+ * @version Egret 2.4
410
+ * @platform Web,Native
411
+ * @language en_US
412
+ */
413
+ /**
414
+ * 从字节流中读取一个 IEEE 754 双精度(64 位)浮点数
415
+ * @return 双精度(64 位)浮点数
416
+ * @version Egret 2.4
417
+ * @platform Web,Native
418
+ * @language zh_CN
419
+ */
420
+ readDouble() {
421
+ if (this.validate(8 /* ByteArraySize.SIZE_OF_FLOAT64 */)) {
422
+ let value = this.data.getFloat64(this._position, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
423
+ this.position += 8 /* ByteArraySize.SIZE_OF_FLOAT64 */;
424
+ return value;
425
+ }
426
+ }
427
+ /**
428
+ * Read an IEEE 754 single-precision (32 bit) floating point number from the byte stream
429
+ * @return Single-precision (32 bit) floating point number
430
+ * @version Egret 2.4
431
+ * @platform Web,Native
432
+ * @language en_US
433
+ */
434
+ /**
435
+ * 从字节流中读取一个 IEEE 754 单精度(32 位)浮点数
436
+ * @return 单精度(32 位)浮点数
437
+ * @version Egret 2.4
438
+ * @platform Web,Native
439
+ * @language zh_CN
440
+ */
441
+ readFloat() {
442
+ if (this.validate(4 /* ByteArraySize.SIZE_OF_FLOAT32 */)) {
443
+ let value = this.data.getFloat32(this._position, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
444
+ this.position += 4 /* ByteArraySize.SIZE_OF_FLOAT32 */;
445
+ return value;
446
+ }
447
+ }
448
+ /**
449
+ * Read a 32-bit signed integer from the byte stream.
450
+ * @return A 32-bit signed integer ranging from -2147483648 to 2147483647
451
+ * @version Egret 2.4
452
+ * @platform Web,Native
453
+ * @language en_US
454
+ */
455
+ /**
456
+ * 从字节流中读取一个带符号的 32 位整数
457
+ * @return 介于 -2147483648 和 2147483647 之间的 32 位带符号整数
458
+ * @version Egret 2.4
459
+ * @platform Web,Native
460
+ * @language zh_CN
461
+ */
462
+ readInt() {
463
+ if (this.validate(4 /* ByteArraySize.SIZE_OF_INT32 */)) {
464
+ let value = this.data.getInt32(this._position, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
465
+ this.position += 4 /* ByteArraySize.SIZE_OF_INT32 */;
466
+ return value;
467
+ }
468
+ }
469
+ /**
470
+ * Read a 16-bit signed integer from the byte stream.
471
+ * @return A 16-bit signed integer ranging from -32768 to 32767
472
+ * @version Egret 2.4
473
+ * @platform Web,Native
474
+ * @language en_US
475
+ */
476
+ /**
477
+ * 从字节流中读取一个带符号的 16 位整数
478
+ * @return 介于 -32768 和 32767 之间的 16 位带符号整数
479
+ * @version Egret 2.4
480
+ * @platform Web,Native
481
+ * @language zh_CN
482
+ */
483
+ readShort() {
484
+ if (this.validate(2 /* ByteArraySize.SIZE_OF_INT16 */)) {
485
+ let value = this.data.getInt16(this._position, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
486
+ this.position += 2 /* ByteArraySize.SIZE_OF_INT16 */;
487
+ return value;
488
+ }
489
+ }
490
+ /**
491
+ * Read unsigned bytes from the byte stream.
492
+ * @return A 32-bit unsigned integer ranging from 0 to 255
493
+ * @version Egret 2.4
494
+ * @platform Web,Native
495
+ * @language en_US
496
+ */
497
+ /**
498
+ * 从字节流中读取无符号的字节
499
+ * @return 介于 0 和 255 之间的 32 位无符号整数
500
+ * @version Egret 2.4
501
+ * @platform Web,Native
502
+ * @language zh_CN
503
+ */
504
+ readUnsignedByte() {
505
+ if (this.validate(1 /* ByteArraySize.SIZE_OF_UINT8 */))
506
+ return this._bytes[this.position++];
507
+ }
508
+ /**
509
+ * Read a 32-bit unsigned integer from the byte stream.
510
+ * @return A 32-bit unsigned integer ranging from 0 to 4294967295
511
+ * @version Egret 2.4
512
+ * @platform Web,Native
513
+ * @language en_US
514
+ */
515
+ /**
516
+ * 从字节流中读取一个无符号的 32 位整数
517
+ * @return 介于 0 和 4294967295 之间的 32 位无符号整数
518
+ * @version Egret 2.4
519
+ * @platform Web,Native
520
+ * @language zh_CN
521
+ */
522
+ readUnsignedInt() {
523
+ if (this.validate(4 /* ByteArraySize.SIZE_OF_UINT32 */)) {
524
+ let value = this.data.getUint32(this._position, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
525
+ this.position += 4 /* ByteArraySize.SIZE_OF_UINT32 */;
526
+ return value;
527
+ }
528
+ }
529
+ /**
530
+ * Read a 16-bit unsigned integer from the byte stream.
531
+ * @return A 16-bit unsigned integer ranging from 0 to 65535
532
+ * @version Egret 2.4
533
+ * @platform Web,Native
534
+ * @language en_US
535
+ */
536
+ /**
537
+ * 从字节流中读取一个无符号的 16 位整数
538
+ * @return 介于 0 和 65535 之间的 16 位无符号整数
539
+ * @version Egret 2.4
540
+ * @platform Web,Native
541
+ * @language zh_CN
542
+ */
543
+ readUnsignedShort() {
544
+ if (this.validate(2 /* ByteArraySize.SIZE_OF_UINT16 */)) {
545
+ let value = this.data.getUint16(this._position, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
546
+ this.position += 2 /* ByteArraySize.SIZE_OF_UINT16 */;
547
+ return value;
548
+ }
549
+ }
550
+ /**
551
+ * Read a UTF-8 character string from the byte stream Assume that the prefix of the character string is a short unsigned integer (use byte to express length)
552
+ * @return UTF-8 character string
553
+ * @version Egret 2.4
554
+ * @platform Web,Native
555
+ * @language en_US
556
+ */
557
+ /**
558
+ * 从字节流中读取一个 UTF-8 字符串。假定字符串的前缀是无符号的短整型(以字节表示长度)
559
+ * @return UTF-8 编码的字符串
560
+ * @version Egret 2.4
561
+ * @platform Web,Native
562
+ * @language zh_CN
563
+ */
564
+ readUTF() {
565
+ let length = this.readUnsignedShort();
566
+ if (length > 0) {
567
+ return this.readUTFBytes(length);
568
+ }
569
+ else {
570
+ return '';
571
+ }
572
+ }
573
+ /**
574
+ * Read a UTF-8 byte sequence specified by the length parameter from the byte stream, and then return a character string
575
+ * @param Specify a short unsigned integer of the UTF-8 byte length
576
+ * @return A character string consists of UTF-8 bytes of the specified length
577
+ * @version Egret 2.4
578
+ * @platform Web,Native
579
+ * @language en_US
580
+ */
581
+ /**
582
+ * 从字节流中读取一个由 length 参数指定的 UTF-8 字节序列,并返回一个字符串
583
+ * @param length 指明 UTF-8 字节长度的无符号短整型数
584
+ * @return 由指定长度的 UTF-8 字节组成的字符串
585
+ * @version Egret 2.4
586
+ * @platform Web,Native
587
+ * @language zh_CN
588
+ */
589
+ readUTFBytes(length) {
590
+ if (!this.validate(length)) {
591
+ return;
592
+ }
593
+ let data = this.data;
594
+ let bytes = new Uint8Array(data.buffer, data.byteOffset + this._position, length);
595
+ this.position += length;
596
+ return this.decodeUTF8(bytes);
597
+ }
598
+ /**
599
+ * Write a Boolean value. A single byte is written according to the value parameter. If the value is true, write 1; if the value is false, write 0.
600
+ * @param value A Boolean value determining which byte is written. If the value is true, write 1; if the value is false, write 0.
601
+ * @version Egret 2.4
602
+ * @platform Web,Native
603
+ * @language en_US
604
+ */
605
+ /**
606
+ * 写入布尔值。根据 value 参数写入单个字节。如果为 true,则写入 1,如果为 false,则写入 0
607
+ * @param value 确定写入哪个字节的布尔值。如果该参数为 true,则该方法写入 1;如果该参数为 false,则该方法写入 0
608
+ * @version Egret 2.4
609
+ * @platform Web,Native
610
+ * @language zh_CN
611
+ */
612
+ writeBoolean(value) {
613
+ this.validateBuffer(1 /* ByteArraySize.SIZE_OF_BOOLEAN */);
614
+ this._bytes[this.position++] = +value;
615
+ }
616
+ /**
617
+ * Write a byte into the byte stream
618
+ * The low 8 bits of the parameter are used. The high 24 bits are ignored.
619
+ * @param value A 32-bit integer. The low 8 bits will be written into the byte stream
620
+ * @version Egret 2.4
621
+ * @platform Web,Native
622
+ * @language en_US
623
+ */
624
+ /**
625
+ * 在字节流中写入一个字节
626
+ * 使用参数的低 8 位。忽略高 24 位
627
+ * @param value 一个 32 位整数。低 8 位将被写入字节流
628
+ * @version Egret 2.4
629
+ * @platform Web,Native
630
+ * @language zh_CN
631
+ */
632
+ writeByte(value) {
633
+ this.validateBuffer(1 /* ByteArraySize.SIZE_OF_INT8 */);
634
+ this._bytes[this.position++] = value & 0xff;
635
+ }
636
+ /**
637
+ * Write the byte sequence that includes length bytes in the specified byte array, bytes, (starting at the byte specified by offset, using a zero-based index), into the byte stream
638
+ * If the length parameter is omitted, the default length value 0 is used and the entire buffer starting at offset is written. If the offset parameter is also omitted, the entire buffer is written
639
+ * If the offset or length parameter is out of range, they are clamped to the beginning and end of the bytes array.
640
+ * @param bytes ByteArray Object
641
+ * @param offset A zero-based index specifying the position into the array to begin writing
642
+ * @param length An unsigned integer specifying how far into the buffer to write
643
+ * @version Egret 2.4
644
+ * @platform Web,Native
645
+ * @language en_US
646
+ */
647
+ /**
648
+ * 将指定字节数组 bytes(起始偏移量为 offset,从零开始的索引)中包含 length 个字节的字节序列写入字节流
649
+ * 如果省略 length 参数,则使用默认长度 0;该方法将从 offset 开始写入整个缓冲区。如果还省略了 offset 参数,则写入整个缓冲区
650
+ * 如果 offset 或 length 超出范围,它们将被锁定到 bytes 数组的开头和结尾
651
+ * @param bytes ByteArray 对象
652
+ * @param offset 从 0 开始的索引,表示在数组中开始写入的位置
653
+ * @param length 一个无符号整数,表示在缓冲区中的写入范围
654
+ * @version Egret 2.4
655
+ * @platform Web,Native
656
+ * @language zh_CN
657
+ */
658
+ writeBytes(bytes, offset = 0, length = 0) {
659
+ let writeLength;
660
+ if (offset < 0) {
661
+ return;
662
+ }
663
+ if (length < 0) {
664
+ return;
665
+ }
666
+ else if (length === 0) {
667
+ writeLength = bytes.length - offset;
668
+ }
669
+ else {
670
+ writeLength = Math.min(bytes.length - offset, length);
671
+ }
672
+ if (writeLength > 0) {
673
+ this.validateBuffer(writeLength);
674
+ this._bytes.set(bytes._bytes.subarray(offset, offset + writeLength), this._position);
675
+ this.position = this._position + writeLength;
676
+ }
677
+ }
678
+ /**
679
+ * Write an IEEE 754 double-precision (64 bit) floating point number into the byte stream
680
+ * @param value Double-precision (64 bit) floating point number
681
+ * @version Egret 2.4
682
+ * @platform Web,Native
683
+ * @language en_US
684
+ */
685
+ /**
686
+ * 在字节流中写入一个 IEEE 754 双精度(64 位)浮点数
687
+ * @param value 双精度(64 位)浮点数
688
+ * @version Egret 2.4
689
+ * @platform Web,Native
690
+ * @language zh_CN
691
+ */
692
+ writeDouble(value) {
693
+ this.validateBuffer(8 /* ByteArraySize.SIZE_OF_FLOAT64 */);
694
+ this.data.setFloat64(this._position, value, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
695
+ this.position += 8 /* ByteArraySize.SIZE_OF_FLOAT64 */;
696
+ }
697
+ /**
698
+ * Write an IEEE 754 single-precision (32 bit) floating point number into the byte stream
699
+ * @param value Single-precision (32 bit) floating point number
700
+ * @version Egret 2.4
701
+ * @platform Web,Native
702
+ * @language en_US
703
+ */
704
+ /**
705
+ * 在字节流中写入一个 IEEE 754 单精度(32 位)浮点数
706
+ * @param value 单精度(32 位)浮点数
707
+ * @version Egret 2.4
708
+ * @platform Web,Native
709
+ * @language zh_CN
710
+ */
711
+ writeFloat(value) {
712
+ this.validateBuffer(4 /* ByteArraySize.SIZE_OF_FLOAT32 */);
713
+ this.data.setFloat32(this._position, value, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
714
+ this.position += 4 /* ByteArraySize.SIZE_OF_FLOAT32 */;
715
+ }
716
+ /**
717
+ * Write a 32-bit signed integer into the byte stream
718
+ * @param value An integer to be written into the byte stream
719
+ * @version Egret 2.4
720
+ * @platform Web,Native
721
+ * @language en_US
722
+ */
723
+ /**
724
+ * 在字节流中写入一个带符号的 32 位整数
725
+ * @param value 要写入字节流的整数
726
+ * @version Egret 2.4
727
+ * @platform Web,Native
728
+ * @language zh_CN
729
+ */
730
+ writeInt(value) {
731
+ this.validateBuffer(4 /* ByteArraySize.SIZE_OF_INT32 */);
732
+ this.data.setInt32(this._position, value, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
733
+ this.position += 4 /* ByteArraySize.SIZE_OF_INT32 */;
734
+ }
735
+ /**
736
+ * Write a 16-bit integer into the byte stream. The low 16 bits of the parameter are used. The high 16 bits are ignored.
737
+ * @param value A 32-bit integer. Its low 16 bits will be written into the byte stream
738
+ * @version Egret 2.4
739
+ * @platform Web,Native
740
+ * @language en_US
741
+ */
742
+ /**
743
+ * 在字节流中写入一个 16 位整数。使用参数的低 16 位。忽略高 16 位
744
+ * @param value 32 位整数,该整数的低 16 位将被写入字节流
745
+ * @version Egret 2.4
746
+ * @platform Web,Native
747
+ * @language zh_CN
748
+ */
749
+ writeShort(value) {
750
+ this.validateBuffer(2 /* ByteArraySize.SIZE_OF_INT16 */);
751
+ this.data.setInt16(this._position, value, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
752
+ this.position += 2 /* ByteArraySize.SIZE_OF_INT16 */;
753
+ }
754
+ /**
755
+ * Write a 32-bit unsigned integer into the byte stream
756
+ * @param value An unsigned integer to be written into the byte stream
757
+ * @version Egret 2.4
758
+ * @platform Web,Native
759
+ * @language en_US
760
+ */
761
+ /**
762
+ * 在字节流中写入一个无符号的 32 位整数
763
+ * @param value 要写入字节流的无符号整数
764
+ * @version Egret 2.4
765
+ * @platform Web,Native
766
+ * @language zh_CN
767
+ */
768
+ writeUnsignedInt(value) {
769
+ this.validateBuffer(4 /* ByteArraySize.SIZE_OF_UINT32 */);
770
+ this.data.setUint32(this._position, value, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
771
+ this.position += 4 /* ByteArraySize.SIZE_OF_UINT32 */;
772
+ }
773
+ /**
774
+ * Write a 16-bit unsigned integer into the byte stream
775
+ * @param value An unsigned integer to be written into the byte stream
776
+ * @version Egret 2.5
777
+ * @platform Web,Native
778
+ * @language en_US
779
+ */
780
+ /**
781
+ * 在字节流中写入一个无符号的 16 位整数
782
+ * @param value 要写入字节流的无符号整数
783
+ * @version Egret 2.5
784
+ * @platform Web,Native
785
+ * @language zh_CN
786
+ */
787
+ writeUnsignedShort(value) {
788
+ this.validateBuffer(2 /* ByteArraySize.SIZE_OF_UINT16 */);
789
+ this.data.setUint16(this._position, value, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
790
+ this.position += 2 /* ByteArraySize.SIZE_OF_UINT16 */;
791
+ }
792
+ /**
793
+ * Write a UTF-8 string into the byte stream. The length of the UTF-8 string in bytes is written first, as a 16-bit integer, followed by the bytes representing the characters of the string
794
+ * @param value Character string value to be written
795
+ * @version Egret 2.4
796
+ * @platform Web,Native
797
+ * @language en_US
798
+ */
799
+ /**
800
+ * 将 UTF-8 字符串写入字节流。先写入以字节表示的 UTF-8 字符串长度(作为 16 位整数),然后写入表示字符串字符的字节
801
+ * @param value 要写入的字符串值
802
+ * @version Egret 2.4
803
+ * @platform Web,Native
804
+ * @language zh_CN
805
+ */
806
+ writeUTF(value) {
807
+ let utf8bytes = this.encodeUTF8(value);
808
+ let length = utf8bytes.length;
809
+ this.validateBuffer(2 /* ByteArraySize.SIZE_OF_UINT16 */ + length);
810
+ this.data.setUint16(this._position, length, this.$endian === 0 /* EndianConst.LITTLE_ENDIAN */);
811
+ this.position += 2 /* ByteArraySize.SIZE_OF_UINT16 */;
812
+ this._writeUint8Array(utf8bytes, false);
813
+ }
814
+ /**
815
+ * Write a UTF-8 string into the byte stream. Similar to the writeUTF() method, but the writeUTFBytes() method does not prefix the string with a 16-bit length word
816
+ * @param value Character string value to be written
817
+ * @version Egret 2.4
818
+ * @platform Web,Native
819
+ * @language en_US
820
+ */
821
+ /**
822
+ * 将 UTF-8 字符串写入字节流。类似于 writeUTF() 方法,但 writeUTFBytes() 不使用 16 位长度的词为字符串添加前缀
823
+ * @param value 要写入的字符串值
824
+ * @version Egret 2.4
825
+ * @platform Web,Native
826
+ * @language zh_CN
827
+ */
828
+ writeUTFBytes(value) {
829
+ this._writeUint8Array(this.encodeUTF8(value));
830
+ }
831
+ /**
832
+ *
833
+ * @returns
834
+ * @version Egret 2.4
835
+ * @platform Web,Native
836
+ */
837
+ toString() {
838
+ return '[ByteArray] length:' + this.length + ', bytesAvailable:' + this.bytesAvailable;
839
+ }
840
+ /**
841
+ * @private
842
+ * 将 Uint8Array 写入字节流
843
+ * @param bytes 要写入的Uint8Array
844
+ * @param validateBuffer
845
+ */
846
+ _writeUint8Array(bytes, validateBuffer = true) {
847
+ let pos = this._position;
848
+ let npos = pos + bytes.length;
849
+ if (validateBuffer) {
850
+ this.validateBuffer(npos);
851
+ }
852
+ this.bytes.set(bytes, pos);
853
+ this.position = npos;
854
+ }
855
+ /**
856
+ * @param len
857
+ * @returns
858
+ * @version Egret 2.4
859
+ * @platform Web,Native
860
+ * @private
861
+ */
862
+ validate(len) {
863
+ let bl = this._bytes.length;
864
+ if (bl > 0 && this._position + len <= bl) {
865
+ return true;
866
+ }
867
+ else {
868
+ console.error(1025);
869
+ }
870
+ }
871
+ /**********************/
872
+ /* PRIVATE METHODS */
873
+ /**********************/
874
+ /**
875
+ * @private
876
+ * @param len
877
+ * @param needReplace
878
+ */
879
+ validateBuffer(len) {
880
+ this.write_position = len > this.write_position ? len : this.write_position;
881
+ len += this._position;
882
+ this._validateBuffer(len);
883
+ }
884
+ /**
885
+ * @private
886
+ * UTF-8 Encoding/Decoding
887
+ */
888
+ encodeUTF8(str) {
889
+ let pos = 0;
890
+ let codePoints = this.stringToCodePoints(str);
891
+ let outputBytes = [];
892
+ while (codePoints.length > pos) {
893
+ let code_point = codePoints[pos++];
894
+ if (this.inRange(code_point, 0xD800, 0xDFFF)) {
895
+ this.encoderError(code_point);
896
+ }
897
+ else if (this.inRange(code_point, 0x0000, 0x007f)) {
898
+ outputBytes.push(code_point);
899
+ }
900
+ else {
901
+ let count, offset;
902
+ if (this.inRange(code_point, 0x0080, 0x07FF)) {
903
+ count = 1;
904
+ offset = 0xC0;
905
+ }
906
+ else if (this.inRange(code_point, 0x0800, 0xFFFF)) {
907
+ count = 2;
908
+ offset = 0xE0;
909
+ }
910
+ else if (this.inRange(code_point, 0x10000, 0x10FFFF)) {
911
+ count = 3;
912
+ offset = 0xF0;
913
+ }
914
+ outputBytes.push(this.div(code_point, Math.pow(64, count)) + offset);
915
+ while (count > 0) {
916
+ let temp = this.div(code_point, Math.pow(64, count - 1));
917
+ outputBytes.push(0x80 + (temp % 64));
918
+ count -= 1;
919
+ }
920
+ }
921
+ }
922
+ return new Uint8Array(outputBytes);
923
+ }
924
+ /**
925
+ * @private
926
+ *
927
+ * @param data
928
+ * @returns
929
+ */
930
+ decodeUTF8(data) {
931
+ let fatal = false;
932
+ let pos = 0;
933
+ let result = '';
934
+ let code_point;
935
+ let utf8_code_point = 0;
936
+ let utf8_bytes_needed = 0;
937
+ let utf8_bytes_seen = 0;
938
+ let utf8_lower_boundary = 0;
939
+ while (data.length > pos) {
940
+ let _byte = data[pos++];
941
+ if (_byte === this.EOF_byte) {
942
+ if (utf8_bytes_needed !== 0) {
943
+ code_point = this.decoderError(fatal);
944
+ }
945
+ else {
946
+ code_point = this.EOF_code_point;
947
+ }
948
+ }
949
+ else {
950
+ if (utf8_bytes_needed === 0) {
951
+ if (this.inRange(_byte, 0x00, 0x7F)) {
952
+ code_point = _byte;
953
+ }
954
+ else {
955
+ if (this.inRange(_byte, 0xC2, 0xDF)) {
956
+ utf8_bytes_needed = 1;
957
+ utf8_lower_boundary = 0x80;
958
+ utf8_code_point = _byte - 0xC0;
959
+ }
960
+ else if (this.inRange(_byte, 0xE0, 0xEF)) {
961
+ utf8_bytes_needed = 2;
962
+ utf8_lower_boundary = 0x800;
963
+ utf8_code_point = _byte - 0xE0;
964
+ }
965
+ else if (this.inRange(_byte, 0xF0, 0xF4)) {
966
+ utf8_bytes_needed = 3;
967
+ utf8_lower_boundary = 0x10000;
968
+ utf8_code_point = _byte - 0xF0;
969
+ }
970
+ else {
971
+ this.decoderError(fatal);
972
+ }
973
+ utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed);
974
+ code_point = null;
975
+ }
976
+ }
977
+ else if (!this.inRange(_byte, 0x80, 0xBF)) {
978
+ utf8_code_point = 0;
979
+ utf8_bytes_needed = 0;
980
+ utf8_bytes_seen = 0;
981
+ utf8_lower_boundary = 0;
982
+ pos--;
983
+ code_point = this.decoderError(fatal, _byte);
984
+ }
985
+ else {
986
+ utf8_bytes_seen += 1;
987
+ utf8_code_point = utf8_code_point + (_byte - 0x80) * Math.pow(64, utf8_bytes_needed - utf8_bytes_seen);
988
+ if (utf8_bytes_seen !== utf8_bytes_needed) {
989
+ code_point = null;
990
+ }
991
+ else {
992
+ let cp = utf8_code_point;
993
+ let lower_boundary = utf8_lower_boundary;
994
+ utf8_code_point = 0;
995
+ utf8_bytes_needed = 0;
996
+ utf8_bytes_seen = 0;
997
+ utf8_lower_boundary = 0;
998
+ if (this.inRange(cp, lower_boundary, 0x10FFFF) && !this.inRange(cp, 0xD800, 0xDFFF)) {
999
+ code_point = cp;
1000
+ }
1001
+ else {
1002
+ code_point = this.decoderError(fatal, _byte);
1003
+ }
1004
+ }
1005
+ }
1006
+ }
1007
+ // Decode string
1008
+ if (code_point !== null && code_point !== this.EOF_code_point) {
1009
+ if (code_point <= 0xFFFF) {
1010
+ if (code_point > 0)
1011
+ result += String.fromCharCode(code_point);
1012
+ }
1013
+ else {
1014
+ code_point -= 0x10000;
1015
+ result += String.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff));
1016
+ result += String.fromCharCode(0xDC00 + (code_point & 0x3ff));
1017
+ }
1018
+ }
1019
+ }
1020
+ return result;
1021
+ }
1022
+ /**
1023
+ * @private
1024
+ *
1025
+ * @param code_point
1026
+ */
1027
+ encoderError(code_point) {
1028
+ console.error(1026, code_point);
1029
+ }
1030
+ /**
1031
+ * @private
1032
+ *
1033
+ * @param fatal
1034
+ * @param opt_code_point
1035
+ * @returns
1036
+ */
1037
+ decoderError(fatal, opt_code_point) {
1038
+ if (fatal) {
1039
+ console.error(1027);
1040
+ }
1041
+ return opt_code_point || 0xFFFD;
1042
+ }
1043
+ /**
1044
+ * @private
1045
+ *
1046
+ * @param a
1047
+ * @param min
1048
+ * @param max
1049
+ */
1050
+ inRange(a, min, max) {
1051
+ return min <= a && a <= max;
1052
+ }
1053
+ /**
1054
+ * @private
1055
+ *
1056
+ * @param n
1057
+ * @param d
1058
+ */
1059
+ div(n, d) {
1060
+ return Math.floor(n / d);
1061
+ }
1062
+ /**
1063
+ * @private
1064
+ *
1065
+ * @param string
1066
+ */
1067
+ stringToCodePoints(str) {
1068
+ /** @type {Array.<number>} */
1069
+ let cps = [];
1070
+ // Based on http://www.w3.org/TR/WebIDL/#idl-DOMString
1071
+ let i = 0, n = str.length;
1072
+ while (i < str.length) {
1073
+ let c = str.charCodeAt(i);
1074
+ if (!this.inRange(c, 0xD800, 0xDFFF)) {
1075
+ cps.push(c);
1076
+ }
1077
+ else if (this.inRange(c, 0xDC00, 0xDFFF)) {
1078
+ cps.push(0xFFFD);
1079
+ }
1080
+ else { // (inRange(c, 0xD800, 0xDBFF))
1081
+ if (i === n - 1) {
1082
+ cps.push(0xFFFD);
1083
+ }
1084
+ else {
1085
+ let d = str.charCodeAt(i + 1);
1086
+ if (this.inRange(d, 0xDC00, 0xDFFF)) {
1087
+ let a = c & 0x3FF;
1088
+ let b = d & 0x3FF;
1089
+ i += 1;
1090
+ cps.push(0x10000 + (a << 10) + b);
1091
+ }
1092
+ else {
1093
+ cps.push(0xFFFD);
1094
+ }
1095
+ }
1096
+ }
1097
+ i += 1;
1098
+ }
1099
+ return cps;
1100
+ }
1101
+ }
1102
+ exports.ByteArray = ByteArray;
1103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnl0ZUFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYXBwL3NjcmlwdC9CeXRlQXJyYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHNGQUFzRjtBQUN0RixFQUFFO0FBQ0YsaURBQWlEO0FBQ2pELHdCQUF3QjtBQUN4QixzRUFBc0U7QUFDdEUsK0VBQStFO0FBQy9FLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsc0VBQXNFO0FBQ3RFLDBFQUEwRTtBQUMxRSw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLDhDQUE4QztBQUM5Qyw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDJFQUEyRTtBQUMzRSxnRkFBZ0Y7QUFDaEYsZ0ZBQWdGO0FBQ2hGLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0Usd0VBQXdFO0FBQ3hFLGdGQUFnRjtBQUNoRixzREFBc0Q7QUFDdEQsRUFBRTtBQUNGLHNGQUFzRjs7O0FBR2xGOzs7Ozs7R0FNRztBQUNIOzs7Ozs7R0FNRztBQUNILE1BQWEsTUFBTTs7QUFBbkIsd0JBaUNDO0FBaENHOzs7Ozs7R0FNRztBQUNIOzs7Ozs7R0FNRztBQUNXLG9CQUFhLEdBQVcsY0FBYyxDQUFDO0FBRXJEOzs7Ozs7R0FNRztBQUNIOzs7Ozs7R0FNRztBQUNXLGlCQUFVLEdBQVcsV0FBVyxDQUFDO0FBNkJuRDs7Ozs7OztHQU9HO0FBQ0g7Ozs7Ozs7R0FPRztBQUNILE1BQWEsU0FBUztJQXdCbEI7Ozs7OztPQU1HO0lBQ0g7Ozs7OztPQU1HO0lBQ0gsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxzQ0FBOEIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNqRyxDQUFDO0lBRUQsSUFBVyxNQUFNLENBQUMsS0FBYTtRQUMzQixJQUFJLENBQUMsT0FBTyxH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