werift 0.24.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/common/src/binary.js +2 -3
- package/lib/common/src/binary.js.map +1 -1
- package/lib/ice/src/ice.js +4 -9
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/internal/selectAddresses.d.ts +9 -0
- package/lib/ice/src/internal/selectAddresses.js +40 -0
- package/lib/ice/src/internal/selectAddresses.js.map +1 -0
- package/lib/ice/src/utils.js +2 -31
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/ice-server/src/stun/attributes.js +9 -47
- package/lib/ice-server/src/stun/attributes.js.map +1 -1
- package/lib/ice-server/src/stun/ip.d.ts +12 -0
- package/lib/ice-server/src/stun/ip.js +88 -0
- package/lib/ice-server/src/stun/ip.js.map +1 -0
- package/lib/index.mjs +217 -130
- package/lib/nonstandard/index.mjs +121 -54
- package/lib/rtp/src/codec/av1.js +11 -5
- package/lib/rtp/src/codec/av1.js.map +1 -1
- package/lib/rtp/src/codec/leb128.d.ts +5 -0
- package/lib/rtp/src/codec/leb128.js +24 -0
- package/lib/rtp/src/codec/leb128.js.map +1 -0
- package/lib/rtp/src/rtp/rtx.js +4 -6
- package/lib/rtp/src/rtp/rtx.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.d.ts +2 -0
- package/lib/rtp/src/srtp/context/context.js +12 -12
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/sctp/src/param.js +31 -15
- package/lib/sctp/src/param.js.map +1 -1
- package/lib/sctp/src/sctp.js +10 -9
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.js +2 -3
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/sdp.js +1 -35
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +17 -16
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/package.json +1 -7
package/lib/common/src/binary.js
CHANGED
|
@@ -14,12 +14,11 @@ exports.bufferWriterLE = bufferWriterLE;
|
|
|
14
14
|
exports.bufferReader = bufferReader;
|
|
15
15
|
exports.buffer2ArrayBuffer = buffer2ArrayBuffer;
|
|
16
16
|
const crypto_1 = require("crypto");
|
|
17
|
-
const jspack_1 = require("@shinyoshiaki/jspack");
|
|
18
17
|
function random16() {
|
|
19
|
-
return
|
|
18
|
+
return (0, crypto_1.randomBytes)(2).readUInt16BE(0);
|
|
20
19
|
}
|
|
21
20
|
function random32() {
|
|
22
|
-
return
|
|
21
|
+
return (0, crypto_1.randomBytes)(4).readUInt32BE(0);
|
|
23
22
|
}
|
|
24
23
|
function bufferXor(a, b) {
|
|
25
24
|
if (a.length !== b.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../../../../common/src/binary.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { jspack } from \"@shinyoshiaki/jspack\";\n\nexport function random16() {\n return jspack.Unpack(\"!H\", randomBytes(2))[0];\n}\n\nexport function random32() {\n return jspack.Unpack(\"!L\", randomBytes(4))[0];\n}\n\nexport function bufferXor(a: Buffer, b: Buffer): Buffer {\n if (a.length !== b.length) {\n throw new TypeError(\n \"[webrtc-stun] You can not XOR buffers which length are different\",\n );\n }\n\n const length = a.length;\n const buffer = Buffer.allocUnsafe(length);\n\n for (let i = 0; i < length; i++) {\n buffer[i] = a[i] ^ b[i];\n }\n\n return buffer;\n}\n\nexport function bufferArrayXor(arr: Buffer[]): Buffer {\n const length = [...arr]\n .sort((a, b) => a.length - b.length)\n .reverse()[0].length;\n const xored = Buffer.allocUnsafe(length);\n\n for (let i = 0; i < length; i++) {\n xored[i] = 0;\n arr.forEach((buffer) => {\n xored[i] ^= buffer[i] ?? 0;\n });\n }\n\n return xored;\n}\n\nexport class BitWriter {\n value = 0;\n\n constructor(private bitLength: number) {}\n\n set(size: number, startIndex: number, value: number) {\n value &= (1 << size) - 1;\n this.value |= value << (this.bitLength - size - startIndex);\n\n return this;\n }\n\n get buffer() {\n const length = Math.ceil(this.bitLength / 8);\n const buf = Buffer.alloc(length);\n buf.writeUIntBE(this.value, 0, length);\n return buf;\n }\n}\n\nexport class BitWriter2 {\n private _value = 0n;\n offset = 0n;\n\n /**\n * 各valueがオクテットを跨いではならない\n */\n constructor(\n /**Max 32bit */\n private bitLength: number,\n ) {\n if (bitLength > 32) {\n throw new Error();\n }\n }\n\n set(value: number, size: number = 1) {\n let value_b = BigInt(value);\n const size_b = BigInt(size);\n\n value_b &= (1n << size_b) - 1n;\n this._value |= value_b << (BigInt(this.bitLength) - size_b - this.offset);\n this.offset += size_b;\n return this;\n }\n\n get value() {\n return Number(this._value);\n }\n\n get buffer() {\n const length = Math.ceil(this.bitLength / 8);\n const buf = Buffer.alloc(length);\n buf.writeUIntBE(this.value, 0, length);\n return buf;\n }\n}\n\nexport function getBit(bits: number, startIndex: number, length: number = 1) {\n let bin = bits.toString(2).split(\"\");\n bin = [...Array(8 - bin.length).fill(\"0\"), ...bin];\n const s = bin.slice(startIndex, startIndex + length).join(\"\");\n const v = Number.parseInt(s, 2);\n return v;\n}\n\nexport function paddingByte(bits: number) {\n const dec = bits.toString(2).split(\"\");\n return [...[...Array(8 - dec.length)].map(() => \"0\"), ...dec].join(\"\");\n}\n\nexport function paddingBits(bits: number, expectLength: number) {\n const dec = bits.toString(2);\n return [...[...Array(expectLength - dec.length)].map(() => \"0\"), ...dec].join(\n \"\",\n );\n}\n\nexport function bufferWriter(bytes: number[], values: (number | bigint)[]) {\n return createBufferWriter(bytes)(values);\n}\n\nexport function createBufferWriter(bytes: number[], singleBuffer?: boolean) {\n const length = bytes.reduce((acc, cur) => acc + cur, 0);\n const reuseBuffer = singleBuffer ? Buffer.alloc(length) : undefined;\n\n return (values: (number | bigint)[]) => {\n const buf = reuseBuffer || Buffer.alloc(length);\n let offset = 0;\n\n values.forEach((v, i) => {\n const size = bytes[i];\n if (size === 8) buf.writeBigUInt64BE(v as bigint, offset);\n else buf.writeUIntBE(v as number, offset, size);\n offset += size;\n });\n return buf;\n };\n}\n\nexport function bufferWriterLE(bytes: number[], values: (number | bigint)[]) {\n const length = bytes.reduce((acc, cur) => acc + cur, 0);\n const buf = Buffer.alloc(length);\n let offset = 0;\n\n values.forEach((v, i) => {\n const size = bytes[i];\n if (size === 8) buf.writeBigUInt64LE(v as bigint, offset);\n else buf.writeUIntLE(v as number, offset, size);\n\n offset += size;\n });\n return buf;\n}\n\nexport function bufferReader(buf: Buffer, bytes: number[]) {\n let offset = 0;\n return bytes.map((v) => {\n let read: number | bigint;\n if (v === 8) {\n read = buf.readBigUInt64BE(offset);\n } else {\n read = buf.readUIntBE(offset, v);\n }\n\n offset += v;\n\n return read as any;\n });\n}\n\nexport class BufferChain {\n buffer: Buffer;\n\n constructor(size: number) {\n this.buffer = Buffer.alloc(size);\n }\n\n writeInt16BE(value: number, offset?: number | undefined) {\n this.buffer.writeInt16BE(value, offset);\n return this;\n }\n\n writeUInt8(value: number, offset?: number | undefined) {\n this.buffer.writeUInt8(value, offset);\n return this;\n }\n}\n\nexport const dumpBuffer = (data: Buffer) =>\n \"0x\" +\n data\n .toString(\"hex\")\n .replace(/(.)(.)/g, \"$1$2 \")\n .split(\" \")\n .filter((s) => s != undefined && s.length > 0)\n .join(\",0x\");\n\nexport function buffer2ArrayBuffer(buf: Buffer) {\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n}\n\nexport class BitStream {\n private position = 0;\n private bitsPending = 0;\n\n constructor(public uint8Array: Buffer) {}\n\n writeBits(bits: number, value: number): BitStream {\n if (bits == 0) {\n return this;\n }\n value &= 0xffffffff >>> (32 - bits);\n let bitsConsumed;\n if (this.bitsPending > 0) {\n if (this.bitsPending > bits) {\n this.uint8Array[this.position - 1] |=\n value << (this.bitsPending - bits);\n bitsConsumed = bits;\n this.bitsPending -= bits;\n } else if (this.bitsPending == bits) {\n this.uint8Array[this.position - 1] |= value;\n bitsConsumed = bits;\n this.bitsPending = 0;\n } else {\n this.uint8Array[this.position - 1] |=\n value >> (bits - this.bitsPending);\n // ???\n bitsConsumed = this.bitsPending;\n this.bitsPending = 0;\n }\n } else {\n bitsConsumed = Math.min(8, bits);\n this.bitsPending = 8 - bitsConsumed;\n this.uint8Array[this.position++] =\n (value >> (bits - bitsConsumed)) << this.bitsPending;\n }\n bits -= bitsConsumed;\n if (bits > 0) {\n this.writeBits(bits, value);\n }\n\n return this;\n }\n\n readBits(bits: number) {\n return this._readBits(bits);\n }\n\n private _readBits(bits: number, bitBuffer?: number): number {\n if (typeof bitBuffer == \"undefined\") {\n bitBuffer = 0;\n }\n if (bits == 0) {\n return bitBuffer;\n }\n let partial: number;\n let bitsConsumed: number;\n if (this.bitsPending > 0) {\n const byte =\n this.uint8Array[this.position - 1] & (0xff >> (8 - this.bitsPending));\n bitsConsumed = Math.min(this.bitsPending, bits);\n this.bitsPending -= bitsConsumed;\n partial = byte >> this.bitsPending;\n } else {\n bitsConsumed = Math.min(8, bits);\n this.bitsPending = 8 - bitsConsumed;\n partial = this.uint8Array[this.position++] >> this.bitsPending;\n }\n bits -= bitsConsumed;\n bitBuffer = (bitBuffer << bitsConsumed) | partial;\n return bits > 0 ? this._readBits(bits, bitBuffer) : bitBuffer;\n }\n\n seekTo(bitPos: number) {\n this.position = (bitPos / 8) | 0;\n this.bitsPending = bitPos % 8;\n if (this.bitsPending > 0) {\n this.bitsPending = 8 - this.bitsPending;\n this.position++;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../../../../common/src/binary.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\n\nexport function random16() {\n return randomBytes(2).readUInt16BE(0);\n}\n\nexport function random32() {\n return randomBytes(4).readUInt32BE(0);\n}\n\nexport function bufferXor(a: Buffer, b: Buffer): Buffer {\n if (a.length !== b.length) {\n throw new TypeError(\n \"[webrtc-stun] You can not XOR buffers which length are different\",\n );\n }\n\n const length = a.length;\n const buffer = Buffer.allocUnsafe(length);\n\n for (let i = 0; i < length; i++) {\n buffer[i] = a[i] ^ b[i];\n }\n\n return buffer;\n}\n\nexport function bufferArrayXor(arr: Buffer[]): Buffer {\n const length = [...arr]\n .sort((a, b) => a.length - b.length)\n .reverse()[0].length;\n const xored = Buffer.allocUnsafe(length);\n\n for (let i = 0; i < length; i++) {\n xored[i] = 0;\n arr.forEach((buffer) => {\n xored[i] ^= buffer[i] ?? 0;\n });\n }\n\n return xored;\n}\n\nexport class BitWriter {\n value = 0;\n\n constructor(private bitLength: number) {}\n\n set(size: number, startIndex: number, value: number) {\n value &= (1 << size) - 1;\n this.value |= value << (this.bitLength - size - startIndex);\n\n return this;\n }\n\n get buffer() {\n const length = Math.ceil(this.bitLength / 8);\n const buf = Buffer.alloc(length);\n buf.writeUIntBE(this.value, 0, length);\n return buf;\n }\n}\n\nexport class BitWriter2 {\n private _value = 0n;\n offset = 0n;\n\n /**\n * 各valueがオクテットを跨いではならない\n */\n constructor(\n /**Max 32bit */\n private bitLength: number,\n ) {\n if (bitLength > 32) {\n throw new Error();\n }\n }\n\n set(value: number, size: number = 1) {\n let value_b = BigInt(value);\n const size_b = BigInt(size);\n\n value_b &= (1n << size_b) - 1n;\n this._value |= value_b << (BigInt(this.bitLength) - size_b - this.offset);\n this.offset += size_b;\n return this;\n }\n\n get value() {\n return Number(this._value);\n }\n\n get buffer() {\n const length = Math.ceil(this.bitLength / 8);\n const buf = Buffer.alloc(length);\n buf.writeUIntBE(this.value, 0, length);\n return buf;\n }\n}\n\nexport function getBit(bits: number, startIndex: number, length: number = 1) {\n let bin = bits.toString(2).split(\"\");\n bin = [...Array(8 - bin.length).fill(\"0\"), ...bin];\n const s = bin.slice(startIndex, startIndex + length).join(\"\");\n const v = Number.parseInt(s, 2);\n return v;\n}\n\nexport function paddingByte(bits: number) {\n const dec = bits.toString(2).split(\"\");\n return [...[...Array(8 - dec.length)].map(() => \"0\"), ...dec].join(\"\");\n}\n\nexport function paddingBits(bits: number, expectLength: number) {\n const dec = bits.toString(2);\n return [...[...Array(expectLength - dec.length)].map(() => \"0\"), ...dec].join(\n \"\",\n );\n}\n\nexport function bufferWriter(bytes: number[], values: (number | bigint)[]) {\n return createBufferWriter(bytes)(values);\n}\n\nexport function createBufferWriter(bytes: number[], singleBuffer?: boolean) {\n const length = bytes.reduce((acc, cur) => acc + cur, 0);\n const reuseBuffer = singleBuffer ? Buffer.alloc(length) : undefined;\n\n return (values: (number | bigint)[]) => {\n const buf = reuseBuffer || Buffer.alloc(length);\n let offset = 0;\n\n values.forEach((v, i) => {\n const size = bytes[i];\n if (size === 8) buf.writeBigUInt64BE(v as bigint, offset);\n else buf.writeUIntBE(v as number, offset, size);\n offset += size;\n });\n return buf;\n };\n}\n\nexport function bufferWriterLE(bytes: number[], values: (number | bigint)[]) {\n const length = bytes.reduce((acc, cur) => acc + cur, 0);\n const buf = Buffer.alloc(length);\n let offset = 0;\n\n values.forEach((v, i) => {\n const size = bytes[i];\n if (size === 8) buf.writeBigUInt64LE(v as bigint, offset);\n else buf.writeUIntLE(v as number, offset, size);\n\n offset += size;\n });\n return buf;\n}\n\nexport function bufferReader(buf: Buffer, bytes: number[]) {\n let offset = 0;\n return bytes.map((v) => {\n let read: number | bigint;\n if (v === 8) {\n read = buf.readBigUInt64BE(offset);\n } else {\n read = buf.readUIntBE(offset, v);\n }\n\n offset += v;\n\n return read as any;\n });\n}\n\nexport class BufferChain {\n buffer: Buffer;\n\n constructor(size: number) {\n this.buffer = Buffer.alloc(size);\n }\n\n writeInt16BE(value: number, offset?: number | undefined) {\n this.buffer.writeInt16BE(value, offset);\n return this;\n }\n\n writeUInt8(value: number, offset?: number | undefined) {\n this.buffer.writeUInt8(value, offset);\n return this;\n }\n}\n\nexport const dumpBuffer = (data: Buffer) =>\n \"0x\" +\n data\n .toString(\"hex\")\n .replace(/(.)(.)/g, \"$1$2 \")\n .split(\" \")\n .filter((s) => s != undefined && s.length > 0)\n .join(\",0x\");\n\nexport function buffer2ArrayBuffer(buf: Buffer) {\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n}\n\nexport class BitStream {\n private position = 0;\n private bitsPending = 0;\n\n constructor(public uint8Array: Buffer) {}\n\n writeBits(bits: number, value: number): BitStream {\n if (bits == 0) {\n return this;\n }\n value &= 0xffffffff >>> (32 - bits);\n let bitsConsumed;\n if (this.bitsPending > 0) {\n if (this.bitsPending > bits) {\n this.uint8Array[this.position - 1] |=\n value << (this.bitsPending - bits);\n bitsConsumed = bits;\n this.bitsPending -= bits;\n } else if (this.bitsPending == bits) {\n this.uint8Array[this.position - 1] |= value;\n bitsConsumed = bits;\n this.bitsPending = 0;\n } else {\n this.uint8Array[this.position - 1] |=\n value >> (bits - this.bitsPending);\n // ???\n bitsConsumed = this.bitsPending;\n this.bitsPending = 0;\n }\n } else {\n bitsConsumed = Math.min(8, bits);\n this.bitsPending = 8 - bitsConsumed;\n this.uint8Array[this.position++] =\n (value >> (bits - bitsConsumed)) << this.bitsPending;\n }\n bits -= bitsConsumed;\n if (bits > 0) {\n this.writeBits(bits, value);\n }\n\n return this;\n }\n\n readBits(bits: number) {\n return this._readBits(bits);\n }\n\n private _readBits(bits: number, bitBuffer?: number): number {\n if (typeof bitBuffer == \"undefined\") {\n bitBuffer = 0;\n }\n if (bits == 0) {\n return bitBuffer;\n }\n let partial: number;\n let bitsConsumed: number;\n if (this.bitsPending > 0) {\n const byte =\n this.uint8Array[this.position - 1] & (0xff >> (8 - this.bitsPending));\n bitsConsumed = Math.min(this.bitsPending, bits);\n this.bitsPending -= bitsConsumed;\n partial = byte >> this.bitsPending;\n } else {\n bitsConsumed = Math.min(8, bits);\n this.bitsPending = 8 - bitsConsumed;\n partial = this.uint8Array[this.position++] >> this.bitsPending;\n }\n bits -= bitsConsumed;\n bitBuffer = (bitBuffer << bitsConsumed) | partial;\n return bits > 0 ? this._readBits(bits, bitBuffer) : bitBuffer;\n }\n\n seekTo(bitPos: number) {\n this.position = (bitPos / 8) | 0;\n this.bitsPending = bitPos % 8;\n if (this.bitsPending > 0) {\n this.bitsPending = 8 - this.bitsPending;\n this.position++;\n }\n }\n}\n"]}
|
package/lib/ice/src/ice.js
CHANGED
|
@@ -32,16 +32,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
36
|
exports.Connection = void 0;
|
|
40
37
|
const crypto_1 = require("crypto");
|
|
41
38
|
const net_1 = require("net");
|
|
42
|
-
const Int64 = __importStar(require("int64-buffer"));
|
|
43
39
|
const timers = __importStar(require("node:timers/promises"));
|
|
44
|
-
const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
|
|
45
40
|
const common_1 = require("./imports/common");
|
|
46
41
|
const candidate_1 = require("./candidate");
|
|
47
42
|
const lookup_1 = require("./dns/lookup");
|
|
@@ -150,7 +145,7 @@ class Connection {
|
|
|
150
145
|
enumerable: true,
|
|
151
146
|
configurable: true,
|
|
152
147
|
writable: true,
|
|
153
|
-
value:
|
|
148
|
+
value: (0, crypto_1.randomBytes)(8).readBigUInt64BE(0)
|
|
154
149
|
});
|
|
155
150
|
Object.defineProperty(this, "state", {
|
|
156
151
|
enumerable: true,
|
|
@@ -421,7 +416,8 @@ class Connection {
|
|
|
421
416
|
}
|
|
422
417
|
}
|
|
423
418
|
// # check remote address matches
|
|
424
|
-
if (
|
|
419
|
+
if (result.addr[0] !== pair.remoteAddr[0] ||
|
|
420
|
+
result.addr[1] !== pair.remoteAddr[1]) {
|
|
425
421
|
pair.updateState(iceBase_1.CandidatePairState.FAILED);
|
|
426
422
|
this.checkComplete(pair);
|
|
427
423
|
r();
|
|
@@ -1013,8 +1009,7 @@ class Connection {
|
|
|
1013
1009
|
(0, iceBase_1.sortCandidatePairs)(this.checkList, this.iceControlling);
|
|
1014
1010
|
}
|
|
1015
1011
|
findPair(protocol, remoteCandidate) {
|
|
1016
|
-
const pair = this.checkList.find((pair) =>
|
|
1017
|
-
(0, fast_deep_equal_1.default)(pair.remoteCandidate, remoteCandidate));
|
|
1012
|
+
const pair = this.checkList.find((pair) => pair.protocol === protocol && pair.remoteCandidate === remoteCandidate);
|
|
1018
1013
|
return pair;
|
|
1019
1014
|
}
|
|
1020
1015
|
switchRole(iceControlling) {
|
package/lib/ice/src/ice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../ice/src/ice.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAqC;AACrC,6BAA6B;AAE7B,oDAAsC;AAEtC,6DAA+C;AAC/C,sEAAsC;AACtC,6CAA8D;AAE9D,2CAKqB;AACrB,yCAA0C;AAE1C,qCAA6E;AAC7E,uCAemB;AACnB,wCAAgD;AAChD,4CAAyC;AACzC,8CAA+C;AAC/C,oDAA2E;AAC3E,8CAA2D;AAE3D,mCAA2C;AAE3C,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,4CAA4C,CAAC,CAAC;AAEhE,MAAa,UAAU;IAqCrB,YACU,eAAwB,EAChC,OAA6B;QAD7B;;;;mBAAQ,eAAe;WAAS;QArClC;;;;mBAAgB,IAAA,qBAAY,EAAC,CAAC,CAAC;WAAC;QAChC;;;;mBAAgB,IAAA,qBAAY,EAAC,EAAE,CAAC;WAAC;QACjC;;;;mBAAe,KAAK;WAAC;QACrB;;;;mBAAyB,EAAE;WAAC;QAC5B;;;;mBAAyB,EAAE;WAAC;QAC5B;;;;mBAA6B,EAAE;WAAC;QAChC;;;;mBAA+B,EAAE;WAAC;QAClC;;;;;WAAqB;QACrB;;;;;WAAqB;QACrB;;;;;WAAoB;QACpB;;;;mBAAsB,KAAK;WAAC;QAC5B;;;;mBAAqB,KAAK;WAAC;QAC3B;;;;mBAAa,CAAC,CAAC;WAAC;QAChB;;;;mBAA8C,EAAE;WAAC;QAChC;;;;mBAAqB,MAAM,CAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAC/C;WAAC;QACF;;;;mBAAkB,KAAK;WAAC;QACxB;;;;;WAAoB;QAEZ;;;;mBAAiC,EAAE;WAAC;QAC5C,gBAAgB;QAChB;;;;;WAA0B;QAClB;;;;mBAAa,KAAK;WAAC;QACnB;;;;mBAAgB,KAAK;WAAC;QACtB;;;;mBAAiB,IAAI,eAAM,EAAU;WAAC;QACtC;;;;mBAA8C,EAAE;WAAC;QACjD;;;;mBAAkB,KAAK;WAAC;QACxB;;;;mBAAuB,KAAK;WAAC;QAC7B;;;;mBAAwB,EAAE;WAAC;QAC3B;;;;;WAAsC;QAErC;;;;mBAAS,IAAI,cAAK,EAAY;WAAC;QAC/B;;;;mBAAe,IAAI,cAAK,EAAc;WAAC;QACvC;;;;mBAAqC,IAAI,cAAK,EAAE;WAAC;QA4mB1D,4BAA4B;QACpB;;;;mBAAe,GAAG,EAAE;gBAC1B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC5B,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBACpC,CAAC;gBAED,IAAI,CAAC,kBAAkB,GAAG,IAAA,mBAAU,EAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;oBAC7D,IAAI,QAAQ,GAAG,CAAC,CAAC;oBACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;oBAErB,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;oBAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;wBACjB,QAAQ,GAAG,IAAI,CAAC;wBAChB,QAAQ,IAAI,0BAAgB,CAAC;wBAC7B,WAAW,CAAC,KAAK,EAAE,CAAC;wBACpB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;oBACtC,CAAC,CAAC,CAAC;oBAEH,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;oBAE/D,MAAM;oBACN,yCAAyC;oBACzC,MAAM;oBAEN,IAAI,CAAC;wBACH,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;4BAC5C,yDAAyD;4BACzD,MAAM,MAAM,CAAC,UAAU,CACrB,0BAAgB,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EACrD,SAAS,EACT,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAC/B,CAAC;4BAEF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;4BACjC,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC;gCAC3B,MAAM;4BACR,CAAC;4BAED,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;gCAChC,QAAQ,EAAE,KAAK;gCACf,aAAa;gCACb,cAAc;gCACd,cAAc;gCACd,cAAc,EAAE,SAAS,CAAC,cAAc;6BACzC,CAAC,CAAC;4BACH,IAAI,CAAC;gCACH,SAAS,CAAC,mBAAmB,EAAE,CAAC;gCAChC,SAAS,CAAC,YAAY,EAAE,CAAC;gCACzB,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,CAC9B,OAAO,EACP,SAAS,CAAC,UAAU,EACpB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACxC,CAAC,EACD,CAAC,OAAO,EAAE,EAAE;oCACV,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;wCAChB,SAAS,CAAC,mBAAmB,EAAE,CAAC;oCAClC,CAAC;gCACH,CAAC,CACF,CAAC;gCACF,SAAS,CAAC,iBAAiB,EAAE,CAAC;gCAC9B,QAAQ,GAAG,CAAC,CAAC;gCACb,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;oCAClC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gCAC7B,CAAC;4BACH,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,IAAI,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC;oCACxC,GAAG,CAAC,kBAAkB,CAAC,CAAC;oCACxB,QAAQ,EAAE,CAAC;oCACX,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;oCAC9B,MAAM;gCACR,CAAC;4BACH,CAAC;4BACD,IAAI,QAAQ,IAAI,0BAAgB,EAAE,CAAC;gCACjC,GAAG,CAAC,yBAAyB,CAAC,CAAC;gCAC/B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;gCACpC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gCACxB,MAAM;4BACR,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;gBACpB,CAAC,CAAC,CAAC;YACL,CAAC;WAAC;QA+EF;;;;mBAAO,KAAK,EAAE,IAAY,EAAE,EAAE;gBAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;gBAClC,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;oBAEhE,oBAAoB;oBACpB,UAAU,CAAC,WAAW,EAAE,CAAC;oBACzB,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;gBACtC,CAAC;qBAAM,CAAC;oBACN,8CAA8C;oBAC9C,OAAO;gBACT,CAAC;YACH,CAAC;WAAC;QA6IF,0BAA0B;QAC1B;;;;mBAAa,CAAC,IAAmB,EAAE,EAAE,CACnC,IAAA,mBAAU,EAAO,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC3B,MAAM;gBACN,kBAAkB;gBAClB,MAAM;gBAEN,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAElC,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,WAAW,CAAC,CAAC;gBACjD,MAAM,MAAM,GAA2C,EAAE,CAAC;gBAC1D,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;gBAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC;gBAEtE,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;oBAChC,QAAQ;oBACR,aAAa;oBACb,cAAc;oBACd,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,cAAc,EAAE,IAAI,CAAC,cAAc;iBACpC,CAAC,CAAC;gBAEH,wCAAwC;gBACxC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAEpC,IAAI,CAAC;oBACH,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAClD,OAAO,EACP,IAAI,CAAC,UAAU,EACf,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACnC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7D,CAAC,OAAO,EAAE,EAAE;wBACV,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;4BAChB,IAAI,CAAC,mBAAmB,EAAE,CAAC;wBAC7B,CAAC;oBACH,CAAC,CACF,CAAC;oBACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAEzB,gBAAgB;oBAChB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;oBAClC,MAAM,GAAG,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,qBAAqB;oBAE/D,wBAAwB;oBACxB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;oBACf,IAAI,CAAC,kBAAkB,IAAI,GAAG,CAAC;oBAC/B,IAAI,CAAC,yBAAyB,EAAE,CAAC;oBAEjC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE;wBAClE,aAAa;wBACb,cAAc;wBACd,cAAc;wBACd,UAAU;wBACV,GAAG;qBACJ,CAAC,CAAC;oBACH,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;oBAC3B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;gBACrB,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,MAAM,GAAG,GAAqB,KAAK,CAAC;oBACpC,0BAA0B;oBAC1B,GAAG,CACD,cAAc,EACd,OAAO,CAAC,MAAM,EAAE,EAChB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EACrE;wBACE,aAAa;wBACb,cAAc;wBACd,cAAc;wBACd,UAAU;qBACX,EACD,IAAI,CAAC,UAAU,CAChB,CAAC;oBACF,IAAI,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wBAC7D,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;4BACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;wBACxB,CAAC;6BAAM,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;4BAC9D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;wBACzB,CAAC;wBACD,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;wBACtC,CAAC,EAAE,CAAC;wBACJ,OAAO;oBACT,CAAC;oBACD,IAAI,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wBAC7D,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;wBAChC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;wBACtC,CAAC,EAAE,CAAC;wBACJ,OAAO;oBACT,CAAC;yBAAM,CAAC;wBACN,UAAU;wBACV,GAAG,CAAC,sCAAsC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;wBAC3D,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,MAAM,CAAC,CAAC;wBAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;wBACzB,CAAC,EAAE,CAAC;wBACJ,OAAO;oBACT,CAAC;gBACH,CAAC;gBAED,iCAAiC;gBACjC,IAAI,CAAC,IAAA,yBAAO,EAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC3C,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,MAAM,CAAC,CAAC;oBAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBACzB,CAAC,EAAE,CAAC;oBACJ,OAAO;gBACT,CAAC;gBAED,YAAY;gBACZ,IAAI,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrC,0DAA0D;oBAC1D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACxB,CAAC;qBAAM,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnD,+BAA+B;oBAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;oBACvB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;wBAChC,QAAQ,EAAE,IAAI;wBACd,aAAa;wBACb,cAAc;wBACd,cAAc,EAAE,IAAI,CAAC,cAAc;wBACnC,cAAc,EAAE,IAAI,CAAC,cAAc;qBACpC,CAAC,CAAC;oBACH,IAAI,CAAC;wBACH,IAAI,CAAC,YAAY,EAAE,CAAC;wBACpB,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CACzB,OAAO,EACP,IAAI,CAAC,UAAU,EACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACxC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7D,CAAC,OAAO,EAAE,EAAE;4BACV,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gCAChB,IAAI,CAAC,mBAAmB,EAAE,CAAC;4BAC7B,CAAC;wBACH,CAAC,CACF,CAAC;wBACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC3B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,MAAM,CAAC,CAAC;wBAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;wBACzB,OAAO;oBACT,CAAC;oBACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACxB,CAAC;gBAED,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,SAAS,CAAC,CAAC;gBAC/C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC,EAAE,CAAC;YACN,CAAC,CAAC;WAAC;QAsIG;;;;mBAAsB,CAAC,eAA0B,EAAE,EAAE;gBAC3D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACtC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;WAAC;QA9rCA,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,wBAAc;YACjB,GAAG,OAAO;SACX,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC;QACD,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAChD,IAAI,CAAC,UAAU,GAAG,IAAA,yBAAe,EAAC,UAAU,CAAC,IAAI;YAC/C,mBAAmB;YACnB,KAAK;SACN,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAA,yBAAe,EAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAI,cAAc,CAAC,KAAc;QAC/B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,CAAC,aAAa,GAAG,IAAA,qBAAY,EAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,IAAA,qBAAY,EAAC,EAAE,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa;gBAChB,IAAI,CAAC,OAAO,CAAC,mBAAmB;oBAChC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAE1D,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,eAAM,EAAU,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAElC,6CAA6C;QAC7C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;gBAC5B,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;gBACpC,QAAQ,CAAC,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;gBACrD,QAAQ,CAAC,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;YACrD,CAAC;QACH,CAAC;QAED,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACtC,CAAC;IAED,kBAAkB;QAChB,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,eAAe,CAAC,EACd,OAAO,EACP,gBAAgB,EAChB,QAAQ,GAKT;QACC,GAAG,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IACjC,CAAC;IAED,6BAA6B;IAC7B,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YAEjC,IAAI,OAAO,GAAG,IAAA,wBAAgB,EAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,EACpB,IAAI,CAAC,OAAO,CAAC,OAAO,EACpB;gBACE,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB;aACtD,CACF,CAAC;YACF,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAC5C,IAAI,kBAAkB,EAAE,CAAC;gBACvB,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CACjD,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClD,CAAC;gBACF,IAAI,iBAAiB,CAAC,MAAM,EAAE,CAAC;oBAC7B,OAAO,GAAG,iBAAiB,CAAC;gBAC9B,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;gBACzC,OAAO,GAAG,KAAK,CAAC,IAAI,CAClB,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,OAAO,CAAC,CAAC,CAC/D,CAAC;YACJ,CAAC;YAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAChE,MAAM,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAE5C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAEO,oBAAoB,CAAC,SAAoB;QAC/C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAEO,cAAc,CAAC,QAAkB;QACvC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACvD,IAAI,GAAG,CAAC,aAAa,KAAK,eAAO,CAAC,OAAO,EAAE,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YAED,MAAM,UAAU,GAAG,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACrD,6BAA6B;YAC7B,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACvE,MAAM,aAAa,GACjB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC;YAExD,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;YAEhC,mDAAmD;YACnD,IAAI,cAAc,IAAI,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACrE,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAChE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;oBAC/D,OAAO;gBACT,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;iBAAM,IACL,CAAC,cAAc;gBACf,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAC7C,CAAC;gBACD,IACE,IAAI,CAAC,OAAO;oBACZ,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EACzD,CAAC;oBACD,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;oBAC/D,OAAO;gBACT,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACtB,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IACE,IAAI,CAAC,OAAO,CAAC,kBAAkB;gBAC/B,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,EACrD,CAAC;gBACD,OAAO;YACT,CAAC;YAED,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,IAAI,iBAAO,CAC1B,eAAO,CAAC,OAAO,EACf,eAAO,CAAC,QAAQ,EAChB,GAAG,CAAC,aAAa,CAClB,CAAC;YAEF,QAAQ;iBACL,YAAY,CAAC,oBAAoB,EAAE,IAAI,CAAC;iBACxC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;iBACvD,cAAc,EAAE,CAAC;YACpB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC5C,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACzC,IAAI,CAAC;gBACH,2CAA2C;gBAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;gBAClC,IAAI,UAAU,IAAI,UAAU,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACnD,UAAU,CAAC,eAAe,EAAE,CAAC;oBAC7B,UAAU,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC;gBAC1C,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,oBAAoB,CAAC,SAAmB,EAAE,OAAO,GAAG,CAAC;QAC3D,MAAM,iBAAiB,GAAuB,EAAE,CAAC;QACjD,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QACxC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,eAAe,GACnB,CAAC,aAAa;YACd,IAAI,CAAC,OAAO,CAAC,SAAS;YACtB,UAAU;YACV,YAAY;YACZ,YAAY,CAAC;QAEf,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YACvC,+BAA+B;YAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;gBACpE,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,eAAe;YACvC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC9B,qBAAqB;gBACrB,MAAM,QAAQ,GAAG,IAAI,uBAAY,EAAE,CAAC;gBACpC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,QAAQ,CAAC,cAAc,CAC3B,IAAA,YAAM,EAAC,OAAO,CAAC,EACf,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAChC,CAAC;oBAEF,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;oBAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAE9B,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAElC,uBAAuB;oBACvB,MAAM,gBAAgB,GAAY;wBAChC,OAAO;wBACP,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;qBAC3B,CAAC;oBAEF,QAAQ,CAAC,cAAc,GAAG,IAAI,qBAAS,CACrC,IAAA,+BAAmB,EAAC,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,EACvD,CAAC,EACD,KAAK,EACL,IAAA,6BAAiB,EAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAC/C,gBAAgB,CAAC,CAAC,CAAC,EACnB,gBAAgB,CAAC,CAAC,CAAC,EACnB,MAAM,EACN,SAAS,EACT,SAAS,EACT,SAAS,EACT,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,aAAa,CACnB,CAAC;oBAEF,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;oBACjC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;oBAEnD,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC,CAAC,CAAC;QAEP,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,iBAAiB,CAAC,IAAI,CACpB,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CACxC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAC1D,CACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,oBAAoB,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC3D,MAAM,eAAe,GAAG,IAAI,gCAAkB,EAAE,CAAC;gBACjD,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;gBACrC,MAAM,eAAe,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACtE,eAAe,CAAC,OAAO,GAAG,OAAO,CAAC;gBAClC,eAAe,CAAC,cAAc,GAAG,IAAI,qBAAS,CAC5C,IAAA,+BAAmB,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAC3C,CAAC,EACD,KAAK,EACL,IAAA,6BAAiB,EAAC,MAAM,EAAE;oBACxB,SAAS,EAAE,KAAK;oBAChB,OAAO,EAAE,SAAS;iBACnB,CAAC,EACF,OAAO,EACP,eAAe,CAAC,aAAa,EAC7B,MAAM,EACN,SAAS,EACT,SAAS,EACT,SAAS,EACT,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,aAAa,CACnB,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACrC,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;gBAE1D,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,MAAM,cAAc,GAAG,IAAI,+BAAiB,EAAE,CAAC;oBAC/C,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;oBACpC,MAAM,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;oBAC7C,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC;oBACjC,cAAc,CAAC,cAAc,GAAG,IAAI,qBAAS,CAC3C,IAAA,+BAAmB,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAC3C,CAAC,EACD,KAAK,EACL,IAAA,6BAAiB,EAAC,MAAM,EAAE;wBACxB,SAAS,EAAE,KAAK;wBAChB,OAAO,EAAE,QAAQ;qBAClB,CAAC,EACF,OAAO,EACP,CAAC,EACD,MAAM,EACN,SAAS,EACT,SAAS,EACT,QAAQ,EACR,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,aAAa,CACnB,CAAC;oBACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBACpC,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;oBACvC,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,iBAAiB,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,aAAa,IAAI,CAAC,eAAe,IAAI,UAAU,EAAE,CAAC;YACrD,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,GAAG,CACjD,KAAK,EAAE,eAAe,EAAE,EAAE;gBACxB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;gBACvC,IAAI,CAAC,QAAQ;oBAAE,OAAO;gBAEtB,MAAM,oBAAoB,GAAG,IAAI,OAAO,CACtC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;oBACb,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;oBAC5C,IACE,QAAQ,CAAC,cAAc,EAAE,IAAI;wBAC7B,IAAA,YAAM,EAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,EACrC,CAAC;wBACD,MAAM,SAAS,GAAG,MAAM,IAAA,kCAAwB,EAC9C,QAAQ,EACR,UAAU,CACX,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;4BAChB,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;wBACtB,CAAC,CAAC,CAAC;wBACH,IAAI,SAAS,EAAE,CAAC;4BACd,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;wBACvC,CAAC;wBAED,YAAY,CAAC,KAAK,CAAC,CAAC;wBACpB,CAAC,CAAC,SAAS,CAAC,CAAC;oBACf,CAAC;yBAAM,CAAC;wBACN,YAAY,CAAC,KAAK,CAAC,CAAC;wBACpB,CAAC,EAAE,CAAC;oBACN,CAAC;gBACH,CAAC,CACF,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBAChB,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;gBAClC,CAAC,CAAC,CAAC;gBAEH,OAAO,oBAAoB,CAAC;YAC9B,CAAC,CACF,CAAC;YAEF,iBAAiB,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,aAAa,IAAI,UAAU,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;YACjE,MAAM,oBAAoB,GAAG,CAAC,KAAK,IAAI,EAAE;gBACvC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;gBAC1D,MAAM,QAAQ,GAAG,MAAM,IAAA,mCAAwB,EAC7C;oBACE,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,YAAY;oBACtB,QAAQ,EAAE,YAAY;iBACvB,EACD;oBACE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;oBACjC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB;oBACnD,SAAS,EAAE,aAAa;oBACxB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;iBACxC,CACF,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oBAClB,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;wBAC5B,OAAO,MAAM,IAAA,mCAAwB,EACnC;4BACE,OAAO,EAAE,UAAU;4BACnB,QAAQ,EAAE,YAAY;4BACtB,QAAQ,EAAE,YAAY;yBACvB,EACD;4BACE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;4BACjC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB;4BACnD,SAAS,EAAE,KAAK;yBACjB,CACF,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,CAAC;oBACV,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE9B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;gBACtD,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;gBAEnD,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;gBAE/C,QAAQ,CAAC,cAAc,GAAG,IAAI,qBAAS,CACrC,IAAA,+BAAmB,EAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,EACxD,CAAC,EACD,KAAK,EACL,IAAA,6BAAiB,EAAC,OAAO,CAAC,EAC1B,gBAAgB,CAAC,CAAC,CAAC,EACnB,gBAAgB,CAAC,CAAC,CAAC,EACnB,OAAO,EACP,cAAc,CAAC,CAAC,CAAC,EACjB,cAAc,CAAC,CAAC,CAAC,EACjB,SAAS,EACT,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,aAAa,CACnB,CAAC;gBACF,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;gBAEnD,OAAO,QAAQ,CAAC,cAAc,CAAC;YACjC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACnB,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM;QACN,yBAAyB;QACzB,EAAE;QACF,wEAAwE;QACxE,qCAAqC;QACrC,MAAM;QACN,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,mCAAmC;QACnC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAED,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAChE,wBAAwB;QACxB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,GAAG,GAAW,oBAAU,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACtD,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;oBACtC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;oBAC3B,IAAI,GAAG,KAAK,uBAAa,EAAE,CAAC;wBAC1B,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,IAAI,GAAG,KAAK,uBAAa,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC7C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,0BAA0B;QAC1B,SAAS,CAAC;YACR,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAAE,MAAM;YACnC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAAE,MAAM;YACpC,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC;QAED,wBAAwB;QACxB,IAAI,GAAG,GAAW,oBAAU,CAAC;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,KAAK,oBAAU,EAAE,CAAC;YACvD,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;YACtC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QAED,4BAA4B;QAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,GAAG,KAAK,uBAAa,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,kCAAkC;QAClC,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAEO,eAAe;QACrB,gDAAgD;QAChD,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,SAAS,CAAC,KAAK,KAAK,4BAAkB,CAAC,MAAM,EAAE,CAAC;YAClD,SAAS,CAAC,WAAW,CAAC,4BAAkB,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,iEAAiE;QACjE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,IACE,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS;gBACtC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;gBACpD,IAAI,CAAC,KAAK,KAAK,4BAAkB,CAAC,MAAM,EACxC,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,OAAO,CAAC,CAAC;gBAC7C,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED,wBAAwB;IAChB,gBAAgB;QACtB,iBAAiB;QACjB,CAAC;YACC,gEAAgE;YAChE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS;iBACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBACf,IACE,IAAI,CAAC,OAAO,CAAC,SAAS;oBACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,uBAAY,CAAC,IAAI;oBAExC,OAAO,KAAK,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,4BAAkB,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,CAAC;YACC,+DAA+D;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,4BAAkB,CAAC,MAAM,CACnD,CAAC;YACF,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;QAC7B,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAwFD,KAAK,CAAC,KAAK;QACT,MAAM;QACN,wBAAwB;QACxB,MAAM;QAEN,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAExB,iCAAiC;QACjC,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAAC;QAErC,oBAAoB;QACpB,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChB,CAAC,CAAC,oBAAU,CAAC,CAAC;YAChB,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAE1B,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IAEO,QAAQ,CAAC,KAAe;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,eAAsC;QAC7D,MAAM;QACN,sDAAsD;QAEtD,4CAA4C;QAE5C,oEAAoE;QACpE,MAAM;QAEN,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAU,EAAE,CAAC;gBACjC,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC5D,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,IAAA,iCAAuB,EAAC,eAAe,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,GAAG,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAE7C,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;QAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAgBD,mBAAmB;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAClC,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,gBAAgB;IAChB,IAAI,gBAAgB,CAAC,KAAkB;QACrC,IAAI,IAAI,CAAC,mBAAmB;YAC1B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,KAAK,MAAM,eAAe,IAAI,KAAK,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,IAAA,iCAAuB,EAAC,eAAe,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAClC,CAAC;IACD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEO,aAAa;QACnB,IAAA,4BAAkB,EAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAEO,QAAQ,CAAC,QAAkB,EAAE,eAA0B;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC9B,CAAC,IAAI,EAAE,EAAE,CACP,IAAA,yBAAO,EAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAChC,IAAA,yBAAO,EAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CACjD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,cAAuB;QACxC,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,aAAa,CAAC,IAAmB;QACvC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,IAAI,CAAC,KAAK,KAAK,4BAAkB,CAAC,SAAS,EAAE,CAAC;YAChD,8BAA8B;YAE9B,0DAA0D;YAC1D,sEAAsE;YACtE,mEAAmE;YACnE,mEAAmE;YACnE,IACE,IAAI,CAAC,SAAS;gBACd,qEAAqE;gBACrE,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,IAAI,SAAS;oBAC3C,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU;oBACrD,CAAC,CAAC,IAAI,CAAC;gBACT,IAAI,CAAC,SAAS,IAAI,SAAS,EAC3B,CAAC;gBACD,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAE/B,0BAA0B;gBAE1B,kEAAkE;gBAClE,+DAA+D;gBAC/D,yCAAyC;gBACzC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC/B,IACE,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;wBAC9B,CAAC,4BAAkB,CAAC,OAAO,EAAE,4BAAkB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAC9D,CAAC,CAAC,KAAK,CACR,EACD,CAAC;wBACD,CAAC,CAAC,WAAW,CAAC,4BAAkB,CAAC,MAAM,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC;YAED,kEAAkE;YAClE,oEAAoE;YACpE,yBAAyB;YACzB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACxB,GAAG,CAAC,eAAe,CAAC,CAAC;oBACrB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAa,CAAC,CAAC,CAAC,CAAC;oBAC9D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC5B,CAAC;gBACD,OAAO;YACT,CAAC;YAED,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAEpC,mCAAmC;YACnC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC/B,IACE,CAAC,CAAC,cAAc,CAAC,UAAU,KAAK,IAAI,CAAC,cAAc,CAAC,UAAU;oBAC9D,CAAC,CAAC,KAAK,KAAK,4BAAkB,CAAC,MAAM,EACrC,CAAC;oBACD,CAAC,CAAC,WAAW,CAAC,4BAAkB,CAAC,OAAO,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAED,CAAC;YACC,MAAM,IAAI,GAAG,CAAC,4BAAkB,CAAC,SAAS,EAAE,4BAAkB,CAAC,MAAM,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC9D,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,4BAAkB,CAAC,SAAS,CAAC;YAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;gBACzD,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,GAAG,CAAC,YAAY,CAAC,CAAC;YAClB,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChB,CAAC,CAAC,oBAAU,CAAC,CAAC;YAChB,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAsJO,OAAO,CAAC,IAAmB;QACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,+BAA+B;IAC/B,6BAA6B;IAC7B,aAAa,CAAC,OAAgB,EAAE,IAAa,EAAE,QAAkB;QAC/D,MAAM;QACN,sCAAsC;QACtC,MAAM;QAEN,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAEvE,wBAAwB;QACxB,IAAI,eAAsC,CAAC;QAC3C,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvC,eAAe,GAAG,CAAC,CAAC;gBACpB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,+CAA+C;YAC/C,eAAe,GAAG,IAAI,qBAAS,CAC7B,IAAA,qBAAY,EAAC,EAAE,CAAC,EAChB,CAAC,EACD,QAAQ,CAAC,cAAc,EAAE,SAAS,IAAI,KAAK,EAC3C,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,EACrC,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,cAAc,EAAE,SAAS,KAAK,KAAK;gBAC1C,CAAC,CAAC,IAAA,oCAAwB,EAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC;gBAC3D,CAAC,CAAC,SAAS,EACb,SAAS,EACT,SAAS,CACV,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/C,CAAC;QAED,YAAY;QACZ,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,uBAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACzE,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACnD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,aAAa,CAAC;QAE1C,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;YACvD,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IACE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAChD,CAAC,IAAI,CAAC,cAAc,EACpB,CAAC;gBACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,SAAS,CAAC,CAAC;gBAC/C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO;QACT,CAAC;QAED,6BAA6B;QAC7B,IACE,CAAC,4BAAkB,CAAC,OAAO,EAAE,4BAAkB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAC9D,IAAI,CAAC,KAAK,CACX,EACD,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,uCAAuC;QACvC,IACE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC;YAChD,CAAC,IAAI,CAAC,cAAc,EACpB,CAAC;YACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,4BAAkB,CAAC,SAAS,EAAE,CAAC;gBAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,QAAkB,EAAE,eAA0B;QAC5D,IACE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,eAAe,CAAC;YACrD,CAAC,CACC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,KAAK;gBACzD,QAAQ,CAAC,cAAc,CAAC,OAAO,KAAK,SAAS;gBAC7C,eAAe,CAAC,IAAI,KAAK,OAAO,CACjC;YACD,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,EACzC,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,uBAAa,CAC5B,QAAQ,EACR,eAAe,EACf,IAAI,CAAC,cAAc,CACpB,CAAC;YACF,IACE,IAAI,CAAC,OAAO,CAAC,mBAAmB;gBAChC,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,EACvC,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,QAAkB;QAC1C,KAAK,MAAM,eAAe,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAQO,YAAY,CAAC,EACnB,QAAQ,EACR,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,GAOf;QACC,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,eAAO,CAAC,OAAO,EAAE,eAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,YAAY,CACvD,UAAU,EACV,IAAA,6BAAiB,EAAC,OAAO,EAAE;YACzB,SAAS,EAAE,cAAc,EAAE,SAAS;YACpC,OAAO,EAAE,cAAc,EAAE,OAAO;SACjC,CAAC,CACH,CAAC;QACF,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,mBAAmB,CAAC,YAA2B;QACrD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC/D,SAAS;YACX,CAAC;YAED,IACE,mBAAmB,IAAI,QAAQ;gBAC/B,OAAO,QAAQ,CAAC,iBAAiB,KAAK,UAAU,EAChD,CAAC;gBACD,KAAK,QAAQ,CAAC,iBAAiB,CAC7B,QAAQ,KAAK,YAAY,CAAC,QAAQ;oBAChC,CAAC,CAAC,YAAY,CAAC,UAAU;oBACzB,CAAC,CAAC,SAAS,CACd,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAClB,OAAgB,EAChB,IAAa,EACb,QAAkB,EAClB,SAA2B;QAE3B,MAAM,QAAQ,GAAG,IAAI,iBAAO,CAC1B,OAAO,CAAC,aAAa,EACrB,eAAO,CAAC,KAAK,EACb,OAAO,CAAC,aAAa,CACtB,CAAC;QACF,QAAQ;aACL,YAAY,CAAC,YAAY,EAAE,SAAS,CAAC;aACrC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;aAC5D,cAAc,EAAE,CAAC;QACpB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5C,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAhzCD,gCAgzCC;AAED,MAAM,gBAAgB,GAAG,CAAC,EACxB,cAAc,EACd,aAAa,GAId,EAAE,EAAE;IACH,OAAO,GAAG,cAAc,IAAI,aAAa,EAAE,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAE,EAAE;IAC9C,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AAC3C,CAAC,CAAC","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { isIPv4 } from \"net\";\n\nimport * as Int64 from \"int64-buffer\";\n\nimport * as timers from \"node:timers/promises\";\nimport isEqual from \"fast-deep-equal\";\nimport { type Address, Event, debug } from \"./imports/common\";\n\nimport {\n Candidate,\n candidateFoundation,\n candidatePriority,\n remoteTcpTypeForIncoming,\n} from \"./candidate\";\nimport { MdnsLookup } from \"./dns/lookup\";\nimport type { TransactionError } from \"./exceptions\";\nimport { type Cancelable, PQueue, cancelable, randomString } from \"./helper\";\nimport {\n CONSENT_FAILURES,\n CONSENT_INTERVAL,\n CandidatePair,\n CandidatePairState,\n ICE_COMPLETED,\n ICE_FAILED,\n type IceConnection,\n type IceOptions,\n type IceState,\n defaultOptions,\n serverReflexiveCandidate,\n sortCandidatePairs,\n validateAddress,\n validateRemoteCandidate,\n} from \"./iceBase\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { TcpActiveProtocol, TcpPassiveProtocol } from \"./stun/tcpProtocol\";\nimport { createStunOverTurnClient } from \"./turn/protocol\";\nimport type { Protocol } from \"./types/model\";\nimport { getHostAddresses } from \"./utils\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport class Connection implements IceConnection {\n localUsername = randomString(4);\n localPassword = randomString(22);\n remoteIsLite = false;\n remotePassword: string = \"\";\n remoteUsername: string = \"\";\n checkList: CandidatePair[] = [];\n localCandidates: Candidate[] = [];\n stunServer?: Address;\n turnServer?: Address;\n options: IceOptions;\n remoteCandidatesEnd = false;\n localCandidatesEnd = false;\n generation = -1;\n userHistory: { [username: string]: string } = {};\n private readonly tieBreaker: bigint = BigInt(\n new Int64.Uint64BE(randomBytes(64)).toString(),\n );\n state: IceState = \"new\";\n lookup?: MdnsLookup;\n\n private _remoteCandidates: Candidate[] = [];\n // P2P接続完了したソケット\n nominated?: CandidatePair;\n private nominating = false;\n private checkListDone = false;\n private checkListState = new PQueue<number>();\n private earlyChecks: [Message, Address, Protocol][] = [];\n private earlyChecksDone = false;\n private localCandidatesStart = false;\n private protocols: Protocol[] = [];\n private queryConsentHandle?: Cancelable<void>;\n\n readonly onData = new Event<[Buffer]>();\n readonly stateChanged = new Event<[IceState]>();\n readonly onIceCandidate: Event<[Candidate]> = new Event();\n\n constructor(\n private _iceControlling: boolean,\n options?: Partial<IceOptions>,\n ) {\n this.options = {\n ...defaultOptions,\n ...options,\n };\n if (this.iceLite) {\n this._iceControlling = false;\n }\n const { stunServer, turnServer } = this.options;\n this.stunServer = validateAddress(stunServer) ?? [\n \"stun.l.google.com\",\n 19302,\n ];\n this.turnServer = validateAddress(turnServer);\n this.restart();\n log(\"new Connection\", this.options);\n }\n\n get iceControlling() {\n return this._iceControlling;\n }\n\n set iceControlling(value: boolean) {\n if (this.iceLite) {\n value = false;\n }\n if (this.generation > 0 || this.nominated) {\n return;\n }\n this._iceControlling = value;\n for (const pair of this.checkList) {\n pair.iceControlling = value;\n }\n }\n\n get iceLite() {\n return this.options.iceLite;\n }\n\n async restart() {\n this.generation++;\n\n this.localUsername = randomString(4);\n this.localPassword = randomString(22);\n if (this.options.localPasswordPrefix) {\n this.localPassword =\n this.options.localPasswordPrefix +\n this.localPassword.slice(this.options.localPasswordPrefix.length);\n }\n this.userHistory[this.localUsername] = this.localPassword;\n\n this.remoteUsername = \"\";\n this.remotePassword = \"\";\n this.localCandidates = [];\n this._remoteCandidates = [];\n this.remoteCandidatesEnd = false;\n this.localCandidatesEnd = false;\n this.state = \"new\";\n this.lookup?.close?.();\n this.lookup = undefined;\n this.nominated = undefined;\n this.nominating = false;\n this.checkList = [];\n this.checkListDone = false;\n this.checkListState = new PQueue<number>();\n this.earlyChecks = [];\n this.earlyChecksDone = false;\n this.localCandidatesStart = false;\n\n // protocolsはincomingのearlyCheckに使うかもしれないので残す\n for (const protocol of this.protocols) {\n if (protocol.localCandidate) {\n protocol.localCandidate.refreshId();\n protocol.localCandidate.generation = this.generation;\n protocol.localCandidate.ufrag = this.localUsername;\n }\n }\n\n this.queryConsentHandle?.resolve?.();\n this.queryConsentHandle = undefined;\n }\n\n resetNominatedPair() {\n log(\"resetNominatedPair\");\n this.nominated = undefined;\n this.nominating = false;\n }\n\n setRemoteParams({\n iceLite,\n usernameFragment,\n password,\n }: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }) {\n log(\"setRemoteParams\", { iceLite, usernameFragment, password });\n this.remoteIsLite = iceLite;\n this.remoteUsername = usernameFragment;\n this.remotePassword = password;\n }\n\n // 4.1.1 Gathering Candidates\n async gatherCandidates() {\n if (!this.localCandidatesStart) {\n this.localCandidatesStart = true;\n\n let address = getHostAddresses(\n this.options.useIpv4,\n this.options.useIpv6,\n {\n useLinkLocalAddress: this.options.useLinkLocalAddress,\n },\n );\n const { interfaceAddresses } = this.options;\n if (interfaceAddresses) {\n const filteredAddresses = address.filter((check) =>\n Object.values(interfaceAddresses).includes(check),\n );\n if (filteredAddresses.length) {\n address = filteredAddresses;\n }\n }\n if (this.options.additionalHostAddresses) {\n address = Array.from(\n new Set([...this.options.additionalHostAddresses, ...address]),\n );\n }\n\n const candidatePromises = this.getCandidatePromises(address, 5);\n await Promise.allSettled(candidatePromises);\n\n this.localCandidatesEnd = true;\n }\n this.setState(\"completed\");\n }\n\n private appendLocalCandidate(candidate: Candidate) {\n this.localCandidates.push(candidate);\n this.onIceCandidate.execute(candidate);\n }\n\n private ensureProtocol(protocol: Protocol) {\n protocol.onRequestReceived.subscribe((msg, addr, data) => {\n if (msg.messageMethod !== methods.BINDING) {\n this.respondError(msg, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n const txUsername = msg.getAttributeValue(\"USERNAME\");\n // 相手にとってのremoteは自分にとってのlocal\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n const localPassword =\n this.userHistory[localUsername] ?? this.localPassword;\n\n const { iceControlling } = this;\n\n // 7.2.1.1. Detecting and Repairing Role Conflicts\n if (iceControlling && msg.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n if (this.tieBreaker >= msg.getAttributeValue(\"ICE-CONTROLLING\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(false);\n }\n } else if (\n !iceControlling &&\n msg.attributesKeys.includes(\"ICE-CONTROLLED\")\n ) {\n if (\n this.iceLite ||\n this.tieBreaker < msg.getAttributeValue(\"ICE-CONTROLLED\")\n ) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(true);\n return;\n }\n }\n\n if (\n this.options.filterStunResponse &&\n !this.options.filterStunResponse(msg, addr, protocol)\n ) {\n return;\n }\n\n // # send binding response\n const response = new Message(\n methods.BINDING,\n classes.RESPONSE,\n msg.transactionId,\n );\n\n response\n .setAttribute(\"XOR-MAPPED-ADDRESS\", addr)\n .addMessageIntegrity(Buffer.from(localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n\n if (this.checkList.length === 0 && !this.earlyChecksDone) {\n this.earlyChecks.push([msg, addr, protocol]);\n } else {\n this.checkIncoming(msg, addr, protocol);\n }\n });\n protocol.onDataReceived.subscribe((data) => {\n try {\n // Update statistics for the nominated pair\n const activePair = this.nominated;\n if (activePair && activePair.protocol === protocol) {\n activePair.packetsReceived++;\n activePair.bytesReceived += data.length;\n }\n\n this.onData.execute(data);\n } catch (error) {\n log(\"dataReceived\", error);\n }\n });\n }\n\n private getCandidatePromises(addresses: string[], timeout = 5) {\n const candidatePromises: Promise<unknown>[] = [];\n const { stunServer, turnServer } = this;\n const { turnUsername, turnPassword } = this.options;\n const gatherIceLite = this.iceLite;\n const gatherRelayOnly =\n !gatherIceLite &&\n this.options.forceTurn &&\n turnServer &&\n turnUsername &&\n turnPassword;\n\n addresses = addresses.filter((address) => {\n // ice restartで同じアドレスが追加されるのを防ぐ\n if (this.protocols.find((protocol) => protocol.localIp === address)) {\n return false;\n }\n return true;\n });\n\n const localStunPromises = gatherRelayOnly\n ? []\n : addresses.map(async (address) => {\n // # create transport\n const protocol = new StunProtocol();\n this.ensureProtocol(protocol);\n try {\n await protocol.connectionMade(\n isIPv4(address),\n this.options.portRange,\n this.options.interfaceAddresses,\n );\n\n protocol.localIp = address;\n this.protocols.push(protocol);\n\n log(\"protocol\", protocol.localIp);\n\n // # add host candidate\n const candidateAddress: Address = [\n address,\n protocol.getExtraInfo()[1],\n ];\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"host\", { transport: \"udp\" }),\n candidateAddress[0],\n candidateAddress[1],\n \"host\",\n undefined,\n undefined,\n undefined,\n this.generation,\n this.localUsername,\n );\n\n this.pairLocalProtocol(protocol);\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol;\n } catch (error) {\n log(\"error protocol STUN\", error);\n }\n });\n\n if (!gatherRelayOnly) {\n candidatePromises.push(\n ...localStunPromises.map((localPromise) =>\n localPromise.then((protocol) => protocol?.localCandidate),\n ),\n );\n }\n\n if (!gatherRelayOnly && this.options.useTcp) {\n const tcpCandidatePromises = addresses.map(async (address) => {\n const passiveProtocol = new TcpPassiveProtocol();\n this.ensureProtocol(passiveProtocol);\n await passiveProtocol.connectionMade(address, this.options.portRange);\n passiveProtocol.localIp = address;\n passiveProtocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"tcp\", address),\n 1,\n \"tcp\",\n candidatePriority(\"host\", {\n transport: \"tcp\",\n tcptype: \"passive\",\n }),\n address,\n passiveProtocol.listeningPort,\n \"host\",\n undefined,\n undefined,\n \"passive\",\n this.generation,\n this.localUsername,\n );\n this.protocols.push(passiveProtocol);\n this.appendLocalCandidate(passiveProtocol.localCandidate);\n\n if (!gatherIceLite) {\n const activeProtocol = new TcpActiveProtocol();\n this.ensureProtocol(activeProtocol);\n await activeProtocol.connectionMade(address);\n activeProtocol.localIp = address;\n activeProtocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"tcp\", address),\n 1,\n \"tcp\",\n candidatePriority(\"host\", {\n transport: \"tcp\",\n tcptype: \"active\",\n }),\n address,\n 9,\n \"host\",\n undefined,\n undefined,\n \"active\",\n this.generation,\n this.localUsername,\n );\n this.protocols.push(activeProtocol);\n this.pairLocalProtocol(activeProtocol);\n this.appendLocalCandidate(activeProtocol.localCandidate);\n }\n });\n\n candidatePromises.push(...tcpCandidatePromises);\n }\n\n if (!gatherIceLite && !gatherRelayOnly && stunServer) {\n const stunCandidatePromises = localStunPromises.map(\n async (protocolPromise) => {\n const protocol = await protocolPromise;\n if (!protocol) return;\n\n const stunCandidatePromise = new Promise<Candidate | void>(\n async (r, f) => {\n const timer = setTimeout(f, timeout * 1000);\n if (\n protocol.localCandidate?.host &&\n isIPv4(protocol.localCandidate?.host)\n ) {\n const candidate = await serverReflexiveCandidate(\n protocol,\n stunServer,\n ).catch((error) => {\n log(\"error\", error);\n });\n if (candidate) {\n this.appendLocalCandidate(candidate);\n }\n\n clearTimeout(timer);\n r(candidate);\n } else {\n clearTimeout(timer);\n r();\n }\n },\n ).catch((error) => {\n log(\"query STUN server\", error);\n });\n\n return stunCandidatePromise;\n },\n );\n\n candidatePromises.push(...stunCandidatePromises);\n }\n\n if (!gatherIceLite && turnServer && turnUsername && turnPassword) {\n const turnCandidatePromise = (async () => {\n const turnTransport = this.options.turnTransport ?? \"udp\";\n const protocol = await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: turnTransport,\n tlsOptions: this.options.turnTlsOptions,\n },\n ).catch(async (e) => {\n if (turnTransport === \"udp\") {\n return await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: \"tcp\",\n },\n );\n } else {\n throw e;\n }\n });\n this.ensureProtocol(protocol);\n this.protocols.push(protocol);\n\n const candidateAddress = protocol.turn.relayedAddress;\n const relatedAddress = protocol.turn.mappedAddress;\n\n log(\"turn candidateAddress\", candidateAddress);\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"relay\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"relay\"),\n candidateAddress[0],\n candidateAddress[1],\n \"relay\",\n relatedAddress[0],\n relatedAddress[1],\n undefined,\n this.generation,\n this.localUsername,\n );\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol.localCandidate;\n })().catch((error) => {\n log(\"query TURN server\", error);\n });\n\n candidatePromises.push(turnCandidatePromise);\n }\n\n return candidatePromises;\n }\n\n async connect() {\n // \"\"\"\n // Perform ICE handshake.\n //\n // This coroutine returns if a candidate pair was successfully nominated\n // and raises an exception otherwise.\n // \"\"\"\n log(\"start connect ice\");\n if (!this.localCandidatesEnd) {\n if (!this.localCandidatesStart) {\n throw new Error(\"Local candidates gathering was not performed\");\n }\n }\n if (!this.remoteUsername || !this.remotePassword) {\n throw new Error(\"Remote username or password is missing\");\n }\n\n // # 5.7.1. Forming Candidate Pairs\n for (const c of this.remoteCandidates) {\n this.pairRemoteCandidate(c);\n }\n this.sortCheckList();\n\n if (!this.iceLite) {\n this.unfreezeInitial();\n }\n\n log(\"earlyChecks\", this.localPassword, this.earlyChecks.length);\n // # handle early checks\n for (const earlyCheck of this.earlyChecks) {\n this.checkIncoming(...earlyCheck);\n }\n this.earlyChecks = [];\n this.earlyChecksDone = true;\n\n if (this.iceLite) {\n if (!this.nominated) {\n let res: number = ICE_FAILED;\n while (!this.checkListDone && this.state !== \"closed\") {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n if (res === ICE_COMPLETED) {\n break;\n }\n }\n\n if (res !== ICE_COMPLETED && !this.nominated) {\n throw new Error(\"ICE negotiation failed\");\n }\n }\n\n this.setState(\"connected\");\n return;\n }\n\n // # perform checks\n // 5.8. Scheduling Checks\n for (;;) {\n if (this.state === \"closed\") break;\n if (!this.schedulingChecks()) break;\n await timers.setTimeout(20);\n }\n\n // # wait for completion\n let res: number = ICE_FAILED;\n while (this.checkList.length > 0 && res === ICE_FAILED) {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n }\n\n // # cancel remaining checks\n for (const check of this.checkList) {\n check.handle?.resolve?.();\n }\n\n if (res !== ICE_COMPLETED) {\n throw new Error(\"ICE negotiation failed\");\n }\n\n // # start consent freshness tests\n this.queryConsent();\n\n this.setState(\"connected\");\n }\n\n private unfreezeInitial() {\n // # unfreeze first pair for the first component\n const [firstPair] = this.checkList;\n if (!firstPair) return;\n if (firstPair.state === CandidatePairState.FROZEN) {\n firstPair.updateState(CandidatePairState.WAITING);\n }\n\n // # unfreeze pairs with same component but different foundations\n const seenFoundations = new Set(firstPair.localCandidate.foundation);\n for (const pair of this.checkList) {\n if (\n pair.component === firstPair.component &&\n !seenFoundations.has(pair.localCandidate.foundation) &&\n pair.state === CandidatePairState.FROZEN\n ) {\n pair.updateState(CandidatePairState.WAITING);\n seenFoundations.add(pair.localCandidate.foundation);\n }\n }\n }\n\n // 5.8 Scheduling Checks\n private schedulingChecks() {\n // Ordinary Check\n {\n // # find the highest-priority pair that is in the waiting state\n const pair = this.checkList\n .filter((pair) => {\n if (\n this.options.forceTurn &&\n pair.protocol.type === StunProtocol.type\n )\n return false;\n return true;\n })\n .find((pair) => pair.state === CandidatePairState.WAITING);\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n {\n // # find the highest-priority pair that is in the frozen state\n const pair = this.checkList.find(\n (pair) => pair.state === CandidatePairState.FROZEN,\n );\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n // # if we expect more candidates, keep going\n if (!this.remoteCandidatesEnd) {\n return !this.checkListDone;\n }\n\n return false;\n }\n\n // 4.1.1.4 ? 生存確認 life check\n private queryConsent = () => {\n if (this.iceLite) {\n return;\n }\n if (this.queryConsentHandle) {\n this.queryConsentHandle.resolve();\n }\n\n this.queryConsentHandle = cancelable(async (_, __, onCancel) => {\n let failures = 0;\n let canceled = false;\n\n const cancelEvent = new AbortController();\n onCancel.once(() => {\n canceled = true;\n failures += CONSENT_FAILURES;\n cancelEvent.abort();\n this.queryConsentHandle = undefined;\n });\n\n const { localUsername, remoteUsername, iceControlling } = this;\n\n // \"\"\"\n // Periodically check consent (RFC 7675).\n // \"\"\"\n\n try {\n while (this.state !== \"closed\" && !canceled) {\n // # randomize between 0.8 and 1.2 times CONSENT_INTERVAL\n await timers.setTimeout(\n CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000,\n undefined,\n { signal: cancelEvent.signal },\n );\n\n const nominated = this.nominated;\n if (!nominated || canceled) {\n break;\n }\n\n const request = this.buildRequest({\n nominate: false,\n localUsername,\n remoteUsername,\n iceControlling,\n localCandidate: nominated.localCandidate,\n });\n try {\n nominated.consentRequestsSent++;\n nominated.requestsSent++;\n await nominated.protocol.request(\n request,\n nominated.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n 0,\n (attempt) => {\n if (attempt > 0) {\n nominated.retransmissionsSent++;\n }\n },\n );\n nominated.responsesReceived++;\n failures = 0;\n if (this.state === \"disconnected\") {\n this.setState(\"connected\");\n }\n } catch (error) {\n if (nominated.id === this.nominated?.id) {\n log(\"no stun response\");\n failures++;\n this.setState(\"disconnected\");\n break;\n }\n }\n if (failures >= CONSENT_FAILURES) {\n log(\"Consent to send expired\");\n this.queryConsentHandle = undefined;\n this.setState(\"closed\");\n break;\n }\n }\n } catch (error) {}\n });\n };\n\n async close() {\n // \"\"\"\n // Close the connection.\n // \"\"\"\n\n this.setState(\"closed\");\n\n // # stop consent freshness tests\n this.queryConsentHandle?.resolve?.();\n\n // # stop check list\n if (this.checkList && !this.checkListDone) {\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n\n this.nominated = undefined;\n for (const protocol of this.protocols) {\n if (protocol.close) {\n await protocol.close();\n }\n }\n\n this.protocols = [];\n this.localCandidates = [];\n\n this.lookup?.close?.();\n this.lookup = undefined;\n }\n\n private setState(state: IceState) {\n this.state = state;\n this.stateChanged.execute(state);\n }\n\n async addRemoteCandidate(remoteCandidate: Candidate | undefined) {\n // \"\"\"\n // Add a remote candidate or signal end-of-candidates.\n\n // To signal end-of-candidates, pass `None`.\n\n // :param remote_candidate: A :class:`Candidate` instance or `None`.\n // \"\"\"\n\n if (!remoteCandidate) {\n this.remoteCandidatesEnd = true;\n return;\n }\n\n if (remoteCandidate.host.includes(\".local\")) {\n try {\n if (!this.lookup) {\n this.lookup = new MdnsLookup();\n }\n const host = await this.lookup.lookup(remoteCandidate.host);\n remoteCandidate.host = host;\n } catch (error) {\n return;\n }\n }\n\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n return;\n }\n\n log(\"addRemoteCandidate\", remoteCandidate);\n this._remoteCandidates.push(remoteCandidate);\n\n this.pairRemoteCandidate(remoteCandidate);\n this.sortCheckList();\n }\n\n send = async (data: Buffer) => {\n const activePair = this.nominated;\n if (activePair) {\n await activePair.protocol.sendData(data, activePair.remoteAddr);\n\n // Update statistics\n activePair.packetsSent++;\n activePair.bytesSent += data.length;\n } else {\n // log(\"Cannot send data, ice not connected\");\n return;\n }\n };\n\n getDefaultCandidate() {\n const candidates = this.localCandidates.sort(\n (a, b) => a.priority - b.priority,\n );\n const [candidate] = candidates;\n return candidate;\n }\n\n // for test only\n set remoteCandidates(value: Candidate[]) {\n if (this.remoteCandidatesEnd)\n throw new Error(\"Cannot set remote candidates after end-of-candidates.\");\n this._remoteCandidates = [];\n for (const remoteCandidate of value) {\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n continue;\n }\n this._remoteCandidates.push(remoteCandidate);\n }\n\n this.remoteCandidatesEnd = true;\n }\n get remoteCandidates() {\n return this._remoteCandidates;\n }\n\n get candidatePairs() {\n return this.checkList;\n }\n\n private sortCheckList() {\n sortCandidatePairs(this.checkList, this.iceControlling);\n }\n\n private findPair(protocol: Protocol, remoteCandidate: Candidate) {\n const pair = this.checkList.find(\n (pair) =>\n isEqual(pair.protocol, protocol) &&\n isEqual(pair.remoteCandidate, remoteCandidate),\n );\n return pair;\n }\n\n private switchRole(iceControlling: boolean) {\n log(\"switch role\", iceControlling);\n this.iceControlling = iceControlling;\n this.sortCheckList();\n }\n\n private checkComplete(pair: CandidatePair) {\n pair.handle = undefined;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n // Updating the Nominated Flag\n\n // https://www.rfc-editor.org/rfc/rfc8445#section-7.3.1.5,\n // Once the nominated flag is set for a component of a data stream, it\n // concludes the ICE processing for that component. See Section 8.\n // So disallow overwriting of the pair nominated for that component\n if (\n pair.nominated &&\n // remoteのgenerationをチェックする.localのgenerationは更新が間に合わないかもしれないのでチェックしない\n (pair.remoteCandidate.generation != undefined\n ? pair.remoteCandidate.generation === this.generation\n : true) &&\n this.nominated == undefined\n ) {\n log(\"nominated\", pair.toJSON());\n this.nominated = pair;\n this.nominating = false;\n this.pruneTcpConnections(pair);\n\n // 8.1.2. Updating States\n\n // The agent MUST remove all Waiting and Frozen pairs in the check\n // list and triggered check queue for the same component as the\n // nominated pairs for that media stream.\n for (const p of this.checkList) {\n if (\n p.component === pair.component &&\n [CandidatePairState.WAITING, CandidatePairState.FROZEN].includes(\n p.state,\n )\n ) {\n p.updateState(CandidatePairState.FAILED);\n }\n }\n }\n\n // Once there is at least one nominated pair in the valid list for\n // every component of at least one media stream and the state of the\n // check list is Running:\n if (this.nominated) {\n if (!this.checkListDone) {\n log(\"ICE completed\");\n this.checkListState.put(new Promise((r) => r(ICE_COMPLETED)));\n this.checkListDone = true;\n }\n return;\n }\n\n log(\"not completed\", pair.toJSON());\n\n // 7.1.3.2.3. Updating Pair States\n for (const p of this.checkList) {\n if (\n p.localCandidate.foundation === pair.localCandidate.foundation &&\n p.state === CandidatePairState.FROZEN\n ) {\n p.updateState(CandidatePairState.WAITING);\n }\n }\n }\n\n {\n const list = [CandidatePairState.SUCCEEDED, CandidatePairState.FAILED];\n if (this.checkList.find(({ state }) => !list.includes(state))) {\n return;\n }\n }\n\n if (!this.iceControlling) {\n const target = CandidatePairState.SUCCEEDED;\n if (this.checkList.find(({ state }) => state === target)) {\n return;\n }\n }\n\n if (!this.checkListDone) {\n log(\"ICE failed\");\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n }\n\n // 3. Terminology : Check\n checkStart = (pair: CandidatePair) =>\n cancelable<void>(async (r) => {\n // \"\"\"\n // Starts a check.\n // \"\"\"\n\n log(\"check start\", pair.toJSON());\n\n pair.updateState(CandidatePairState.IN_PROGRESS);\n const result: { response?: Message; addr?: Address } = {};\n const { remotePassword, remoteUsername, generation } = this;\n const localUsername = pair.localCandidate.ufrag ?? this.localUsername;\n\n const nominate = this.iceControlling && !this.remoteIsLite;\n const request = this.buildRequest({\n nominate,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n localCandidate: pair.localCandidate,\n });\n\n // Record start time for RTT calculation\n const startTime = performance.now();\n\n try {\n pair.requestsSent++;\n const [response, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(remotePassword, \"utf8\"),\n pair.localCandidate.transport.toLowerCase() === \"tcp\" ? 0 : 4,\n (attempt) => {\n if (attempt > 0) {\n pair.retransmissionsSent++;\n }\n },\n );\n pair.responsesReceived++;\n\n // Calculate RTT\n const endTime = performance.now();\n const rtt = (endTime - startTime) / 1000; // Convert to seconds\n\n // Update RTT statistics\n pair.rtt = rtt;\n pair.totalRoundTripTime += rtt;\n pair.roundTripTimeMeasurements++;\n\n log(\"response received\", request.toJSON(), response.toJSON(), addr, {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n rtt,\n });\n result.response = response;\n result.addr = addr;\n } catch (error: any) {\n const exc: TransactionError = error;\n // 7.1.3.1. Failure Cases\n log(\n \"failure case\",\n request.toJSON(),\n exc.response ? JSON.stringify(exc.response.toJSON(), null, 2) : error,\n {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n },\n pair.remoteAddr,\n );\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 487) {\n if (request.attributesKeys.includes(\"ICE-CONTROLLED\")) {\n this.switchRole(true);\n } else if (request.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n this.switchRole(false);\n }\n await this.checkStart(pair).awaitable;\n r();\n return;\n }\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 401) {\n log(\"retry 401\", pair.toJSON());\n await this.checkStart(pair).awaitable;\n r();\n return;\n } else {\n // timeout\n log(\"checkStart CandidatePairState.FAILED\", pair.toJSON());\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n }\n\n // # check remote address matches\n if (!isEqual(result.addr, pair.remoteAddr)) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n\n // # success\n if (nominate || pair.remoteNominated) {\n // # nominated by agressive nomination or the remote party\n pair.nominated = true;\n } else if (this.iceControlling && !this.nominating) {\n // # perform regular nomination\n this.nominating = true;\n const request = this.buildRequest({\n nominate: true,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n localCandidate: pair.localCandidate,\n });\n try {\n pair.requestsSent++;\n await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n pair.localCandidate.transport.toLowerCase() === \"tcp\" ? 0 : 4,\n (attempt) => {\n if (attempt > 0) {\n pair.retransmissionsSent++;\n }\n },\n );\n pair.responsesReceived++;\n } catch (error) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n return;\n }\n pair.nominated = true;\n }\n\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n r();\n });\n\n private addPair(pair: CandidatePair) {\n this.checkList.push(pair);\n this.sortCheckList();\n }\n\n // 7.2. STUN Server Procedures\n // 7.2.1.3、7.2.1.4、および7.2.1.5\n checkIncoming(message: Message, addr: Address, protocol: Protocol) {\n // \"\"\"\n // Handle a successful incoming check.\n // \"\"\"\n\n const txUsername = message.getAttributeValue(\"USERNAME\");\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n\n // find remote candidate\n let remoteCandidate: Candidate | undefined;\n const [host, port] = addr;\n for (const c of this.remoteCandidates) {\n if (c.host === host && c.port === port) {\n remoteCandidate = c;\n break;\n }\n }\n if (!remoteCandidate) {\n // 7.2.1.3. Learning Peer Reflexive Candidates\n remoteCandidate = new Candidate(\n randomString(10),\n 1,\n protocol.localCandidate?.transport ?? \"udp\",\n message.getAttributeValue(\"PRIORITY\"),\n host,\n port,\n \"prflx\",\n undefined,\n undefined,\n protocol.localCandidate?.transport === \"tcp\"\n ? remoteTcpTypeForIncoming(protocol.localCandidate.tcptype)\n : undefined,\n undefined,\n undefined,\n );\n this._remoteCandidates.push(remoteCandidate);\n }\n\n // find pair\n let pair = this.findPair(protocol, remoteCandidate);\n if (!pair) {\n pair = new CandidatePair(protocol, remoteCandidate, this.iceControlling);\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n pair.noteIncomingRequest(message.transactionIdHex);\n pair.requestsReceived++;\n pair.responsesSent++;\n pair.localCandidate.ufrag = localUsername;\n\n log(\"Triggered Checks\", message.toJSON(), pair.toJSON(), {\n localUsername: this.localUsername,\n remoteUsername: this.remoteUsername,\n localPassword: this.localPassword,\n remotePassword: this.remotePassword,\n generation: this.generation,\n });\n\n if (this.iceLite) {\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n pair.nominated = true;\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n }\n return;\n }\n\n // 7.2.1.4. Triggered Checks\n if (\n [CandidatePairState.WAITING, CandidatePairState.FAILED].includes(\n pair.state,\n )\n ) {\n pair.handle = this.checkStart(pair);\n }\n\n // 7.2.1.5. Updating the Nominated Flag\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n pair.nominated = true;\n this.checkComplete(pair);\n }\n }\n }\n\n private tryPair(protocol: Protocol, remoteCandidate: Candidate) {\n if (\n protocol.localCandidate?.canPairWith(remoteCandidate) &&\n !(\n protocol.localCandidate.transport.toLowerCase() === \"tcp\" &&\n protocol.localCandidate.tcptype === \"passive\" &&\n remoteCandidate.type !== \"prflx\"\n ) &&\n !this.findPair(protocol, remoteCandidate)\n ) {\n const pair = new CandidatePair(\n protocol,\n remoteCandidate,\n this.iceControlling,\n );\n if (\n this.options.filterCandidatePair &&\n !this.options.filterCandidatePair(pair)\n ) {\n return;\n }\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n }\n\n private pairLocalProtocol(protocol: Protocol) {\n for (const remoteCandidate of this.remoteCandidates) {\n this.tryPair(protocol, remoteCandidate);\n }\n }\n\n private pairRemoteCandidate = (remoteCandidate: Candidate) => {\n for (const protocol of this.protocols) {\n this.tryPair(protocol, remoteCandidate);\n }\n };\n\n private buildRequest({\n nominate,\n remoteUsername,\n localUsername,\n iceControlling,\n localCandidate,\n }: {\n nominate: boolean;\n remoteUsername: string;\n localUsername: string;\n iceControlling: boolean;\n localCandidate?: Candidate;\n }) {\n const txUsername = encodeTxUsername({ remoteUsername, localUsername });\n const request = new Message(methods.BINDING, classes.REQUEST);\n request.setAttribute(\"USERNAME\", txUsername).setAttribute(\n \"PRIORITY\",\n candidatePriority(\"prflx\", {\n transport: localCandidate?.transport,\n tcptype: localCandidate?.tcptype,\n }),\n );\n if (iceControlling) {\n request.setAttribute(\"ICE-CONTROLLING\", this.tieBreaker);\n if (nominate) {\n request.setAttribute(\"USE-CANDIDATE\", null);\n }\n } else {\n request.setAttribute(\"ICE-CONTROLLED\", this.tieBreaker);\n }\n return request;\n }\n\n private pruneTcpConnections(selectedPair: CandidatePair) {\n for (const protocol of this.protocols) {\n if (protocol.localCandidate?.transport.toLowerCase() !== \"tcp\") {\n continue;\n }\n\n if (\n \"pruneForSelection\" in protocol &&\n typeof protocol.pruneForSelection === \"function\"\n ) {\n void protocol.pruneForSelection(\n protocol === selectedPair.protocol\n ? selectedPair.remoteAddr\n : undefined,\n );\n }\n }\n }\n\n private respondError(\n request: Message,\n addr: Address,\n protocol: Protocol,\n errorCode: [number, string],\n ) {\n const response = new Message(\n request.messageMethod,\n classes.ERROR,\n request.transactionId,\n );\n response\n .setAttribute(\"ERROR-CODE\", errorCode)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n }\n}\n\nconst encodeTxUsername = ({\n remoteUsername,\n localUsername,\n}: {\n remoteUsername: string;\n localUsername: string;\n}) => {\n return `${remoteUsername}:${localUsername}`;\n};\n\nconst decodeTxUsername = (txUsername: string) => {\n const [remoteUsername, localUsername] = txUsername.split(\":\");\n return { remoteUsername, localUsername };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../ice/src/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { isIPv4 } from \"net\";\n\nimport * as timers from \"node:timers/promises\";\nimport { type Address, Event, debug } from \"./imports/common\";\n\nimport {\n Candidate,\n candidateFoundation,\n candidatePriority,\n remoteTcpTypeForIncoming,\n} from \"./candidate\";\nimport { MdnsLookup } from \"./dns/lookup\";\nimport type { TransactionError } from \"./exceptions\";\nimport { type Cancelable, PQueue, cancelable, randomString } from \"./helper\";\nimport {\n CONSENT_FAILURES,\n CONSENT_INTERVAL,\n CandidatePair,\n CandidatePairState,\n ICE_COMPLETED,\n ICE_FAILED,\n type IceConnection,\n type IceOptions,\n type IceState,\n defaultOptions,\n serverReflexiveCandidate,\n sortCandidatePairs,\n validateAddress,\n validateRemoteCandidate,\n} from \"./iceBase\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { TcpActiveProtocol, TcpPassiveProtocol } from \"./stun/tcpProtocol\";\nimport { createStunOverTurnClient } from \"./turn/protocol\";\nimport type { Protocol } from \"./types/model\";\nimport { getHostAddresses } from \"./utils\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport class Connection implements IceConnection {\n localUsername = randomString(4);\n localPassword = randomString(22);\n remoteIsLite = false;\n remotePassword: string = \"\";\n remoteUsername: string = \"\";\n checkList: CandidatePair[] = [];\n localCandidates: Candidate[] = [];\n stunServer?: Address;\n turnServer?: Address;\n options: IceOptions;\n remoteCandidatesEnd = false;\n localCandidatesEnd = false;\n generation = -1;\n userHistory: { [username: string]: string } = {};\n private readonly tieBreaker: bigint = randomBytes(8).readBigUInt64BE(0);\n state: IceState = \"new\";\n lookup?: MdnsLookup;\n\n private _remoteCandidates: Candidate[] = [];\n // P2P接続完了したソケット\n nominated?: CandidatePair;\n private nominating = false;\n private checkListDone = false;\n private checkListState = new PQueue<number>();\n private earlyChecks: [Message, Address, Protocol][] = [];\n private earlyChecksDone = false;\n private localCandidatesStart = false;\n private protocols: Protocol[] = [];\n private queryConsentHandle?: Cancelable<void>;\n\n readonly onData = new Event<[Buffer]>();\n readonly stateChanged = new Event<[IceState]>();\n readonly onIceCandidate: Event<[Candidate]> = new Event();\n\n constructor(\n private _iceControlling: boolean,\n options?: Partial<IceOptions>,\n ) {\n this.options = {\n ...defaultOptions,\n ...options,\n };\n if (this.iceLite) {\n this._iceControlling = false;\n }\n const { stunServer, turnServer } = this.options;\n this.stunServer = validateAddress(stunServer) ?? [\n \"stun.l.google.com\",\n 19302,\n ];\n this.turnServer = validateAddress(turnServer);\n this.restart();\n log(\"new Connection\", this.options);\n }\n\n get iceControlling() {\n return this._iceControlling;\n }\n\n set iceControlling(value: boolean) {\n if (this.iceLite) {\n value = false;\n }\n if (this.generation > 0 || this.nominated) {\n return;\n }\n this._iceControlling = value;\n for (const pair of this.checkList) {\n pair.iceControlling = value;\n }\n }\n\n get iceLite() {\n return this.options.iceLite;\n }\n\n async restart() {\n this.generation++;\n\n this.localUsername = randomString(4);\n this.localPassword = randomString(22);\n if (this.options.localPasswordPrefix) {\n this.localPassword =\n this.options.localPasswordPrefix +\n this.localPassword.slice(this.options.localPasswordPrefix.length);\n }\n this.userHistory[this.localUsername] = this.localPassword;\n\n this.remoteUsername = \"\";\n this.remotePassword = \"\";\n this.localCandidates = [];\n this._remoteCandidates = [];\n this.remoteCandidatesEnd = false;\n this.localCandidatesEnd = false;\n this.state = \"new\";\n this.lookup?.close?.();\n this.lookup = undefined;\n this.nominated = undefined;\n this.nominating = false;\n this.checkList = [];\n this.checkListDone = false;\n this.checkListState = new PQueue<number>();\n this.earlyChecks = [];\n this.earlyChecksDone = false;\n this.localCandidatesStart = false;\n\n // protocolsはincomingのearlyCheckに使うかもしれないので残す\n for (const protocol of this.protocols) {\n if (protocol.localCandidate) {\n protocol.localCandidate.refreshId();\n protocol.localCandidate.generation = this.generation;\n protocol.localCandidate.ufrag = this.localUsername;\n }\n }\n\n this.queryConsentHandle?.resolve?.();\n this.queryConsentHandle = undefined;\n }\n\n resetNominatedPair() {\n log(\"resetNominatedPair\");\n this.nominated = undefined;\n this.nominating = false;\n }\n\n setRemoteParams({\n iceLite,\n usernameFragment,\n password,\n }: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }) {\n log(\"setRemoteParams\", { iceLite, usernameFragment, password });\n this.remoteIsLite = iceLite;\n this.remoteUsername = usernameFragment;\n this.remotePassword = password;\n }\n\n // 4.1.1 Gathering Candidates\n async gatherCandidates() {\n if (!this.localCandidatesStart) {\n this.localCandidatesStart = true;\n\n let address = getHostAddresses(\n this.options.useIpv4,\n this.options.useIpv6,\n {\n useLinkLocalAddress: this.options.useLinkLocalAddress,\n },\n );\n const { interfaceAddresses } = this.options;\n if (interfaceAddresses) {\n const filteredAddresses = address.filter((check) =>\n Object.values(interfaceAddresses).includes(check),\n );\n if (filteredAddresses.length) {\n address = filteredAddresses;\n }\n }\n if (this.options.additionalHostAddresses) {\n address = Array.from(\n new Set([...this.options.additionalHostAddresses, ...address]),\n );\n }\n\n const candidatePromises = this.getCandidatePromises(address, 5);\n await Promise.allSettled(candidatePromises);\n\n this.localCandidatesEnd = true;\n }\n this.setState(\"completed\");\n }\n\n private appendLocalCandidate(candidate: Candidate) {\n this.localCandidates.push(candidate);\n this.onIceCandidate.execute(candidate);\n }\n\n private ensureProtocol(protocol: Protocol) {\n protocol.onRequestReceived.subscribe((msg, addr, data) => {\n if (msg.messageMethod !== methods.BINDING) {\n this.respondError(msg, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n const txUsername = msg.getAttributeValue(\"USERNAME\");\n // 相手にとってのremoteは自分にとってのlocal\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n const localPassword =\n this.userHistory[localUsername] ?? this.localPassword;\n\n const { iceControlling } = this;\n\n // 7.2.1.1. Detecting and Repairing Role Conflicts\n if (iceControlling && msg.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n if (this.tieBreaker >= msg.getAttributeValue(\"ICE-CONTROLLING\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(false);\n }\n } else if (\n !iceControlling &&\n msg.attributesKeys.includes(\"ICE-CONTROLLED\")\n ) {\n if (\n this.iceLite ||\n this.tieBreaker < msg.getAttributeValue(\"ICE-CONTROLLED\")\n ) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(true);\n return;\n }\n }\n\n if (\n this.options.filterStunResponse &&\n !this.options.filterStunResponse(msg, addr, protocol)\n ) {\n return;\n }\n\n // # send binding response\n const response = new Message(\n methods.BINDING,\n classes.RESPONSE,\n msg.transactionId,\n );\n\n response\n .setAttribute(\"XOR-MAPPED-ADDRESS\", addr)\n .addMessageIntegrity(Buffer.from(localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n\n if (this.checkList.length === 0 && !this.earlyChecksDone) {\n this.earlyChecks.push([msg, addr, protocol]);\n } else {\n this.checkIncoming(msg, addr, protocol);\n }\n });\n protocol.onDataReceived.subscribe((data) => {\n try {\n // Update statistics for the nominated pair\n const activePair = this.nominated;\n if (activePair && activePair.protocol === protocol) {\n activePair.packetsReceived++;\n activePair.bytesReceived += data.length;\n }\n\n this.onData.execute(data);\n } catch (error) {\n log(\"dataReceived\", error);\n }\n });\n }\n\n private getCandidatePromises(addresses: string[], timeout = 5) {\n const candidatePromises: Promise<unknown>[] = [];\n const { stunServer, turnServer } = this;\n const { turnUsername, turnPassword } = this.options;\n const gatherIceLite = this.iceLite;\n const gatherRelayOnly =\n !gatherIceLite &&\n this.options.forceTurn &&\n turnServer &&\n turnUsername &&\n turnPassword;\n\n addresses = addresses.filter((address) => {\n // ice restartで同じアドレスが追加されるのを防ぐ\n if (this.protocols.find((protocol) => protocol.localIp === address)) {\n return false;\n }\n return true;\n });\n\n const localStunPromises = gatherRelayOnly\n ? []\n : addresses.map(async (address) => {\n // # create transport\n const protocol = new StunProtocol();\n this.ensureProtocol(protocol);\n try {\n await protocol.connectionMade(\n isIPv4(address),\n this.options.portRange,\n this.options.interfaceAddresses,\n );\n\n protocol.localIp = address;\n this.protocols.push(protocol);\n\n log(\"protocol\", protocol.localIp);\n\n // # add host candidate\n const candidateAddress: Address = [\n address,\n protocol.getExtraInfo()[1],\n ];\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"host\", { transport: \"udp\" }),\n candidateAddress[0],\n candidateAddress[1],\n \"host\",\n undefined,\n undefined,\n undefined,\n this.generation,\n this.localUsername,\n );\n\n this.pairLocalProtocol(protocol);\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol;\n } catch (error) {\n log(\"error protocol STUN\", error);\n }\n });\n\n if (!gatherRelayOnly) {\n candidatePromises.push(\n ...localStunPromises.map((localPromise) =>\n localPromise.then((protocol) => protocol?.localCandidate),\n ),\n );\n }\n\n if (!gatherRelayOnly && this.options.useTcp) {\n const tcpCandidatePromises = addresses.map(async (address) => {\n const passiveProtocol = new TcpPassiveProtocol();\n this.ensureProtocol(passiveProtocol);\n await passiveProtocol.connectionMade(address, this.options.portRange);\n passiveProtocol.localIp = address;\n passiveProtocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"tcp\", address),\n 1,\n \"tcp\",\n candidatePriority(\"host\", {\n transport: \"tcp\",\n tcptype: \"passive\",\n }),\n address,\n passiveProtocol.listeningPort,\n \"host\",\n undefined,\n undefined,\n \"passive\",\n this.generation,\n this.localUsername,\n );\n this.protocols.push(passiveProtocol);\n this.appendLocalCandidate(passiveProtocol.localCandidate);\n\n if (!gatherIceLite) {\n const activeProtocol = new TcpActiveProtocol();\n this.ensureProtocol(activeProtocol);\n await activeProtocol.connectionMade(address);\n activeProtocol.localIp = address;\n activeProtocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"tcp\", address),\n 1,\n \"tcp\",\n candidatePriority(\"host\", {\n transport: \"tcp\",\n tcptype: \"active\",\n }),\n address,\n 9,\n \"host\",\n undefined,\n undefined,\n \"active\",\n this.generation,\n this.localUsername,\n );\n this.protocols.push(activeProtocol);\n this.pairLocalProtocol(activeProtocol);\n this.appendLocalCandidate(activeProtocol.localCandidate);\n }\n });\n\n candidatePromises.push(...tcpCandidatePromises);\n }\n\n if (!gatherIceLite && !gatherRelayOnly && stunServer) {\n const stunCandidatePromises = localStunPromises.map(\n async (protocolPromise) => {\n const protocol = await protocolPromise;\n if (!protocol) return;\n\n const stunCandidatePromise = new Promise<Candidate | void>(\n async (r, f) => {\n const timer = setTimeout(f, timeout * 1000);\n if (\n protocol.localCandidate?.host &&\n isIPv4(protocol.localCandidate?.host)\n ) {\n const candidate = await serverReflexiveCandidate(\n protocol,\n stunServer,\n ).catch((error) => {\n log(\"error\", error);\n });\n if (candidate) {\n this.appendLocalCandidate(candidate);\n }\n\n clearTimeout(timer);\n r(candidate);\n } else {\n clearTimeout(timer);\n r();\n }\n },\n ).catch((error) => {\n log(\"query STUN server\", error);\n });\n\n return stunCandidatePromise;\n },\n );\n\n candidatePromises.push(...stunCandidatePromises);\n }\n\n if (!gatherIceLite && turnServer && turnUsername && turnPassword) {\n const turnCandidatePromise = (async () => {\n const turnTransport = this.options.turnTransport ?? \"udp\";\n const protocol = await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: turnTransport,\n tlsOptions: this.options.turnTlsOptions,\n },\n ).catch(async (e) => {\n if (turnTransport === \"udp\") {\n return await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: \"tcp\",\n },\n );\n } else {\n throw e;\n }\n });\n this.ensureProtocol(protocol);\n this.protocols.push(protocol);\n\n const candidateAddress = protocol.turn.relayedAddress;\n const relatedAddress = protocol.turn.mappedAddress;\n\n log(\"turn candidateAddress\", candidateAddress);\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"relay\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"relay\"),\n candidateAddress[0],\n candidateAddress[1],\n \"relay\",\n relatedAddress[0],\n relatedAddress[1],\n undefined,\n this.generation,\n this.localUsername,\n );\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol.localCandidate;\n })().catch((error) => {\n log(\"query TURN server\", error);\n });\n\n candidatePromises.push(turnCandidatePromise);\n }\n\n return candidatePromises;\n }\n\n async connect() {\n // \"\"\"\n // Perform ICE handshake.\n //\n // This coroutine returns if a candidate pair was successfully nominated\n // and raises an exception otherwise.\n // \"\"\"\n log(\"start connect ice\");\n if (!this.localCandidatesEnd) {\n if (!this.localCandidatesStart) {\n throw new Error(\"Local candidates gathering was not performed\");\n }\n }\n if (!this.remoteUsername || !this.remotePassword) {\n throw new Error(\"Remote username or password is missing\");\n }\n\n // # 5.7.1. Forming Candidate Pairs\n for (const c of this.remoteCandidates) {\n this.pairRemoteCandidate(c);\n }\n this.sortCheckList();\n\n if (!this.iceLite) {\n this.unfreezeInitial();\n }\n\n log(\"earlyChecks\", this.localPassword, this.earlyChecks.length);\n // # handle early checks\n for (const earlyCheck of this.earlyChecks) {\n this.checkIncoming(...earlyCheck);\n }\n this.earlyChecks = [];\n this.earlyChecksDone = true;\n\n if (this.iceLite) {\n if (!this.nominated) {\n let res: number = ICE_FAILED;\n while (!this.checkListDone && this.state !== \"closed\") {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n if (res === ICE_COMPLETED) {\n break;\n }\n }\n\n if (res !== ICE_COMPLETED && !this.nominated) {\n throw new Error(\"ICE negotiation failed\");\n }\n }\n\n this.setState(\"connected\");\n return;\n }\n\n // # perform checks\n // 5.8. Scheduling Checks\n for (;;) {\n if (this.state === \"closed\") break;\n if (!this.schedulingChecks()) break;\n await timers.setTimeout(20);\n }\n\n // # wait for completion\n let res: number = ICE_FAILED;\n while (this.checkList.length > 0 && res === ICE_FAILED) {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n }\n\n // # cancel remaining checks\n for (const check of this.checkList) {\n check.handle?.resolve?.();\n }\n\n if (res !== ICE_COMPLETED) {\n throw new Error(\"ICE negotiation failed\");\n }\n\n // # start consent freshness tests\n this.queryConsent();\n\n this.setState(\"connected\");\n }\n\n private unfreezeInitial() {\n // # unfreeze first pair for the first component\n const [firstPair] = this.checkList;\n if (!firstPair) return;\n if (firstPair.state === CandidatePairState.FROZEN) {\n firstPair.updateState(CandidatePairState.WAITING);\n }\n\n // # unfreeze pairs with same component but different foundations\n const seenFoundations = new Set(firstPair.localCandidate.foundation);\n for (const pair of this.checkList) {\n if (\n pair.component === firstPair.component &&\n !seenFoundations.has(pair.localCandidate.foundation) &&\n pair.state === CandidatePairState.FROZEN\n ) {\n pair.updateState(CandidatePairState.WAITING);\n seenFoundations.add(pair.localCandidate.foundation);\n }\n }\n }\n\n // 5.8 Scheduling Checks\n private schedulingChecks() {\n // Ordinary Check\n {\n // # find the highest-priority pair that is in the waiting state\n const pair = this.checkList\n .filter((pair) => {\n if (\n this.options.forceTurn &&\n pair.protocol.type === StunProtocol.type\n )\n return false;\n return true;\n })\n .find((pair) => pair.state === CandidatePairState.WAITING);\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n {\n // # find the highest-priority pair that is in the frozen state\n const pair = this.checkList.find(\n (pair) => pair.state === CandidatePairState.FROZEN,\n );\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n // # if we expect more candidates, keep going\n if (!this.remoteCandidatesEnd) {\n return !this.checkListDone;\n }\n\n return false;\n }\n\n // 4.1.1.4 ? 生存確認 life check\n private queryConsent = () => {\n if (this.iceLite) {\n return;\n }\n if (this.queryConsentHandle) {\n this.queryConsentHandle.resolve();\n }\n\n this.queryConsentHandle = cancelable(async (_, __, onCancel) => {\n let failures = 0;\n let canceled = false;\n\n const cancelEvent = new AbortController();\n onCancel.once(() => {\n canceled = true;\n failures += CONSENT_FAILURES;\n cancelEvent.abort();\n this.queryConsentHandle = undefined;\n });\n\n const { localUsername, remoteUsername, iceControlling } = this;\n\n // \"\"\"\n // Periodically check consent (RFC 7675).\n // \"\"\"\n\n try {\n while (this.state !== \"closed\" && !canceled) {\n // # randomize between 0.8 and 1.2 times CONSENT_INTERVAL\n await timers.setTimeout(\n CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000,\n undefined,\n { signal: cancelEvent.signal },\n );\n\n const nominated = this.nominated;\n if (!nominated || canceled) {\n break;\n }\n\n const request = this.buildRequest({\n nominate: false,\n localUsername,\n remoteUsername,\n iceControlling,\n localCandidate: nominated.localCandidate,\n });\n try {\n nominated.consentRequestsSent++;\n nominated.requestsSent++;\n await nominated.protocol.request(\n request,\n nominated.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n 0,\n (attempt) => {\n if (attempt > 0) {\n nominated.retransmissionsSent++;\n }\n },\n );\n nominated.responsesReceived++;\n failures = 0;\n if (this.state === \"disconnected\") {\n this.setState(\"connected\");\n }\n } catch (error) {\n if (nominated.id === this.nominated?.id) {\n log(\"no stun response\");\n failures++;\n this.setState(\"disconnected\");\n break;\n }\n }\n if (failures >= CONSENT_FAILURES) {\n log(\"Consent to send expired\");\n this.queryConsentHandle = undefined;\n this.setState(\"closed\");\n break;\n }\n }\n } catch (error) {}\n });\n };\n\n async close() {\n // \"\"\"\n // Close the connection.\n // \"\"\"\n\n this.setState(\"closed\");\n\n // # stop consent freshness tests\n this.queryConsentHandle?.resolve?.();\n\n // # stop check list\n if (this.checkList && !this.checkListDone) {\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n\n this.nominated = undefined;\n for (const protocol of this.protocols) {\n if (protocol.close) {\n await protocol.close();\n }\n }\n\n this.protocols = [];\n this.localCandidates = [];\n\n this.lookup?.close?.();\n this.lookup = undefined;\n }\n\n private setState(state: IceState) {\n this.state = state;\n this.stateChanged.execute(state);\n }\n\n async addRemoteCandidate(remoteCandidate: Candidate | undefined) {\n // \"\"\"\n // Add a remote candidate or signal end-of-candidates.\n\n // To signal end-of-candidates, pass `None`.\n\n // :param remote_candidate: A :class:`Candidate` instance or `None`.\n // \"\"\"\n\n if (!remoteCandidate) {\n this.remoteCandidatesEnd = true;\n return;\n }\n\n if (remoteCandidate.host.includes(\".local\")) {\n try {\n if (!this.lookup) {\n this.lookup = new MdnsLookup();\n }\n const host = await this.lookup.lookup(remoteCandidate.host);\n remoteCandidate.host = host;\n } catch (error) {\n return;\n }\n }\n\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n return;\n }\n\n log(\"addRemoteCandidate\", remoteCandidate);\n this._remoteCandidates.push(remoteCandidate);\n\n this.pairRemoteCandidate(remoteCandidate);\n this.sortCheckList();\n }\n\n send = async (data: Buffer) => {\n const activePair = this.nominated;\n if (activePair) {\n await activePair.protocol.sendData(data, activePair.remoteAddr);\n\n // Update statistics\n activePair.packetsSent++;\n activePair.bytesSent += data.length;\n } else {\n // log(\"Cannot send data, ice not connected\");\n return;\n }\n };\n\n getDefaultCandidate() {\n const candidates = this.localCandidates.sort(\n (a, b) => a.priority - b.priority,\n );\n const [candidate] = candidates;\n return candidate;\n }\n\n // for test only\n set remoteCandidates(value: Candidate[]) {\n if (this.remoteCandidatesEnd)\n throw new Error(\"Cannot set remote candidates after end-of-candidates.\");\n this._remoteCandidates = [];\n for (const remoteCandidate of value) {\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n continue;\n }\n this._remoteCandidates.push(remoteCandidate);\n }\n\n this.remoteCandidatesEnd = true;\n }\n get remoteCandidates() {\n return this._remoteCandidates;\n }\n\n get candidatePairs() {\n return this.checkList;\n }\n\n private sortCheckList() {\n sortCandidatePairs(this.checkList, this.iceControlling);\n }\n\n private findPair(protocol: Protocol, remoteCandidate: Candidate) {\n const pair = this.checkList.find(\n (pair) =>\n pair.protocol === protocol && pair.remoteCandidate === remoteCandidate,\n );\n return pair;\n }\n\n private switchRole(iceControlling: boolean) {\n log(\"switch role\", iceControlling);\n this.iceControlling = iceControlling;\n this.sortCheckList();\n }\n\n private checkComplete(pair: CandidatePair) {\n pair.handle = undefined;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n // Updating the Nominated Flag\n\n // https://www.rfc-editor.org/rfc/rfc8445#section-7.3.1.5,\n // Once the nominated flag is set for a component of a data stream, it\n // concludes the ICE processing for that component. See Section 8.\n // So disallow overwriting of the pair nominated for that component\n if (\n pair.nominated &&\n // remoteのgenerationをチェックする.localのgenerationは更新が間に合わないかもしれないのでチェックしない\n (pair.remoteCandidate.generation != undefined\n ? pair.remoteCandidate.generation === this.generation\n : true) &&\n this.nominated == undefined\n ) {\n log(\"nominated\", pair.toJSON());\n this.nominated = pair;\n this.nominating = false;\n this.pruneTcpConnections(pair);\n\n // 8.1.2. Updating States\n\n // The agent MUST remove all Waiting and Frozen pairs in the check\n // list and triggered check queue for the same component as the\n // nominated pairs for that media stream.\n for (const p of this.checkList) {\n if (\n p.component === pair.component &&\n [CandidatePairState.WAITING, CandidatePairState.FROZEN].includes(\n p.state,\n )\n ) {\n p.updateState(CandidatePairState.FAILED);\n }\n }\n }\n\n // Once there is at least one nominated pair in the valid list for\n // every component of at least one media stream and the state of the\n // check list is Running:\n if (this.nominated) {\n if (!this.checkListDone) {\n log(\"ICE completed\");\n this.checkListState.put(new Promise((r) => r(ICE_COMPLETED)));\n this.checkListDone = true;\n }\n return;\n }\n\n log(\"not completed\", pair.toJSON());\n\n // 7.1.3.2.3. Updating Pair States\n for (const p of this.checkList) {\n if (\n p.localCandidate.foundation === pair.localCandidate.foundation &&\n p.state === CandidatePairState.FROZEN\n ) {\n p.updateState(CandidatePairState.WAITING);\n }\n }\n }\n\n {\n const list = [CandidatePairState.SUCCEEDED, CandidatePairState.FAILED];\n if (this.checkList.find(({ state }) => !list.includes(state))) {\n return;\n }\n }\n\n if (!this.iceControlling) {\n const target = CandidatePairState.SUCCEEDED;\n if (this.checkList.find(({ state }) => state === target)) {\n return;\n }\n }\n\n if (!this.checkListDone) {\n log(\"ICE failed\");\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n }\n\n // 3. Terminology : Check\n checkStart = (pair: CandidatePair) =>\n cancelable<void>(async (r) => {\n // \"\"\"\n // Starts a check.\n // \"\"\"\n\n log(\"check start\", pair.toJSON());\n\n pair.updateState(CandidatePairState.IN_PROGRESS);\n const result: { response?: Message; addr?: Address } = {};\n const { remotePassword, remoteUsername, generation } = this;\n const localUsername = pair.localCandidate.ufrag ?? this.localUsername;\n\n const nominate = this.iceControlling && !this.remoteIsLite;\n const request = this.buildRequest({\n nominate,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n localCandidate: pair.localCandidate,\n });\n\n // Record start time for RTT calculation\n const startTime = performance.now();\n\n try {\n pair.requestsSent++;\n const [response, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(remotePassword, \"utf8\"),\n pair.localCandidate.transport.toLowerCase() === \"tcp\" ? 0 : 4,\n (attempt) => {\n if (attempt > 0) {\n pair.retransmissionsSent++;\n }\n },\n );\n pair.responsesReceived++;\n\n // Calculate RTT\n const endTime = performance.now();\n const rtt = (endTime - startTime) / 1000; // Convert to seconds\n\n // Update RTT statistics\n pair.rtt = rtt;\n pair.totalRoundTripTime += rtt;\n pair.roundTripTimeMeasurements++;\n\n log(\"response received\", request.toJSON(), response.toJSON(), addr, {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n rtt,\n });\n result.response = response;\n result.addr = addr;\n } catch (error: any) {\n const exc: TransactionError = error;\n // 7.1.3.1. Failure Cases\n log(\n \"failure case\",\n request.toJSON(),\n exc.response ? JSON.stringify(exc.response.toJSON(), null, 2) : error,\n {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n },\n pair.remoteAddr,\n );\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 487) {\n if (request.attributesKeys.includes(\"ICE-CONTROLLED\")) {\n this.switchRole(true);\n } else if (request.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n this.switchRole(false);\n }\n await this.checkStart(pair).awaitable;\n r();\n return;\n }\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 401) {\n log(\"retry 401\", pair.toJSON());\n await this.checkStart(pair).awaitable;\n r();\n return;\n } else {\n // timeout\n log(\"checkStart CandidatePairState.FAILED\", pair.toJSON());\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n }\n\n // # check remote address matches\n if (\n result.addr[0] !== pair.remoteAddr[0] ||\n result.addr[1] !== pair.remoteAddr[1]\n ) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n\n // # success\n if (nominate || pair.remoteNominated) {\n // # nominated by agressive nomination or the remote party\n pair.nominated = true;\n } else if (this.iceControlling && !this.nominating) {\n // # perform regular nomination\n this.nominating = true;\n const request = this.buildRequest({\n nominate: true,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n localCandidate: pair.localCandidate,\n });\n try {\n pair.requestsSent++;\n await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n pair.localCandidate.transport.toLowerCase() === \"tcp\" ? 0 : 4,\n (attempt) => {\n if (attempt > 0) {\n pair.retransmissionsSent++;\n }\n },\n );\n pair.responsesReceived++;\n } catch (error) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n return;\n }\n pair.nominated = true;\n }\n\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n r();\n });\n\n private addPair(pair: CandidatePair) {\n this.checkList.push(pair);\n this.sortCheckList();\n }\n\n // 7.2. STUN Server Procedures\n // 7.2.1.3、7.2.1.4、および7.2.1.5\n checkIncoming(message: Message, addr: Address, protocol: Protocol) {\n // \"\"\"\n // Handle a successful incoming check.\n // \"\"\"\n\n const txUsername = message.getAttributeValue(\"USERNAME\");\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n\n // find remote candidate\n let remoteCandidate: Candidate | undefined;\n const [host, port] = addr;\n for (const c of this.remoteCandidates) {\n if (c.host === host && c.port === port) {\n remoteCandidate = c;\n break;\n }\n }\n if (!remoteCandidate) {\n // 7.2.1.3. Learning Peer Reflexive Candidates\n remoteCandidate = new Candidate(\n randomString(10),\n 1,\n protocol.localCandidate?.transport ?? \"udp\",\n message.getAttributeValue(\"PRIORITY\"),\n host,\n port,\n \"prflx\",\n undefined,\n undefined,\n protocol.localCandidate?.transport === \"tcp\"\n ? remoteTcpTypeForIncoming(protocol.localCandidate.tcptype)\n : undefined,\n undefined,\n undefined,\n );\n this._remoteCandidates.push(remoteCandidate);\n }\n\n // find pair\n let pair = this.findPair(protocol, remoteCandidate);\n if (!pair) {\n pair = new CandidatePair(protocol, remoteCandidate, this.iceControlling);\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n pair.noteIncomingRequest(message.transactionIdHex);\n pair.requestsReceived++;\n pair.responsesSent++;\n pair.localCandidate.ufrag = localUsername;\n\n log(\"Triggered Checks\", message.toJSON(), pair.toJSON(), {\n localUsername: this.localUsername,\n remoteUsername: this.remoteUsername,\n localPassword: this.localPassword,\n remotePassword: this.remotePassword,\n generation: this.generation,\n });\n\n if (this.iceLite) {\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n pair.nominated = true;\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n }\n return;\n }\n\n // 7.2.1.4. Triggered Checks\n if (\n [CandidatePairState.WAITING, CandidatePairState.FAILED].includes(\n pair.state,\n )\n ) {\n pair.handle = this.checkStart(pair);\n }\n\n // 7.2.1.5. Updating the Nominated Flag\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n pair.nominated = true;\n this.checkComplete(pair);\n }\n }\n }\n\n private tryPair(protocol: Protocol, remoteCandidate: Candidate) {\n if (\n protocol.localCandidate?.canPairWith(remoteCandidate) &&\n !(\n protocol.localCandidate.transport.toLowerCase() === \"tcp\" &&\n protocol.localCandidate.tcptype === \"passive\" &&\n remoteCandidate.type !== \"prflx\"\n ) &&\n !this.findPair(protocol, remoteCandidate)\n ) {\n const pair = new CandidatePair(\n protocol,\n remoteCandidate,\n this.iceControlling,\n );\n if (\n this.options.filterCandidatePair &&\n !this.options.filterCandidatePair(pair)\n ) {\n return;\n }\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n }\n\n private pairLocalProtocol(protocol: Protocol) {\n for (const remoteCandidate of this.remoteCandidates) {\n this.tryPair(protocol, remoteCandidate);\n }\n }\n\n private pairRemoteCandidate = (remoteCandidate: Candidate) => {\n for (const protocol of this.protocols) {\n this.tryPair(protocol, remoteCandidate);\n }\n };\n\n private buildRequest({\n nominate,\n remoteUsername,\n localUsername,\n iceControlling,\n localCandidate,\n }: {\n nominate: boolean;\n remoteUsername: string;\n localUsername: string;\n iceControlling: boolean;\n localCandidate?: Candidate;\n }) {\n const txUsername = encodeTxUsername({ remoteUsername, localUsername });\n const request = new Message(methods.BINDING, classes.REQUEST);\n request.setAttribute(\"USERNAME\", txUsername).setAttribute(\n \"PRIORITY\",\n candidatePriority(\"prflx\", {\n transport: localCandidate?.transport,\n tcptype: localCandidate?.tcptype,\n }),\n );\n if (iceControlling) {\n request.setAttribute(\"ICE-CONTROLLING\", this.tieBreaker);\n if (nominate) {\n request.setAttribute(\"USE-CANDIDATE\", null);\n }\n } else {\n request.setAttribute(\"ICE-CONTROLLED\", this.tieBreaker);\n }\n return request;\n }\n\n private pruneTcpConnections(selectedPair: CandidatePair) {\n for (const protocol of this.protocols) {\n if (protocol.localCandidate?.transport.toLowerCase() !== \"tcp\") {\n continue;\n }\n\n if (\n \"pruneForSelection\" in protocol &&\n typeof protocol.pruneForSelection === \"function\"\n ) {\n void protocol.pruneForSelection(\n protocol === selectedPair.protocol\n ? selectedPair.remoteAddr\n : undefined,\n );\n }\n }\n }\n\n private respondError(\n request: Message,\n addr: Address,\n protocol: Protocol,\n errorCode: [number, string],\n ) {\n const response = new Message(\n request.messageMethod,\n classes.ERROR,\n request.transactionId,\n );\n response\n .setAttribute(\"ERROR-CODE\", errorCode)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n }\n}\n\nconst encodeTxUsername = ({\n remoteUsername,\n localUsername,\n}: {\n remoteUsername: string;\n localUsername: string;\n}) => {\n return `${remoteUsername}:${localUsername}`;\n};\n\nconst decodeTxUsername = (txUsername: string) => {\n const [remoteUsername, localUsername] = txUsername.split(\":\");\n return { remoteUsername, localUsername };\n};\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type * as os from "node:os";
|
|
2
|
+
/**
|
|
3
|
+
* Interface 辞書から host 候補アドレスを選別する(package-private)。
|
|
4
|
+
* 公開 barrel (`src/index.ts`) からは export しない。
|
|
5
|
+
* テストは本 helper への依存注入で行う。
|
|
6
|
+
*/
|
|
7
|
+
export declare function selectAddressesFromInterfaces(interfaces: NodeJS.Dict<os.NetworkInterfaceInfo[] | undefined>, family: number, options: {
|
|
8
|
+
useLinkLocalAddress?: boolean;
|
|
9
|
+
} | undefined, isLinkLocal: (info: os.NetworkInterfaceInfo) => boolean): string[];
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectAddressesFromInterfaces = selectAddressesFromInterfaces;
|
|
4
|
+
const common_1 = require("../imports/common");
|
|
5
|
+
/**
|
|
6
|
+
* Interface 辞書から host 候補アドレスを選別する(package-private)。
|
|
7
|
+
* 公開 barrel (`src/index.ts`) からは export しない。
|
|
8
|
+
* テストは本 helper への依存注入で行う。
|
|
9
|
+
*/
|
|
10
|
+
function selectAddressesFromInterfaces(interfaces, family, options = {}, isLinkLocal) {
|
|
11
|
+
// https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236
|
|
12
|
+
const costlyNetworks = ["ipsec", "tun", "utun", "tap"];
|
|
13
|
+
const banNetworks = ["vmnet", "veth"];
|
|
14
|
+
const { useLinkLocalAddress } = options;
|
|
15
|
+
const all = Object.keys(interfaces)
|
|
16
|
+
.map((nic) => {
|
|
17
|
+
for (const word of [...costlyNetworks, ...banNetworks]) {
|
|
18
|
+
if (nic.startsWith(word)) {
|
|
19
|
+
return {
|
|
20
|
+
nic,
|
|
21
|
+
addresses: [],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const addresses = (interfaces[nic] ?? []).filter((details) => (0, common_1.normalizeFamilyNodeV18)(details.family) === family &&
|
|
26
|
+
!details.internal &&
|
|
27
|
+
(useLinkLocalAddress ? true : !isLinkLocal(details)));
|
|
28
|
+
return {
|
|
29
|
+
nic,
|
|
30
|
+
addresses: addresses.map((address) => address.address),
|
|
31
|
+
};
|
|
32
|
+
})
|
|
33
|
+
.filter((address) => !!address);
|
|
34
|
+
// os.networkInterfaces doesn't actually return addresses in a good order.
|
|
35
|
+
// have seen instances where en0 (ethernet) is after en1 (wlan), etc.
|
|
36
|
+
// eth0 > eth1
|
|
37
|
+
all.sort((a, b) => a.nic.localeCompare(b.nic));
|
|
38
|
+
return Object.values(all).flatMap((entry) => entry.addresses);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=selectAddresses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectAddresses.js","sourceRoot":"","sources":["../../../../../ice/src/internal/selectAddresses.ts"],"names":[],"mappings":";;AAQA,sEAyCC;AAhDD,8CAA2D;AAE3D;;;;GAIG;AACH,SAAgB,6BAA6B,CAC3C,UAA8D,EAC9D,MAAc,EACd,UAEI,EAAE,EACN,WAAuD;IAEvD,qFAAqF;IACrF,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;SAChC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,cAAc,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;YACvD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,OAAO;oBACL,GAAG;oBACH,SAAS,EAAE,EAAc;iBAC1B,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAC9C,CAAC,OAAO,EAAE,EAAE,CACV,IAAA,+BAAsB,EAAC,OAAO,CAAC,MAAM,CAAC,KAAK,MAAM;YACjD,CAAC,OAAO,CAAC,QAAQ;YACjB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CACvD,CAAC;QACF,OAAO;YACL,GAAG;YACH,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SACvD,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAElC,0EAA0E;IAC1E,qEAAqE;IACrE,cAAc;IACd,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAChE,CAAC","sourcesContent":["import type * as os from \"node:os\";\nimport { normalizeFamilyNodeV18 } from \"../imports/common\";\n\n/**\n * Interface 辞書から host 候補アドレスを選別する(package-private)。\n * 公開 barrel (`src/index.ts`) からは export しない。\n * テストは本 helper への依存注入で行う。\n */\nexport function selectAddressesFromInterfaces(\n interfaces: NodeJS.Dict<os.NetworkInterfaceInfo[] | undefined>,\n family: number,\n options: {\n useLinkLocalAddress?: boolean;\n } = {},\n isLinkLocal: (info: os.NetworkInterfaceInfo) => boolean,\n): string[] {\n // https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236\n const costlyNetworks = [\"ipsec\", \"tun\", \"utun\", \"tap\"];\n const banNetworks = [\"vmnet\", \"veth\"];\n const { useLinkLocalAddress } = options;\n\n const all = Object.keys(interfaces)\n .map((nic) => {\n for (const word of [...costlyNetworks, ...banNetworks]) {\n if (nic.startsWith(word)) {\n return {\n nic,\n addresses: [] as string[],\n };\n }\n }\n const addresses = (interfaces[nic] ?? []).filter(\n (details) =>\n normalizeFamilyNodeV18(details.family) === family &&\n !details.internal &&\n (useLinkLocalAddress ? true : !isLinkLocal(details)),\n );\n return {\n nic,\n addresses: addresses.map((address) => address.address),\n };\n })\n .filter((address) => !!address);\n\n // os.networkInterfaces doesn't actually return addresses in a good order.\n // have seen instances where en0 (ethernet) is after en1 (wlan), etc.\n // eth0 > eth1\n all.sort((a, b) => a.nic.localeCompare(b.nic));\n return Object.values(all).flatMap((entry) => entry.addresses);\n}\n"]}
|