botframework-webchat 4.18.1-main.20250312.706dcd7 → 4.18.1-main.20250313.cd86ef9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/botframework-webchat.es5.js +1 -1
- package/dist/botframework-webchat.es5.mjs +1 -1
- package/dist/botframework-webchat.es5.mjs.map +1 -1
- package/dist/botframework-webchat.js +1 -1
- package/dist/botframework-webchat.minimal.js +1 -1
- package/dist/botframework-webchat.minimal.mjs +1 -1
- package/dist/botframework-webchat.mjs +1 -1
- package/dist/{chunk-24TI5DF6.js → chunk-7UVFO3ZG.js} +35 -35
- package/dist/chunk-7UVFO3ZG.js.map +1 -0
- package/dist/chunk-DT4JEDVP.mjs +3 -0
- package/dist/{chunk-EN5RF5BD.mjs.map → chunk-DT4JEDVP.mjs.map} +1 -1
- package/dist/chunk-LKW24LYQ.js +3 -0
- package/dist/chunk-LKW24LYQ.js.map +1 -0
- package/dist/{chunk-LILSPKM7.mjs → chunk-PRXWUPSB.mjs} +35 -35
- package/dist/chunk-PRXWUPSB.mjs.map +1 -0
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/webchat-es5.js +5 -5
- package/dist/webchat-minimal.js +4 -4
- package/dist/webchat.js +5 -5
- package/package.json +8 -8
- package/dist/chunk-24TI5DF6.js.map +0 -1
- package/dist/chunk-EN5RF5BD.mjs +0 -3
- package/dist/chunk-LILSPKM7.mjs.map +0 -1
- package/dist/chunk-WSM72U4X.js +0 -3
- package/dist/chunk-WSM72U4X.js.map +0 -1
- /package/dist/{chunk-24TI5DF6.js.LEGAL.txt → chunk-7UVFO3ZG.js.LEGAL.txt} +0 -0
- /package/dist/{chunk-EN5RF5BD.mjs.LEGAL.txt → chunk-DT4JEDVP.mjs.LEGAL.txt} +0 -0
- /package/dist/{chunk-LILSPKM7.mjs.LEGAL.txt → chunk-LKW24LYQ.js.LEGAL.txt} +0 -0
- /package/dist/{chunk-WSM72U4X.js.LEGAL.txt → chunk-PRXWUPSB.mjs.LEGAL.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/__w/1/s/BotFramework-WebChat/packages/bundle/dist/chunk-7UVFO3ZG.js","../../../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/lib/rng-browser.js","../../../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/lib/bytesToUuid.js","../../../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/v1.js","../../../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/v4.js","../../../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/index.js","../../../node_modules/requires-port/index.js","../../../node_modules/querystringify/index.js","../../../node_modules/url-parse/index.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/rng.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/regex.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/validate.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/stringify.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/v1.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/parse.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/v35.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/md5.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/v3.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/native.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/v4.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/sha1.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/v5.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/nil.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/version.js","../node_modules/microsoft-cognitiveservices-speech-sdk/node_modules/uuid/dist/commonjs-browser/index.js","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/Guid.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/PlatformEvent.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/AudioSourceEvents.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/ConnectionEvents.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/Error.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/ConnectionMessage.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/ConnectionOpenResponse.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/DeferralMap.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/DialogEvents.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/EventSource.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/Events.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/IConnection.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/IErrorMessages.js","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/List.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/Promise.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/Queue.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/RawWebsocketMessage.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/RiffPcmEncoder.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/Stream.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.speech/src/common.speech/TranslationStatus.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/ChunkedArrayBufferStream.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/Timeout.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/OCSPEvents.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/BackgroundError.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common/src/common/Exports.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.speech/src/common.speech/HeaderNames.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.speech/src/common.speech/IAuthentication.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.speech/src/common.speech/CognitiveSubscriptionKeyAuthentication.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.speech/src/common.speech/CognitiveTokenAuthentication.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/src/sdk/LogLevel.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/src/sdk/Contracts.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.browser/src/common.browser/ConsoleLoggingListener.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.browser/src/common.browser/PCMRecorder.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/Audio/src/sdk/Audio/AudioFileWriter.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.speech/src/common.speech/ServiceRecognizerBase.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.speech/src/common.speech/WebsocketMessageFormatter.ts","../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/lib/src/common.speech/src/common.speech/SynthesisAdapterBase.ts","../../../node_modules/@shikijs/vscode-textmate/dist/index.js","../../../node_modules/hast-util-to-html/lib/handle/element.js","../../../node_modules/regex/src/atomic.js","../../../node_modules/oniguruma-to-es/src/unicode.js","../../../node_modules/oniguruma-to-es/src/tokenize.js","../../../node_modules/oniguruma-to-es/src/transform.js","../../../node_modules/@shikijs/core/dist/index.mjs","../src/markdown/private/respectCRLF.ts","../src/markdown/renderMarkdown.ts","../../../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/sdk/Audio/src/sdk/Audio/AudioFileWriter.ts","../../../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.speech/src/common.speech/ServiceRecognizerBase.ts","../../../node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.speech/src/common.speech/WebsocketMessageFormatter.ts","../../../node_modules/web-speech-cognitive-services/node_modules/src/lib/warnings.ts","../../../node_modules/web-speech-cognitive-services/src/SpeechServices/TextToSpeech/buildSSML.js","../../../node_modules/web-speech-cognitive-services/src/SpeechServices/TextToSpeech/fetchSpeechData.js"],"names":["require_rng_browser","__commonJSMin","exports","module","getRandomValues","rnds8","rnds","i","r","require_bytesToUuid","byteToHex","bytesToUuid","buf","offset","bth","require_v1","rng","_nodeId","_clockseq","_lastMSecs","_lastNSecs","v1","options","b","node","clockseq","seedBytes","msecs","nsecs","dt","tl","tmh","n","require_v4","v4","ii","require_uuid","uuid","require_requires_port","port","protocol","require_querystringify","has","undef","decode","input","encode","querystring","query","parser","result","part","key","value","querystringify","obj","prefix","pairs","require_url_parse","required","qs","controlOrWhitespace","CRHTLF","slashes","protocolre","windowsDriveLetter","trimLeft","str","rules","address","url","isSpecial","ignore","lolcation","loc","globalVar","location","finaldestination","type","Url","scheme","extractProtocol","match","forwardSlashes","otherSlashes","slashesCount","rest","resolve","relative","base","path","last","unshift","up","extracted","parse","instruction","index","instructions","set","fn","char","ins","toString","stringify","host","require_rng","require_regex","_default","require_validate","_regex","_interopRequireDefault","validate","require_stringify","unsafeStringify","_validate","arr","_rng","_stringify","require_parse","v","require_v35","v35","_parse","stringToBytes","bytes","DNS","URL","name","version","hashfunc","generateUUID","namespace","_namespace","require_md5","md5","msg","md5ToHexEncodedArray","wordsToMd5","bytesToWords","output","length32","hexTab","x","hex","getOutputLength","inputLength8","len","a","c","d","olda","oldb","oldc","oldd","md5ff","md5gg","md5hh","md5ii","safeAdd","length8","y","lsw","bitRotateLeft","num","cnt","md5cmn","q","s","t","require_v3","_v","_md","v3","require_native","randomUUID","_native","require_sha1","f","z","ROTL","sha1","K","H","l","N","M","j","W","e","T","require_v5","_sha","v5","require_nil","require_version","require_commonjs_browser","_nil","_v2","_v3","_v4","_version","uuid_1","createGuid","createNoDashGuid","Guid_js_1","EventType","PlatformEvent","eventName","eventType","PlatformEvent_js_1","AudioSourceEvent","audioSourceId","AudioSourceInitializingEvent","AudioSourceReadyEvent","AudioSourceOffEvent","AudioSourceErrorEvent","error","AudioStreamNodeEvent","audioNodeId","AudioStreamNodeAttachingEvent","AudioStreamNodeAttachedEvent","AudioStreamNodeDetachedEvent","AudioStreamNodeErrorEvent","ServiceEvent","jsonstring","ConnectionEvent","connectionId","ConnectionStartEvent","uri","headers","ConnectionEstablishedEvent","ConnectionClosedEvent","statusCode","reason","ConnectionErrorEvent","message","ConnectionEstablishErrorEvent","statuscode","ConnectionMessageReceivedEvent","networkReceivedTimeISO","ConnectionMessageSentEvent","networkSentTimeISO","ArgumentNullError","argumentName","InvalidOperationError","ObjectDisposedError","objectName","Error_js_1","MessageType","ConnectionMessage","messageType","body","id","ConnectionOpenResponse","DeferralMap","deferral","DialogEvent","SendingAgentContextMessageEvent","agentConfig","EventSource","metadata","event","paramName","eventId","onEventCallback","listener","EventSource_js_1","Events","_Events","eventSource","ConnectionState","require_IErrorMessages","List","_List","list","item","itemIndex","count","removedElements","addedCallback","subscriptionId","removedCallback","disposedCallback","seperator","cloneCopy","val","callback","selectList","filteredList","compareFn","orderedArray","array","subscriptions","PromiseState","PromiseResult","promiseResultEventSource","PromiseResultEventSource","onSetResult","onSetError","Deferred","reject","Sink","errorHandler","successCallback","errorCallback","marshalPromiseToCallbacks","promise","cb","err","typedError","List_js_1","Promise_js_1","SubscriberType","Queue","deferredSubscriber","pendingItemProcessor","subs","detachable","promiseArray","wrapper","lists","subscriber","dequeuedItem","ConnectionMessage_js_1","RawWebsocketMessage","payload","RiffPcmEncoder","actualSampleRate","desiredSampleRate","actualAudioFrame","audioFrame","audioLength","buffer","view","srcFrame","srcRate","dstRate","ratio","dstLength","dstFrame","srcOffset","dstOffset","nextSrcOffset","accum","Queue_js_1","Stream","streamId","streamChunk","TranslationStatus","Exports_js_1","ChunkedArrayBufferStream","targetChunkSize","chunk","bytesCopiedFromBuffer","bytesToCopy","targetView","sourceView","Timeout","_Timeout","scheduledTimeoutFunctions","unhandledRequests","workerUrl","worker","data","timerId","idOrFunc","unhandledTimerId","func","delay","OCSPEvent","signature","OCSPMemoryCacheHitEvent","OCSPCacheMissEvent","OCSPDiskCacheHitEvent","OCSPCacheUpdateNeededEvent","OCSPMemoryCacheStoreEvent","OCSPDiskCacheStoreEvent","OCSPCacheUpdateCompleteEvent","OCSPStapleReceivedEvent","OCSPWSUpgradeStartedEvent","serialNumber","OCSPCacheEntryExpiredEvent","expireTime","OCSPCacheEntryNeedsRefreshEvent","startTime","OCSPCacheHitEvent","OCSPVerificationFailedEvent","OCSPCacheFetchErrorEvent","OCSPResponseRetrievedEvent","OCSPCacheUpdateErrorEvent","BackgroundEvent","__exportStar","TranslationStatus_js_1","HeaderNames","AuthInfo","headerName","token","HeaderNames_js_1","IAuthentication_js_1","CognitiveSubscriptionKeyAuthentication","subscriptionKey","authFetchEventId","CognitiveTokenAuthentication","_CognitiveTokenAuthentication","fetchCallback","fetchOnExpiryCallback","Contracts","_Contracts","param","maxLength","minLength","isDisposed","fs","__importStar","LogLevel_js_1","Contracts_js_1","ConsoleLoggingListener","logLevelFilter","enableOutput","log","logFragments","grammar","state","lastToken"],"mappings":"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B,CACjC,IAAM+J,CAAAA,CAAe,CACjB,CAAA,EAAA;AxDjE8R;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AyD4E1Q,4DAAA;AClEuB,0EAAA;ACg+B3C;AC/9BkD;A5DN4O;A4DsBtQ;AC2btB,oBAAA;ACisCZ;AA4zBAC;ACz8E8B,SAAA;AAC3B,aAAA;AAAiC,YAAA;AAIjC,cAAA;AAAyB,OAAA;AACzB,aAAA;AAAiC,aAAA;AAiC9BC,aAAAA;ACyDwC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAarB,WAAA;AAAA;AA0CaC;AhEhIkQ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AiEyBnQ,cAAA;AjEvBmQ;AkEnDhR,IAAA;AlEqDgR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AkEnDjR,IAAA;AACC,IAAA;AlEqDgR;AkElDtQha;AlEoDsQ;AkElDhR,IAAA;AlEoDgR;AACA;AACA;AkElDhR,IAAA;AlEoDgR;AACA;AkEHlR;AAoQY;AlE9PsQ;AmE0PpR,sBAAA;ACw1BC;ACrvCyD,EAAA;AAAS;ACuClC,EAAA;AChB3C,0EAAA;AC6uByB;AC9uByB;AzEsJ4O;AyElI5P;AC3B1C;ACHqC,mBAAA;AAGpC,oBAAA;AACO,MAAA;A3EkK8R;AACA;A4E/KxS,QAAA;A5EiLwS","file":"/__w/1/s/BotFramework-WebChat/packages/bundle/dist/chunk-7UVFO3ZG.js","sourcesContent":[null,"// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","'use strict';\n\n/**\n * Check if we're required to add a port number.\n *\n * @see https://url.spec.whatwg.org/#default-port\n * @param {Number|String} port Port number we need to check\n * @param {String} protocol Protocol we need to check against.\n * @returns {Boolean} Is it a default port for the given protocol\n * @api private\n */\nmodule.exports = function required(port, protocol) {\n protocol = protocol.split(':')[0];\n port = +port;\n\n if (!port) return false;\n\n switch (protocol) {\n case 'http':\n case 'ws':\n return port !== 80;\n\n case 'https':\n case 'wss':\n return port !== 443;\n\n case 'ftp':\n return port !== 21;\n\n case 'gopher':\n return port !== 70;\n\n case 'file':\n return false;\n }\n\n return port !== 0;\n};\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , undef;\n\n/**\n * Decode a URI encoded string.\n *\n * @param {String} input The URI encoded string.\n * @returns {String|Null} The decoded string.\n * @api private\n */\nfunction decode(input) {\n try {\n return decodeURIComponent(input.replace(/\\+/g, ' '));\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Attempts to encode a given input.\n *\n * @param {String} input The string that needs to be encoded.\n * @returns {String|Null} The encoded string.\n * @api private\n */\nfunction encode(input) {\n try {\n return encodeURIComponent(input);\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Simple query string parser.\n *\n * @param {String} query The query string that needs to be parsed.\n * @returns {Object}\n * @api public\n */\nfunction querystring(query) {\n var parser = /([^=?#&]+)=?([^&]*)/g\n , result = {}\n , part;\n\n while (part = parser.exec(query)) {\n var key = decode(part[1])\n , value = decode(part[2]);\n\n //\n // Prevent overriding of existing properties. This ensures that build-in\n // methods like `toString` or __proto__ are not overriden by malicious\n // querystrings.\n //\n // In the case if failed decoding, we want to omit the key/value pairs\n // from the result.\n //\n if (key === null || value === null || key in result) continue;\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Transform a query string to an object.\n *\n * @param {Object} obj Object that should be transformed.\n * @param {String} prefix Optional prefix.\n * @returns {String}\n * @api public\n */\nfunction querystringify(obj, prefix) {\n prefix = prefix || '';\n\n var pairs = []\n , value\n , key;\n\n //\n // Optionally prefix with a '?' if needed\n //\n if ('string' !== typeof prefix) prefix = '?';\n\n for (key in obj) {\n if (has.call(obj, key)) {\n value = obj[key];\n\n //\n // Edge cases where we actually want to encode the value to an empty\n // string instead of the stringified value.\n //\n if (!value && (value === null || value === undef || isNaN(value))) {\n value = '';\n }\n\n key = encode(key);\n value = encode(value);\n\n //\n // If we failed to encode the strings, we should bail out as we don't\n // want to add invalid strings to the query.\n //\n if (key === null || value === null) continue;\n pairs.push(key +'='+ value);\n }\n }\n\n return pairs.length ? prefix + pairs.join('&') : '';\n}\n\n//\n// Expose the module.\n//\nexports.stringify = querystringify;\nexports.parse = querystring;\n","'use strict';\n\nvar required = require('requires-port')\n , qs = require('querystringify')\n , controlOrWhitespace = /^[\\x00-\\x20\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]+/\n , CRHTLF = /[\\n\\r\\t]/g\n , slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\\/\\//\n , port = /:\\d+$/\n , protocolre = /^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\\\/]+)?([\\S\\s]*)/i\n , windowsDriveLetter = /^[a-zA-Z]:/;\n\n/**\n * Remove control characters and whitespace from the beginning of a string.\n *\n * @param {Object|String} str String to trim.\n * @returns {String} A new string representing `str` stripped of control\n * characters and whitespace from its beginning.\n * @public\n */\nfunction trimLeft(str) {\n return (str ? str : '').toString().replace(controlOrWhitespace, '');\n}\n\n/**\n * These are the parse rules for the URL parser, it informs the parser\n * about:\n *\n * 0. The char it Needs to parse, if it's a string it should be done using\n * indexOf, RegExp using exec and NaN means set as current value.\n * 1. The property we should set when parsing this value.\n * 2. Indication if it's backwards or forward parsing, when set as number it's\n * the value of extra chars that should be split off.\n * 3. Inherit from location if non existing in the parser.\n * 4. `toLowerCase` the resulting value.\n */\nvar rules = [\n ['#', 'hash'], // Extract from the back.\n ['?', 'query'], // Extract from the back.\n function sanitize(address, url) { // Sanitize what is left of the address\n return isSpecial(url.protocol) ? address.replace(/\\\\/g, '/') : address;\n },\n ['/', 'pathname'], // Extract from the back.\n ['@', 'auth', 1], // Extract from the front.\n [NaN, 'host', undefined, 1, 1], // Set left over value.\n [/:(\\d*)$/, 'port', undefined, 1], // RegExp the back.\n [NaN, 'hostname', undefined, 1, 1] // Set left over.\n];\n\n/**\n * These properties should not be copied or inherited from. This is only needed\n * for all non blob URL's as a blob URL does not include a hash, only the\n * origin.\n *\n * @type {Object}\n * @private\n */\nvar ignore = { hash: 1, query: 1 };\n\n/**\n * The location object differs when your code is loaded through a normal page,\n * Worker or through a worker using a blob. And with the blobble begins the\n * trouble as the location object will contain the URL of the blob, not the\n * location of the page where our code is loaded in. The actual origin is\n * encoded in the `pathname` so we can thankfully generate a good \"default\"\n * location from it so we can generate proper relative URL's again.\n *\n * @param {Object|String} loc Optional default location object.\n * @returns {Object} lolcation object.\n * @public\n */\nfunction lolcation(loc) {\n var globalVar;\n\n if (typeof window !== 'undefined') globalVar = window;\n else if (typeof global !== 'undefined') globalVar = global;\n else if (typeof self !== 'undefined') globalVar = self;\n else globalVar = {};\n\n var location = globalVar.location || {};\n loc = loc || location;\n\n var finaldestination = {}\n , type = typeof loc\n , key;\n\n if ('blob:' === loc.protocol) {\n finaldestination = new Url(unescape(loc.pathname), {});\n } else if ('string' === type) {\n finaldestination = new Url(loc, {});\n for (key in ignore) delete finaldestination[key];\n } else if ('object' === type) {\n for (key in loc) {\n if (key in ignore) continue;\n finaldestination[key] = loc[key];\n }\n\n if (finaldestination.slashes === undefined) {\n finaldestination.slashes = slashes.test(loc.href);\n }\n }\n\n return finaldestination;\n}\n\n/**\n * Check whether a protocol scheme is special.\n *\n * @param {String} The protocol scheme of the URL\n * @return {Boolean} `true` if the protocol scheme is special, else `false`\n * @private\n */\nfunction isSpecial(scheme) {\n return (\n scheme === 'file:' ||\n scheme === 'ftp:' ||\n scheme === 'http:' ||\n scheme === 'https:' ||\n scheme === 'ws:' ||\n scheme === 'wss:'\n );\n}\n\n/**\n * @typedef ProtocolExtract\n * @type Object\n * @property {String} protocol Protocol matched in the URL, in lowercase.\n * @property {Boolean} slashes `true` if protocol is followed by \"//\", else `false`.\n * @property {String} rest Rest of the URL that is not part of the protocol.\n */\n\n/**\n * Extract protocol information from a URL with/without double slash (\"//\").\n *\n * @param {String} address URL we want to extract from.\n * @param {Object} location\n * @return {ProtocolExtract} Extracted information.\n * @private\n */\nfunction extractProtocol(address, location) {\n address = trimLeft(address);\n address = address.replace(CRHTLF, '');\n location = location || {};\n\n var match = protocolre.exec(address);\n var protocol = match[1] ? match[1].toLowerCase() : '';\n var forwardSlashes = !!match[2];\n var otherSlashes = !!match[3];\n var slashesCount = 0;\n var rest;\n\n if (forwardSlashes) {\n if (otherSlashes) {\n rest = match[2] + match[3] + match[4];\n slashesCount = match[2].length + match[3].length;\n } else {\n rest = match[2] + match[4];\n slashesCount = match[2].length;\n }\n } else {\n if (otherSlashes) {\n rest = match[3] + match[4];\n slashesCount = match[3].length;\n } else {\n rest = match[4]\n }\n }\n\n if (protocol === 'file:') {\n if (slashesCount >= 2) {\n rest = rest.slice(2);\n }\n } else if (isSpecial(protocol)) {\n rest = match[4];\n } else if (protocol) {\n if (forwardSlashes) {\n rest = rest.slice(2);\n }\n } else if (slashesCount >= 2 && isSpecial(location.protocol)) {\n rest = match[4];\n }\n\n return {\n protocol: protocol,\n slashes: forwardSlashes || isSpecial(protocol),\n slashesCount: slashesCount,\n rest: rest\n };\n}\n\n/**\n * Resolve a relative URL pathname against a base URL pathname.\n *\n * @param {String} relative Pathname of the relative URL.\n * @param {String} base Pathname of the base URL.\n * @return {String} Resolved pathname.\n * @private\n */\nfunction resolve(relative, base) {\n if (relative === '') return base;\n\n var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/'))\n , i = path.length\n , last = path[i - 1]\n , unshift = false\n , up = 0;\n\n while (i--) {\n if (path[i] === '.') {\n path.splice(i, 1);\n } else if (path[i] === '..') {\n path.splice(i, 1);\n up++;\n } else if (up) {\n if (i === 0) unshift = true;\n path.splice(i, 1);\n up--;\n }\n }\n\n if (unshift) path.unshift('');\n if (last === '.' || last === '..') path.push('');\n\n return path.join('/');\n}\n\n/**\n * The actual URL instance. Instead of returning an object we've opted-in to\n * create an actual constructor as it's much more memory efficient and\n * faster and it pleases my OCD.\n *\n * It is worth noting that we should not use `URL` as class name to prevent\n * clashes with the global URL instance that got introduced in browsers.\n *\n * @constructor\n * @param {String} address URL we want to parse.\n * @param {Object|String} [location] Location defaults for relative paths.\n * @param {Boolean|Function} [parser] Parser for the query string.\n * @private\n */\nfunction Url(address, location, parser) {\n address = trimLeft(address);\n address = address.replace(CRHTLF, '');\n\n if (!(this instanceof Url)) {\n return new Url(address, location, parser);\n }\n\n var relative, extracted, parse, instruction, index, key\n , instructions = rules.slice()\n , type = typeof location\n , url = this\n , i = 0;\n\n //\n // The following if statements allows this module two have compatibility with\n // 2 different API:\n //\n // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments\n // where the boolean indicates that the query string should also be parsed.\n //\n // 2. The `URL` interface of the browser which accepts a URL, object as\n // arguments. The supplied object will be used as default values / fall-back\n // for relative paths.\n //\n if ('object' !== type && 'string' !== type) {\n parser = location;\n location = null;\n }\n\n if (parser && 'function' !== typeof parser) parser = qs.parse;\n\n location = lolcation(location);\n\n //\n // Extract protocol information before running the instructions.\n //\n extracted = extractProtocol(address || '', location);\n relative = !extracted.protocol && !extracted.slashes;\n url.slashes = extracted.slashes || relative && location.slashes;\n url.protocol = extracted.protocol || location.protocol || '';\n address = extracted.rest;\n\n //\n // When the authority component is absent the URL starts with a path\n // component.\n //\n if (\n extracted.protocol === 'file:' && (\n extracted.slashesCount !== 2 || windowsDriveLetter.test(address)) ||\n (!extracted.slashes &&\n (extracted.protocol ||\n extracted.slashesCount < 2 ||\n !isSpecial(url.protocol)))\n ) {\n instructions[3] = [/(.*)/, 'pathname'];\n }\n\n for (; i < instructions.length; i++) {\n instruction = instructions[i];\n\n if (typeof instruction === 'function') {\n address = instruction(address, url);\n continue;\n }\n\n parse = instruction[0];\n key = instruction[1];\n\n if (parse !== parse) {\n url[key] = address;\n } else if ('string' === typeof parse) {\n index = parse === '@'\n ? address.lastIndexOf(parse)\n : address.indexOf(parse);\n\n if (~index) {\n if ('number' === typeof instruction[2]) {\n url[key] = address.slice(0, index);\n address = address.slice(index + instruction[2]);\n } else {\n url[key] = address.slice(index);\n address = address.slice(0, index);\n }\n }\n } else if ((index = parse.exec(address))) {\n url[key] = index[1];\n address = address.slice(0, index.index);\n }\n\n url[key] = url[key] || (\n relative && instruction[3] ? location[key] || '' : ''\n );\n\n //\n // Hostname, host and protocol should be lowercased so they can be used to\n // create a proper `origin`.\n //\n if (instruction[4]) url[key] = url[key].toLowerCase();\n }\n\n //\n // Also parse the supplied query string in to an object. If we're supplied\n // with a custom parser as function use that instead of the default build-in\n // parser.\n //\n if (parser) url.query = parser(url.query);\n\n //\n // If the URL is relative, resolve the pathname against the base URL.\n //\n if (\n relative\n && location.slashes\n && url.pathname.charAt(0) !== '/'\n && (url.pathname !== '' || location.pathname !== '')\n ) {\n url.pathname = resolve(url.pathname, location.pathname);\n }\n\n //\n // Default to a / for pathname if none exists. This normalizes the URL\n // to always have a /\n //\n if (url.pathname.charAt(0) !== '/' && isSpecial(url.protocol)) {\n url.pathname = '/' + url.pathname;\n }\n\n //\n // We should not add port numbers if they are already the default port number\n // for a given protocol. As the host also contains the port number we're going\n // override it with the hostname which contains no port number.\n //\n if (!required(url.port, url.protocol)) {\n url.host = url.hostname;\n url.port = '';\n }\n\n //\n // Parse down the `auth` for the username and password.\n //\n url.username = url.password = '';\n\n if (url.auth) {\n index = url.auth.indexOf(':');\n\n if (~index) {\n url.username = url.auth.slice(0, index);\n url.username = encodeURIComponent(decodeURIComponent(url.username));\n\n url.password = url.auth.slice(index + 1);\n url.password = encodeURIComponent(decodeURIComponent(url.password))\n } else {\n url.username = encodeURIComponent(decodeURIComponent(url.auth));\n }\n\n url.auth = url.password ? url.username +':'+ url.password : url.username;\n }\n\n url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n ? url.protocol +'//'+ url.host\n : 'null';\n\n //\n // The href is just the compiled result.\n //\n url.href = url.toString();\n}\n\n/**\n * This is convenience method for changing properties in the URL instance to\n * insure that they all propagate correctly.\n *\n * @param {String} part Property we need to adjust.\n * @param {Mixed} value The newly assigned value.\n * @param {Boolean|Function} fn When setting the query, it will be the function\n * used to parse the query.\n * When setting the protocol, double slash will be\n * removed from the final url if it is true.\n * @returns {URL} URL instance for chaining.\n * @public\n */\nfunction set(part, value, fn) {\n var url = this;\n\n switch (part) {\n case 'query':\n if ('string' === typeof value && value.length) {\n value = (fn || qs.parse)(value);\n }\n\n url[part] = value;\n break;\n\n case 'port':\n url[part] = value;\n\n if (!required(value, url.protocol)) {\n url.host = url.hostname;\n url[part] = '';\n } else if (value) {\n url.host = url.hostname +':'+ value;\n }\n\n break;\n\n case 'hostname':\n url[part] = value;\n\n if (url.port) value += ':'+ url.port;\n url.host = value;\n break;\n\n case 'host':\n url[part] = value;\n\n if (port.test(value)) {\n value = value.split(':');\n url.port = value.pop();\n url.hostname = value.join(':');\n } else {\n url.hostname = value;\n url.port = '';\n }\n\n break;\n\n case 'protocol':\n url.protocol = value.toLowerCase();\n url.slashes = !fn;\n break;\n\n case 'pathname':\n case 'hash':\n if (value) {\n var char = part === 'pathname' ? '/' : '#';\n url[part] = value.charAt(0) !== char ? char + value : value;\n } else {\n url[part] = value;\n }\n break;\n\n case 'username':\n case 'password':\n url[part] = encodeURIComponent(value);\n break;\n\n case 'auth':\n var index = value.indexOf(':');\n\n if (~index) {\n url.username = value.slice(0, index);\n url.username = encodeURIComponent(decodeURIComponent(url.username));\n\n url.password = value.slice(index + 1);\n url.password = encodeURIComponent(decodeURIComponent(url.password));\n } else {\n url.username = encodeURIComponent(decodeURIComponent(value));\n }\n }\n\n for (var i = 0; i < rules.length; i++) {\n var ins = rules[i];\n\n if (ins[4]) url[ins[1]] = url[ins[1]].toLowerCase();\n }\n\n url.auth = url.password ? url.username +':'+ url.password : url.username;\n\n url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n ? url.protocol +'//'+ url.host\n : 'null';\n\n url.href = url.toString();\n\n return url;\n}\n\n/**\n * Transform the properties back in to a valid and full URL string.\n *\n * @param {Function} stringify Optional query stringify function.\n * @returns {String} Compiled version of the URL.\n * @public\n */\nfunction toString(stringify) {\n if (!stringify || 'function' !== typeof stringify) stringify = qs.stringify;\n\n var query\n , url = this\n , host = url.host\n , protocol = url.protocol;\n\n if (protocol && protocol.charAt(protocol.length - 1) !== ':') protocol += ':';\n\n var result =\n protocol +\n ((url.protocol && url.slashes) || isSpecial(url.protocol) ? '//' : '');\n\n if (url.username) {\n result += url.username;\n if (url.password) result += ':'+ url.password;\n result += '@';\n } else if (url.password) {\n result += ':'+ url.password;\n result += '@';\n } else if (\n url.protocol !== 'file:' &&\n isSpecial(url.protocol) &&\n !host &&\n url.pathname !== '/'\n ) {\n //\n // Add back the empty userinfo, otherwise the original invalid URL\n // might be transformed into a valid one with `url.pathname` as host.\n //\n result += '@';\n }\n\n //\n // Trailing colon is removed from `url.host` when it is parsed. If it still\n // ends with a colon, then add back the trailing colon that was removed. This\n // prevents an invalid URL from being transformed into a valid one.\n //\n if (host[host.length - 1] === ':' || (port.test(url.hostname) && !url.port)) {\n host += ':';\n }\n\n result += host + url.pathname;\n\n query = 'object' === typeof url.query ? stringify(url.query) : url.query;\n if (query) result += '?' !== query.charAt(0) ? '?'+ query : query;\n\n if (url.hash) result += url.hash;\n\n return result;\n}\n\nUrl.prototype = { set: set, toString: toString };\n\n//\n// Expose the URL parser and some additional properties that might be useful for\n// others or testing.\n//\nUrl.extractProtocol = extractProtocol;\nUrl.location = lolcation;\nUrl.trimLeft = trimLeft;\nUrl.qs = qs;\n\nmodule.exports = Url;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rng;\n// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\n\nfunction rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _regex = _interopRequireDefault(require(\"./regex.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && _regex.default.test(uuid);\n}\n\nvar _default = validate;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nexports.unsafeStringify = unsafeStringify;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nfunction unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nvar _default = stringify;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _rng = _interopRequireDefault(require(\"./rng.js\"));\n\nvar _stringify = require(\"./stringify.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\nlet _nodeId;\n\nlet _clockseq; // Previous uuid creation time\n\n\nlet _lastMSecs = 0;\nlet _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n let i = buf && offset || 0;\n const b = buf || new Array(16);\n options = options || {};\n let node = options.node || _nodeId;\n let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n const seedBytes = options.random || (options.rng || _rng.default)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (let n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || (0, _stringify.unsafeStringify)(b);\n}\n\nvar _default = v1;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction parse(uuid) {\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n let v;\n const arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nvar _default = parse;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.URL = exports.DNS = void 0;\nexports.default = v35;\n\nvar _stringify = require(\"./stringify.js\");\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n const bytes = [];\n\n for (let i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nconst DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexports.DNS = DNS;\nconst URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexports.URL = URL;\n\nfunction v35(name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n var _namespace;\n\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = (0, _parse.default)(namespace);\n }\n\n if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n let bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return (0, _stringify.unsafeStringify)(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (let i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n const output = [];\n const length32 = input.length * 32;\n const hexTab = '0123456789abcdef';\n\n for (let i = 0; i < length32; i += 8) {\n const x = input[i >> 5] >>> i % 32 & 0xff;\n const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n let a = 1732584193;\n let b = -271733879;\n let c = -1732584194;\n let d = 271733878;\n\n for (let i = 0; i < x.length; i += 16) {\n const olda = a;\n const oldb = b;\n const oldc = c;\n const oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n const length8 = input.length * 8;\n const output = new Uint32Array(getOutputLength(length8));\n\n for (let i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n const lsw = (x & 0xffff) + (y & 0xffff);\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nvar _default = md5;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _v = _interopRequireDefault(require(\"./v35.js\"));\n\nvar _md = _interopRequireDefault(require(\"./md5.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst v3 = (0, _v.default)('v3', 0x30, _md.default);\nvar _default = v3;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nvar _default = {\n randomUUID\n};\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _native = _interopRequireDefault(require(\"./native.js\"));\n\nvar _rng = _interopRequireDefault(require(\"./rng.js\"));\n\nvar _stringify = require(\"./stringify.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction v4(options, buf, offset) {\n if (_native.default.randomUUID && !buf && !options) {\n return _native.default.randomUUID();\n }\n\n options = options || {};\n\n const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return (0, _stringify.unsafeStringify)(rnds);\n}\n\nvar _default = v4;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (let i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n const l = bytes.length / 4 + 2;\n const N = Math.ceil(l / 16);\n const M = new Array(N);\n\n for (let i = 0; i < N; ++i) {\n const arr = new Uint32Array(16);\n\n for (let j = 0; j < 16; ++j) {\n arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];\n }\n\n M[i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (let i = 0; i < N; ++i) {\n const W = new Uint32Array(80);\n\n for (let t = 0; t < 16; ++t) {\n W[t] = M[i][t];\n }\n\n for (let t = 16; t < 80; ++t) {\n W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);\n }\n\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n let e = H[4];\n\n for (let t = 0; t < 80; ++t) {\n const s = Math.floor(t / 20);\n const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nvar _default = sha1;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _v = _interopRequireDefault(require(\"./v35.js\"));\n\nvar _sha = _interopRequireDefault(require(\"./sha1.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst v5 = (0, _v.default)('v5', 0x50, _sha.default);\nvar _default = v5;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = '00000000-0000-0000-0000-000000000000';\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction version(uuid) {\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.slice(14, 15), 16);\n}\n\nvar _default = version;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"NIL\", {\n enumerable: true,\n get: function get() {\n return _nil.default;\n }\n});\nObject.defineProperty(exports, \"parse\", {\n enumerable: true,\n get: function get() {\n return _parse.default;\n }\n});\nObject.defineProperty(exports, \"stringify\", {\n enumerable: true,\n get: function get() {\n return _stringify.default;\n }\n});\nObject.defineProperty(exports, \"v1\", {\n enumerable: true,\n get: function get() {\n return _v.default;\n }\n});\nObject.defineProperty(exports, \"v3\", {\n enumerable: true,\n get: function get() {\n return _v2.default;\n }\n});\nObject.defineProperty(exports, \"v4\", {\n enumerable: true,\n get: function get() {\n return _v3.default;\n }\n});\nObject.defineProperty(exports, \"v5\", {\n enumerable: true,\n get: function get() {\n return _v4.default;\n }\n});\nObject.defineProperty(exports, \"validate\", {\n enumerable: true,\n get: function get() {\n return _validate.default;\n }\n});\nObject.defineProperty(exports, \"version\", {\n enumerable: true,\n get: function get() {\n return _version.default;\n }\n});\n\nvar _v = _interopRequireDefault(require(\"./v1.js\"));\n\nvar _v2 = _interopRequireDefault(require(\"./v3.js\"));\n\nvar _v3 = _interopRequireDefault(require(\"./v4.js\"));\n\nvar _v4 = _interopRequireDefault(require(\"./v5.js\"));\n\nvar _nil = _interopRequireDefault(require(\"./nil.js\"));\n\nvar _version = _interopRequireDefault(require(\"./version.js\"));\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { v4 as uuid } from \"uuid\";\r\n\r\nconst createGuid: () => string = (): string => uuid();\r\n\r\nconst createNoDashGuid: () => string = (): string => createGuid().replace(new RegExp(\"-\", \"g\"), \"\").toUpperCase();\r\n\r\nexport { createGuid, createNoDashGuid };\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { createNoDashGuid } from \"./Guid.js\";\r\nimport { IStringDictionary } from \"./IDictionary.js\";\r\n\r\nexport enum EventType {\r\n Debug,\r\n Info,\r\n Warning,\r\n Error,\r\n None,\r\n}\r\n\r\nexport class PlatformEvent {\r\n private privName: string;\r\n private privEventId: string;\r\n private privEventTime: string;\r\n private privEventType: EventType;\r\n private privMetadata: IStringDictionary<string>;\r\n\r\n public constructor(eventName: string, eventType: EventType) {\r\n this.privName = eventName;\r\n this.privEventId = createNoDashGuid();\r\n this.privEventTime = new Date().toISOString();\r\n this.privEventType = eventType;\r\n this.privMetadata = { };\r\n }\r\n\r\n public get name(): string {\r\n return this.privName;\r\n }\r\n\r\n public get eventId(): string {\r\n return this.privEventId;\r\n }\r\n\r\n public get eventTime(): string {\r\n return this.privEventTime;\r\n }\r\n\r\n public get eventType(): EventType {\r\n return this.privEventType;\r\n }\r\n\r\n public get metadata(): IStringDictionary<string> {\r\n return this.privMetadata;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\n/* eslint-disable max-classes-per-file */\r\n\r\nimport { EventType, PlatformEvent } from \"./PlatformEvent.js\";\r\n\r\nexport class AudioSourceEvent extends PlatformEvent {\r\n private privAudioSourceId: string;\r\n\r\n public constructor(eventName: string, audioSourceId: string, eventType: EventType = EventType.Info) {\r\n super(eventName, eventType);\r\n this.privAudioSourceId = audioSourceId;\r\n }\r\n\r\n public get audioSourceId(): string {\r\n return this.privAudioSourceId;\r\n }\r\n}\r\n\r\nexport class AudioSourceInitializingEvent extends AudioSourceEvent {\r\n public constructor(audioSourceId: string) {\r\n super(\"AudioSourceInitializingEvent\", audioSourceId);\r\n }\r\n}\r\n\r\nexport class AudioSourceReadyEvent extends AudioSourceEvent {\r\n public constructor(audioSourceId: string) {\r\n super(\"AudioSourceReadyEvent\", audioSourceId);\r\n }\r\n}\r\n\r\nexport class AudioSourceOffEvent extends AudioSourceEvent {\r\n public constructor(audioSourceId: string) {\r\n super(\"AudioSourceOffEvent\", audioSourceId);\r\n }\r\n}\r\n\r\nexport class AudioSourceErrorEvent extends AudioSourceEvent {\r\n private privError: string;\r\n\r\n public constructor(audioSourceId: string, error: string) {\r\n super(\"AudioSourceErrorEvent\", audioSourceId, EventType.Error);\r\n this.privError = error;\r\n }\r\n\r\n public get error(): string {\r\n return this.privError;\r\n }\r\n}\r\n\r\nexport class AudioStreamNodeEvent extends AudioSourceEvent {\r\n private privAudioNodeId: string;\r\n\r\n public constructor(eventName: string, audioSourceId: string, audioNodeId: string) {\r\n super(eventName, audioSourceId);\r\n this.privAudioNodeId = audioNodeId;\r\n }\r\n\r\n public get audioNodeId(): string {\r\n return this.privAudioNodeId;\r\n }\r\n}\r\n\r\nexport class AudioStreamNodeAttachingEvent extends AudioStreamNodeEvent {\r\n public constructor(audioSourceId: string, audioNodeId: string) {\r\n super(\"AudioStreamNodeAttachingEvent\", audioSourceId, audioNodeId);\r\n }\r\n}\r\n\r\nexport class AudioStreamNodeAttachedEvent extends AudioStreamNodeEvent {\r\n public constructor(audioSourceId: string, audioNodeId: string) {\r\n super(\"AudioStreamNodeAttachedEvent\", audioSourceId, audioNodeId);\r\n }\r\n}\r\n\r\nexport class AudioStreamNodeDetachedEvent extends AudioStreamNodeEvent {\r\n public constructor(audioSourceId: string, audioNodeId: string) {\r\n super(\"AudioStreamNodeDetachedEvent\", audioSourceId, audioNodeId);\r\n }\r\n}\r\n\r\nexport class AudioStreamNodeErrorEvent extends AudioStreamNodeEvent {\r\n private privError: string;\r\n\r\n public constructor(audioSourceId: string, audioNodeId: string, error: string) {\r\n super(\"AudioStreamNodeErrorEvent\", audioSourceId, audioNodeId);\r\n this.privError = error;\r\n }\r\n\r\n public get error(): string {\r\n return this.privError;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\n/* eslint-disable max-classes-per-file */\r\n\r\nimport { ConnectionMessage } from \"./ConnectionMessage.js\";\r\nimport { IStringDictionary } from \"./IDictionary.js\";\r\nimport { EventType, PlatformEvent } from \"./PlatformEvent.js\";\r\n\r\nexport class ServiceEvent extends PlatformEvent {\r\n private privJsonResult: string;\r\n\r\n public constructor(eventName: string, jsonstring: string, eventType: EventType = EventType.Info) {\r\n super(eventName, eventType);\r\n this.privJsonResult = jsonstring;\r\n }\r\n\r\n public get jsonString(): string {\r\n return this.privJsonResult;\r\n }\r\n}\r\n\r\nexport class ConnectionEvent extends PlatformEvent {\r\n private privConnectionId: string;\r\n\r\n public constructor(eventName: string, connectionId: string, eventType: EventType = EventType.Info) {\r\n super(eventName, eventType);\r\n this.privConnectionId = connectionId;\r\n }\r\n\r\n public get connectionId(): string {\r\n return this.privConnectionId;\r\n }\r\n}\r\n\r\nexport class ConnectionStartEvent extends ConnectionEvent {\r\n private privUri: string;\r\n private privHeaders: IStringDictionary<string>;\r\n\r\n public constructor(connectionId: string, uri: string, headers?: IStringDictionary<string>) {\r\n super(\"ConnectionStartEvent\", connectionId);\r\n this.privUri = uri;\r\n this.privHeaders = headers;\r\n }\r\n\r\n public get uri(): string {\r\n return this.privUri;\r\n }\r\n\r\n public get headers(): IStringDictionary<string> {\r\n return this.privHeaders;\r\n }\r\n}\r\n\r\nexport class ConnectionEstablishedEvent extends ConnectionEvent {\r\n public constructor(connectionId: string) {\r\n super(\"ConnectionEstablishedEvent\", connectionId);\r\n }\r\n}\r\n\r\nexport class ConnectionClosedEvent extends ConnectionEvent {\r\n private privReason: string;\r\n private privStatusCode: number;\r\n\r\n public constructor(connectionId: string, statusCode: number, reason: string) {\r\n super(\"ConnectionClosedEvent\", connectionId, EventType.Debug);\r\n this.privReason = reason;\r\n this.privStatusCode = statusCode;\r\n }\r\n\r\n public get reason(): string {\r\n return this.privReason;\r\n }\r\n\r\n public get statusCode(): number {\r\n return this.privStatusCode;\r\n }\r\n}\r\n\r\nexport class ConnectionErrorEvent extends ConnectionEvent {\r\n private readonly privMessage: string;\r\n private readonly privType: string;\r\n\r\n public constructor(connectionId: string, message: string, type: string) {\r\n super(\"ConnectionErrorEvent\", connectionId, EventType.Debug);\r\n this.privMessage = message;\r\n this.privType = type;\r\n }\r\n\r\n public get message(): string {\r\n return this.privMessage;\r\n }\r\n\r\n public get type(): string {\r\n return this.privType;\r\n }\r\n}\r\n\r\nexport class ConnectionEstablishErrorEvent extends ConnectionEvent {\r\n private privStatusCode: number;\r\n private privReason: string;\r\n\r\n public constructor(connectionId: string, statuscode: number, reason: string) {\r\n super(\"ConnectionEstablishErrorEvent\", connectionId, EventType.Error);\r\n this.privStatusCode = statuscode;\r\n this.privReason = reason;\r\n }\r\n\r\n public get reason(): string {\r\n return this.privReason;\r\n }\r\n\r\n public get statusCode(): number {\r\n return this.privStatusCode;\r\n }\r\n}\r\n\r\nexport class ConnectionMessageReceivedEvent extends ConnectionEvent {\r\n private privNetworkReceivedTime: string;\r\n private privMessage: ConnectionMessage;\r\n\r\n public constructor(connectionId: string, networkReceivedTimeISO: string, message: ConnectionMessage) {\r\n super(\"ConnectionMessageReceivedEvent\", connectionId);\r\n this.privNetworkReceivedTime = networkReceivedTimeISO;\r\n this.privMessage = message;\r\n }\r\n\r\n public get networkReceivedTime(): string {\r\n return this.privNetworkReceivedTime;\r\n }\r\n\r\n public get message(): ConnectionMessage {\r\n return this.privMessage;\r\n }\r\n}\r\n\r\nexport class ConnectionMessageSentEvent extends ConnectionEvent {\r\n private privNetworkSentTime: string;\r\n private privMessage: ConnectionMessage;\r\n\r\n public constructor(connectionId: string, networkSentTimeISO: string, message: ConnectionMessage) {\r\n super(\"ConnectionMessageSentEvent\", connectionId);\r\n this.privNetworkSentTime = networkSentTimeISO;\r\n this.privMessage = message;\r\n }\r\n\r\n public get networkSentTime(): string {\r\n return this.privNetworkSentTime;\r\n }\r\n\r\n public get message(): ConnectionMessage {\r\n return this.privMessage;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\n/* eslint-disable max-classes-per-file */\r\n\r\n/**\r\n * The error that is thrown when an argument passed in is null.\r\n *\r\n * @export\r\n * @class ArgumentNullError\r\n * @extends {Error}\r\n */\r\nexport class ArgumentNullError extends Error {\r\n\r\n /**\r\n * Creates an instance of ArgumentNullError.\r\n *\r\n * @param {string} argumentName - Name of the argument that is null\r\n *\r\n * @memberOf ArgumentNullError\r\n */\r\n public constructor(argumentName: string) {\r\n super(argumentName);\r\n this.name = \"ArgumentNull\";\r\n this.message = argumentName;\r\n }\r\n}\r\n\r\n/**\r\n * The error that is thrown when an invalid operation is performed in the code.\r\n *\r\n * @export\r\n * @class InvalidOperationError\r\n * @extends {Error}\r\n */\r\nexport class InvalidOperationError extends Error {\r\n\r\n /**\r\n * Creates an instance of InvalidOperationError.\r\n *\r\n * @param {string} error - The error\r\n *\r\n * @memberOf InvalidOperationError\r\n */\r\n public constructor(error: string) {\r\n super(error);\r\n this.name = \"InvalidOperation\";\r\n this.message = error;\r\n }\r\n}\r\n\r\n/**\r\n * The error that is thrown when an object is disposed.\r\n *\r\n * @export\r\n * @class ObjectDisposedError\r\n * @extends {Error}\r\n */\r\nexport class ObjectDisposedError extends Error {\r\n\r\n /**\r\n * Creates an instance of ObjectDisposedError.\r\n *\r\n * @param {string} objectName - The object that is disposed\r\n * @param {string} error - The error\r\n *\r\n * @memberOf ObjectDisposedError\r\n */\r\n public constructor(objectName: string, error?: string) {\r\n super(error);\r\n this.name = objectName + \"ObjectDisposed\";\r\n this.message = error;\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-unsafe-return */\r\n// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { InvalidOperationError } from \"./Error.js\";\r\nimport { createNoDashGuid } from \"./Guid.js\";\r\nimport { IStringDictionary } from \"./IDictionary.js\";\r\n\r\nexport enum MessageType {\r\n Text,\r\n Binary,\r\n}\r\n\r\nexport class ConnectionMessage {\r\n\r\n private privMessageType: MessageType;\r\n private privHeaders: IStringDictionary<string>;\r\n private privBody: any = null;\r\n private privSize: number;\r\n\r\n private privId: string;\r\n\r\n public constructor(\r\n messageType: MessageType,\r\n body: any,\r\n headers?: IStringDictionary<string>,\r\n id?: string) {\r\n\r\n if (messageType === MessageType.Text && body && !(typeof (body) === \"string\")) {\r\n throw new InvalidOperationError(\"Payload must be a string\");\r\n }\r\n\r\n if (messageType === MessageType.Binary && body && !(body instanceof ArrayBuffer)) {\r\n throw new InvalidOperationError(\"Payload must be ArrayBuffer\");\r\n }\r\n\r\n this.privMessageType = messageType;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.privBody = body;\r\n this.privHeaders = headers ? headers : {};\r\n this.privId = id ? id : createNoDashGuid();\r\n switch (this.messageType) {\r\n case MessageType.Binary:\r\n this.privSize = this.binaryBody !== null ? this.binaryBody.byteLength : 0;\r\n break;\r\n case MessageType.Text:\r\n this.privSize = this.textBody.length;\r\n }\r\n }\r\n\r\n public get messageType(): MessageType {\r\n return this.privMessageType;\r\n }\r\n\r\n public get headers(): IStringDictionary<string> {\r\n return this.privHeaders;\r\n }\r\n\r\n public get body(): any {\r\n return this.privBody;\r\n }\r\n\r\n public get textBody(): string {\r\n if (this.privMessageType === MessageType.Binary) {\r\n throw new InvalidOperationError(\"Not supported for binary message\");\r\n }\r\n\r\n return this.privBody as string;\r\n }\r\n\r\n public get binaryBody(): ArrayBuffer {\r\n if (this.privMessageType === MessageType.Text) {\r\n throw new InvalidOperationError(\"Not supported for text message\");\r\n }\r\n\r\n return this.privBody;\r\n }\r\n\r\n public get id(): string {\r\n return this.privId;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nexport class ConnectionOpenResponse {\r\n private privStatusCode: number;\r\n private privReason: string;\r\n\r\n public constructor(statusCode: number, reason: string) {\r\n this.privStatusCode = statusCode;\r\n this.privReason = reason;\r\n }\r\n\r\n public get statusCode(): number {\r\n return this.privStatusCode;\r\n }\r\n\r\n public get reason(): string {\r\n return this.privReason;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { Deferred } from \"./Promise.js\";\r\n\r\n/**\r\n * The error that is thrown when an argument passed in is null.\r\n *\r\n * @export\r\n * @class DefferalMap\r\n */\r\n\r\nexport class DeferralMap {\r\n private privMap: { [id: string]: Deferred<any> } = {};\r\n\r\n public add<T>(id: string, deferral: Deferred<T>): void {\r\n this.privMap[id] = deferral;\r\n }\r\n\r\n public getId(id: string): Deferred<any> {\r\n return this.privMap[id];\r\n }\r\n\r\n public complete<T>(id: string, result: T): void {\r\n try {\r\n this.privMap[id].resolve(result);\r\n } catch (error) {\r\n this.privMap[id].reject(error as string);\r\n } finally {\r\n this.privMap[id] = undefined;\r\n }\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\n/* eslint-disable max-classes-per-file */\r\n\r\nimport { AgentConfig } from \"../common.speech/Exports.js\";\r\nimport { EventType, PlatformEvent } from \"./PlatformEvent.js\";\r\n\r\nexport class DialogEvent extends PlatformEvent {\r\n\r\n public constructor(eventName: string, eventType: EventType = EventType.Info) {\r\n super(eventName, eventType);\r\n }\r\n}\r\n\r\nexport class SendingAgentContextMessageEvent extends DialogEvent {\r\n private privAgentConfig: AgentConfig;\r\n\r\n public constructor(agentConfig: AgentConfig) {\r\n super(\"SendingAgentContextMessageEvent\");\r\n this.privAgentConfig = agentConfig;\r\n }\r\n\r\n public get agentConfig(): AgentConfig {\r\n return this.privAgentConfig;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { ObjectDisposedError } from \"./Error.js\";\r\nimport { createNoDashGuid } from \"./Guid.js\";\r\nimport { IDetachable } from \"./IDetachable.js\";\r\nimport { IStringDictionary } from \"./IDictionary.js\";\r\nimport { IEventListener } from \"./IEventListener.js\";\r\nimport { IEventSource } from \"./IEventSource.js\";\r\nimport { PlatformEvent } from \"./PlatformEvent.js\";\r\n\r\nexport class EventSource<TEvent extends PlatformEvent> implements IEventSource<TEvent> {\r\n private privEventListeners: IStringDictionary<(event: TEvent) => void> = {};\r\n private privMetadata: IStringDictionary<string>;\r\n private privIsDisposed: boolean = false;\r\n private privConsoleListener: IDetachable = undefined;\r\n\r\n public constructor(metadata?: IStringDictionary<string>) {\r\n this.privMetadata = metadata;\r\n }\r\n\r\n public onEvent(event: TEvent): void {\r\n if (this.isDisposed()) {\r\n throw (new ObjectDisposedError(\"EventSource\"));\r\n }\r\n\r\n if (this.metadata) {\r\n for (const paramName in this.metadata) {\r\n if (paramName) {\r\n if (event.metadata) {\r\n if (!event.metadata[paramName]) {\r\n event.metadata[paramName] = this.metadata[paramName];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const eventId in this.privEventListeners) {\r\n if (eventId && this.privEventListeners[eventId]) {\r\n this.privEventListeners[eventId](event);\r\n }\r\n }\r\n }\r\n\r\n public attach(onEventCallback: (event: TEvent) => void): IDetachable {\r\n const id = createNoDashGuid();\r\n this.privEventListeners[id] = onEventCallback;\r\n return {\r\n detach: (): Promise<void> => {\r\n delete this.privEventListeners[id];\r\n return Promise.resolve();\r\n },\r\n };\r\n }\r\n\r\n public attachListener(listener: IEventListener<TEvent>): IDetachable {\r\n return this.attach((e: TEvent): void => listener.onEvent(e));\r\n }\r\n\r\n public attachConsoleListener(listener: IEventListener<TEvent>): IDetachable {\r\n if (!!this.privConsoleListener) {\r\n void this.privConsoleListener.detach(); // Detach implementation for eventListeners is synchronous\r\n }\r\n this.privConsoleListener = this.attach((e: TEvent): void => listener.onEvent(e));\r\n return this.privConsoleListener;\r\n }\r\n\r\n public isDisposed(): boolean {\r\n return this.privIsDisposed;\r\n }\r\n\r\n public dispose(): void {\r\n this.privEventListeners = null;\r\n this.privIsDisposed = true;\r\n }\r\n\r\n public get metadata(): IStringDictionary<string> {\r\n return this.privMetadata;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { ArgumentNullError } from \"./Error.js\";\r\nimport { EventSource } from \"./EventSource.js\";\r\nimport { IEventSource } from \"./IEventSource.js\";\r\nimport { PlatformEvent } from \"./PlatformEvent.js\";\r\n\r\nexport class Events {\r\n private static privInstance: IEventSource<PlatformEvent> = new EventSource<PlatformEvent>();\r\n\r\n public static setEventSource(eventSource: IEventSource<PlatformEvent>): void {\r\n if (!eventSource) {\r\n throw new ArgumentNullError(\"eventSource\");\r\n }\r\n\r\n Events.privInstance = eventSource;\r\n }\r\n\r\n public static get instance(): IEventSource<PlatformEvent> {\r\n return Events.privInstance;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { ConnectionEvent } from \"./ConnectionEvents.js\";\r\nimport { ConnectionMessage } from \"./ConnectionMessage.js\";\r\nimport { ConnectionOpenResponse } from \"./ConnectionOpenResponse.js\";\r\nimport { EventSource } from \"./EventSource.js\";\r\n\r\nexport enum ConnectionState {\r\n None,\r\n Connected,\r\n Connecting,\r\n Disconnected,\r\n}\r\n\r\nexport interface IConnection {\r\n id: string;\r\n state(): ConnectionState;\r\n open(): Promise<ConnectionOpenResponse>;\r\n send(message: ConnectionMessage): Promise<void>;\r\n read(): Promise<ConnectionMessage>;\r\n events: EventSource<ConnectionEvent>;\r\n dispose(disposing?: string): Promise<void>;\r\n}\r\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n\n//# sourceMappingURL=IErrorMessages.js.map\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { ObjectDisposedError } from \"./Error.js\";\r\nimport { IDetachable } from \"./IDetachable.js\";\r\nimport { IStringDictionary } from \"./IDictionary.js\";\r\nimport { IDisposable } from \"./IDisposable.js\";\r\n\r\nexport interface IList<TItem> extends IDisposable {\r\n get(itemIndex: number): TItem;\r\n first(): TItem;\r\n last(): TItem;\r\n\r\n add(item: TItem): void;\r\n insertAt(index: number, item: TItem): void;\r\n\r\n removeFirst(): TItem;\r\n removeLast(): TItem;\r\n removeAt(index: number): TItem;\r\n remove(index: number, count: number): TItem[];\r\n clear(): void;\r\n\r\n length(): number;\r\n\r\n onAdded(addedCallback: () => void): IDetachable;\r\n onRemoved(removedCallback: () => void): IDetachable;\r\n onDisposed(disposedCallback: () => void): IDetachable;\r\n\r\n join(seperator?: string): string;\r\n\r\n toArray(): TItem[];\r\n\r\n any(callback?: (item: TItem, index: number) => boolean): boolean;\r\n all(callback: (item: TItem) => boolean): boolean;\r\n forEach(callback: (item: TItem, index: number) => void): void;\r\n select<T2>(callback: (item: TItem, index: number) => T2): List<T2>;\r\n where(callback: (item: TItem, index: number) => boolean): List<TItem>;\r\n orderBy(compareFn: (a: TItem, b: TItem) => number): List<TItem>;\r\n orderByDesc(compareFn: (a: TItem, b: TItem) => number): List<TItem>;\r\n clone(): List<TItem>;\r\n concat(list: List<TItem>): List<TItem>;\r\n concatArray(array: TItem[]): List<TItem>;\r\n}\r\n\r\nexport class List<TItem> implements IList<TItem> {\r\n private privList: TItem[];\r\n private privSubscriptionIdCounter: number = 0;\r\n private privAddSubscriptions: IStringDictionary<() => void> = {};\r\n private privRemoveSubscriptions: IStringDictionary<() => void> = {};\r\n private privDisposedSubscriptions: IStringDictionary<() => void> = {};\r\n private privDisposeReason: string = null;\r\n\r\n public constructor(list?: TItem[]) {\r\n this.privList = [];\r\n // copy the list rather than taking as is.\r\n if (list) {\r\n for (const item of list) {\r\n this.privList.push(item);\r\n }\r\n }\r\n }\r\n\r\n public get(itemIndex: number): TItem {\r\n this.throwIfDisposed();\r\n return this.privList[itemIndex];\r\n }\r\n\r\n public first(): TItem {\r\n return this.get(0);\r\n }\r\n\r\n public last(): TItem {\r\n return this.get(this.length() - 1);\r\n }\r\n\r\n public add(item: TItem): void {\r\n this.throwIfDisposed();\r\n this.insertAt(this.privList.length, item);\r\n }\r\n\r\n public insertAt(index: number, item: TItem): void {\r\n this.throwIfDisposed();\r\n if (index === 0) {\r\n this.privList.unshift(item);\r\n } else if (index === this.privList.length) {\r\n this.privList.push(item);\r\n } else {\r\n this.privList.splice(index, 0, item);\r\n }\r\n this.triggerSubscriptions(this.privAddSubscriptions);\r\n }\r\n\r\n public removeFirst(): TItem {\r\n this.throwIfDisposed();\r\n return this.removeAt(0);\r\n }\r\n\r\n public removeLast(): TItem {\r\n this.throwIfDisposed();\r\n return this.removeAt(this.length() - 1);\r\n }\r\n\r\n public removeAt(index: number): TItem {\r\n this.throwIfDisposed();\r\n return this.remove(index, 1)[0];\r\n }\r\n\r\n public remove(index: number, count: number): TItem[] {\r\n this.throwIfDisposed();\r\n const removedElements = this.privList.splice(index, count);\r\n this.triggerSubscriptions(this.privRemoveSubscriptions);\r\n return removedElements;\r\n }\r\n\r\n public clear(): void {\r\n this.throwIfDisposed();\r\n this.remove(0, this.length());\r\n }\r\n\r\n public length(): number {\r\n this.throwIfDisposed();\r\n return this.privList.length;\r\n }\r\n\r\n public onAdded(addedCallback: () => void): IDetachable {\r\n this.throwIfDisposed();\r\n const subscriptionId = this.privSubscriptionIdCounter++;\r\n\r\n this.privAddSubscriptions[subscriptionId] = addedCallback;\r\n\r\n return {\r\n detach: (): Promise<void> => {\r\n delete this.privAddSubscriptions[subscriptionId];\r\n return Promise.resolve();\r\n },\r\n };\r\n }\r\n\r\n public onRemoved(removedCallback: () => void): IDetachable {\r\n this.throwIfDisposed();\r\n const subscriptionId = this.privSubscriptionIdCounter++;\r\n\r\n this.privRemoveSubscriptions[subscriptionId] = removedCallback;\r\n\r\n return {\r\n detach: (): Promise<void> => {\r\n delete this.privRemoveSubscriptions[subscriptionId];\r\n return Promise.resolve();\r\n },\r\n };\r\n }\r\n\r\n public onDisposed(disposedCallback: () => void): IDetachable {\r\n this.throwIfDisposed();\r\n const subscriptionId = this.privSubscriptionIdCounter++;\r\n\r\n this.privDisposedSubscriptions[subscriptionId] = disposedCallback;\r\n\r\n return {\r\n detach: (): Promise<void> => {\r\n delete this.privDisposedSubscriptions[subscriptionId];\r\n return Promise.resolve();\r\n },\r\n };\r\n }\r\n\r\n public join(seperator?: string): string {\r\n this.throwIfDisposed();\r\n return this.privList.join(seperator);\r\n }\r\n\r\n public toArray(): TItem[] {\r\n const cloneCopy = Array<TItem>();\r\n this.privList.forEach((val: TItem): void => {\r\n cloneCopy.push(val);\r\n });\r\n return cloneCopy;\r\n }\r\n\r\n public any(callback?: (item: TItem, index: number) => boolean): boolean {\r\n this.throwIfDisposed();\r\n if (callback) {\r\n return this.where(callback).length() > 0;\r\n } else {\r\n return this.length() > 0;\r\n }\r\n }\r\n\r\n public all(callback: (item: TItem) => boolean): boolean {\r\n this.throwIfDisposed();\r\n return this.where(callback).length() === this.length();\r\n }\r\n\r\n public forEach(callback: (item: TItem, index: number) => void): void {\r\n this.throwIfDisposed();\r\n for (let i = 0; i < this.length(); i++) {\r\n callback(this.privList[i], i);\r\n }\r\n }\r\n\r\n public select<T2>(callback: (item: TItem, index: number) => T2): List<T2> {\r\n this.throwIfDisposed();\r\n const selectList: T2[] = [];\r\n for (let i = 0; i < this.privList.length; i++) {\r\n selectList.push(callback(this.privList[i], i));\r\n }\r\n\r\n return new List<T2>(selectList);\r\n }\r\n\r\n public where(callback: (item: TItem, index: number) => boolean): List<TItem> {\r\n this.throwIfDisposed();\r\n const filteredList = new List<TItem>();\r\n for (let i = 0; i < this.privList.length; i++) {\r\n if (callback(this.privList[i], i)) {\r\n filteredList.add(this.privList[i]);\r\n }\r\n }\r\n return filteredList;\r\n }\r\n\r\n public orderBy(compareFn: (a: TItem, b: TItem) => number): List<TItem> {\r\n this.throwIfDisposed();\r\n const clonedArray = this.toArray();\r\n const orderedArray = clonedArray.sort(compareFn);\r\n return new List(orderedArray);\r\n }\r\n\r\n public orderByDesc(compareFn: (a: TItem, b: TItem) => number): List<TItem> {\r\n this.throwIfDisposed();\r\n return this.orderBy((a: TItem, b: TItem): number => compareFn(b, a));\r\n }\r\n\r\n public clone(): List<TItem> {\r\n this.throwIfDisposed();\r\n return new List<TItem>(this.toArray());\r\n }\r\n\r\n public concat(list: List<TItem>): List<TItem> {\r\n this.throwIfDisposed();\r\n return new List<TItem>(this.privList.concat(list.toArray()));\r\n }\r\n\r\n public concatArray(array: TItem[]): List<TItem> {\r\n this.throwIfDisposed();\r\n return new List<TItem>(this.privList.concat(array));\r\n }\r\n\r\n public isDisposed(): boolean {\r\n return this.privList == null;\r\n }\r\n\r\n public dispose(reason?: string): void {\r\n if (!this.isDisposed()) {\r\n this.privDisposeReason = reason;\r\n this.privList = null;\r\n this.privAddSubscriptions = null;\r\n this.privRemoveSubscriptions = null;\r\n this.triggerSubscriptions(this.privDisposedSubscriptions);\r\n }\r\n }\r\n\r\n private throwIfDisposed(): void {\r\n if (this.isDisposed()) {\r\n throw new ObjectDisposedError(\"List\", this.privDisposeReason);\r\n }\r\n }\r\n\r\n private triggerSubscriptions(subscriptions: IStringDictionary<() => void>): void {\r\n if (subscriptions) {\r\n for (const subscriptionId in subscriptions) {\r\n if (subscriptionId) {\r\n subscriptions[subscriptionId]();\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\n/* eslint-disable max-classes-per-file, @typescript-eslint/typedef */\r\n\r\nexport enum PromiseState {\r\n None,\r\n Resolved,\r\n Rejected,\r\n}\r\n\r\nexport interface IDeferred<T> {\r\n readonly promise: Promise<T>;\r\n\r\n resolve(result: T): IDeferred<T>;\r\n\r\n reject(error: string): IDeferred<T>;\r\n}\r\n\r\nexport class PromiseResult<T> {\r\n protected privIsCompleted: boolean;\r\n protected privIsError: boolean;\r\n protected privError: string;\r\n protected privResult: T;\r\n\r\n public constructor(promiseResultEventSource: PromiseResultEventSource<T>) {\r\n promiseResultEventSource.on((result: T): void => {\r\n if (!this.privIsCompleted) {\r\n this.privIsCompleted = true;\r\n this.privIsError = false;\r\n this.privResult = result;\r\n }\r\n }, (error: string): void => {\r\n if (!this.privIsCompleted) {\r\n this.privIsCompleted = true;\r\n this.privIsError = true;\r\n this.privError = error;\r\n }\r\n });\r\n }\r\n\r\n public get isCompleted(): boolean {\r\n return this.privIsCompleted;\r\n }\r\n\r\n public get isError(): boolean {\r\n return this.privIsError;\r\n }\r\n\r\n public get error(): string {\r\n return this.privError;\r\n }\r\n\r\n public get result(): T {\r\n return this.privResult;\r\n }\r\n\r\n public throwIfError = (): void => {\r\n if (this.isError) {\r\n throw this.error;\r\n }\r\n };\r\n}\r\n\r\nexport class PromiseResultEventSource<T> {\r\n\r\n private privOnSetResult: (result: T) => void;\r\n private privOnSetError: (error: string) => void;\r\n\r\n public setResult = (result: T): void => {\r\n this.privOnSetResult(result);\r\n };\r\n\r\n public setError = (error: string): void => {\r\n this.privOnSetError(error);\r\n };\r\n\r\n public on = (onSetResult: (result: T) => void, onSetError: (error: string) => void): void => {\r\n this.privOnSetResult = onSetResult;\r\n this.privOnSetError = onSetError;\r\n };\r\n}\r\n\r\nexport class Deferred<T> implements IDeferred<T> {\r\n private privPromise: Promise<T>;\r\n private privResolve: (value?: T | PromiseLike<T>) => void;\r\n private privReject: (reason?: any) => void;\r\n\r\n public constructor() {\r\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\r\n this.privPromise = new Promise<T>((resolve: (value: T) => void, reject: (reason: any) => void) => {\r\n this.privResolve = resolve;\r\n this.privReject = reject;\r\n });\r\n }\r\n\r\n public get promise(): Promise<T> {\r\n return this.privPromise;\r\n }\r\n\r\n public resolve = (result: T | Promise<T>): Deferred<T> => {\r\n this.privResolve(result);\r\n return this;\r\n };\r\n\r\n public reject = (error: string): Deferred<T> => {\r\n this.privReject(error);\r\n return this;\r\n };\r\n}\r\n\r\nexport class Sink<T> {\r\n private privState: PromiseState = PromiseState.None;\r\n private privPromiseResult: PromiseResult<T> = null;\r\n private privPromiseResultEvents: PromiseResultEventSource<T> = null;\r\n\r\n private privSuccessHandlers: ((result: T) => void)[] = [];\r\n private privErrorHandlers: ((e: string) => void)[] = [];\r\n\r\n public constructor() {\r\n this.privPromiseResultEvents = new PromiseResultEventSource();\r\n this.privPromiseResult = new PromiseResult(this.privPromiseResultEvents);\r\n }\r\n\r\n public get state(): PromiseState {\r\n return this.privState;\r\n }\r\n\r\n public get result(): PromiseResult<T> {\r\n return this.privPromiseResult;\r\n }\r\n\r\n public resolve(result: T): void {\r\n if (this.privState !== PromiseState.None) {\r\n throw new Error(\"'Cannot resolve a completed promise'\");\r\n }\r\n\r\n this.privState = PromiseState.Resolved;\r\n this.privPromiseResultEvents.setResult(result);\r\n\r\n for (let i = 0; i < this.privSuccessHandlers.length; i++) {\r\n this.executeSuccessCallback(result, this.privSuccessHandlers[i], this.privErrorHandlers[i]);\r\n }\r\n\r\n this.detachHandlers();\r\n }\r\n\r\n public reject(error: string): void {\r\n if (this.privState !== PromiseState.None) {\r\n throw new Error(\"'Cannot reject a completed promise'\");\r\n }\r\n\r\n this.privState = PromiseState.Rejected;\r\n this.privPromiseResultEvents.setError(error);\r\n\r\n for (const errorHandler of this.privErrorHandlers) {\r\n this.executeErrorCallback(error, errorHandler);\r\n }\r\n\r\n this.detachHandlers();\r\n }\r\n\r\n public on(\r\n successCallback: (result: T) => void,\r\n errorCallback: (error: string) => void): void {\r\n\r\n if (successCallback == null) {\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n successCallback = (): void => { };\r\n }\r\n\r\n if (this.privState === PromiseState.None) {\r\n this.privSuccessHandlers.push(successCallback);\r\n this.privErrorHandlers.push(errorCallback);\r\n } else {\r\n if (this.privState === PromiseState.Resolved) {\r\n this.executeSuccessCallback(this.privPromiseResult.result, successCallback, errorCallback);\r\n } else if (this.privState === PromiseState.Rejected) {\r\n this.executeErrorCallback(this.privPromiseResult.error, errorCallback);\r\n }\r\n\r\n this.detachHandlers();\r\n }\r\n }\r\n\r\n private executeSuccessCallback(result: T, successCallback: (result: T) => void, errorCallback: (error: string) => void): void {\r\n try {\r\n successCallback(result);\r\n } catch (e) {\r\n this.executeErrorCallback(`'Unhandled callback error: ${e as string}'`, errorCallback);\r\n }\r\n }\r\n\r\n private executeErrorCallback(error: string, errorCallback: (error: string) => void): void {\r\n if (errorCallback) {\r\n try {\r\n errorCallback(error);\r\n } catch (e) {\r\n throw new Error(`'Unhandled callback error: ${e as string}. InnerError: ${error}'`);\r\n }\r\n } else {\r\n throw new Error(`'Unhandled error: ${error}'`);\r\n }\r\n }\r\n\r\n private detachHandlers(): void {\r\n this.privErrorHandlers = [];\r\n this.privSuccessHandlers = [];\r\n }\r\n}\r\n\r\n// eslint-disable-next-line prefer-arrow/prefer-arrow-functions\r\nexport function marshalPromiseToCallbacks<T>(\r\n promise: Promise<T>,\r\n cb?: (value: T) => void,\r\n err?: (error: string) => void): void {\r\n promise.then((val: T): void => {\r\n try {\r\n if (!!cb) {\r\n cb(val);\r\n }\r\n } catch (error) {\r\n if (!!err) {\r\n try {\r\n if (error instanceof Error) {\r\n const typedError: Error = error ;\r\n err(typedError.name + \": \" + typedError.message);\r\n } else {\r\n err(error as string);\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) { }\r\n }\r\n }\r\n }, (error: any): void => {\r\n if (!!err) {\r\n try {\r\n if (error instanceof Error) {\r\n const typedError: Error = error;\r\n err(typedError.name + \": \" + typedError.message);\r\n } else {\r\n err(error as string);\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) { }\r\n }\r\n });\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { InvalidOperationError, ObjectDisposedError } from \"./Error.js\";\r\nimport { IDetachable } from \"./IDetachable.js\";\r\nimport { IDisposable } from \"./IDisposable.js\";\r\nimport { List } from \"./List.js\";\r\nimport {\r\n Deferred,\r\n} from \"./Promise.js\";\r\nexport interface IQueue<TItem> extends IDisposable {\r\n enqueue(item: TItem): void;\r\n enqueueFromPromise(promise: Promise<TItem>): void;\r\n dequeue(): Promise<TItem>;\r\n peek(): Promise<TItem>;\r\n length(): number;\r\n}\r\n\r\nenum SubscriberType {\r\n Dequeue,\r\n Peek,\r\n}\r\n\r\nexport class Queue<TItem> implements IQueue<TItem> {\r\n private privPromiseStore: List<Promise<TItem>> = new List<Promise<TItem>>();\r\n private privList: List<TItem>;\r\n private privDetachables: IDetachable[];\r\n private privSubscribers: List<{ type: SubscriberType; deferral: Deferred<TItem> }>;\r\n private privIsDrainInProgress: boolean = false;\r\n private privIsDisposing: boolean = false;\r\n private privDisposeReason: string = null;\r\n\r\n public constructor(list?: List<TItem>) {\r\n this.privList = list ? list : new List<TItem>();\r\n this.privDetachables = [];\r\n this.privSubscribers = new List<{ type: SubscriberType; deferral: Deferred<TItem> }>();\r\n this.privDetachables.push(this.privList.onAdded((): void => this.drain()));\r\n }\r\n\r\n public enqueue(item: TItem): void {\r\n this.throwIfDispose();\r\n this.enqueueFromPromise(new Promise<TItem>((resolve: (value: TItem) => void): void => resolve(item)));\r\n }\r\n\r\n public enqueueFromPromise(promise: Promise<TItem>): void {\r\n this.throwIfDispose();\r\n promise.then((val: TItem): void => {\r\n this.privList.add(val);\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n }, (): void => { });\r\n }\r\n\r\n public dequeue(): Promise<TItem> {\r\n this.throwIfDispose();\r\n const deferredSubscriber = new Deferred<TItem>();\r\n\r\n if (this.privSubscribers) {\r\n this.privSubscribers.add({ deferral: deferredSubscriber, type: SubscriberType.Dequeue });\r\n this.drain();\r\n }\r\n\r\n return deferredSubscriber.promise;\r\n }\r\n\r\n public peek(): Promise<TItem> {\r\n this.throwIfDispose();\r\n const deferredSubscriber = new Deferred<TItem>();\r\n\r\n const subs = this.privSubscribers;\r\n if (subs) {\r\n this.privSubscribers.add({ deferral: deferredSubscriber, type: SubscriberType.Peek });\r\n this.drain();\r\n }\r\n\r\n return deferredSubscriber.promise;\r\n }\r\n\r\n public length(): number {\r\n this.throwIfDispose();\r\n return this.privList.length();\r\n }\r\n\r\n public isDisposed(): boolean {\r\n return this.privSubscribers == null;\r\n }\r\n\r\n public async drainAndDispose(pendingItemProcessor: (pendingItemInQueue: TItem) => void, reason?: string): Promise<void> {\r\n if (!this.isDisposed() && !this.privIsDisposing) {\r\n this.privDisposeReason = reason;\r\n this.privIsDisposing = true;\r\n\r\n const subs = this.privSubscribers;\r\n if (subs) {\r\n while (subs.length() > 0) {\r\n const subscriber = subs.removeFirst();\r\n // TODO: this needs work (Resolve(null) instead?).\r\n subscriber.deferral.resolve(undefined);\r\n // subscriber.deferral.reject(\"Disposed\");\r\n }\r\n\r\n // note: this block assumes cooperative multitasking, i.e.,\r\n // between the if-statement and the assignment there are no\r\n // thread switches.\r\n // Reason is that between the initial const = this.; and this\r\n // point there is the derral.resolve() operation that might have\r\n // caused recursive calls to the Queue, especially, calling\r\n // Dispose() on the queue alredy (which would reset the var\r\n // here to null!).\r\n // That should generally hold true for javascript...\r\n if (this.privSubscribers === subs) {\r\n this.privSubscribers = subs;\r\n }\r\n }\r\n\r\n for (const detachable of this.privDetachables) {\r\n await detachable.detach();\r\n }\r\n\r\n if (this.privPromiseStore.length() > 0 && pendingItemProcessor) {\r\n const promiseArray: Promise<TItem>[] = [];\r\n\r\n this.privPromiseStore.toArray().forEach((wrapper: Promise<TItem>): void => {\r\n promiseArray.push(wrapper);\r\n });\r\n return Promise.all(promiseArray).finally((): void => {\r\n this.privSubscribers = null;\r\n this.privList.forEach((item: TItem): void => {\r\n pendingItemProcessor(item);\r\n });\r\n this.privList = null;\r\n return;\r\n }).then<void>();\r\n } else {\r\n this.privSubscribers = null;\r\n this.privList = null;\r\n }\r\n }\r\n }\r\n\r\n public async dispose(reason?: string): Promise<void> {\r\n await this.drainAndDispose(null, reason);\r\n }\r\n\r\n private drain(): void {\r\n if (!this.privIsDrainInProgress && !this.privIsDisposing) {\r\n this.privIsDrainInProgress = true;\r\n\r\n const subs = this.privSubscribers;\r\n const lists = this.privList;\r\n if (subs && lists) {\r\n while (lists.length() > 0 && subs.length() > 0 && !this.privIsDisposing) {\r\n const subscriber = subs.removeFirst();\r\n if (subscriber.type === SubscriberType.Peek) {\r\n subscriber.deferral.resolve(lists.first());\r\n } else {\r\n const dequeuedItem = lists.removeFirst();\r\n subscriber.deferral.resolve(dequeuedItem);\r\n }\r\n }\r\n\r\n // note: this block assumes cooperative multitasking, i.e.,\r\n // between the if-statement and the assignment there are no\r\n // thread switches.\r\n // Reason is that between the initial const = this.; and this\r\n // point there is the derral.resolve() operation that might have\r\n // caused recursive calls to the Queue, especially, calling\r\n // Dispose() on the queue alredy (which would reset the var\r\n // here to null!).\r\n // That should generally hold true for javascript...\r\n if (this.privSubscribers === subs) {\r\n this.privSubscribers = subs;\r\n }\r\n\r\n // note: this block assumes cooperative multitasking, i.e.,\r\n // between the if-statement and the assignment there are no\r\n // thread switches.\r\n // Reason is that between the initial const = this.; and this\r\n // point there is the derral.resolve() operation that might have\r\n // caused recursive calls to the Queue, especially, calling\r\n // Dispose() on the queue alredy (which would reset the var\r\n // here to null!).\r\n // That should generally hold true for javascript...\r\n if (this.privList === lists) {\r\n this.privList = lists;\r\n }\r\n }\r\n\r\n this.privIsDrainInProgress = false;\r\n }\r\n }\r\n\r\n private throwIfDispose(): void {\r\n if (this.isDisposed()) {\r\n if (this.privDisposeReason) {\r\n throw new InvalidOperationError(this.privDisposeReason);\r\n }\r\n\r\n throw new ObjectDisposedError(\"Queue\");\r\n } else if (this.privIsDisposing) {\r\n throw new InvalidOperationError(\"Queue disposing\");\r\n }\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { MessageType } from \"./ConnectionMessage.js\";\r\nimport { ArgumentNullError, InvalidOperationError } from \"./Error.js\";\r\nimport { createNoDashGuid } from \"./Guid.js\";\r\n\r\nexport class RawWebsocketMessage {\r\n private privMessageType: MessageType;\r\n private privPayload: any = null;\r\n private privId: string;\r\n\r\n public constructor(messageType: MessageType, payload: any, id?: string) {\r\n if (!payload) {\r\n throw new ArgumentNullError(\"payload\");\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\r\n if (messageType === MessageType.Binary && Object.getPrototypeOf(payload).constructor.name !== \"ArrayBuffer\") {\r\n throw new InvalidOperationError(\"Payload must be ArrayBuffer\");\r\n }\r\n\r\n if (messageType === MessageType.Text && !(typeof (payload) === \"string\")) {\r\n throw new InvalidOperationError(\"Payload must be a string\");\r\n }\r\n\r\n this.privMessageType = messageType;\r\n this.privPayload = payload;\r\n this.privId = id ? id : createNoDashGuid();\r\n }\r\n\r\n public get messageType(): MessageType {\r\n return this.privMessageType;\r\n }\r\n\r\n public get payload(): any {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\r\n return this.privPayload;\r\n }\r\n\r\n public get textContent(): string {\r\n if (this.privMessageType === MessageType.Binary) {\r\n throw new InvalidOperationError(\"Not supported for binary message\");\r\n }\r\n\r\n return this.privPayload as string;\r\n }\r\n\r\n public get binaryContent(): ArrayBuffer {\r\n if (this.privMessageType === MessageType.Text) {\r\n throw new InvalidOperationError(\"Not supported for text message\");\r\n }\r\n\r\n return this.privPayload as ArrayBuffer;\r\n }\r\n\r\n public get id(): string {\r\n return this.privId;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nexport class RiffPcmEncoder {\r\n\r\n private privActualSampleRate: number;\r\n private privDesiredSampleRate: number;\r\n\r\n public constructor(actualSampleRate: number, desiredSampleRate: number) {\r\n this.privActualSampleRate = actualSampleRate;\r\n this.privDesiredSampleRate = desiredSampleRate;\r\n }\r\n\r\n public encode(actualAudioFrame: Float32Array): ArrayBuffer {\r\n\r\n const audioFrame = this.downSampleAudioFrame(actualAudioFrame, this.privActualSampleRate, this.privDesiredSampleRate);\r\n\r\n if (!audioFrame) {\r\n return null;\r\n }\r\n\r\n const audioLength = audioFrame.length * 2;\r\n\r\n const buffer = new ArrayBuffer(audioLength);\r\n const view = new DataView(buffer);\r\n this.floatTo16BitPCM(view, 0, audioFrame);\r\n\r\n return buffer;\r\n }\r\n\r\n private setString(view: DataView, offset: number, str: string): void {\r\n for (let i = 0; i < str.length; i++) {\r\n view.setUint8(offset + i, str.charCodeAt(i));\r\n }\r\n }\r\n\r\n private floatTo16BitPCM(view: DataView, offset: number, input: Float32Array): void {\r\n for (let i = 0; i < input.length; i++ , offset += 2) {\r\n const s = Math.max(-1, Math.min(1, input[i]));\r\n view.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);\r\n }\r\n }\r\n\r\n private downSampleAudioFrame(\r\n srcFrame: Float32Array,\r\n srcRate: number,\r\n dstRate: number): Float32Array {\r\n\r\n if (!srcFrame) {\r\n return null;\r\n }\r\n\r\n if (dstRate === srcRate || dstRate > srcRate) {\r\n return srcFrame;\r\n }\r\n\r\n const ratio = srcRate / dstRate;\r\n const dstLength = Math.round(srcFrame.length / ratio);\r\n const dstFrame = new Float32Array(dstLength);\r\n let srcOffset = 0;\r\n let dstOffset = 0;\r\n while (dstOffset < dstLength) {\r\n const nextSrcOffset = Math.round((dstOffset + 1) * ratio);\r\n let accum = 0;\r\n let count = 0;\r\n while (srcOffset < nextSrcOffset && srcOffset < srcFrame.length) {\r\n accum += srcFrame[srcOffset++];\r\n count++;\r\n }\r\n dstFrame[dstOffset++] = accum / count;\r\n }\r\n\r\n return dstFrame;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { InvalidOperationError } from \"./Error.js\";\r\nimport { createNoDashGuid } from \"./Guid.js\";\r\nimport { Queue } from \"./Queue.js\";\r\n\r\nexport interface IStreamChunk<TBuffer> {\r\n isEnd: boolean;\r\n buffer: TBuffer;\r\n timeReceived: number;\r\n}\r\n\r\nexport class Stream<TBuffer> {\r\n private privId: string;\r\n private privIsWriteEnded: boolean = false;\r\n private privIsReadEnded: boolean = false;\r\n private privReaderQueue: Queue<IStreamChunk<TBuffer>>;\r\n\r\n public constructor(streamId?: string) {\r\n this.privId = streamId ? streamId : createNoDashGuid();\r\n this.privReaderQueue = new Queue<IStreamChunk<TBuffer>>();\r\n }\r\n\r\n public get isClosed(): boolean {\r\n return this.privIsWriteEnded;\r\n }\r\n\r\n public get isReadEnded(): boolean {\r\n return this.privIsReadEnded;\r\n }\r\n\r\n public get id(): string {\r\n return this.privId;\r\n }\r\n\r\n public close(): void {\r\n if (!this.privIsWriteEnded) {\r\n this.writeStreamChunk({\r\n buffer: null,\r\n isEnd: true,\r\n timeReceived: Date.now(),\r\n });\r\n this.privIsWriteEnded = true;\r\n }\r\n }\r\n\r\n public writeStreamChunk(streamChunk: IStreamChunk<TBuffer>): void {\r\n this.throwIfClosed();\r\n if (!this.privReaderQueue.isDisposed()) {\r\n try {\r\n this.privReaderQueue.enqueue(streamChunk);\r\n } catch (e) {\r\n // Do nothing\r\n }\r\n }\r\n }\r\n\r\n public read(): Promise<IStreamChunk<TBuffer>> {\r\n if (this.privIsReadEnded) {\r\n throw new InvalidOperationError(\"Stream read has already finished\");\r\n }\r\n\r\n return this.privReaderQueue\r\n .dequeue()\r\n .then(async (streamChunk: IStreamChunk<TBuffer>): Promise<IStreamChunk<TBuffer>> => {\r\n if (streamChunk === undefined || streamChunk.isEnd) {\r\n await this.privReaderQueue.dispose(\"End of stream reached\");\r\n }\r\n\r\n return streamChunk;\r\n });\r\n }\r\n public readEnded(): void {\r\n if (!this.privIsReadEnded) {\r\n this.privIsReadEnded = true;\r\n this.privReaderQueue = new Queue<IStreamChunk<TBuffer>>();\r\n }\r\n }\r\n\r\n private throwIfClosed(): void {\r\n if (this.privIsWriteEnded) {\r\n throw new InvalidOperationError(\"Stream closed\");\r\n }\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\n/**\r\n * Defines translation status.\r\n * @class TranslationStatus\r\n */\r\nexport enum TranslationStatus {\r\n /**\r\n * @member TranslationStatus.Success\r\n */\r\n Success = 0,\r\n\r\n /**\r\n * @member TranslationStatus.Error\r\n */\r\n Error,\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { IStreamChunk, Stream } from \"./Exports.js\";\r\n\r\nexport class ChunkedArrayBufferStream extends Stream<ArrayBuffer> {\r\n private privTargetChunkSize: number;\r\n private privNextBufferToWrite: ArrayBuffer;\r\n private privNextBufferStartTime: number;\r\n private privNextBufferReadyBytes: number;\r\n\r\n public constructor(targetChunkSize: number, streamId?: string) {\r\n super(streamId);\r\n this.privTargetChunkSize = Math.round(targetChunkSize);\r\n this.privNextBufferReadyBytes = 0;\r\n }\r\n\r\n public writeStreamChunk(chunk: IStreamChunk<ArrayBuffer>): void {\r\n // No pending write, and the buffer is the right size so write it.\r\n if (chunk.isEnd ||\r\n (0 === this.privNextBufferReadyBytes && chunk.buffer.byteLength === this.privTargetChunkSize)) {\r\n super.writeStreamChunk(chunk);\r\n return;\r\n }\r\n\r\n let bytesCopiedFromBuffer: number = 0;\r\n\r\n while (bytesCopiedFromBuffer < chunk.buffer.byteLength) {\r\n // Fill the next buffer.\r\n if (undefined === this.privNextBufferToWrite) {\r\n this.privNextBufferToWrite = new ArrayBuffer(this.privTargetChunkSize);\r\n this.privNextBufferStartTime = chunk.timeReceived;\r\n }\r\n\r\n // Find out how many bytes we can copy into the read buffer.\r\n const bytesToCopy: number = Math.min(chunk.buffer.byteLength - bytesCopiedFromBuffer, this.privTargetChunkSize - this.privNextBufferReadyBytes);\r\n const targetView: Uint8Array = new Uint8Array(this.privNextBufferToWrite);\r\n const sourceView: Uint8Array = new Uint8Array(chunk.buffer.slice(bytesCopiedFromBuffer, bytesToCopy + bytesCopiedFromBuffer));\r\n\r\n targetView.set(sourceView, this.privNextBufferReadyBytes);\r\n this.privNextBufferReadyBytes += bytesToCopy;\r\n bytesCopiedFromBuffer += bytesToCopy;\r\n\r\n // Are we ready to write?\r\n if (this.privNextBufferReadyBytes === this.privTargetChunkSize) {\r\n super.writeStreamChunk({\r\n buffer: this.privNextBufferToWrite,\r\n isEnd: false,\r\n timeReceived: this.privNextBufferStartTime,\r\n });\r\n this.privNextBufferReadyBytes = 0;\r\n this.privNextBufferToWrite = undefined;\r\n }\r\n }\r\n }\r\n\r\n public close(): void {\r\n // Send whatever is pending, then close the base class.\r\n if (0 !== this.privNextBufferReadyBytes && !this.isClosed) {\r\n super.writeStreamChunk({\r\n buffer: this.privNextBufferToWrite.slice(0, this.privNextBufferReadyBytes),\r\n isEnd: false,\r\n timeReceived: this.privNextBufferStartTime,\r\n });\r\n }\r\n\r\n super.close();\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\ntype TWorkerMessage = ICallNotification | IClearResponse | IErrorNotification | IErrorResponse;\r\n\r\ninterface IClearResponse {\r\n error: null;\r\n id: number;\r\n}\r\n\r\ninterface IErrorNotification {\r\n error: {\r\n message: string;\r\n };\r\n id: null;\r\n result: null;\r\n}\r\n\r\ninterface IErrorResponse {\r\n error: {\r\n message: string;\r\n };\r\n id: number;\r\n result: null;\r\n}\r\n\r\ninterface ICallNotification {\r\n id: null;\r\n method: \"call\";\r\n params: {\r\n timerId: number;\r\n };\r\n}\r\n\r\ninterface ISetNotification {\r\n id: null;\r\n method: \"set\";\r\n params: {\r\n delay: number;\r\n now: number;\r\n timerId: number;\r\n };\r\n}\r\n\r\ninterface IClearRequest {\r\n id: number;\r\n method: \"clear\";\r\n params: {\r\n timerId: number;\r\n };\r\n}\r\n\r\ninterface IWorkerEvent extends Event {\r\n data: TWorkerMessage;\r\n}\r\n\r\ninterface IWorkerTimers {\r\n clearTimeout: (timerId: number) => void;\r\n setTimeout: (func: () => any, delay: number) => number;\r\n}\r\n\r\ndeclare type Func = () => any;\r\n\r\nexport class Timeout {\r\n\r\n private static workerTimers: null | IWorkerTimers = null;\r\n\r\n public static clearTimeout: IWorkerTimers[\"clearTimeout\"] = (timerId: number): void => Timeout.timers().clearTimeout(timerId);\r\n\r\n public static setTimeout: IWorkerTimers[\"setTimeout\"] = (func: () => any, delay: number): number => Timeout.timers().setTimeout(func, delay);\r\n\r\n public static load(): any {\r\n // Prefilling the Maps with a function indexed by zero is necessary to be compliant with the specification.\r\n const scheduledTimeoutFunctions: Map<number, number | Func> = new Map([[0, (): void => { }]]); // eslint-disable-line @typescript-eslint/no-empty-function\r\n const unhandledRequests: Map<number, number> = new Map();\r\n\r\n // eslint-disable-next-line\r\n const workerScript = `!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"\",n(n.s=14)}([function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return i})),n.d(t,\"b\",(function(){return u})),n.d(t,\"c\",(function(){return a})),n.d(t,\"d\",(function(){return d}));const r=new Map,o=new Map,i=e=>{const t=r.get(e);if(void 0===t)throw new Error('There is no interval scheduled with the given id \"'.concat(e,'\".'));clearTimeout(t),r.delete(e)},u=e=>{const t=o.get(e);if(void 0===t)throw new Error('There is no timeout scheduled with the given id \"'.concat(e,'\".'));clearTimeout(t),o.delete(e)},f=(e,t)=>{let n,r;if(\"performance\"in self){const o=performance.now();n=o,r=e-Math.max(0,o-t)}else n=Date.now(),r=e;return{expected:n+r,remainingDelay:r}},c=(e,t,n,r)=>{const o=\"performance\"in self?performance.now():Date.now();o>n?postMessage({id:null,method:\"call\",params:{timerId:t}}):e.set(t,setTimeout(c,n-o,e,t,n))},a=(e,t,n)=>{const{expected:o,remainingDelay:i}=f(e,n);r.set(t,setTimeout(c,i,r,t,o))},d=(e,t,n)=>{const{expected:r,remainingDelay:i}=f(e,n);o.set(t,setTimeout(c,i,o,t,r))}},function(e,t,n){\"use strict\";n.r(t);var r=n(2);for(var o in r)\"default\"!==o&&function(e){n.d(t,e,(function(){return r[e]}))}(o);var i=n(3);for(var o in i)\"default\"!==o&&function(e){n.d(t,e,(function(){return i[e]}))}(o);var u=n(4);for(var o in u)\"default\"!==o&&function(e){n.d(t,e,(function(){return u[e]}))}(o);var f=n(5);for(var o in f)\"default\"!==o&&function(e){n.d(t,e,(function(){return f[e]}))}(o);var c=n(6);for(var o in c)\"default\"!==o&&function(e){n.d(t,e,(function(){return c[e]}))}(o);var a=n(7);for(var o in a)\"default\"!==o&&function(e){n.d(t,e,(function(){return a[e]}))}(o);var d=n(8);for(var o in d)\"default\"!==o&&function(e){n.d(t,e,(function(){return d[e]}))}(o);var s=n(9);for(var o in s)\"default\"!==o&&function(e){n.d(t,e,(function(){return s[e]}))}(o)},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t,n){\"use strict\";n.r(t);var r=n(11);for(var o in r)\"default\"!==o&&function(e){n.d(t,e,(function(){return r[e]}))}(o);var i=n(12);for(var o in i)\"default\"!==o&&function(e){n.d(t,e,(function(){return i[e]}))}(o);var u=n(13);for(var o in u)\"default\"!==o&&function(e){n.d(t,e,(function(){return u[e]}))}(o)},function(e,t){},function(e,t){},function(e,t){},function(e,t,n){\"use strict\";n.r(t);var r=n(0),o=n(1);for(var i in o)\"default\"!==i&&function(e){n.d(t,e,(function(){return o[e]}))}(i);var u=n(10);for(var i in u)\"default\"!==i&&function(e){n.d(t,e,(function(){return u[e]}))}(i);addEventListener(\"message\",({data:e})=>{try{if(\"clear\"===e.method){const{id:t,params:{timerId:n}}=e;Object(r.b)(n),postMessage({error:null,id:t})}else{if(\"set\"!==e.method)throw new Error('The given method \"'.concat(e.method,'\" is not supported'));{const{params:{delay:t,now:n,timerId:o}}=e;Object(r.d)(t,o,n)}}}catch(t){postMessage({error:{message:t.message},id:e.id,result:null})}})}]);`;\r\n const workerUrl = \"data:text/javascript;base64,\" + btoa(workerScript);\r\n const worker = new Worker(workerUrl);\r\n\r\n worker.addEventListener(\"message\", ({ data }: IWorkerEvent): void => {\r\n if (Timeout.isCallNotification(data)) {\r\n const {\r\n params: { timerId }\r\n } = data;\r\n\r\n const idOrFunc = scheduledTimeoutFunctions.get(timerId);\r\n\r\n if (typeof idOrFunc === \"number\") {\r\n const unhandledTimerId = unhandledRequests.get(idOrFunc);\r\n\r\n if (\r\n unhandledTimerId === undefined ||\r\n unhandledTimerId !== timerId\r\n ) {\r\n throw new Error(\"The timer is in an undefined state.\");\r\n }\r\n } else if (typeof idOrFunc !== \"undefined\") {\r\n idOrFunc();\r\n\r\n // A timeout can be safely deleted because it is only called once.\r\n scheduledTimeoutFunctions.delete(timerId);\r\n } else {\r\n throw new Error(\"The timer is in an undefined state.\");\r\n }\r\n } else if (Timeout.isClearResponse(data)) {\r\n const { id } = data;\r\n\r\n const unhandledTimerId = unhandledRequests.get(id);\r\n\r\n if (unhandledTimerId === undefined) {\r\n throw new Error(\"The timer is in an undefined state.\");\r\n }\r\n\r\n unhandledRequests.delete(id);\r\n\r\n scheduledTimeoutFunctions.delete(unhandledTimerId);\r\n } else {\r\n const {\r\n error: { message }\r\n } = data;\r\n\r\n throw new Error(message);\r\n }\r\n });\r\n\r\n const clearTimeout = (timerId: number): void => {\r\n const id = Math.random();\r\n\r\n unhandledRequests.set(id, timerId);\r\n scheduledTimeoutFunctions.set(timerId, id);\r\n\r\n worker.postMessage({\r\n id,\r\n method: \"clear\",\r\n params: { timerId }\r\n } as IClearRequest);\r\n };\r\n\r\n const setTimeout = (func: () => void, delay: number): number => {\r\n const timerId = Math.random();\r\n\r\n scheduledTimeoutFunctions.set(timerId, func);\r\n\r\n worker.postMessage({\r\n id: null,\r\n method: \"set\",\r\n params: {\r\n delay,\r\n now: performance.now(),\r\n timerId\r\n }\r\n } as ISetNotification);\r\n\r\n return timerId;\r\n };\r\n\r\n return {\r\n clearTimeout,\r\n setTimeout\r\n };\r\n }\r\n\r\n private static loadWorkerTimers(): () => IWorkerTimers {\r\n return (): IWorkerTimers => {\r\n if (Timeout.workerTimers !== null) {\r\n return Timeout.workerTimers;\r\n }\r\n\r\n Timeout.workerTimers = Timeout.load() as IWorkerTimers;\r\n\r\n return Timeout.workerTimers;\r\n };\r\n }\r\n\r\n public static timers: () => IWorkerTimers = Timeout.loadWorkerTimers();\r\n\r\n private static isCallNotification(message: TWorkerMessage): message is ICallNotification {\r\n return (message as ICallNotification).method !== undefined && (message as ICallNotification).method === \"call\";\r\n }\r\n\r\n private static isClearResponse(message: TWorkerMessage): message is IClearResponse {\r\n return (message as IClearResponse).error === null && typeof message.id === \"number\";\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\n/* eslint-disable max-classes-per-file */\r\n\r\nimport { EventType, PlatformEvent } from \"./PlatformEvent.js\";\r\n\r\nexport class OCSPEvent extends PlatformEvent {\r\n private privSignature: string;\r\n\r\n public constructor(eventName: string, eventType: EventType, signature: string) {\r\n super(eventName, eventType);\r\n\r\n this.privSignature = signature;\r\n }\r\n}\r\n\r\nexport class OCSPMemoryCacheHitEvent extends OCSPEvent {\r\n public constructor(signature: string) {\r\n super(\"OCSPMemoryCacheHitEvent\", EventType.Debug, signature);\r\n }\r\n}\r\n\r\nexport class OCSPCacheMissEvent extends OCSPEvent {\r\n public constructor(signature: string) {\r\n super(\"OCSPCacheMissEvent\", EventType.Debug, signature);\r\n }\r\n}\r\n\r\nexport class OCSPDiskCacheHitEvent extends OCSPEvent {\r\n public constructor(signature: string) {\r\n super(\"OCSPDiskCacheHitEvent\", EventType.Debug, signature);\r\n }\r\n}\r\n\r\nexport class OCSPCacheUpdateNeededEvent extends OCSPEvent {\r\n public constructor(signature: string) {\r\n super(\"OCSPCacheUpdateNeededEvent\", EventType.Debug, signature);\r\n }\r\n}\r\n\r\nexport class OCSPMemoryCacheStoreEvent extends OCSPEvent {\r\n public constructor(signature: string) {\r\n super(\"OCSPMemoryCacheStoreEvent\", EventType.Debug, signature);\r\n }\r\n}\r\n\r\nexport class OCSPDiskCacheStoreEvent extends OCSPEvent {\r\n public constructor(signature: string) {\r\n super(\"OCSPDiskCacheStoreEvent\", EventType.Debug, signature);\r\n }\r\n}\r\n\r\nexport class OCSPCacheUpdateCompleteEvent extends OCSPEvent {\r\n public constructor(signature: string) {\r\n super(\"OCSPCacheUpdateCompleteEvent\", EventType.Debug, signature);\r\n }\r\n}\r\n\r\nexport class OCSPStapleReceivedEvent extends OCSPEvent {\r\n public constructor() {\r\n super(\"OCSPStapleReceivedEvent\", EventType.Debug, \"\");\r\n }\r\n}\r\n\r\nexport class OCSPWSUpgradeStartedEvent extends OCSPEvent {\r\n public constructor(serialNumber: string) {\r\n super(\"OCSPWSUpgradeStartedEvent\", EventType.Debug, serialNumber);\r\n }\r\n}\r\n\r\nexport class OCSPCacheEntryExpiredEvent extends OCSPEvent {\r\n private privExpireTime: number;\r\n\r\n public constructor(serialNumber: string, expireTime: number) {\r\n super(\"OCSPCacheEntryExpiredEvent\", EventType.Debug, serialNumber);\r\n this.privExpireTime = expireTime;\r\n }\r\n}\r\n\r\nexport class OCSPCacheEntryNeedsRefreshEvent extends OCSPEvent {\r\n private privExpireTime: number;\r\n private privStartTime: number;\r\n\r\n public constructor(serialNumber: string, startTime: number, expireTime: number) {\r\n super(\"OCSPCacheEntryNeedsRefreshEvent\", EventType.Debug, serialNumber);\r\n this.privExpireTime = expireTime;\r\n this.privStartTime = startTime;\r\n }\r\n}\r\n\r\nexport class OCSPCacheHitEvent extends OCSPEvent {\r\n private privExpireTime: number;\r\n private privStartTime: number;\r\n private privExpireTimeString: string;\r\n private privStartTimeString: string;\r\n\r\n public constructor(serialNumber: string, startTime: number, expireTime: number) {\r\n super(\"OCSPCacheHitEvent\", EventType.Debug, serialNumber);\r\n this.privExpireTime = expireTime;\r\n this.privExpireTimeString = new Date(expireTime).toLocaleDateString();\r\n this.privStartTime = startTime;\r\n this.privStartTimeString = new Date(startTime).toLocaleTimeString();\r\n }\r\n}\r\n\r\nexport class OCSPVerificationFailedEvent extends OCSPEvent {\r\n private privError: string;\r\n\r\n public constructor(serialNumber: string, error: string) {\r\n super(\"OCSPVerificationFailedEvent\", EventType.Debug, serialNumber);\r\n this.privError = error;\r\n }\r\n}\r\n\r\nexport class OCSPCacheFetchErrorEvent extends OCSPEvent {\r\n private privError: string;\r\n\r\n public constructor(serialNumber: string, error: string) {\r\n super(\"OCSPCacheFetchErrorEvent\", EventType.Debug, serialNumber);\r\n this.privError = error;\r\n }\r\n}\r\n\r\nexport class OCSPResponseRetrievedEvent extends OCSPEvent {\r\n public constructor(serialNumber: string) {\r\n super(\"OCSPResponseRetrievedEvent\", EventType.Debug, serialNumber);\r\n }\r\n}\r\n\r\nexport class OCSPCacheUpdateErrorEvent extends OCSPEvent {\r\n private privError: string;\r\n\r\n public constructor(serialNumber: string, error: string) {\r\n super(\"OCSPCacheUpdateErrorEvent\", EventType.Debug, serialNumber);\r\n this.privError = error;\r\n }\r\n}\r\n","\r\n// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport {\r\n EventType,\r\n PlatformEvent\r\n} from \"./Exports.js\";\r\n\r\nexport class BackgroundEvent extends PlatformEvent {\r\n private privError: string;\r\n\r\n public constructor(error: string) {\r\n super(\"BackgroundEvent\", EventType.Error);\r\n this.privError = error;\r\n }\r\n\r\n public get error(): string {\r\n return this.privError;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nexport * from \"./AudioSourceEvents.js\";\r\nexport * from \"./ConnectionEvents.js\";\r\nexport * from \"./ConnectionMessage.js\";\r\nexport * from \"./ConnectionOpenResponse.js\";\r\nexport * from \"./DeferralMap.js\";\r\nexport * from \"./DialogEvents.js\";\r\nexport * from \"./Error.js\";\r\nexport * from \"./Events.js\";\r\nexport * from \"./EventSource.js\";\r\nexport * from \"./Guid.js\";\r\nexport * from \"./IAudioSource.js\";\r\nexport * from \"./IConnection.js\";\r\nexport * from \"./IDetachable.js\";\r\nexport * from \"./IDictionary.js\";\r\nexport * from \"./IDisposable.js\";\r\nexport * from \"./IEventListener.js\";\r\nexport * from \"./IEventSource.js\";\r\nexport * from \"./IErrorMessages.js\";\r\nexport * from \"./ITimer.js\";\r\nexport * from \"./IWebsocketMessageFormatter.js\";\r\nexport * from \"./List.js\";\r\nexport * from \"./PlatformEvent.js\";\r\nexport * from \"./Promise.js\";\r\nexport * from \"./Queue.js\";\r\nexport * from \"./RawWebsocketMessage.js\";\r\nexport * from \"./RiffPcmEncoder.js\";\r\nexport * from \"./Stream.js\";\r\nexport { TranslationStatus } from \"../common.speech/TranslationStatus.js\";\r\nexport * from \"./ChunkedArrayBufferStream.js\";\r\nexport * from \"./IAudioDestination.js\";\r\nexport * from \"./Timeout.js\";\r\nexport * from \"./OCSPEvents.js\";\r\nexport * from \"./BackgroundError.js\";\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nexport class HeaderNames {\r\n public static AuthKey: string = \"Ocp-Apim-Subscription-Key\";\r\n public static Authorization: string = \"Authorization\";\r\n public static SpIDAuthKey: string = \"Apim-Subscription-Id\";\r\n public static ConnectionId: string = \"X-ConnectionId\";\r\n public static ContentType: string = \"Content-Type\";\r\n public static CustomCommandsAppId: string = \"X-CommandsAppId\";\r\n public static Path: string = \"Path\";\r\n public static RequestId: string = \"X-RequestId\";\r\n public static RequestStreamId: string = \"X-StreamId\";\r\n public static RequestTimestamp: string = \"X-Timestamp\";\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nexport interface IAuthentication {\r\n fetch(authFetchEventId: string): Promise<AuthInfo>;\r\n fetchOnExpiry(authFetchEventId: string): Promise<AuthInfo>;\r\n}\r\n\r\nexport class AuthInfo {\r\n private privHeaderName: string;\r\n private privToken: string;\r\n\r\n public constructor(headerName: string, token: string) {\r\n this.privHeaderName = headerName;\r\n this.privToken = token;\r\n }\r\n\r\n public get headerName(): string {\r\n return this.privHeaderName;\r\n }\r\n\r\n public get token(): string {\r\n return this.privToken;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport {\r\n ArgumentNullError,\r\n} from \"../common/Exports.js\";\r\nimport { HeaderNames } from \"./HeaderNames.js\";\r\nimport {\r\n AuthInfo,\r\n IAuthentication\r\n} from \"./IAuthentication.js\";\r\n\r\n/**\r\n * @class\r\n */\r\nexport class CognitiveSubscriptionKeyAuthentication implements IAuthentication {\r\n private privAuthInfo: AuthInfo;\r\n\r\n /**\r\n * Creates and initializes an instance of the CognitiveSubscriptionKeyAuthentication class.\r\n * @constructor\r\n * @param {string} subscriptionKey - The subscription key\r\n */\r\n public constructor(subscriptionKey: string) {\r\n if (!subscriptionKey) {\r\n throw new ArgumentNullError(\"subscriptionKey\");\r\n }\r\n\r\n this.privAuthInfo = new AuthInfo(HeaderNames.AuthKey, subscriptionKey);\r\n }\r\n\r\n /**\r\n * Fetches the subscription key.\r\n * @member\r\n * @function\r\n * @public\r\n * @param {string} authFetchEventId - The id to fetch.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public fetch(authFetchEventId: string): Promise<AuthInfo> {\r\n return Promise.resolve(this.privAuthInfo);\r\n }\r\n\r\n /**\r\n * Fetches the subscription key.\r\n * @member\r\n * @function\r\n * @public\r\n * @param {string} authFetchEventId - The id to fetch.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public fetchOnExpiry(authFetchEventId: string): Promise<AuthInfo> {\r\n return Promise.resolve(this.privAuthInfo);\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { ArgumentNullError } from \"../common/Exports.js\";\r\nimport { AuthInfo, IAuthentication } from \"./IAuthentication.js\";\r\nimport { HeaderNames } from \"./HeaderNames.js\";\r\n\r\nexport class CognitiveTokenAuthentication implements IAuthentication {\r\n private static privTokenPrefix: string = \"Bearer \";\r\n private privFetchCallback: (authFetchEventId: string) => Promise<string>;\r\n private privFetchOnExpiryCallback: (authFetchEventId: string) => Promise<string>;\r\n\r\n public constructor(fetchCallback: (authFetchEventId: string) => Promise<string>, fetchOnExpiryCallback: (authFetchEventId: string) => Promise<string>) {\r\n if (!fetchCallback) {\r\n throw new ArgumentNullError(\"fetchCallback\");\r\n }\r\n\r\n if (!fetchOnExpiryCallback) {\r\n throw new ArgumentNullError(\"fetchOnExpiryCallback\");\r\n }\r\n\r\n this.privFetchCallback = fetchCallback;\r\n this.privFetchOnExpiryCallback = fetchOnExpiryCallback;\r\n }\r\n\r\n public fetch(authFetchEventId: string): Promise<AuthInfo> {\r\n return this.privFetchCallback(authFetchEventId).then((token: string): AuthInfo => new AuthInfo(HeaderNames.Authorization, token === undefined ? undefined : CognitiveTokenAuthentication.privTokenPrefix + token));\r\n }\r\n\r\n public fetchOnExpiry(authFetchEventId: string): Promise<AuthInfo> {\r\n return this.privFetchOnExpiryCallback(authFetchEventId).then((token: string): AuthInfo => new AuthInfo(HeaderNames.Authorization, token === undefined ? undefined : CognitiveTokenAuthentication.privTokenPrefix + token));\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { EventType } from \"../common/Exports.js\";\r\n\r\n/**\r\n * Define event severity types for setting logging output.\r\n * @class LogLevel\r\n */\r\n\r\nexport { EventType as LogLevel };\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\n/**\r\n * @class Contracts\r\n * @private\r\n */\r\nexport class Contracts {\r\n public static throwIfNullOrUndefined(param: any, name: string): void {\r\n if (param === undefined || param === null) {\r\n throw new Error(\"throwIfNullOrUndefined:\" + name);\r\n }\r\n }\r\n\r\n public static throwIfNull(param: any, name: string): void {\r\n if (param === null) {\r\n throw new Error(\"throwIfNull:\" + name);\r\n }\r\n }\r\n\r\n public static throwIfNullOrWhitespace(param: string, name: string): void {\r\n Contracts.throwIfNullOrUndefined(param, name);\r\n\r\n if ((\"\" + param).trim().length < 1) {\r\n throw new Error(\"throwIfNullOrWhitespace:\" + name);\r\n }\r\n }\r\n\r\n public static throwIfNullOrTooLong(param: string, name: string, maxLength: number): void {\r\n Contracts.throwIfNullOrUndefined(param, name);\r\n\r\n if ((\"\" + param).length > maxLength) {\r\n throw new Error(\"throwIfNullOrTooLong:\" + name + \" (more than \" + maxLength.toString() + \" characters)\");\r\n }\r\n }\r\n\r\n public static throwIfNullOrTooShort(param: string, name: string, minLength: number): void {\r\n Contracts.throwIfNullOrUndefined(param, name);\r\n\r\n if ((\"\" + param).length < minLength) {\r\n throw new Error(\"throwIfNullOrTooShort:\" + name + \" (less than \" + minLength.toString() + \" characters)\");\r\n }\r\n }\r\n\r\n public static throwIfDisposed(isDisposed: boolean): void {\r\n if (isDisposed) {\r\n throw new Error(\"the object is already disposed\");\r\n }\r\n }\r\n\r\n public static throwIfArrayEmptyOrWhitespace(array: string[], name: string): void {\r\n Contracts.throwIfNullOrUndefined(array, name);\r\n\r\n if (array.length === 0) {\r\n throw new Error(\"throwIfArrayEmptyOrWhitespace:\" + name);\r\n }\r\n\r\n for (const item of array) {\r\n Contracts.throwIfNullOrWhitespace(item, name);\r\n }\r\n }\r\n\r\n public static throwIfFileDoesNotExist(param: string, name: string): void {\r\n Contracts.throwIfNullOrWhitespace(param, name);\r\n\r\n // TODO check for file existence.\r\n }\r\n\r\n public static throwIfNotUndefined(param: any, name: string): void {\r\n if (param !== undefined) {\r\n throw new Error(\"throwIfNotUndefined:\" + name);\r\n }\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport * as fs from \"fs\";\r\nimport { LogLevel } from \"../sdk/LogLevel.js\";\r\nimport { IEventListener, PlatformEvent } from \"../common/Exports.js\";\r\nimport { Contracts } from \"../sdk/Contracts.js\";\r\n\r\nexport class ConsoleLoggingListener implements IEventListener<PlatformEvent> {\r\n private privLogLevelFilter: LogLevel;\r\n private privLogPath: fs.PathLike = undefined;\r\n private privEnableConsoleOutput: boolean = true;\r\n\r\n public logCallback: (s: string) => void;\r\n\r\n public constructor(logLevelFilter: LogLevel = LogLevel.None) { // Console output disabled by default\r\n this.privLogLevelFilter = logLevelFilter;\r\n }\r\n\r\n public set logPath(path: fs.PathLike) {\r\n Contracts.throwIfNullOrUndefined(fs.openSync, \"\\nFile System access not available\");\r\n this.privLogPath = path;\r\n }\r\n\r\n public set enableConsoleOutput(enableOutput: boolean) {\r\n this.privEnableConsoleOutput = enableOutput;\r\n }\r\n\r\n public onEvent(event: PlatformEvent): void {\r\n if (event.eventType >= this.privLogLevelFilter) {\r\n const log = this.toString(event);\r\n if (!!this.logCallback) {\r\n this.logCallback(log);\r\n }\r\n if (!!this.privLogPath) {\r\n fs.writeFileSync(this.privLogPath, log + \"\\n\", { flag: \"a+\" });\r\n }\r\n\r\n if (this.privEnableConsoleOutput) {\r\n switch (event.eventType) {\r\n case LogLevel.Debug:\r\n // eslint-disable-next-line no-console\r\n console.debug(log);\r\n break;\r\n case LogLevel.Info:\r\n // eslint-disable-next-line no-console\r\n console.info(log);\r\n break;\r\n case LogLevel.Warning:\r\n // eslint-disable-next-line no-console\r\n console.warn(log);\r\n break;\r\n case LogLevel.Error:\r\n // eslint-disable-next-line no-console\r\n console.error(log);\r\n break;\r\n default:\r\n // eslint-disable-next-line no-console\r\n console.log(log);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private toString(event: PlatformEvent): string {\r\n const logFragments = [\r\n `${event.eventTime}`,\r\n `${event.name}`,\r\n ];\r\n\r\n const e: any = event as any;\r\n for (const prop in e) {\r\n if (prop && event.hasOwnProperty(prop) &&\r\n prop !== \"eventTime\" && prop !== \"eventType\" &&\r\n prop !== \"eventId\" && prop !== \"name\" &&\r\n prop !== \"constructor\") {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\r\n const value = e[prop];\r\n let valueToLog = \"<NULL>\";\r\n if (value !== undefined && value !== null) {\r\n if (typeof (value) === \"number\" || typeof (value) === \"string\") {\r\n valueToLog = value.toString();\r\n } else {\r\n valueToLog = JSON.stringify(value);\r\n }\r\n }\r\n\r\n logFragments.push(`${prop}: ${valueToLog}`);\r\n }\r\n\r\n }\r\n\r\n return logFragments.join(\" | \");\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { RiffPcmEncoder, Stream } from \"../common/Exports\";\r\nimport { IRecorder } from \"./IRecorder\";\r\n\r\nexport class PcmRecorder implements IRecorder {\r\n private privMediaResources: IMediaResources;\r\n private privSpeechProcessorScript: string; // speech-processor.js Url\r\n private privStopInputOnRelease: boolean;\r\n\r\n public constructor(stopInputOnRelease: boolean) {\r\n this.privStopInputOnRelease = stopInputOnRelease;\r\n }\r\n\r\n public record(context: AudioContext, mediaStream: MediaStream, outputStream: Stream<ArrayBuffer>): void {\r\n const desiredSampleRate = 16000;\r\n\r\n const waveStreamEncoder = new RiffPcmEncoder(context.sampleRate, desiredSampleRate);\r\n\r\n const micInput = context.createMediaStreamSource(mediaStream);\r\n\r\n const attachScriptProcessor = (): void => {\r\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\r\n const scriptNode = (() => {\r\n let bufferSize = 0;\r\n try {\r\n return context.createScriptProcessor(bufferSize, 1, 1);\r\n } catch (error) {\r\n // Webkit (<= version 31) requires a valid bufferSize.\r\n bufferSize = 2048;\r\n let audioSampleRate = context.sampleRate;\r\n while (bufferSize < 16384 && audioSampleRate >= (2 * desiredSampleRate)) {\r\n bufferSize <<= 1;\r\n audioSampleRate >>= 1;\r\n }\r\n return context.createScriptProcessor(bufferSize, 1, 1);\r\n }\r\n })();\r\n scriptNode.onaudioprocess = (event: AudioProcessingEvent): void => {\r\n const inputFrame = event.inputBuffer.getChannelData(0);\r\n\r\n if (outputStream && !outputStream.isClosed) {\r\n const waveFrame = waveStreamEncoder.encode(inputFrame);\r\n if (!!waveFrame) {\r\n outputStream.writeStreamChunk({\r\n buffer: waveFrame,\r\n isEnd: false,\r\n timeReceived: Date.now(),\r\n });\r\n }\r\n }\r\n };\r\n micInput.connect(scriptNode);\r\n scriptNode.connect(context.destination);\r\n this.privMediaResources = {\r\n scriptProcessorNode: scriptNode,\r\n source: micInput,\r\n stream: mediaStream,\r\n };\r\n };\r\n\r\n // https://webaudio.github.io/web-audio-api/#audioworklet\r\n // Using AudioWorklet to improve audio quality and avoid audio glitches due to blocking the UI thread\r\n const skipAudioWorklet = !!this.privSpeechProcessorScript && this.privSpeechProcessorScript.toLowerCase() === \"ignore\";\r\n\r\n if (!!context.audioWorklet && !skipAudioWorklet) {\r\n if (!this.privSpeechProcessorScript) {\r\n const workletScript = `class SP extends AudioWorkletProcessor {\r\n constructor(options) {\r\n super(options);\r\n }\r\n process(inputs, outputs) {\r\n const input = inputs[0];\r\n const output = [];\r\n for (let channel = 0; channel < input.length; channel += 1) {\r\n output[channel] = input[channel];\r\n }\r\n this.port.postMessage(output[0]);\r\n return true;\r\n }\r\n }\r\n registerProcessor('speech-processor', SP);`;\r\n const blob = new Blob([workletScript], { type: \"application/javascript; charset=utf-8\" });\r\n this.privSpeechProcessorScript = URL.createObjectURL(blob);\r\n }\r\n\r\n context.audioWorklet\r\n .addModule(this.privSpeechProcessorScript)\r\n .then((): void => {\r\n const workletNode = new AudioWorkletNode(context, \"speech-processor\");\r\n workletNode.port.onmessage = (ev: MessageEvent): void => {\r\n const inputFrame: Float32Array = ev.data as Float32Array;\r\n\r\n if (outputStream && !outputStream.isClosed) {\r\n const waveFrame = waveStreamEncoder.encode(inputFrame);\r\n if (!!waveFrame) {\r\n outputStream.writeStreamChunk({\r\n buffer: waveFrame,\r\n isEnd: false,\r\n timeReceived: Date.now(),\r\n });\r\n }\r\n }\r\n };\r\n micInput.connect(workletNode);\r\n workletNode.connect(context.destination);\r\n this.privMediaResources = {\r\n scriptProcessorNode: workletNode,\r\n source: micInput,\r\n stream: mediaStream,\r\n };\r\n })\r\n .catch((): void => {\r\n attachScriptProcessor();\r\n });\r\n } else {\r\n try {\r\n attachScriptProcessor();\r\n } catch (err) {\r\n throw new Error(`Unable to start audio worklet node for PCMRecorder: ${err as string}`);\r\n }\r\n }\r\n }\r\n\r\n public releaseMediaResources(context: AudioContext): void {\r\n if (this.privMediaResources) {\r\n if (this.privMediaResources.scriptProcessorNode) {\r\n this.privMediaResources.scriptProcessorNode.disconnect(context.destination);\r\n this.privMediaResources.scriptProcessorNode = null;\r\n }\r\n if (this.privMediaResources.source) {\r\n this.privMediaResources.source.disconnect();\r\n if (this.privStopInputOnRelease) {\r\n this.privMediaResources.stream.getTracks().forEach((track: MediaStreamTrack): void => track.stop());\r\n }\r\n this.privMediaResources.source = null;\r\n }\r\n }\r\n }\r\n\r\n public setWorkletUrl(url: string): void {\r\n this.privSpeechProcessorScript = url;\r\n }\r\n}\r\n\r\ninterface IMediaResources {\r\n source: MediaStreamAudioSourceNode;\r\n scriptProcessorNode: ScriptProcessorNode | AudioWorkletNode;\r\n stream: MediaStream;\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport * as fs from \"fs\";\r\nimport { IAudioDestination } from \"../../common/Exports.js\";\r\nimport { Contracts } from \"../Contracts.js\";\r\nimport { AudioStreamFormat } from \"../Exports.js\";\r\nimport { AudioOutputFormatImpl } from \"./AudioOutputFormat.js\";\r\n\r\nexport class AudioFileWriter implements IAudioDestination {\r\n private privAudioFormat: AudioOutputFormatImpl;\r\n private privFd: number;\r\n private privId: string;\r\n private privWriteStream: fs.WriteStream;\r\n\r\n public constructor(filename: fs.PathLike) {\r\n Contracts.throwIfNullOrUndefined(fs.openSync, \"\\nFile System access not available, please use Push or PullAudioOutputStream\");\r\n this.privFd = fs.openSync(filename, \"w\");\r\n }\r\n\r\n public set format(format: AudioStreamFormat) {\r\n Contracts.throwIfNotUndefined(this.privAudioFormat, \"format is already set\");\r\n this.privAudioFormat = format as AudioOutputFormatImpl;\r\n let headerOffset: number = 0;\r\n if (this.privAudioFormat.hasHeader) {\r\n headerOffset = this.privAudioFormat.header.byteLength;\r\n }\r\n if (this.privFd !== undefined) {\r\n this.privWriteStream = fs.createWriteStream(\"\", {fd: this.privFd, start: headerOffset, autoClose: false});\r\n }\r\n }\r\n\r\n public write(buffer: ArrayBuffer): void {\r\n Contracts.throwIfNullOrUndefined(this.privAudioFormat, \"must set format before writing.\");\r\n if (this.privWriteStream !== undefined) {\r\n this.privWriteStream.write(new Uint8Array(buffer.slice(0)));\r\n }\r\n }\r\n\r\n public close(): void {\r\n if (this.privFd !== undefined) {\r\n this.privWriteStream.on(\"finish\", (): void => {\r\n if (this.privAudioFormat.hasHeader) {\r\n this.privAudioFormat.updateHeader(this.privWriteStream.bytesWritten);\r\n fs.writeSync(this.privFd,\r\n new Int8Array(this.privAudioFormat.header),\r\n 0,\r\n this.privAudioFormat.header.byteLength,\r\n 0);\r\n }\r\n fs.closeSync(this.privFd);\r\n this.privFd = undefined;\r\n });\r\n this.privWriteStream.end();\r\n }\r\n }\r\n\r\n public id(): string {\r\n return this.privId;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { ReplayableAudioNode } from \"../common.browser/Exports.js\";\r\nimport { ConnectionOpenResponse } from \"../common/ConnectionOpenResponse.js\";\r\nimport {\r\n ArgumentNullError,\r\n ConnectionClosedEvent,\r\n ConnectionEvent,\r\n ConnectionState,\r\n createNoDashGuid,\r\n EventSource,\r\n IAudioSource,\r\n IAudioStreamNode,\r\n IConnection,\r\n IDisposable,\r\n IStreamChunk,\r\n MessageType,\r\n ServiceEvent,\r\n Timeout\r\n} from \"../common/Exports.js\";\r\nimport { AudioStreamFormatImpl } from \"../sdk/Audio/AudioStreamFormat.js\";\r\nimport { SpeakerRecognitionModel } from \"../sdk/SpeakerRecognitionModel.js\";\r\nimport {\r\n CancellationErrorCode,\r\n CancellationReason,\r\n PropertyId,\r\n RecognitionEventArgs,\r\n Recognizer,\r\n SessionEventArgs,\r\n SpeakerRecognitionResult,\r\n SpeechRecognitionResult,\r\n OutputFormat\r\n} from \"../sdk/Exports.js\";\r\nimport { Callback } from \"../sdk/Transcription/IConversation.js\";\r\nimport {\r\n AgentConfig,\r\n DynamicGrammarBuilder,\r\n ISpeechConfigAudioDevice,\r\n RecognitionMode,\r\n RequestSession,\r\n SpeechContext,\r\n SpeechDetected,\r\n type,\r\n OutputFormatPropertyName\r\n} from \"./Exports.js\";\r\nimport {\r\n AuthInfo,\r\n IAuthentication,\r\n} from \"./IAuthentication.js\";\r\nimport { IConnectionFactory } from \"./IConnectionFactory.js\";\r\nimport { RecognizerConfig } from \"./RecognizerConfig.js\";\r\nimport { SpeechConnectionMessage } from \"./SpeechConnectionMessage.Internal.js\";\r\n\r\ninterface CustomModel {\r\n language: string;\r\n endpoint: string;\r\n}\r\n\r\nexport interface PhraseDetection {\r\n customModels?: CustomModel[];\r\n onInterim?: { action: string };\r\n onSuccess?: { action: string };\r\n mode?: string;\r\n INTERACTIVE?: Segmentation;\r\n CONVERSATION?: Segmentation;\r\n DICTATION?: Segmentation;\r\n speakerDiarization?: SpeakerDiarization;\r\n}\r\n\r\nexport interface SpeakerDiarization {\r\n mode?: string;\r\n audioSessionId?: string;\r\n audioOffsetMs?: number;\r\n identityProvider?: string;\r\n diarizeIntermediates?: boolean;\r\n}\r\n\r\nexport interface Segmentation {\r\n segmentation: {\r\n mode: string;\r\n segmentationSilenceTimeoutMs?: number;\r\n segmentationForcedTimeoutMs?: number;\r\n };\r\n}\r\n\r\nexport abstract class ServiceRecognizerBase implements IDisposable {\r\n private privAuthentication: IAuthentication;\r\n private privConnectionFactory: IConnectionFactory;\r\n\r\n // A promise for a configured connection.\r\n // Do not consume directly, call fetchConnection instead.\r\n private privConnectionConfigurationPromise: Promise<IConnection> = undefined;\r\n\r\n // A promise for a connection, but one that has not had the speech context sent yet.\r\n // Do not consume directly, call fetchConnection instead.\r\n private privConnectionPromise: Promise<IConnection> = undefined;\r\n private privAuthFetchEventId: string;\r\n private privIsDisposed: boolean;\r\n private privMustReportEndOfStream: boolean;\r\n private privConnectionEvents: EventSource<ConnectionEvent>;\r\n private privServiceEvents: EventSource<ServiceEvent>;\r\n private privDynamicGrammar: DynamicGrammarBuilder;\r\n private privAgentConfig: AgentConfig;\r\n private privServiceHasSentMessage: boolean;\r\n private privActivityTemplate: string;\r\n private privSetTimeout: (cb: () => void, delay: number) => number = setTimeout;\r\n private privAudioSource: IAudioSource;\r\n private privIsLiveAudio: boolean = false;\r\n private privAverageBytesPerMs: number = 0;\r\n protected privSpeechContext: SpeechContext;\r\n protected privRequestSession: RequestSession;\r\n protected privConnectionId: string;\r\n protected privDiarizationSessionId: string;\r\n protected privRecognizerConfig: RecognizerConfig;\r\n protected privRecognizer: Recognizer;\r\n protected privSuccessCallback: (e: SpeechRecognitionResult) => void;\r\n protected privErrorCallback: (e: string) => void;\r\n protected privEnableSpeakerId: boolean = false;\r\n protected privExpectContentAssessmentResponse: boolean = false;\r\n\r\n public constructor(\r\n authentication: IAuthentication,\r\n connectionFactory: IConnectionFactory,\r\n audioSource: IAudioSource,\r\n recognizerConfig: RecognizerConfig,\r\n recognizer: Recognizer) {\r\n\r\n if (!authentication) {\r\n throw new ArgumentNullError(\"authentication\");\r\n }\r\n\r\n if (!connectionFactory) {\r\n throw new ArgumentNullError(\"connectionFactory\");\r\n }\r\n\r\n if (!audioSource) {\r\n throw new ArgumentNullError(\"audioSource\");\r\n }\r\n\r\n if (!recognizerConfig) {\r\n throw new ArgumentNullError(\"recognizerConfig\");\r\n }\r\n\r\n this.privEnableSpeakerId = recognizerConfig.isSpeakerDiarizationEnabled;\r\n this.privMustReportEndOfStream = false;\r\n this.privAuthentication = authentication;\r\n this.privConnectionFactory = connectionFactory;\r\n this.privAudioSource = audioSource;\r\n this.privRecognizerConfig = recognizerConfig;\r\n this.privIsDisposed = false;\r\n this.privRecognizer = recognizer;\r\n this.privRequestSession = new RequestSession(this.privAudioSource.id());\r\n this.privConnectionEvents = new EventSource<ConnectionEvent>();\r\n this.privServiceEvents = new EventSource<ServiceEvent>();\r\n this.privDynamicGrammar = new DynamicGrammarBuilder();\r\n this.privSpeechContext = new SpeechContext(this.privDynamicGrammar);\r\n this.privAgentConfig = new AgentConfig();\r\n const webWorkerLoadType: string = this.privRecognizerConfig.parameters.getProperty(PropertyId.WebWorkerLoadType, \"on\").toLowerCase();\r\n if (webWorkerLoadType === \"on\" && typeof (Blob) !== \"undefined\" && typeof (Worker) !== \"undefined\") {\r\n this.privSetTimeout = Timeout.setTimeout;\r\n } else {\r\n if (typeof window !== \"undefined\") {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.privSetTimeout = window.setTimeout.bind(window);\r\n }\r\n if (typeof globalThis !== \"undefined\") {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.privSetTimeout = globalThis.setTimeout.bind(globalThis);\r\n }\r\n }\r\n\r\n this.connectionEvents.attach((connectionEvent: ConnectionEvent): void => {\r\n if (connectionEvent.name === \"ConnectionClosedEvent\") {\r\n const connectionClosedEvent = connectionEvent as ConnectionClosedEvent;\r\n if (connectionClosedEvent.statusCode === 1003 ||\r\n connectionClosedEvent.statusCode === 1007 ||\r\n connectionClosedEvent.statusCode === 1002 ||\r\n connectionClosedEvent.statusCode === 4000 ||\r\n this.privRequestSession.numConnectionAttempts > this.privRecognizerConfig.maxRetryCount\r\n ) {\r\n void this.cancelRecognitionLocal(CancellationReason.Error,\r\n connectionClosedEvent.statusCode === 1007 ? CancellationErrorCode.BadRequestParameters : CancellationErrorCode.ConnectionFailure,\r\n `${connectionClosedEvent.reason} websocket error code: ${connectionClosedEvent.statusCode}`);\r\n }\r\n }\r\n });\r\n\r\n if (this.privEnableSpeakerId) {\r\n this.privDiarizationSessionId = createNoDashGuid();\r\n }\r\n\r\n this.setLanguageIdJson();\r\n this.setOutputDetailLevelJson();\r\n }\r\n\r\n protected setTranslationJson(): void {\r\n const targetLanguages: string = this.privRecognizerConfig.parameters.getProperty(PropertyId.SpeechServiceConnection_TranslationToLanguages, undefined);\r\n if (targetLanguages !== undefined) {\r\n const languages = targetLanguages.split(\",\");\r\n const translationVoice: string = this.privRecognizerConfig.parameters.getProperty(PropertyId.SpeechServiceConnection_TranslationVoice, undefined);\r\n const action = ( translationVoice !== undefined ) ? \"Synthesize\" : \"None\";\r\n this.privSpeechContext.setSection(\"translation\", {\r\n onSuccess: { action },\r\n output: { interimResults: { mode: \"Always\" } },\r\n targetLanguages: languages,\r\n });\r\n\r\n if (translationVoice !== undefined) {\r\n const languageToVoiceMap: { [key: string]: string } = {};\r\n for (const lang of languages) {\r\n languageToVoiceMap[lang] = translationVoice;\r\n }\r\n this.privSpeechContext.setSection(\"synthesis\", {\r\n defaultVoices: languageToVoiceMap\r\n });\r\n }\r\n }\r\n }\r\n\r\n protected setSpeechSegmentationTimeoutJson(): void {\r\n const speechSegmentationSilenceTimeoutMs: string = this.privRecognizerConfig.parameters.getProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, undefined);\r\n const speechSegmentationMaximumTimeMs: string = this.privRecognizerConfig.parameters.getProperty(PropertyId.Speech_SegmentationMaximumTimeMs, undefined);\r\n const speechSegmentationStrategy: string = this.privRecognizerConfig.parameters.getProperty(PropertyId.Speech_SegmentationStrategy, undefined);\r\n const segmentation: Segmentation = {\r\n segmentation: {\r\n mode: \"\"\r\n }\r\n };\r\n let configuredSegment = false;\r\n\r\n if (speechSegmentationStrategy !== undefined) {\r\n configuredSegment = true;\r\n let segMode: string = \"\";\r\n switch (speechSegmentationStrategy.toLowerCase()) {\r\n case \"default\":\r\n break;\r\n case \"time\":\r\n segMode = \"Custom\";\r\n break;\r\n case \"semantic\":\r\n segMode = \"Semantic\";\r\n break;\r\n }\r\n\r\n segmentation.segmentation.mode = segMode;\r\n }\r\n\r\n if (speechSegmentationSilenceTimeoutMs !== undefined) {\r\n configuredSegment = true;\r\n const segmentationSilenceTimeoutMs: number = parseInt(speechSegmentationSilenceTimeoutMs, 10);\r\n segmentation.segmentation.mode = \"Custom\";\r\n segmentation.segmentation.segmentationSilenceTimeoutMs = segmentationSilenceTimeoutMs;\r\n }\r\n\r\n if (speechSegmentationMaximumTimeMs !== undefined) {\r\n configuredSegment = true;\r\n const segmentationMaximumTimeMs: number = parseInt(speechSegmentationMaximumTimeMs, 10);\r\n segmentation.segmentation.mode = \"Custom\";\r\n segmentation.segmentation.segmentationForcedTimeoutMs = segmentationMaximumTimeMs;\r\n }\r\n\r\n if (configuredSegment) {\r\n const recoMode = this.recognitionMode === RecognitionMode.Conversation ? \"CONVERSATION\" :\r\n this.recognitionMode === RecognitionMode.Dictation ? \"DICTATION\" : \"INTERACTIVE\";\r\n const phraseDetection = this.privSpeechContext.getSection(\"phraseDetection\") as PhraseDetection;\r\n phraseDetection.mode = recoMode;\r\n phraseDetection[recoMode] = segmentation;\r\n this.privSpeechContext.setSection(\"phraseDetection\", phraseDetection);\r\n }\r\n }\r\n\r\n protected setLanguageIdJson(): void {\r\n const phraseDetection = this.privSpeechContext.getSection(\"phraseDetection\") as PhraseDetection;\r\n if (this.privRecognizerConfig.autoDetectSourceLanguages !== undefined) {\r\n const sourceLanguages: string[] = this.privRecognizerConfig.autoDetectSourceLanguages.split(\",\");\r\n\r\n let speechContextLidMode;\r\n if (this.privRecognizerConfig.languageIdMode === \"Continuous\") {\r\n speechContextLidMode = \"DetectContinuous\";\r\n } else {// recognizerConfig.languageIdMode === \"AtStart\"\r\n speechContextLidMode = \"DetectAtAudioStart\";\r\n }\r\n\r\n this.privSpeechContext.setSection(\"languageId\", {\r\n Priority: \"PrioritizeLatency\",\r\n languages: sourceLanguages,\r\n mode: speechContextLidMode,\r\n onSuccess: { action: \"Recognize\" },\r\n onUnknown: { action: \"None\" }\r\n });\r\n this.privSpeechContext.setSection(\"phraseOutput\", {\r\n interimResults: {\r\n resultType: \"Auto\"\r\n },\r\n phraseResults: {\r\n resultType: \"Always\"\r\n }\r\n });\r\n const customModels: CustomModel[] = this.privRecognizerConfig.sourceLanguageModels;\r\n if (customModels !== undefined) {\r\n phraseDetection.customModels = customModels;\r\n phraseDetection.onInterim = { action: \"None\" };\r\n phraseDetection.onSuccess = { action: \"None\" };\r\n }\r\n }\r\n const targetLanguages: string = this.privRecognizerConfig.parameters.getProperty(PropertyId.SpeechServiceConnection_TranslationToLanguages, undefined);\r\n if (targetLanguages !== undefined) {\r\n phraseDetection.onInterim = { action: \"Translate\" };\r\n phraseDetection.onSuccess = { action: \"Translate\" };\r\n this.privSpeechContext.setSection(\"phraseOutput\", {\r\n interimResults: {\r\n resultType: \"None\"\r\n },\r\n phraseResults: {\r\n resultType: \"None\"\r\n }\r\n });\r\n }\r\n\r\n this.privSpeechContext.setSection(\"phraseDetection\", phraseDetection);\r\n }\r\n\r\n protected setOutputDetailLevelJson(): void {\r\n if (this.privEnableSpeakerId) {\r\n const requestWordLevelTimestamps: string = this.privRecognizerConfig.parameters.getProperty(PropertyId.SpeechServiceResponse_RequestWordLevelTimestamps, \"false\").toLowerCase();\r\n if (requestWordLevelTimestamps === \"true\") {\r\n this.privSpeechContext.setWordLevelTimings();\r\n } else {\r\n const outputFormat: string = this.privRecognizerConfig.parameters.getProperty(OutputFormatPropertyName, OutputFormat[OutputFormat.Simple]).toLowerCase();\r\n if (outputFormat === OutputFormat[OutputFormat.Detailed].toLocaleLowerCase()) {\r\n this.privSpeechContext.setDetailedOutputFormat();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public get isSpeakerDiarizationEnabled(): boolean {\r\n return this.privEnableSpeakerId;\r\n }\r\n\r\n public get audioSource(): IAudioSource {\r\n return this.privAudioSource;\r\n }\r\n\r\n public get speechContext(): SpeechContext {\r\n return this.privSpeechContext;\r\n }\r\n\r\n public get dynamicGrammar(): DynamicGrammarBuilder {\r\n return this.privDynamicGrammar;\r\n }\r\n\r\n public get agentConfig(): AgentConfig {\r\n return this.privAgentConfig;\r\n }\r\n\r\n public set conversationTranslatorToken(token: string) {\r\n this.privRecognizerConfig.parameters.setProperty(PropertyId.ConversationTranslator_Token, token);\r\n }\r\n\r\n public set voiceProfileType(type: string) {\r\n this.privRecognizerConfig.parameters.setProperty(PropertyId.SpeechServiceConnection_SpeakerIdMode, type);\r\n }\r\n\r\n public set authentication(auth: IAuthentication) {\r\n this.privAuthentication = auth;\r\n }\r\n\r\n public isDisposed(): boolean {\r\n return this.privIsDisposed;\r\n }\r\n\r\n public async dispose(reason?: string): Promise<void> {\r\n this.privIsDisposed = true;\r\n if (this.privConnectionConfigurationPromise !== undefined) {\r\n try {\r\n const connection: IConnection = await this.privConnectionConfigurationPromise;\r\n await connection.dispose(reason);\r\n } catch (error) {\r\n // The connection is in a bad state. But we're trying to kill it, so...\r\n return;\r\n }\r\n }\r\n }\r\n\r\n public get connectionEvents(): EventSource<ConnectionEvent> {\r\n return this.privConnectionEvents;\r\n }\r\n\r\n public get serviceEvents(): EventSource<ServiceEvent> {\r\n return this.privServiceEvents;\r\n }\r\n\r\n public get recognitionMode(): RecognitionMode {\r\n return this.privRecognizerConfig.recognitionMode;\r\n }\r\n\r\n protected recognizeOverride: (recoMode: RecognitionMode, sc: (e: SpeechRecognitionResult) => void, ec: (e: string) => void) => Promise<void> = undefined;\r\n\r\n public recognizeSpeaker: (model: SpeakerRecognitionModel) => Promise<SpeakerRecognitionResult> = undefined;\r\n\r\n public async recognize(\r\n recoMode: RecognitionMode,\r\n successCallback: (e: SpeechRecognitionResult) => void,\r\n errorCallBack: (e: string) => void,\r\n ): Promise<void> {\r\n\r\n if (this.recognizeOverride !== undefined) {\r\n await this.recognizeOverride(recoMode, successCallback, errorCallBack);\r\n return;\r\n }\r\n // Clear the existing configuration promise to force a re-transmission of config and context.\r\n this.privConnectionConfigurationPromise = undefined;\r\n this.privRecognizerConfig.recognitionMode = recoMode;\r\n this.setSpeechSegmentationTimeoutJson();\r\n this.setTranslationJson();\r\n\r\n this.privSuccessCallback = successCallback;\r\n this.privErrorCallback = errorCallBack;\r\n\r\n this.privRequestSession.startNewRecognition();\r\n this.privRequestSession.listenForServiceTelemetry(this.privAudioSource.events);\r\n\r\n // Start the connection to the service. The promise this will create is stored and will be used by configureConnection().\r\n const conPromise: Promise<IConnection> = this.connectImpl();\r\n let audioNode: ReplayableAudioNode;\r\n\r\n try {\r\n const audioStreamNode: IAudioStreamNode = await this.audioSource.attach(this.privRequestSession.audioNodeId);\r\n const format: AudioStreamFormatImpl = await this.audioSource.format;\r\n const deviceInfo: ISpeechConfigAudioDevice = await this.audioSource.deviceInfo;\r\n this.privIsLiveAudio = deviceInfo.type && deviceInfo.type === type.Microphones;\r\n\r\n audioNode = new ReplayableAudioNode(audioStreamNode, format.avgBytesPerSec);\r\n await this.privRequestSession.onAudioSourceAttachCompleted(audioNode, false);\r\n this.privRecognizerConfig.SpeechServiceConfig.Context.audio = { source: deviceInfo };\r\n\r\n } catch (error) {\r\n await this.privRequestSession.onStopRecognizing();\r\n throw error;\r\n }\r\n\r\n try {\r\n await conPromise;\r\n } catch (error) {\r\n await this.cancelRecognitionLocal(CancellationReason.Error, CancellationErrorCode.ConnectionFailure, error as string);\r\n return;\r\n }\r\n\r\n const sessionStartEventArgs: SessionEventArgs = new SessionEventArgs(this.privRequestSession.sessionId);\r\n\r\n if (!!this.privRecognizer.sessionStarted) {\r\n this.privRecognizer.sessionStarted(this.privRecognizer, sessionStartEventArgs);\r\n }\r\n\r\n void this.receiveMessage();\r\n const audioSendPromise = this.sendAudio(audioNode);\r\n\r\n audioSendPromise.catch(async (error: string): Promise<void> => {\r\n await this.cancelRecognitionLocal(CancellationReason.Error, CancellationErrorCode.RuntimeError, error);\r\n });\r\n\r\n return;\r\n }\r\n\r\n public async stopRecognizing(): Promise<void> {\r\n if (this.privRequestSession.isRecognizing) {\r\n try {\r\n await this.audioSource.turnOff();\r\n await this.sendFinalAudio();\r\n await this.privRequestSession.onStopRecognizing();\r\n await this.privRequestSession.turnCompletionPromise;\r\n } finally {\r\n await this.privRequestSession.dispose();\r\n }\r\n }\r\n return;\r\n }\r\n\r\n public async connect(): Promise<void> {\r\n await this.connectImpl();\r\n return Promise.resolve();\r\n }\r\n\r\n public connectAsync(cb?: Callback, err?: Callback): void {\r\n this.connectImpl().then((): void => {\r\n try {\r\n if (!!cb) {\r\n cb();\r\n }\r\n } catch (e) {\r\n if (!!err) {\r\n err(e);\r\n }\r\n }\r\n }, (reason: any): void => {\r\n try {\r\n if (!!err) {\r\n err(reason);\r\n }\r\n /* eslint-disable no-empty */\r\n } catch (error) {\r\n }\r\n });\r\n }\r\n\r\n protected disconnectOverride: () => Promise<void> = undefined;\r\n\r\n public async disconnect(): Promise<void> {\r\n await this.cancelRecognitionLocal(CancellationReason.Error,\r\n CancellationErrorCode.NoError,\r\n \"Disconnecting\");\r\n\r\n if (this.disconnectOverride !== undefined) {\r\n await this.disconnectOverride();\r\n }\r\n\r\n if (this.privConnectionPromise !== undefined) {\r\n try {\r\n await (await this.privConnectionPromise).dispose();\r\n } catch (error) {\r\n\r\n }\r\n }\r\n this.privConnectionPromise = undefined;\r\n }\r\n\r\n // Called when telemetry data is sent to the service.\r\n // Used for testing Telemetry capture.\r\n public static telemetryData: (json: string) => void;\r\n public static telemetryDataEnabled: boolean = true;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public sendMessage(message: string): Promise<void> {\r\n return;\r\n }\r\n\r\n public async sendNetworkMessage(path: string, payload: string | ArrayBuffer): Promise<void> {\r\n const type: MessageType = typeof payload === \"string\" ? MessageType.Text : MessageType.Binary;\r\n const contentType: string = typeof payload === \"string\" ? \"application/json\" : \"\";\r\n\r\n const connection: IConnection = await this.fetchConnection();\r\n return connection.send(new SpeechConnectionMessage(type, path, this.privRequestSession.requestId, contentType, payload));\r\n }\r\n\r\n public set activityTemplate(messagePayload: string) {\r\n this.privActivityTemplate = messagePayload;\r\n }\r\n\r\n public get activityTemplate(): string {\r\n return this.privActivityTemplate;\r\n }\r\n\r\n public set expectContentAssessmentResponse(value: boolean) {\r\n this.privExpectContentAssessmentResponse = value;\r\n }\r\n\r\n protected abstract processTypeSpecificMessages(\r\n connectionMessage: SpeechConnectionMessage,\r\n successCallback?: (e: SpeechRecognitionResult) => void,\r\n errorCallBack?: (e: string) => void): Promise<boolean>;\r\n\r\n protected async sendTelemetryData(): Promise<void> {\r\n const telemetryData = this.privRequestSession.getTelemetry();\r\n if (ServiceRecognizerBase.telemetryDataEnabled !== true ||\r\n this.privIsDisposed ||\r\n null === telemetryData) {\r\n return;\r\n }\r\n\r\n if (!!ServiceRecognizerBase.telemetryData) {\r\n try {\r\n ServiceRecognizerBase.telemetryData(telemetryData);\r\n /* eslint-disable no-empty */\r\n } catch { }\r\n }\r\n\r\n const connection: IConnection = await this.fetchConnection();\r\n await connection.send(new SpeechConnectionMessage(\r\n MessageType.Text,\r\n \"telemetry\",\r\n this.privRequestSession.requestId,\r\n \"application/json\",\r\n telemetryData));\r\n }\r\n\r\n // Cancels recognition.\r\n protected abstract cancelRecognition(\r\n sessionId: string,\r\n requestId: string,\r\n cancellationReason: CancellationReason,\r\n errorCode: CancellationErrorCode,\r\n error: string): void;\r\n\r\n // Cancels recognition.\r\n protected async cancelRecognitionLocal(\r\n cancellationReason: CancellationReason,\r\n errorCode: CancellationErrorCode,\r\n error: string): Promise<void> {\r\n\r\n if (!!this.privRequestSession.isRecognizing) {\r\n await this.privRequestSession.onStopRecognizing();\r\n\r\n this.cancelRecognition(\r\n this.privRequestSession.sessionId,\r\n this.privRequestSession.requestId,\r\n cancellationReason,\r\n errorCode,\r\n error);\r\n }\r\n }\r\n\r\n protected receiveMessageOverride: () => Promise<void> = undefined;\r\n\r\n protected async receiveMessage(): Promise<void> {\r\n try {\r\n if (this.privIsDisposed) {\r\n // We're done.\r\n return;\r\n }\r\n\r\n let connection = await this.fetchConnection();\r\n const message = await connection.read();\r\n\r\n if (this.receiveMessageOverride !== undefined) {\r\n return this.receiveMessageOverride();\r\n }\r\n\r\n // indicates we are draining the queue and it came with no message;\r\n if (!message) {\r\n return this.receiveMessage();\r\n }\r\n\r\n this.privServiceHasSentMessage = true;\r\n const connectionMessage = SpeechConnectionMessage.fromConnectionMessage(message);\r\n\r\n if (connectionMessage.requestId.toLowerCase() === this.privRequestSession.requestId.toLowerCase()) {\r\n switch (connectionMessage.path.toLowerCase()) {\r\n case \"turn.start\":\r\n this.privMustReportEndOfStream = true;\r\n this.privRequestSession.onServiceTurnStartResponse();\r\n break;\r\n\r\n case \"speech.startdetected\":\r\n const speechStartDetected: SpeechDetected = SpeechDetected.fromJSON(connectionMessage.textBody, this.privRequestSession.currentTurnAudioOffset);\r\n const speechStartEventArgs = new RecognitionEventArgs(speechStartDetected.Offset, this.privRequestSession.sessionId);\r\n if (!!this.privRecognizer.speechStartDetected) {\r\n this.privRecognizer.speechStartDetected(this.privRecognizer, speechStartEventArgs);\r\n }\r\n break;\r\n\r\n case \"speech.enddetected\":\r\n let json: string;\r\n if (connectionMessage.textBody.length > 0) {\r\n json = connectionMessage.textBody;\r\n } else {\r\n // If the request was empty, the JSON returned is empty.\r\n json = \"{ Offset: 0 }\";\r\n }\r\n const speechStopDetected: SpeechDetected = SpeechDetected.fromJSON(json, this.privRequestSession.currentTurnAudioOffset);\r\n const speechStopEventArgs = new RecognitionEventArgs(speechStopDetected.Offset + this.privRequestSession.currentTurnAudioOffset, this.privRequestSession.sessionId);\r\n if (!!this.privRecognizer.speechEndDetected) {\r\n this.privRecognizer.speechEndDetected(this.privRecognizer, speechStopEventArgs);\r\n }\r\n break;\r\n\r\n case \"turn.end\":\r\n await this.sendTelemetryData();\r\n if (this.privRequestSession.isSpeechEnded && this.privMustReportEndOfStream) {\r\n this.privMustReportEndOfStream = false;\r\n await this.cancelRecognitionLocal(CancellationReason.EndOfStream, CancellationErrorCode.NoError, undefined);\r\n }\r\n const sessionStopEventArgs: SessionEventArgs = new SessionEventArgs(this.privRequestSession.sessionId);\r\n await this.privRequestSession.onServiceTurnEndResponse(this.privRecognizerConfig.isContinuousRecognition);\r\n if (!this.privRecognizerConfig.isContinuousRecognition || this.privRequestSession.isSpeechEnded || !this.privRequestSession.isRecognizing) {\r\n if (!!this.privRecognizer.sessionStopped) {\r\n this.privRecognizer.sessionStopped(this.privRecognizer, sessionStopEventArgs);\r\n }\r\n return;\r\n } else {\r\n connection = await this.fetchConnection();\r\n await this.sendPrePayloadJSON(connection);\r\n }\r\n break;\r\n\r\n default:\r\n if (!await this.processTypeSpecificMessages(connectionMessage)) {\r\n // here are some messages that the derived class has not processed, dispatch them to connect class\r\n if (!!this.privServiceEvents) {\r\n this.serviceEvents.onEvent(new ServiceEvent(connectionMessage.path.toLowerCase(), connectionMessage.textBody));\r\n }\r\n }\r\n }\r\n }\r\n return this.receiveMessage();\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n private updateSpeakerDiarizationAudioOffset(): void {\r\n const bytesSent: number = this.privRequestSession.recognitionBytesSent;\r\n const audioOffsetMs: number = this.privAverageBytesPerMs !== 0 ? bytesSent / this.privAverageBytesPerMs : 0;\r\n this.privSpeechContext.setSpeakerDiarizationAudioOffsetMs(audioOffsetMs);\r\n }\r\n\r\n protected sendSpeechContext(connection: IConnection, generateNewRequestId: boolean): Promise<void> {\r\n if (this.privEnableSpeakerId) {\r\n this.updateSpeakerDiarizationAudioOffset();\r\n }\r\n const speechContextJson = this.speechContext.toJSON();\r\n if (generateNewRequestId) {\r\n this.privRequestSession.onSpeechContext();\r\n }\r\n\r\n if (speechContextJson) {\r\n return connection.send(new SpeechConnectionMessage(\r\n MessageType.Text,\r\n \"speech.context\",\r\n this.privRequestSession.requestId,\r\n \"application/json\",\r\n speechContextJson));\r\n }\r\n return;\r\n }\r\n\r\n protected sendPrePayloadJSONOverride: (connection: IConnection) => Promise<void> = undefined;\r\n\r\n protected noOp(): Promise<void> {\r\n // operation not supported\r\n return;\r\n }\r\n\r\n // Encapsulated for derived service recognizers that need to send additional JSON\r\n protected async sendPrePayloadJSON(connection: IConnection, generateNewRequestId: boolean = true): Promise<void> {\r\n if (this.sendPrePayloadJSONOverride !== undefined) {\r\n return this.sendPrePayloadJSONOverride(connection);\r\n }\r\n\r\n await this.sendSpeechContext(connection, generateNewRequestId);\r\n await this.sendWaveHeader(connection);\r\n return;\r\n }\r\n\r\n protected async sendWaveHeader(connection: IConnection): Promise<void> {\r\n const format: AudioStreamFormatImpl = await this.audioSource.format;\r\n // this.writeBufferToConsole(format.header);\r\n return connection.send(new SpeechConnectionMessage(\r\n MessageType.Binary,\r\n \"audio\",\r\n this.privRequestSession.requestId,\r\n \"audio/x-wav\",\r\n format.header\r\n ));\r\n }\r\n\r\n protected postConnectImplOverride: (connection: Promise<IConnection>) => Promise<IConnection> = undefined;\r\n\r\n // Establishes a websocket connection to the end point.\r\n protected connectImpl(): Promise<IConnection> {\r\n if (this.privConnectionPromise !== undefined) {\r\n return this.privConnectionPromise.then((connection: IConnection): Promise<IConnection> => {\r\n if (connection.state() === ConnectionState.Disconnected) {\r\n this.privConnectionId = null;\r\n this.privConnectionPromise = undefined;\r\n this.privServiceHasSentMessage = false;\r\n return this.connectImpl();\r\n }\r\n return this.privConnectionPromise;\r\n }, (): Promise<IConnection> => {\r\n this.privConnectionId = null;\r\n this.privConnectionPromise = undefined;\r\n this.privServiceHasSentMessage = false;\r\n return this.connectImpl();\r\n });\r\n }\r\n\r\n this.privConnectionPromise = this.retryableConnect();\r\n\r\n // Attach an empty handler to allow the promise to run in the background while\r\n // other startup events happen. It'll eventually be awaited on.\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n this.privConnectionPromise.catch((): void => { });\r\n\r\n if (this.postConnectImplOverride !== undefined) {\r\n return this.postConnectImplOverride(this.privConnectionPromise);\r\n }\r\n\r\n return this.privConnectionPromise;\r\n }\r\n\r\n protected configConnectionOverride: (connection: IConnection) => Promise<IConnection> = undefined;\r\n protected handleSpeechPhraseMessage: (textBody: string) => Promise<void> = undefined;\r\n protected handleSpeechHypothesisMessage: (textBody: string) => void = undefined;\r\n\r\n protected sendSpeechServiceConfig(connection: IConnection, requestSession: RequestSession, SpeechServiceConfigJson: string): Promise<void> {\r\n requestSession.onSpeechContext();\r\n // filter out anything that is not required for the service to work.\r\n if (ServiceRecognizerBase.telemetryDataEnabled !== true) {\r\n const withTelemetry: { context: { system: string } } = JSON.parse(SpeechServiceConfigJson) as { context: { system: string } };\r\n\r\n const replacement: any = {\r\n context: {\r\n system: withTelemetry.context.system,\r\n },\r\n };\r\n\r\n SpeechServiceConfigJson = JSON.stringify(replacement);\r\n }\r\n\r\n if (this.privRecognizerConfig.parameters.getProperty(\"f0f5debc-f8c9-4892-ac4b-90a7ab359fd2\", \"false\").toLowerCase() === \"true\") {\r\n const json: { context: { DisableReferenceChannel: string; MicSpec: string } } = JSON.parse(SpeechServiceConfigJson) as { context: { DisableReferenceChannel: string; MicSpec: string } };\r\n json.context.DisableReferenceChannel = \"True\";\r\n json.context.MicSpec = \"1_0_0\";\r\n SpeechServiceConfigJson = JSON.stringify(json);\r\n }\r\n\r\n if (SpeechServiceConfigJson) {\r\n return connection.send(new SpeechConnectionMessage(\r\n MessageType.Text,\r\n \"speech.config\",\r\n requestSession.requestId,\r\n \"application/json\",\r\n SpeechServiceConfigJson));\r\n }\r\n\r\n return;\r\n }\r\n\r\n protected async fetchConnection(): Promise<IConnection> {\r\n if (this.privConnectionConfigurationPromise !== undefined) {\r\n return this.privConnectionConfigurationPromise.then((connection: IConnection): Promise<IConnection> => {\r\n if (connection.state() === ConnectionState.Disconnected) {\r\n this.privConnectionId = null;\r\n this.privConnectionConfigurationPromise = undefined;\r\n this.privServiceHasSentMessage = false;\r\n return this.fetchConnection();\r\n }\r\n return this.privConnectionConfigurationPromise;\r\n }, (): Promise<IConnection> => {\r\n this.privConnectionId = null;\r\n this.privConnectionConfigurationPromise = undefined;\r\n this.privServiceHasSentMessage = false;\r\n return this.fetchConnection();\r\n });\r\n }\r\n\r\n this.privConnectionConfigurationPromise = this.configureConnection();\r\n return await this.privConnectionConfigurationPromise;\r\n }\r\n\r\n protected async sendAudio(audioStreamNode: IAudioStreamNode): Promise<void> {\r\n const audioFormat: AudioStreamFormatImpl = await this.audioSource.format;\r\n this.privAverageBytesPerMs = audioFormat.avgBytesPerSec / 1000;\r\n // The time we last sent data to the service.\r\n let nextSendTime: number = Date.now();\r\n\r\n // Max amount to send before we start to throttle\r\n const fastLaneSizeMs: string = this.privRecognizerConfig.parameters.getProperty(\"SPEECH-TransmitLengthBeforThrottleMs\", \"5000\");\r\n const maxSendUnthrottledBytes: number = audioFormat.avgBytesPerSec / 1000 * parseInt(fastLaneSizeMs, 10);\r\n const startRecogNumber: number = this.privRequestSession.recogNumber;\r\n\r\n const readAndUploadCycle = async (): Promise<void> => {\r\n // If speech is done, stop sending audio.\r\n if (!this.privIsDisposed &&\r\n !this.privRequestSession.isSpeechEnded &&\r\n this.privRequestSession.isRecognizing &&\r\n this.privRequestSession.recogNumber === startRecogNumber) {\r\n\r\n const connection: IConnection = await this.fetchConnection();\r\n const audioStreamChunk: IStreamChunk<ArrayBuffer> = await audioStreamNode.read();\r\n // we have a new audio chunk to upload.\r\n if (this.privRequestSession.isSpeechEnded) {\r\n // If service already recognized audio end then don't send any more audio\r\n return;\r\n }\r\n\r\n let payload: ArrayBuffer;\r\n let sendDelay: number;\r\n\r\n if (!audioStreamChunk || audioStreamChunk.isEnd) {\r\n payload = null;\r\n sendDelay = 0;\r\n } else {\r\n payload = audioStreamChunk.buffer;\r\n\r\n this.privRequestSession.onAudioSent(payload.byteLength);\r\n\r\n if (maxSendUnthrottledBytes >= this.privRequestSession.bytesSent) {\r\n sendDelay = 0;\r\n } else {\r\n sendDelay = Math.max(0, nextSendTime - Date.now());\r\n }\r\n }\r\n\r\n if (0 !== sendDelay) {\r\n await this.delay(sendDelay);\r\n }\r\n\r\n if (payload !== null) {\r\n nextSendTime = Date.now() + (payload.byteLength * 1000 / (audioFormat.avgBytesPerSec * 2));\r\n }\r\n\r\n // Are we still alive?\r\n if (!this.privIsDisposed &&\r\n !this.privRequestSession.isSpeechEnded &&\r\n this.privRequestSession.isRecognizing &&\r\n this.privRequestSession.recogNumber === startRecogNumber) {\r\n connection.send(\r\n new SpeechConnectionMessage(MessageType.Binary, \"audio\", this.privRequestSession.requestId, null, payload)\r\n ).catch((): void => {\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n this.privRequestSession.onServiceTurnEndResponse(this.privRecognizerConfig.isContinuousRecognition).catch((): void => { });\r\n });\r\n\r\n if (!audioStreamChunk?.isEnd) {\r\n // this.writeBufferToConsole(payload);\r\n // Regardless of success or failure, schedule the next upload.\r\n // If the underlying connection was broken, the next cycle will\r\n // get a new connection and re-transmit missing audio automatically.\r\n return readAndUploadCycle();\r\n } else {\r\n // the audio stream has been closed, no need to schedule next\r\n // read-upload cycle.\r\n if (!this.privIsLiveAudio) {\r\n this.privRequestSession.onSpeechEnded();\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n return readAndUploadCycle();\r\n }\r\n\r\n private async retryableConnect(): Promise<IConnection> {\r\n let isUnAuthorized: boolean = false;\r\n\r\n this.privAuthFetchEventId = createNoDashGuid();\r\n const sessionId: string = this.privRequestSession.sessionId;\r\n this.privConnectionId = (sessionId !== undefined) ? sessionId : createNoDashGuid();\r\n\r\n this.privRequestSession.onPreConnectionStart(this.privAuthFetchEventId, this.privConnectionId);\r\n let lastStatusCode: number = 0;\r\n let lastReason: string = \"\";\r\n\r\n while (this.privRequestSession.numConnectionAttempts <= this.privRecognizerConfig.maxRetryCount) {\r\n\r\n // Get the auth information for the connection. This is a bit of overkill for the current API surface, but leaving the plumbing in place to be able to raise a developer-customer\r\n // facing event when a connection fails to let them try and provide new auth information.\r\n const authPromise = isUnAuthorized ? this.privAuthentication.fetchOnExpiry(this.privAuthFetchEventId) : this.privAuthentication.fetch(this.privAuthFetchEventId);\r\n const auth: AuthInfo = await authPromise;\r\n\r\n await this.privRequestSession.onAuthCompleted(false);\r\n\r\n // Create the connection\r\n const connection: IConnection = this.privConnectionFactory.create(this.privRecognizerConfig, auth, this.privConnectionId);\r\n // Attach the telemetry handlers.\r\n this.privRequestSession.listenForServiceTelemetry(connection.events);\r\n\r\n // Attach to the underlying event. No need to hold onto the detach pointers as in the event the connection goes away,\r\n // it'll stop sending events.\r\n connection.events.attach((event: ConnectionEvent): void => {\r\n this.connectionEvents.onEvent(event);\r\n });\r\n\r\n const response: ConnectionOpenResponse = await connection.open();\r\n // 200 == everything is fine.\r\n if (response.statusCode === 200) {\r\n await this.privRequestSession.onConnectionEstablishCompleted(response.statusCode);\r\n return Promise.resolve(connection);\r\n } else if (response.statusCode === 1006) {\r\n isUnAuthorized = true;\r\n }\r\n\r\n lastStatusCode = response.statusCode;\r\n lastReason = response.reason;\r\n\r\n this.privRequestSession.onRetryConnection();\r\n }\r\n\r\n await this.privRequestSession.onConnectionEstablishCompleted(lastStatusCode, lastReason);\r\n return Promise.reject(`Unable to contact server. StatusCode: ${lastStatusCode}, ${this.privRecognizerConfig.parameters.getProperty(PropertyId.SpeechServiceConnection_Endpoint)} Reason: ${lastReason}`);\r\n }\r\n\r\n private delay(delayMs: number): Promise<void> {\r\n return new Promise((resolve: () => void): number => this.privSetTimeout(resolve, delayMs));\r\n }\r\n\r\n private writeBufferToConsole(buffer: ArrayBuffer): void {\r\n let out: string = \"Buffer Size: \";\r\n if (null === buffer) {\r\n out += \"null\";\r\n } else {\r\n const readView: Uint8Array = new Uint8Array(buffer);\r\n out += `${buffer.byteLength}\\r\\n`;\r\n for (let i: number = 0; i < buffer.byteLength; i++) {\r\n out += readView[i].toString(16).padStart(2, \"0\") + \" \";\r\n if (((i + 1) % 16) === 0) {\r\n // eslint-disable-next-line no-console\r\n console.info(out);\r\n out = \"\";\r\n }\r\n }\r\n }\r\n // eslint-disable-next-line no-console\r\n console.info(out);\r\n }\r\n\r\n private async sendFinalAudio(): Promise<void> {\r\n const connection: IConnection = await this.fetchConnection();\r\n await connection.send(new SpeechConnectionMessage(MessageType.Binary, \"audio\", this.privRequestSession.requestId, null, null));\r\n return;\r\n }\r\n\r\n // Takes an established websocket connection to the endpoint and sends speech configuration information.\r\n private async configureConnection(): Promise<IConnection> {\r\n const connection: IConnection = await this.connectImpl();\r\n if (this.configConnectionOverride !== undefined) {\r\n return this.configConnectionOverride(connection);\r\n }\r\n await this.sendSpeechServiceConfig(connection, this.privRequestSession, this.privRecognizerConfig.SpeechServiceConfig.serialize());\r\n await this.sendPrePayloadJSON(connection, false);\r\n return connection;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport {\r\n ConnectionMessage,\r\n Deferred,\r\n IStringDictionary,\r\n IWebsocketMessageFormatter,\r\n MessageType,\r\n RawWebsocketMessage,\r\n} from \"../common/Exports.js\";\r\n\r\nconst CRLF: string = \"\\r\\n\";\r\n\r\nexport class WebsocketMessageFormatter implements IWebsocketMessageFormatter {\r\n\r\n public toConnectionMessage(message: RawWebsocketMessage): Promise<ConnectionMessage> {\r\n const deferral = new Deferred<ConnectionMessage>();\r\n\r\n try {\r\n if (message.messageType === MessageType.Text) {\r\n const textMessage: string = message.textContent;\r\n let headers: IStringDictionary<string> = {};\r\n let body: string = null;\r\n\r\n if (textMessage) {\r\n const headerBodySplit = textMessage.split(\"\\r\\n\\r\\n\");\r\n if (headerBodySplit && headerBodySplit.length > 0) {\r\n headers = this.parseHeaders(headerBodySplit[0]);\r\n if (headerBodySplit.length > 1) {\r\n body = headerBodySplit[1];\r\n }\r\n }\r\n }\r\n\r\n deferral.resolve(new ConnectionMessage(message.messageType, body, headers, message.id));\r\n } else if (message.messageType === MessageType.Binary) {\r\n const binaryMessage: ArrayBuffer = message.binaryContent;\r\n let headers: IStringDictionary<string> = {};\r\n let body: ArrayBuffer = null;\r\n\r\n if (!binaryMessage || binaryMessage.byteLength < 2) {\r\n throw new Error(\"Invalid binary message format. Header length missing.\");\r\n }\r\n\r\n const dataView = new DataView(binaryMessage);\r\n const headerLength = dataView.getInt16(0);\r\n\r\n if (binaryMessage.byteLength < headerLength + 2) {\r\n throw new Error(\"Invalid binary message format. Header content missing.\");\r\n }\r\n\r\n let headersString = \"\";\r\n for (let i = 0; i < headerLength; i++) {\r\n headersString += String.fromCharCode((dataView).getInt8(i + 2));\r\n }\r\n\r\n headers = this.parseHeaders(headersString);\r\n\r\n if (binaryMessage.byteLength > headerLength + 2) {\r\n body = binaryMessage.slice(2 + headerLength);\r\n }\r\n\r\n deferral.resolve(new ConnectionMessage(message.messageType, body, headers, message.id));\r\n }\r\n } catch (e) {\r\n deferral.reject(`Error formatting the message. Error: ${e as string}`);\r\n }\r\n\r\n return deferral.promise;\r\n }\r\n\r\n public fromConnectionMessage(message: ConnectionMessage): Promise<RawWebsocketMessage> {\r\n const deferral = new Deferred<RawWebsocketMessage>();\r\n\r\n try {\r\n if (message.messageType === MessageType.Text) {\r\n const payload = `${this.makeHeaders(message)}${CRLF}${message.textBody ? message.textBody : \"\"}`;\r\n\r\n deferral.resolve(new RawWebsocketMessage(MessageType.Text, payload, message.id));\r\n\r\n } else if (message.messageType === MessageType.Binary) {\r\n const headersString = this.makeHeaders(message);\r\n const content = message.binaryBody;\r\n\r\n const headerBuffer = this.stringToArrayBuffer(headersString);\r\n const headerInt8Array = new Int8Array(headerBuffer);\r\n const headerLength = headerInt8Array.byteLength;\r\n\r\n const payloadInt8Array = new Int8Array(2 + headerLength + (content ? content.byteLength : 0));\r\n payloadInt8Array[0] = ((headerLength >> 8) & 0xff);\r\n payloadInt8Array[1] = headerLength & 0xff;\r\n payloadInt8Array.set(headerInt8Array, 2);\r\n\r\n if (content) {\r\n const bodyInt8Array = new Int8Array(content);\r\n payloadInt8Array.set(bodyInt8Array, 2 + headerLength);\r\n }\r\n\r\n const payload: ArrayBuffer = payloadInt8Array.buffer;\r\n\r\n deferral.resolve(new RawWebsocketMessage(MessageType.Binary, payload, message.id));\r\n }\r\n } catch (e) {\r\n deferral.reject(`Error formatting the message. ${e as string}`);\r\n }\r\n\r\n return deferral.promise;\r\n }\r\n\r\n private makeHeaders(message: ConnectionMessage): string {\r\n let headersString: string = \"\";\r\n\r\n if (message.headers) {\r\n for (const header in message.headers) {\r\n if (header) {\r\n headersString += `${header}: ${message.headers[header]}${CRLF}`;\r\n }\r\n }\r\n }\r\n\r\n return headersString;\r\n }\r\n\r\n private parseHeaders(headersString: string): IStringDictionary<string> {\r\n const headers: IStringDictionary<string> = {};\r\n\r\n if (headersString) {\r\n const headerMatches = headersString.match(/[^\\r\\n]+/g);\r\n if (headers) {\r\n for (const header of headerMatches) {\r\n if (header) {\r\n const separatorIndex = header.indexOf(\":\");\r\n const headerName = separatorIndex > 0 ? header.substr(0, separatorIndex).trim().toLowerCase() : header;\r\n const headerValue =\r\n separatorIndex > 0 && header.length > (separatorIndex + 1) ?\r\n header.substr(separatorIndex + 1).trim() :\r\n \"\";\r\n\r\n headers[headerName] = headerValue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n private stringToArrayBuffer(str: string): ArrayBuffer {\r\n const buffer = new ArrayBuffer(str.length);\r\n const view = new DataView(buffer);\r\n for (let i = 0; i < str.length; i++) {\r\n view.setUint8(i, str.charCodeAt(i));\r\n }\r\n return buffer;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport {\r\n ArgumentNullError,\r\n ConnectionClosedEvent,\r\n ConnectionEvent,\r\n ConnectionMessage,\r\n ConnectionState,\r\n createNoDashGuid,\r\n EventSource,\r\n IAudioDestination,\r\n IConnection,\r\n IDisposable,\r\n MessageType,\r\n ServiceEvent,\r\n} from \"../common/Exports.js\";\r\nimport { AudioOutputFormatImpl } from \"../sdk/Audio/AudioOutputFormat.js\";\r\nimport {\r\n CancellationErrorCode,\r\n CancellationReason,\r\n PropertyCollection,\r\n PropertyId,\r\n ResultReason,\r\n SpeechSynthesisBookmarkEventArgs,\r\n SpeechSynthesisResult,\r\n SpeechSynthesisVisemeEventArgs,\r\n SpeechSynthesisWordBoundaryEventArgs,\r\n Synthesizer,\r\n} from \"../sdk/Exports.js\";\r\nimport {\r\n AgentConfig,\r\n CancellationErrorCodePropertyName,\r\n ISynthesisConnectionFactory,\r\n ISynthesisMetadata,\r\n MetadataType,\r\n SynthesisAudioMetadata,\r\n SynthesisContext,\r\n SynthesisTurn,\r\n SynthesizerConfig\r\n} from \"./Exports.js\";\r\nimport { AuthInfo, IAuthentication } from \"./IAuthentication.js\";\r\nimport { SpeechConnectionMessage } from \"./SpeechConnectionMessage.Internal.js\";\r\n\r\nexport abstract class SynthesisAdapterBase implements IDisposable {\r\n protected privSynthesisTurn: SynthesisTurn;\r\n protected privConnectionId: string;\r\n protected privSynthesizerConfig: SynthesizerConfig;\r\n protected privSynthesizer: Synthesizer;\r\n protected privSuccessCallback: (e: SpeechSynthesisResult) => void;\r\n protected privErrorCallback: (e: string) => void;\r\n\r\n public get synthesisContext(): SynthesisContext {\r\n return this.privSynthesisContext;\r\n }\r\n\r\n public get agentConfig(): AgentConfig {\r\n return this.privAgentConfig;\r\n }\r\n\r\n public get connectionEvents(): EventSource<ConnectionEvent> {\r\n return this.privConnectionEvents;\r\n }\r\n\r\n public get serviceEvents(): EventSource<ServiceEvent> {\r\n return this.privServiceEvents;\r\n }\r\n\r\n protected speakOverride: (ssml: string, requestId: string, sc: (e: SpeechSynthesisResult) => void, ec: (e: string) => void) => void = undefined;\r\n\r\n // Called when telemetry data is sent to the service.\r\n // Used for testing Telemetry capture.\r\n public static telemetryData: (json: string) => void;\r\n public static telemetryDataEnabled: boolean = true;\r\n\r\n public set activityTemplate(messagePayload: string) {\r\n this.privActivityTemplate = messagePayload;\r\n }\r\n public get activityTemplate(): string {\r\n return this.privActivityTemplate;\r\n }\r\n\r\n protected receiveMessageOverride: () => void = undefined;\r\n\r\n protected connectImplOverride: (isUnAuthorized: boolean) => void = undefined;\r\n\r\n protected configConnectionOverride: (connection: IConnection) => Promise<IConnection> = undefined;\r\n\r\n public set audioOutputFormat(format: AudioOutputFormatImpl) {\r\n this.privAudioOutputFormat = format;\r\n this.privSynthesisTurn.audioOutputFormat = format;\r\n if (this.privSessionAudioDestination !== undefined) {\r\n this.privSessionAudioDestination.format = format;\r\n }\r\n if (this.synthesisContext !== undefined) {\r\n this.synthesisContext.audioOutputFormat = format;\r\n }\r\n }\r\n private privAuthentication: IAuthentication;\r\n private privConnectionFactory: ISynthesisConnectionFactory;\r\n\r\n // A promise for a configured connection.\r\n // Do not consume directly, call fetchConnection instead.\r\n private privConnectionConfigurationPromise: Promise<IConnection> = undefined;\r\n\r\n // A promise for a connection, but one that has not had the speech context sent yet.\r\n // Do not consume directly, call fetchConnection instead.\r\n private privConnectionPromise: Promise<IConnection>;\r\n private privAuthFetchEventId: string;\r\n private privIsDisposed: boolean;\r\n private privConnectionEvents: EventSource<ConnectionEvent>;\r\n private privServiceEvents: EventSource<ServiceEvent>;\r\n protected privSynthesisContext: SynthesisContext;\r\n private privAgentConfig: AgentConfig;\r\n private privActivityTemplate: string;\r\n protected privAudioOutputFormat: AudioOutputFormatImpl;\r\n private privSessionAudioDestination: IAudioDestination;\r\n\r\n public constructor(\r\n authentication: IAuthentication,\r\n connectionFactory: ISynthesisConnectionFactory,\r\n synthesizerConfig: SynthesizerConfig,\r\n audioDestination: IAudioDestination) {\r\n\r\n if (!authentication) {\r\n throw new ArgumentNullError(\"authentication\");\r\n }\r\n\r\n if (!connectionFactory) {\r\n throw new ArgumentNullError(\"connectionFactory\");\r\n }\r\n\r\n if (!synthesizerConfig) {\r\n throw new ArgumentNullError(\"synthesizerConfig\");\r\n }\r\n\r\n this.privAuthentication = authentication;\r\n this.privConnectionFactory = connectionFactory;\r\n this.privSynthesizerConfig = synthesizerConfig;\r\n this.privIsDisposed = false;\r\n this.privSessionAudioDestination = audioDestination;\r\n this.privSynthesisTurn = new SynthesisTurn();\r\n this.privConnectionEvents = new EventSource<ConnectionEvent>();\r\n this.privServiceEvents = new EventSource<ServiceEvent>();\r\n this.privSynthesisContext = new SynthesisContext();\r\n this.privAgentConfig = new AgentConfig();\r\n\r\n this.connectionEvents.attach((connectionEvent: ConnectionEvent): void => {\r\n if (connectionEvent.name === \"ConnectionClosedEvent\") {\r\n const connectionClosedEvent = connectionEvent as ConnectionClosedEvent;\r\n if (connectionClosedEvent.statusCode !== 1000) {\r\n this.cancelSynthesisLocal(CancellationReason.Error,\r\n connectionClosedEvent.statusCode === 1007 ? CancellationErrorCode.BadRequestParameters : CancellationErrorCode.ConnectionFailure,\r\n `${connectionClosedEvent.reason} websocket error code: ${connectionClosedEvent.statusCode}`);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public isDisposed(): boolean {\r\n return this.privIsDisposed;\r\n }\r\n\r\n public async dispose(reason?: string): Promise<void> {\r\n this.privIsDisposed = true;\r\n if (this.privSessionAudioDestination !== undefined) {\r\n this.privSessionAudioDestination.close();\r\n }\r\n if (this.privConnectionConfigurationPromise !== undefined) {\r\n const connection: IConnection = await this.privConnectionConfigurationPromise;\r\n await connection.dispose(reason);\r\n }\r\n }\r\n\r\n public async connect(): Promise<void> {\r\n await this.connectImpl();\r\n }\r\n\r\n public async sendNetworkMessage(path: string, payload: string | ArrayBuffer): Promise<void> {\r\n const type: MessageType = typeof payload === \"string\" ? MessageType.Text : MessageType.Binary;\r\n const contentType: string = typeof payload === \"string\" ? \"application/json\" : \"\";\r\n\r\n const connection: IConnection = await this.fetchConnection();\r\n return connection.send(new SpeechConnectionMessage(type, path, this.privSynthesisTurn.requestId, contentType, payload));\r\n }\r\n\r\n public async Speak(\r\n text: string,\r\n isSSML: boolean,\r\n requestId: string,\r\n successCallback: (e: SpeechSynthesisResult) => void,\r\n errorCallBack: (e: string) => void,\r\n audioDestination: IAudioDestination,\r\n ): Promise<void> {\r\n\r\n let ssml: string;\r\n\r\n if (isSSML) {\r\n ssml = text;\r\n } else {\r\n ssml = this.privSynthesizer.buildSsml(text);\r\n }\r\n\r\n if (this.speakOverride !== undefined) {\r\n return this.speakOverride(ssml, requestId, successCallback, errorCallBack);\r\n }\r\n\r\n this.privSuccessCallback = successCallback;\r\n this.privErrorCallback = errorCallBack;\r\n\r\n this.privSynthesisTurn.startNewSynthesis(requestId, text, isSSML, audioDestination);\r\n\r\n try {\r\n await this.connectImpl();\r\n const connection: IConnection = await this.fetchConnection();\r\n await this.sendSynthesisContext(connection);\r\n await this.sendSsmlMessage(connection, ssml, requestId);\r\n this.onSynthesisStarted(requestId);\r\n\r\n void this.receiveMessage();\r\n } catch (e) {\r\n this.cancelSynthesisLocal(CancellationReason.Error, CancellationErrorCode.ConnectionFailure, e as string);\r\n return Promise.reject(e);\r\n }\r\n }\r\n\r\n public async stopSpeaking(): Promise<void> {\r\n await this.connectImpl();\r\n const connection: IConnection = await this.fetchConnection();\r\n\r\n return connection.send(new SpeechConnectionMessage(\r\n MessageType.Text,\r\n \"synthesis.control\",\r\n this.privSynthesisTurn.requestId,\r\n \"application/json\",\r\n JSON.stringify({\r\n action: \"stop\"\r\n })\r\n ));\r\n }\r\n\r\n // Cancels synthesis.\r\n protected cancelSynthesis(\r\n requestId: string,\r\n _cancellationReason: CancellationReason,\r\n errorCode: CancellationErrorCode,\r\n error: string): void {\r\n const properties: PropertyCollection = new PropertyCollection();\r\n properties.setProperty(CancellationErrorCodePropertyName, CancellationErrorCode[errorCode]);\r\n const result: SpeechSynthesisResult = new SpeechSynthesisResult(\r\n requestId,\r\n ResultReason.Canceled,\r\n undefined,\r\n error,\r\n properties\r\n );\r\n\r\n this.onSynthesisCancelled(result);\r\n\r\n if (!!this.privSuccessCallback) {\r\n try {\r\n this.privSuccessCallback(result);\r\n /* eslint-disable no-empty */\r\n } catch { }\r\n }\r\n }\r\n\r\n // Cancels synthesis.\r\n protected cancelSynthesisLocal(\r\n cancellationReason: CancellationReason,\r\n errorCode: CancellationErrorCode,\r\n error: string): void {\r\n\r\n if (!!this.privSynthesisTurn.isSynthesizing) {\r\n this.privSynthesisTurn.onStopSynthesizing();\r\n\r\n this.cancelSynthesis(\r\n this.privSynthesisTurn.requestId,\r\n cancellationReason,\r\n errorCode,\r\n error);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected processTypeSpecificMessages(_connectionMessage: SpeechConnectionMessage): boolean {\r\n return true;\r\n }\r\n\r\n protected async receiveMessage(): Promise<void> {\r\n try {\r\n const connection: IConnection = await this.fetchConnection();\r\n const message: ConnectionMessage = await connection.read();\r\n\r\n if (this.receiveMessageOverride !== undefined) {\r\n return this.receiveMessageOverride();\r\n }\r\n if (this.privIsDisposed) {\r\n // We're done.\r\n return;\r\n }\r\n\r\n // indicates we are draining the queue and it came with no message;\r\n if (!message) {\r\n if (!this.privSynthesisTurn.isSynthesizing) {\r\n return;\r\n } else {\r\n return this.receiveMessage();\r\n }\r\n }\r\n\r\n\r\n const connectionMessage = SpeechConnectionMessage.fromConnectionMessage(message);\r\n\r\n if (connectionMessage.requestId.toLowerCase() === this.privSynthesisTurn.requestId.toLowerCase()) {\r\n switch (connectionMessage.path.toLowerCase()) {\r\n case \"turn.start\":\r\n this.privSynthesisTurn.onServiceTurnStartResponse(connectionMessage.textBody);\r\n break;\r\n case \"response\":\r\n this.privSynthesisTurn.onServiceResponseMessage(connectionMessage.textBody);\r\n break;\r\n case \"audio\":\r\n if (this.privSynthesisTurn.streamId.toLowerCase() === connectionMessage.streamId.toLowerCase()\r\n && !!connectionMessage.binaryBody) {\r\n this.privSynthesisTurn.onAudioChunkReceived(connectionMessage.binaryBody);\r\n this.onSynthesizing(connectionMessage.binaryBody);\r\n if (this.privSessionAudioDestination !== undefined) {\r\n this.privSessionAudioDestination.write(connectionMessage.binaryBody);\r\n }\r\n }\r\n break;\r\n case \"audio.metadata\":\r\n const metadataList = SynthesisAudioMetadata.fromJSON(connectionMessage.textBody).Metadata;\r\n for (const metadata of metadataList) {\r\n switch (metadata.Type) {\r\n case MetadataType.WordBoundary:\r\n case MetadataType.SentenceBoundary:\r\n this.privSynthesisTurn.onTextBoundaryEvent(metadata);\r\n const wordBoundaryEventArgs: SpeechSynthesisWordBoundaryEventArgs = new SpeechSynthesisWordBoundaryEventArgs(\r\n metadata.Data.Offset,\r\n metadata.Data.Duration,\r\n metadata.Data.text.Text,\r\n metadata.Data.text.Length,\r\n metadata.Type === MetadataType.WordBoundary\r\n ? this.privSynthesisTurn.currentTextOffset : this.privSynthesisTurn.currentSentenceOffset,\r\n metadata.Data.text.BoundaryType);\r\n this.onWordBoundary(wordBoundaryEventArgs);\r\n break;\r\n case MetadataType.Bookmark:\r\n const bookmarkEventArgs: SpeechSynthesisBookmarkEventArgs = new SpeechSynthesisBookmarkEventArgs(\r\n metadata.Data.Offset,\r\n metadata.Data.Bookmark);\r\n this.onBookmarkReached(bookmarkEventArgs);\r\n break;\r\n case MetadataType.Viseme:\r\n this.privSynthesisTurn.onVisemeMetadataReceived(metadata);\r\n if (metadata.Data.IsLastAnimation) {\r\n const visemeEventArgs: SpeechSynthesisVisemeEventArgs = new SpeechSynthesisVisemeEventArgs(\r\n metadata.Data.Offset,\r\n metadata.Data.VisemeId,\r\n this.privSynthesisTurn.getAndClearVisemeAnimation());\r\n this.onVisemeReceived(visemeEventArgs);\r\n }\r\n break;\r\n case MetadataType.AvatarSignal:\r\n this.onAvatarEvent(metadata);\r\n break;\r\n case MetadataType.SessionEnd:\r\n this.privSynthesisTurn.onSessionEnd(metadata);\r\n break;\r\n }\r\n }\r\n break;\r\n case \"turn.end\":\r\n this.privSynthesisTurn.onServiceTurnEndResponse();\r\n let result: SpeechSynthesisResult;\r\n try {\r\n result = await this.privSynthesisTurn.constructSynthesisResult();\r\n if (!!this.privSuccessCallback) {\r\n this.privSuccessCallback(result);\r\n }\r\n } catch (error) {\r\n if (!!this.privErrorCallback) {\r\n this.privErrorCallback(error as string);\r\n }\r\n }\r\n this.onSynthesisCompleted(result);\r\n break;\r\n\r\n default:\r\n if (!this.processTypeSpecificMessages(connectionMessage)) {\r\n // here are some messages that the derived class has not processed, dispatch them to connect class\r\n if (!!this.privServiceEvents) {\r\n this.serviceEvents.onEvent(new ServiceEvent(connectionMessage.path.toLowerCase(), connectionMessage.textBody));\r\n }\r\n }\r\n\r\n }\r\n }\r\n\r\n return this.receiveMessage();\r\n\r\n } catch (e) {\r\n // TODO: What goes here?\r\n }\r\n }\r\n\r\n protected sendSynthesisContext(connection: IConnection): Promise<void> {\r\n this.setSynthesisContextSynthesisSection();\r\n const synthesisContextJson = this.synthesisContext.toJSON();\r\n\r\n if (synthesisContextJson) {\r\n return connection.send(new SpeechConnectionMessage(\r\n MessageType.Text,\r\n \"synthesis.context\",\r\n this.privSynthesisTurn.requestId,\r\n \"application/json\",\r\n synthesisContextJson));\r\n }\r\n return;\r\n }\r\n\r\n protected abstract setSynthesisContextSynthesisSection(): void;\r\n\r\n protected setSpeechConfigSynthesisSection(): void {\r\n return;\r\n }\r\n\r\n protected connectImpl(isUnAuthorized: boolean = false): Promise<IConnection> {\r\n if (this.privConnectionPromise != null) {\r\n return this.privConnectionPromise.then((connection: IConnection): Promise<IConnection> => {\r\n if (connection.state() === ConnectionState.Disconnected) {\r\n this.privConnectionId = null;\r\n this.privConnectionPromise = null;\r\n return this.connectImpl();\r\n }\r\n return this.privConnectionPromise;\r\n }, (): Promise<IConnection> => {\r\n this.privConnectionId = null;\r\n this.privConnectionPromise = null;\r\n return this.connectImpl();\r\n });\r\n }\r\n this.privAuthFetchEventId = createNoDashGuid();\r\n this.privConnectionId = createNoDashGuid();\r\n\r\n this.privSynthesisTurn.onPreConnectionStart(this.privAuthFetchEventId);\r\n\r\n const authPromise = isUnAuthorized ? this.privAuthentication.fetchOnExpiry(this.privAuthFetchEventId) : this.privAuthentication.fetch(this.privAuthFetchEventId);\r\n\r\n this.privConnectionPromise = authPromise.then(async (result: AuthInfo): Promise<IConnection> => {\r\n this.privSynthesisTurn.onAuthCompleted(false);\r\n\r\n const connection: IConnection = this.privConnectionFactory.create(this.privSynthesizerConfig, result, this.privConnectionId);\r\n\r\n // Attach to the underlying event. No need to hold onto the detach pointers as in the event the connection goes away,\r\n // it'll stop sending events.\r\n connection.events.attach((event: ConnectionEvent): void => {\r\n this.connectionEvents.onEvent(event);\r\n });\r\n const response = await connection.open();\r\n if (response.statusCode === 200) {\r\n this.privSynthesisTurn.onConnectionEstablishCompleted(response.statusCode);\r\n return Promise.resolve(connection);\r\n } else if (response.statusCode === 403 && !isUnAuthorized) {\r\n return this.connectImpl(true);\r\n } else {\r\n this.privSynthesisTurn.onConnectionEstablishCompleted(response.statusCode);\r\n return Promise.reject(\r\n `Unable to contact server. StatusCode: ${response.statusCode},\r\n ${this.privSynthesizerConfig.parameters.getProperty(PropertyId.SpeechServiceConnection_Url)} Reason: ${response.reason}`);\r\n }\r\n }, (error: string): Promise<IConnection> => {\r\n this.privSynthesisTurn.onAuthCompleted(true);\r\n throw new Error(error);\r\n });\r\n\r\n // Attach an empty handler to allow the promise to run in the background while\r\n // other startup events happen. It'll eventually be awaited on.\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n this.privConnectionPromise.catch((): void => { });\r\n\r\n return this.privConnectionPromise;\r\n }\r\n protected sendSpeechServiceConfig(connection: IConnection, SpeechServiceConfigJson: string): Promise<void> {\r\n if (SpeechServiceConfigJson) {\r\n return connection.send(new SpeechConnectionMessage(\r\n MessageType.Text,\r\n \"speech.config\",\r\n this.privSynthesisTurn.requestId,\r\n \"application/json\",\r\n SpeechServiceConfigJson));\r\n }\r\n }\r\n\r\n protected sendSsmlMessage(connection: IConnection, ssml: string, requestId: string): Promise<void> {\r\n return connection.send(new SpeechConnectionMessage(\r\n MessageType.Text,\r\n \"ssml\",\r\n requestId,\r\n \"application/ssml+xml\",\r\n ssml));\r\n }\r\n\r\n private async fetchConnection(): Promise<IConnection> {\r\n if (this.privConnectionConfigurationPromise !== undefined) {\r\n return this.privConnectionConfigurationPromise.then((connection: IConnection): Promise<IConnection> => {\r\n if (connection.state() === ConnectionState.Disconnected) {\r\n this.privConnectionId = null;\r\n this.privConnectionConfigurationPromise = undefined;\r\n return this.fetchConnection();\r\n }\r\n return this.privConnectionConfigurationPromise;\r\n }, (): Promise<IConnection> => {\r\n this.privConnectionId = null;\r\n this.privConnectionConfigurationPromise = undefined;\r\n return this.fetchConnection();\r\n });\r\n }\r\n this.privConnectionConfigurationPromise = this.configureConnection();\r\n return await this.privConnectionConfigurationPromise;\r\n }\r\n\r\n // Takes an established websocket connection to the endpoint and sends speech configuration information.\r\n private async configureConnection(): Promise<IConnection> {\r\n const connection: IConnection = await this.connectImpl();\r\n if (this.configConnectionOverride !== undefined) {\r\n return this.configConnectionOverride(connection);\r\n }\r\n this.setSpeechConfigSynthesisSection();\r\n await this.sendSpeechServiceConfig(connection, this.privSynthesizerConfig.SpeechServiceConfig.serialize());\r\n return connection;\r\n }\r\n\r\n protected onAvatarEvent(_metadata: ISynthesisMetadata): void {\r\n return;\r\n }\r\n\r\n protected onSynthesisStarted(_requestId: string): void {\r\n return;\r\n }\r\n\r\n protected onSynthesizing(_audio: ArrayBuffer): void {\r\n return;\r\n }\r\n\r\n protected onSynthesisCancelled(_result: SpeechSynthesisResult): void {\r\n return;\r\n }\r\n\r\n protected onSynthesisCompleted(_result: SpeechSynthesisResult): void {\r\n return;\r\n }\r\n\r\n protected onWordBoundary(_wordBoundaryEventArgs: SpeechSynthesisWordBoundaryEventArgs): void {\r\n return;\r\n }\r\n\r\n protected onVisemeReceived(_visemeEventArgs: SpeechSynthesisVisemeEventArgs): void {\r\n return;\r\n }\r\n\r\n protected onBookmarkReached(_bookmarkEventArgs: SpeechSynthesisBookmarkEventArgs): void {\r\n return;\r\n }\r\n\r\n}\r\n","// src/utils.ts\nfunction clone(something) {\n return doClone(something);\n}\nfunction doClone(something) {\n if (Array.isArray(something)) {\n return cloneArray(something);\n }\n if (something instanceof RegExp) {\n return something;\n }\n if (typeof something === \"object\") {\n return cloneObj(something);\n }\n return something;\n}\nfunction cloneArray(arr) {\n let r = [];\n for (let i = 0, len = arr.length; i < len; i++) {\n r[i] = doClone(arr[i]);\n }\n return r;\n}\nfunction cloneObj(obj) {\n let r = {};\n for (let key in obj) {\n r[key] = doClone(obj[key]);\n }\n return r;\n}\nfunction mergeObjects(target, ...sources) {\n sources.forEach((source) => {\n for (let key in source) {\n target[key] = source[key];\n }\n });\n return target;\n}\nfunction basename(path) {\n const idx = ~path.lastIndexOf(\"/\") || ~path.lastIndexOf(\"\\\\\");\n if (idx === 0) {\n return path;\n } else if (~idx === path.length - 1) {\n return basename(path.substring(0, path.length - 1));\n } else {\n return path.substr(~idx + 1);\n }\n}\nvar CAPTURING_REGEX_SOURCE = /\\$(\\d+)|\\${(\\d+):\\/(downcase|upcase)}/g;\nvar RegexSource = class {\n static hasCaptures(regexSource) {\n if (regexSource === null) {\n return false;\n }\n CAPTURING_REGEX_SOURCE.lastIndex = 0;\n return CAPTURING_REGEX_SOURCE.test(regexSource);\n }\n static replaceCaptures(regexSource, captureSource, captureIndices) {\n return regexSource.replace(CAPTURING_REGEX_SOURCE, (match, index, commandIndex, command) => {\n let capture = captureIndices[parseInt(index || commandIndex, 10)];\n if (capture) {\n let result = captureSource.substring(capture.start, capture.end);\n while (result[0] === \".\") {\n result = result.substring(1);\n }\n switch (command) {\n case \"downcase\":\n return result.toLowerCase();\n case \"upcase\":\n return result.toUpperCase();\n default:\n return result;\n }\n } else {\n return match;\n }\n });\n }\n};\nfunction strcmp(a, b) {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n}\nfunction strArrCmp(a, b) {\n if (a === null && b === null) {\n return 0;\n }\n if (!a) {\n return -1;\n }\n if (!b) {\n return 1;\n }\n let len1 = a.length;\n let len2 = b.length;\n if (len1 === len2) {\n for (let i = 0; i < len1; i++) {\n let res = strcmp(a[i], b[i]);\n if (res !== 0) {\n return res;\n }\n }\n return 0;\n }\n return len1 - len2;\n}\nfunction isValidHexColor(hex) {\n if (/^#[0-9a-f]{6}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{8}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{3}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{4}$/i.test(hex)) {\n return true;\n }\n return false;\n}\nfunction escapeRegExpCharacters(value) {\n return value.replace(/[\\-\\\\\\{\\}\\*\\+\\?\\|\\^\\$\\.\\,\\[\\]\\(\\)\\#\\s]/g, \"\\\\$&\");\n}\nvar CachedFn = class {\n constructor(fn) {\n this.fn = fn;\n }\n cache = /* @__PURE__ */ new Map();\n get(key) {\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n const value = this.fn(key);\n this.cache.set(key, value);\n return value;\n }\n};\n\n// src/theme.ts\nvar Theme = class {\n constructor(_colorMap, _defaults, _root) {\n this._colorMap = _colorMap;\n this._defaults = _defaults;\n this._root = _root;\n }\n static createFromRawTheme(source, colorMap) {\n return this.createFromParsedTheme(parseTheme(source), colorMap);\n }\n static createFromParsedTheme(source, colorMap) {\n return resolveParsedThemeRules(source, colorMap);\n }\n _cachedMatchRoot = new CachedFn(\n (scopeName) => this._root.match(scopeName)\n );\n getColorMap() {\n return this._colorMap.getColorMap();\n }\n getDefaults() {\n return this._defaults;\n }\n match(scopePath) {\n if (scopePath === null) {\n return this._defaults;\n }\n const scopeName = scopePath.scopeName;\n const matchingTrieElements = this._cachedMatchRoot.get(scopeName);\n const effectiveRule = matchingTrieElements.find(\n (v) => _scopePathMatchesParentScopes(scopePath.parent, v.parentScopes)\n );\n if (!effectiveRule) {\n return null;\n }\n return new StyleAttributes(\n effectiveRule.fontStyle,\n effectiveRule.foreground,\n effectiveRule.background\n );\n }\n};\nvar ScopeStack = class _ScopeStack {\n constructor(parent, scopeName) {\n this.parent = parent;\n this.scopeName = scopeName;\n }\n static push(path, scopeNames) {\n for (const name of scopeNames) {\n path = new _ScopeStack(path, name);\n }\n return path;\n }\n static from(...segments) {\n let result = null;\n for (let i = 0; i < segments.length; i++) {\n result = new _ScopeStack(result, segments[i]);\n }\n return result;\n }\n push(scopeName) {\n return new _ScopeStack(this, scopeName);\n }\n getSegments() {\n let item = this;\n const result = [];\n while (item) {\n result.push(item.scopeName);\n item = item.parent;\n }\n result.reverse();\n return result;\n }\n toString() {\n return this.getSegments().join(\" \");\n }\n extends(other) {\n if (this === other) {\n return true;\n }\n if (this.parent === null) {\n return false;\n }\n return this.parent.extends(other);\n }\n getExtensionIfDefined(base) {\n const result = [];\n let item = this;\n while (item && item !== base) {\n result.push(item.scopeName);\n item = item.parent;\n }\n return item === base ? result.reverse() : void 0;\n }\n};\nfunction _scopePathMatchesParentScopes(scopePath, parentScopes) {\n if (parentScopes.length === 0) {\n return true;\n }\n for (let index = 0; index < parentScopes.length; index++) {\n let scopePattern = parentScopes[index];\n let scopeMustMatch = false;\n if (scopePattern === \">\") {\n if (index === parentScopes.length - 1) {\n return false;\n }\n scopePattern = parentScopes[++index];\n scopeMustMatch = true;\n }\n while (scopePath) {\n if (_matchesScope(scopePath.scopeName, scopePattern)) {\n break;\n }\n if (scopeMustMatch) {\n return false;\n }\n scopePath = scopePath.parent;\n }\n if (!scopePath) {\n return false;\n }\n scopePath = scopePath.parent;\n }\n return true;\n}\nfunction _matchesScope(scopeName, scopePattern) {\n return scopePattern === scopeName || scopeName.startsWith(scopePattern) && scopeName[scopePattern.length] === \".\";\n}\nvar StyleAttributes = class {\n constructor(fontStyle, foregroundId, backgroundId) {\n this.fontStyle = fontStyle;\n this.foregroundId = foregroundId;\n this.backgroundId = backgroundId;\n }\n};\nfunction parseTheme(source) {\n if (!source) {\n return [];\n }\n if (!source.settings || !Array.isArray(source.settings)) {\n return [];\n }\n let settings = source.settings;\n let result = [], resultLen = 0;\n for (let i = 0, len = settings.length; i < len; i++) {\n let entry = settings[i];\n if (!entry.settings) {\n continue;\n }\n let scopes;\n if (typeof entry.scope === \"string\") {\n let _scope = entry.scope;\n _scope = _scope.replace(/^[,]+/, \"\");\n _scope = _scope.replace(/[,]+$/, \"\");\n scopes = _scope.split(\",\");\n } else if (Array.isArray(entry.scope)) {\n scopes = entry.scope;\n } else {\n scopes = [\"\"];\n }\n let fontStyle = -1 /* NotSet */;\n if (typeof entry.settings.fontStyle === \"string\") {\n fontStyle = 0 /* None */;\n let segments = entry.settings.fontStyle.split(\" \");\n for (let j = 0, lenJ = segments.length; j < lenJ; j++) {\n let segment = segments[j];\n switch (segment) {\n case \"italic\":\n fontStyle = fontStyle | 1 /* Italic */;\n break;\n case \"bold\":\n fontStyle = fontStyle | 2 /* Bold */;\n break;\n case \"underline\":\n fontStyle = fontStyle | 4 /* Underline */;\n break;\n case \"strikethrough\":\n fontStyle = fontStyle | 8 /* Strikethrough */;\n break;\n }\n }\n }\n let foreground = null;\n if (typeof entry.settings.foreground === \"string\" && isValidHexColor(entry.settings.foreground)) {\n foreground = entry.settings.foreground;\n }\n let background = null;\n if (typeof entry.settings.background === \"string\" && isValidHexColor(entry.settings.background)) {\n background = entry.settings.background;\n }\n for (let j = 0, lenJ = scopes.length; j < lenJ; j++) {\n let _scope = scopes[j].trim();\n let segments = _scope.split(\" \");\n let scope = segments[segments.length - 1];\n let parentScopes = null;\n if (segments.length > 1) {\n parentScopes = segments.slice(0, segments.length - 1);\n parentScopes.reverse();\n }\n result[resultLen++] = new ParsedThemeRule(\n scope,\n parentScopes,\n i,\n fontStyle,\n foreground,\n background\n );\n }\n }\n return result;\n}\nvar ParsedThemeRule = class {\n constructor(scope, parentScopes, index, fontStyle, foreground, background) {\n this.scope = scope;\n this.parentScopes = parentScopes;\n this.index = index;\n this.fontStyle = fontStyle;\n this.foreground = foreground;\n this.background = background;\n }\n};\nvar FontStyle = /* @__PURE__ */ ((FontStyle2) => {\n FontStyle2[FontStyle2[\"NotSet\"] = -1] = \"NotSet\";\n FontStyle2[FontStyle2[\"None\"] = 0] = \"None\";\n FontStyle2[FontStyle2[\"Italic\"] = 1] = \"Italic\";\n FontStyle2[FontStyle2[\"Bold\"] = 2] = \"Bold\";\n FontStyle2[FontStyle2[\"Underline\"] = 4] = \"Underline\";\n FontStyle2[FontStyle2[\"Strikethrough\"] = 8] = \"Strikethrough\";\n return FontStyle2;\n})(FontStyle || {});\nfunction resolveParsedThemeRules(parsedThemeRules, _colorMap) {\n parsedThemeRules.sort((a, b) => {\n let r = strcmp(a.scope, b.scope);\n if (r !== 0) {\n return r;\n }\n r = strArrCmp(a.parentScopes, b.parentScopes);\n if (r !== 0) {\n return r;\n }\n return a.index - b.index;\n });\n let defaultFontStyle = 0 /* None */;\n let defaultForeground = \"#000000\";\n let defaultBackground = \"#ffffff\";\n while (parsedThemeRules.length >= 1 && parsedThemeRules[0].scope === \"\") {\n let incomingDefaults = parsedThemeRules.shift();\n if (incomingDefaults.fontStyle !== -1 /* NotSet */) {\n defaultFontStyle = incomingDefaults.fontStyle;\n }\n if (incomingDefaults.foreground !== null) {\n defaultForeground = incomingDefaults.foreground;\n }\n if (incomingDefaults.background !== null) {\n defaultBackground = incomingDefaults.background;\n }\n }\n let colorMap = new ColorMap(_colorMap);\n let defaults = new StyleAttributes(defaultFontStyle, colorMap.getId(defaultForeground), colorMap.getId(defaultBackground));\n let root = new ThemeTrieElement(new ThemeTrieElementRule(0, null, -1 /* NotSet */, 0, 0), []);\n for (let i = 0, len = parsedThemeRules.length; i < len; i++) {\n let rule = parsedThemeRules[i];\n root.insert(0, rule.scope, rule.parentScopes, rule.fontStyle, colorMap.getId(rule.foreground), colorMap.getId(rule.background));\n }\n return new Theme(colorMap, defaults, root);\n}\nvar ColorMap = class {\n _isFrozen;\n _lastColorId;\n _id2color;\n _color2id;\n constructor(_colorMap) {\n this._lastColorId = 0;\n this._id2color = [];\n this._color2id = /* @__PURE__ */ Object.create(null);\n if (Array.isArray(_colorMap)) {\n this._isFrozen = true;\n for (let i = 0, len = _colorMap.length; i < len; i++) {\n this._color2id[_colorMap[i]] = i;\n this._id2color[i] = _colorMap[i];\n }\n } else {\n this._isFrozen = false;\n }\n }\n getId(color) {\n if (color === null) {\n return 0;\n }\n color = color.toUpperCase();\n let value = this._color2id[color];\n if (value) {\n return value;\n }\n if (this._isFrozen) {\n throw new Error(`Missing color in color map - ${color}`);\n }\n value = ++this._lastColorId;\n this._color2id[color] = value;\n this._id2color[value] = color;\n return value;\n }\n getColorMap() {\n return this._id2color.slice(0);\n }\n};\nvar emptyParentScopes = Object.freeze([]);\nvar ThemeTrieElementRule = class _ThemeTrieElementRule {\n scopeDepth;\n parentScopes;\n fontStyle;\n foreground;\n background;\n constructor(scopeDepth, parentScopes, fontStyle, foreground, background) {\n this.scopeDepth = scopeDepth;\n this.parentScopes = parentScopes || emptyParentScopes;\n this.fontStyle = fontStyle;\n this.foreground = foreground;\n this.background = background;\n }\n clone() {\n return new _ThemeTrieElementRule(this.scopeDepth, this.parentScopes, this.fontStyle, this.foreground, this.background);\n }\n static cloneArr(arr) {\n let r = [];\n for (let i = 0, len = arr.length; i < len; i++) {\n r[i] = arr[i].clone();\n }\n return r;\n }\n acceptOverwrite(scopeDepth, fontStyle, foreground, background) {\n if (this.scopeDepth > scopeDepth) {\n console.log(\"how did this happen?\");\n } else {\n this.scopeDepth = scopeDepth;\n }\n if (fontStyle !== -1 /* NotSet */) {\n this.fontStyle = fontStyle;\n }\n if (foreground !== 0) {\n this.foreground = foreground;\n }\n if (background !== 0) {\n this.background = background;\n }\n }\n};\nvar ThemeTrieElement = class _ThemeTrieElement {\n constructor(_mainRule, rulesWithParentScopes = [], _children = {}) {\n this._mainRule = _mainRule;\n this._children = _children;\n this._rulesWithParentScopes = rulesWithParentScopes;\n }\n _rulesWithParentScopes;\n static _cmpBySpecificity(a, b) {\n if (a.scopeDepth !== b.scopeDepth) {\n return b.scopeDepth - a.scopeDepth;\n }\n let aParentIndex = 0;\n let bParentIndex = 0;\n while (true) {\n if (a.parentScopes[aParentIndex] === \">\") {\n aParentIndex++;\n }\n if (b.parentScopes[bParentIndex] === \">\") {\n bParentIndex++;\n }\n if (aParentIndex >= a.parentScopes.length || bParentIndex >= b.parentScopes.length) {\n break;\n }\n const parentScopeLengthDiff = b.parentScopes[bParentIndex].length - a.parentScopes[aParentIndex].length;\n if (parentScopeLengthDiff !== 0) {\n return parentScopeLengthDiff;\n }\n aParentIndex++;\n bParentIndex++;\n }\n return b.parentScopes.length - a.parentScopes.length;\n }\n match(scope) {\n if (scope !== \"\") {\n let dotIndex = scope.indexOf(\".\");\n let head;\n let tail;\n if (dotIndex === -1) {\n head = scope;\n tail = \"\";\n } else {\n head = scope.substring(0, dotIndex);\n tail = scope.substring(dotIndex + 1);\n }\n if (this._children.hasOwnProperty(head)) {\n return this._children[head].match(tail);\n }\n }\n const rules = this._rulesWithParentScopes.concat(this._mainRule);\n rules.sort(_ThemeTrieElement._cmpBySpecificity);\n return rules;\n }\n insert(scopeDepth, scope, parentScopes, fontStyle, foreground, background) {\n if (scope === \"\") {\n this._doInsertHere(scopeDepth, parentScopes, fontStyle, foreground, background);\n return;\n }\n let dotIndex = scope.indexOf(\".\");\n let head;\n let tail;\n if (dotIndex === -1) {\n head = scope;\n tail = \"\";\n } else {\n head = scope.substring(0, dotIndex);\n tail = scope.substring(dotIndex + 1);\n }\n let child;\n if (this._children.hasOwnProperty(head)) {\n child = this._children[head];\n } else {\n child = new _ThemeTrieElement(this._mainRule.clone(), ThemeTrieElementRule.cloneArr(this._rulesWithParentScopes));\n this._children[head] = child;\n }\n child.insert(scopeDepth + 1, tail, parentScopes, fontStyle, foreground, background);\n }\n _doInsertHere(scopeDepth, parentScopes, fontStyle, foreground, background) {\n if (parentScopes === null) {\n this._mainRule.acceptOverwrite(scopeDepth, fontStyle, foreground, background);\n return;\n }\n for (let i = 0, len = this._rulesWithParentScopes.length; i < len; i++) {\n let rule = this._rulesWithParentScopes[i];\n if (strArrCmp(rule.parentScopes, parentScopes) === 0) {\n rule.acceptOverwrite(scopeDepth, fontStyle, foreground, background);\n return;\n }\n }\n if (fontStyle === -1 /* NotSet */) {\n fontStyle = this._mainRule.fontStyle;\n }\n if (foreground === 0) {\n foreground = this._mainRule.foreground;\n }\n if (background === 0) {\n background = this._mainRule.background;\n }\n this._rulesWithParentScopes.push(new ThemeTrieElementRule(scopeDepth, parentScopes, fontStyle, foreground, background));\n }\n};\n\n// src/encodedTokenAttributes.ts\nvar EncodedTokenMetadata = class _EncodedTokenMetadata {\n static toBinaryStr(encodedTokenAttributes) {\n return encodedTokenAttributes.toString(2).padStart(32, \"0\");\n }\n static print(encodedTokenAttributes) {\n const languageId = _EncodedTokenMetadata.getLanguageId(encodedTokenAttributes);\n const tokenType = _EncodedTokenMetadata.getTokenType(encodedTokenAttributes);\n const fontStyle = _EncodedTokenMetadata.getFontStyle(encodedTokenAttributes);\n const foreground = _EncodedTokenMetadata.getForeground(encodedTokenAttributes);\n const background = _EncodedTokenMetadata.getBackground(encodedTokenAttributes);\n console.log({\n languageId,\n tokenType,\n fontStyle,\n foreground,\n background\n });\n }\n static getLanguageId(encodedTokenAttributes) {\n return (encodedTokenAttributes & 255 /* LANGUAGEID_MASK */) >>> 0 /* LANGUAGEID_OFFSET */;\n }\n static getTokenType(encodedTokenAttributes) {\n return (encodedTokenAttributes & 768 /* TOKEN_TYPE_MASK */) >>> 8 /* TOKEN_TYPE_OFFSET */;\n }\n static containsBalancedBrackets(encodedTokenAttributes) {\n return (encodedTokenAttributes & 1024 /* BALANCED_BRACKETS_MASK */) !== 0;\n }\n static getFontStyle(encodedTokenAttributes) {\n return (encodedTokenAttributes & 30720 /* FONT_STYLE_MASK */) >>> 11 /* FONT_STYLE_OFFSET */;\n }\n static getForeground(encodedTokenAttributes) {\n return (encodedTokenAttributes & 16744448 /* FOREGROUND_MASK */) >>> 15 /* FOREGROUND_OFFSET */;\n }\n static getBackground(encodedTokenAttributes) {\n return (encodedTokenAttributes & 4278190080 /* BACKGROUND_MASK */) >>> 24 /* BACKGROUND_OFFSET */;\n }\n /**\n * Updates the fields in `metadata`.\n * A value of `0`, `NotSet` or `null` indicates that the corresponding field should be left as is.\n */\n static set(encodedTokenAttributes, languageId, tokenType, containsBalancedBrackets, fontStyle, foreground, background) {\n let _languageId = _EncodedTokenMetadata.getLanguageId(encodedTokenAttributes);\n let _tokenType = _EncodedTokenMetadata.getTokenType(encodedTokenAttributes);\n let _containsBalancedBracketsBit = _EncodedTokenMetadata.containsBalancedBrackets(encodedTokenAttributes) ? 1 : 0;\n let _fontStyle = _EncodedTokenMetadata.getFontStyle(encodedTokenAttributes);\n let _foreground = _EncodedTokenMetadata.getForeground(encodedTokenAttributes);\n let _background = _EncodedTokenMetadata.getBackground(encodedTokenAttributes);\n if (languageId !== 0) {\n _languageId = languageId;\n }\n if (tokenType !== 8 /* NotSet */) {\n _tokenType = fromOptionalTokenType(tokenType);\n }\n if (containsBalancedBrackets !== null) {\n _containsBalancedBracketsBit = containsBalancedBrackets ? 1 : 0;\n }\n if (fontStyle !== -1 /* NotSet */) {\n _fontStyle = fontStyle;\n }\n if (foreground !== 0) {\n _foreground = foreground;\n }\n if (background !== 0) {\n _background = background;\n }\n return (_languageId << 0 /* LANGUAGEID_OFFSET */ | _tokenType << 8 /* TOKEN_TYPE_OFFSET */ | _containsBalancedBracketsBit << 10 /* BALANCED_BRACKETS_OFFSET */ | _fontStyle << 11 /* FONT_STYLE_OFFSET */ | _foreground << 15 /* FOREGROUND_OFFSET */ | _background << 24 /* BACKGROUND_OFFSET */) >>> 0;\n }\n};\nfunction toOptionalTokenType(standardType) {\n return standardType;\n}\nfunction fromOptionalTokenType(standardType) {\n return standardType;\n}\n\n// src/matcher.ts\nfunction createMatchers(selector, matchesName) {\n const results = [];\n const tokenizer = newTokenizer(selector);\n let token = tokenizer.next();\n while (token !== null) {\n let priority = 0;\n if (token.length === 2 && token.charAt(1) === \":\") {\n switch (token.charAt(0)) {\n case \"R\":\n priority = 1;\n break;\n case \"L\":\n priority = -1;\n break;\n default:\n console.log(`Unknown priority ${token} in scope selector`);\n }\n token = tokenizer.next();\n }\n let matcher = parseConjunction();\n results.push({ matcher, priority });\n if (token !== \",\") {\n break;\n }\n token = tokenizer.next();\n }\n return results;\n function parseOperand() {\n if (token === \"-\") {\n token = tokenizer.next();\n const expressionToNegate = parseOperand();\n return (matcherInput) => !!expressionToNegate && !expressionToNegate(matcherInput);\n }\n if (token === \"(\") {\n token = tokenizer.next();\n const expressionInParents = parseInnerExpression();\n if (token === \")\") {\n token = tokenizer.next();\n }\n return expressionInParents;\n }\n if (isIdentifier(token)) {\n const identifiers = [];\n do {\n identifiers.push(token);\n token = tokenizer.next();\n } while (isIdentifier(token));\n return (matcherInput) => matchesName(identifiers, matcherInput);\n }\n return null;\n }\n function parseConjunction() {\n const matchers = [];\n let matcher = parseOperand();\n while (matcher) {\n matchers.push(matcher);\n matcher = parseOperand();\n }\n return (matcherInput) => matchers.every((matcher2) => matcher2(matcherInput));\n }\n function parseInnerExpression() {\n const matchers = [];\n let matcher = parseConjunction();\n while (matcher) {\n matchers.push(matcher);\n if (token === \"|\" || token === \",\") {\n do {\n token = tokenizer.next();\n } while (token === \"|\" || token === \",\");\n } else {\n break;\n }\n matcher = parseConjunction();\n }\n return (matcherInput) => matchers.some((matcher2) => matcher2(matcherInput));\n }\n}\nfunction isIdentifier(token) {\n return !!token && !!token.match(/[\\w\\.:]+/);\n}\nfunction newTokenizer(input) {\n let regex = /([LR]:|[\\w\\.:][\\w\\.:\\-]*|[\\,\\|\\-\\(\\)])/g;\n let match = regex.exec(input);\n return {\n next: () => {\n if (!match) {\n return null;\n }\n const res = match[0];\n match = regex.exec(input);\n return res;\n }\n };\n}\n\n// src/onigLib.ts\nvar FindOption = /* @__PURE__ */ ((FindOption2) => {\n FindOption2[FindOption2[\"None\"] = 0] = \"None\";\n FindOption2[FindOption2[\"NotBeginString\"] = 1] = \"NotBeginString\";\n FindOption2[FindOption2[\"NotEndString\"] = 2] = \"NotEndString\";\n FindOption2[FindOption2[\"NotBeginPosition\"] = 4] = \"NotBeginPosition\";\n FindOption2[FindOption2[\"DebugCall\"] = 8] = \"DebugCall\";\n return FindOption2;\n})(FindOption || {});\nfunction disposeOnigString(str) {\n if (typeof str.dispose === \"function\") {\n str.dispose();\n }\n}\n\n// src/grammar/grammarDependencies.ts\nvar TopLevelRuleReference = class {\n constructor(scopeName) {\n this.scopeName = scopeName;\n }\n toKey() {\n return this.scopeName;\n }\n};\nvar TopLevelRepositoryRuleReference = class {\n constructor(scopeName, ruleName) {\n this.scopeName = scopeName;\n this.ruleName = ruleName;\n }\n toKey() {\n return `${this.scopeName}#${this.ruleName}`;\n }\n};\nvar ExternalReferenceCollector = class {\n _references = [];\n _seenReferenceKeys = /* @__PURE__ */ new Set();\n get references() {\n return this._references;\n }\n visitedRule = /* @__PURE__ */ new Set();\n add(reference) {\n const key = reference.toKey();\n if (this._seenReferenceKeys.has(key)) {\n return;\n }\n this._seenReferenceKeys.add(key);\n this._references.push(reference);\n }\n};\nvar ScopeDependencyProcessor = class {\n constructor(repo, initialScopeName) {\n this.repo = repo;\n this.initialScopeName = initialScopeName;\n this.seenFullScopeRequests.add(this.initialScopeName);\n this.Q = [new TopLevelRuleReference(this.initialScopeName)];\n }\n seenFullScopeRequests = /* @__PURE__ */ new Set();\n seenPartialScopeRequests = /* @__PURE__ */ new Set();\n Q;\n processQueue() {\n const q = this.Q;\n this.Q = [];\n const deps = new ExternalReferenceCollector();\n for (const dep of q) {\n collectReferencesOfReference(dep, this.initialScopeName, this.repo, deps);\n }\n for (const dep of deps.references) {\n if (dep instanceof TopLevelRuleReference) {\n if (this.seenFullScopeRequests.has(dep.scopeName)) {\n continue;\n }\n this.seenFullScopeRequests.add(dep.scopeName);\n this.Q.push(dep);\n } else {\n if (this.seenFullScopeRequests.has(dep.scopeName)) {\n continue;\n }\n if (this.seenPartialScopeRequests.has(dep.toKey())) {\n continue;\n }\n this.seenPartialScopeRequests.add(dep.toKey());\n this.Q.push(dep);\n }\n }\n }\n};\nfunction collectReferencesOfReference(reference, baseGrammarScopeName, repo, result) {\n const selfGrammar = repo.lookup(reference.scopeName);\n if (!selfGrammar) {\n if (reference.scopeName === baseGrammarScopeName) {\n throw new Error(`No grammar provided for <${baseGrammarScopeName}>`);\n }\n return;\n }\n const baseGrammar = repo.lookup(baseGrammarScopeName);\n if (reference instanceof TopLevelRuleReference) {\n collectExternalReferencesInTopLevelRule({ baseGrammar, selfGrammar }, result);\n } else {\n collectExternalReferencesInTopLevelRepositoryRule(\n reference.ruleName,\n { baseGrammar, selfGrammar, repository: selfGrammar.repository },\n result\n );\n }\n const injections = repo.injections(reference.scopeName);\n if (injections) {\n for (const injection of injections) {\n result.add(new TopLevelRuleReference(injection));\n }\n }\n}\nfunction collectExternalReferencesInTopLevelRepositoryRule(ruleName, context, result) {\n if (context.repository && context.repository[ruleName]) {\n const rule = context.repository[ruleName];\n collectExternalReferencesInRules([rule], context, result);\n }\n}\nfunction collectExternalReferencesInTopLevelRule(context, result) {\n if (context.selfGrammar.patterns && Array.isArray(context.selfGrammar.patterns)) {\n collectExternalReferencesInRules(\n context.selfGrammar.patterns,\n { ...context, repository: context.selfGrammar.repository },\n result\n );\n }\n if (context.selfGrammar.injections) {\n collectExternalReferencesInRules(\n Object.values(context.selfGrammar.injections),\n { ...context, repository: context.selfGrammar.repository },\n result\n );\n }\n}\nfunction collectExternalReferencesInRules(rules, context, result) {\n for (const rule of rules) {\n if (result.visitedRule.has(rule)) {\n continue;\n }\n result.visitedRule.add(rule);\n const patternRepository = rule.repository ? mergeObjects({}, context.repository, rule.repository) : context.repository;\n if (Array.isArray(rule.patterns)) {\n collectExternalReferencesInRules(rule.patterns, { ...context, repository: patternRepository }, result);\n }\n const include = rule.include;\n if (!include) {\n continue;\n }\n const reference = parseInclude(include);\n switch (reference.kind) {\n case 0 /* Base */:\n collectExternalReferencesInTopLevelRule({ ...context, selfGrammar: context.baseGrammar }, result);\n break;\n case 1 /* Self */:\n collectExternalReferencesInTopLevelRule(context, result);\n break;\n case 2 /* RelativeReference */:\n collectExternalReferencesInTopLevelRepositoryRule(reference.ruleName, { ...context, repository: patternRepository }, result);\n break;\n case 3 /* TopLevelReference */:\n case 4 /* TopLevelRepositoryReference */:\n const selfGrammar = reference.scopeName === context.selfGrammar.scopeName ? context.selfGrammar : reference.scopeName === context.baseGrammar.scopeName ? context.baseGrammar : void 0;\n if (selfGrammar) {\n const newContext = { baseGrammar: context.baseGrammar, selfGrammar, repository: patternRepository };\n if (reference.kind === 4 /* TopLevelRepositoryReference */) {\n collectExternalReferencesInTopLevelRepositoryRule(reference.ruleName, newContext, result);\n } else {\n collectExternalReferencesInTopLevelRule(newContext, result);\n }\n } else {\n if (reference.kind === 4 /* TopLevelRepositoryReference */) {\n result.add(new TopLevelRepositoryRuleReference(reference.scopeName, reference.ruleName));\n } else {\n result.add(new TopLevelRuleReference(reference.scopeName));\n }\n }\n break;\n }\n }\n}\nvar BaseReference = class {\n kind = 0 /* Base */;\n};\nvar SelfReference = class {\n kind = 1 /* Self */;\n};\nvar RelativeReference = class {\n constructor(ruleName) {\n this.ruleName = ruleName;\n }\n kind = 2 /* RelativeReference */;\n};\nvar TopLevelReference = class {\n constructor(scopeName) {\n this.scopeName = scopeName;\n }\n kind = 3 /* TopLevelReference */;\n};\nvar TopLevelRepositoryReference = class {\n constructor(scopeName, ruleName) {\n this.scopeName = scopeName;\n this.ruleName = ruleName;\n }\n kind = 4 /* TopLevelRepositoryReference */;\n};\nfunction parseInclude(include) {\n if (include === \"$base\") {\n return new BaseReference();\n } else if (include === \"$self\") {\n return new SelfReference();\n }\n const indexOfSharp = include.indexOf(\"#\");\n if (indexOfSharp === -1) {\n return new TopLevelReference(include);\n } else if (indexOfSharp === 0) {\n return new RelativeReference(include.substring(1));\n } else {\n const scopeName = include.substring(0, indexOfSharp);\n const ruleName = include.substring(indexOfSharp + 1);\n return new TopLevelRepositoryReference(scopeName, ruleName);\n }\n}\n\n// src/rule.ts\nvar HAS_BACK_REFERENCES = /\\\\(\\d+)/;\nvar BACK_REFERENCING_END = /\\\\(\\d+)/g;\nvar ruleIdSymbol = Symbol(\"RuleId\");\nvar endRuleId = -1;\nvar whileRuleId = -2;\nfunction ruleIdFromNumber(id) {\n return id;\n}\nfunction ruleIdToNumber(id) {\n return id;\n}\nvar Rule = class {\n $location;\n id;\n _nameIsCapturing;\n _name;\n _contentNameIsCapturing;\n _contentName;\n constructor($location, id, name, contentName) {\n this.$location = $location;\n this.id = id;\n this._name = name || null;\n this._nameIsCapturing = RegexSource.hasCaptures(this._name);\n this._contentName = contentName || null;\n this._contentNameIsCapturing = RegexSource.hasCaptures(this._contentName);\n }\n get debugName() {\n const location = this.$location ? `${basename(this.$location.filename)}:${this.$location.line}` : \"unknown\";\n return `${this.constructor.name}#${this.id} @ ${location}`;\n }\n getName(lineText, captureIndices) {\n if (!this._nameIsCapturing || this._name === null || lineText === null || captureIndices === null) {\n return this._name;\n }\n return RegexSource.replaceCaptures(this._name, lineText, captureIndices);\n }\n getContentName(lineText, captureIndices) {\n if (!this._contentNameIsCapturing || this._contentName === null) {\n return this._contentName;\n }\n return RegexSource.replaceCaptures(this._contentName, lineText, captureIndices);\n }\n};\nvar CaptureRule = class extends Rule {\n retokenizeCapturedWithRuleId;\n constructor($location, id, name, contentName, retokenizeCapturedWithRuleId) {\n super($location, id, name, contentName);\n this.retokenizeCapturedWithRuleId = retokenizeCapturedWithRuleId;\n }\n dispose() {\n }\n collectPatterns(grammar, out) {\n throw new Error(\"Not supported!\");\n }\n compile(grammar, endRegexSource) {\n throw new Error(\"Not supported!\");\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n throw new Error(\"Not supported!\");\n }\n};\nvar MatchRule = class extends Rule {\n _match;\n captures;\n _cachedCompiledPatterns;\n constructor($location, id, name, match, captures) {\n super($location, id, name, null);\n this._match = new RegExpSource(match, this.id);\n this.captures = captures;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n get debugMatchRegExp() {\n return `${this._match.source}`;\n }\n collectPatterns(grammar, out) {\n out.push(this._match);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n this.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar IncludeOnlyRule = class extends Rule {\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n constructor($location, id, name, contentName, patterns) {\n super($location, id, name, contentName);\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n collectPatterns(grammar, out) {\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, out);\n }\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n this.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar BeginEndRule = class extends Rule {\n _begin;\n beginCaptures;\n _end;\n endHasBackReferences;\n endCaptures;\n applyEndPatternLast;\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n constructor($location, id, name, contentName, begin, beginCaptures, end, endCaptures, applyEndPatternLast, patterns) {\n super($location, id, name, contentName);\n this._begin = new RegExpSource(begin, this.id);\n this.beginCaptures = beginCaptures;\n this._end = new RegExpSource(end ? end : \"\\uFFFF\", -1);\n this.endHasBackReferences = this._end.hasBackReferences;\n this.endCaptures = endCaptures;\n this.applyEndPatternLast = applyEndPatternLast || false;\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n get debugBeginRegExp() {\n return `${this._begin.source}`;\n }\n get debugEndRegExp() {\n return `${this._end.source}`;\n }\n getEndWithResolvedBackReferences(lineText, captureIndices) {\n return this._end.resolveBackReferences(lineText, captureIndices);\n }\n collectPatterns(grammar, out) {\n out.push(this._begin);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar, endRegexSource).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar, endRegexSource).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar, endRegexSource) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n if (this.applyEndPatternLast) {\n this._cachedCompiledPatterns.push(this._end.hasBackReferences ? this._end.clone() : this._end);\n } else {\n this._cachedCompiledPatterns.unshift(this._end.hasBackReferences ? this._end.clone() : this._end);\n }\n }\n if (this._end.hasBackReferences) {\n if (this.applyEndPatternLast) {\n this._cachedCompiledPatterns.setSource(this._cachedCompiledPatterns.length() - 1, endRegexSource);\n } else {\n this._cachedCompiledPatterns.setSource(0, endRegexSource);\n }\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar BeginWhileRule = class extends Rule {\n _begin;\n beginCaptures;\n whileCaptures;\n _while;\n whileHasBackReferences;\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n _cachedCompiledWhilePatterns;\n constructor($location, id, name, contentName, begin, beginCaptures, _while, whileCaptures, patterns) {\n super($location, id, name, contentName);\n this._begin = new RegExpSource(begin, this.id);\n this.beginCaptures = beginCaptures;\n this.whileCaptures = whileCaptures;\n this._while = new RegExpSource(_while, whileRuleId);\n this.whileHasBackReferences = this._while.hasBackReferences;\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n this._cachedCompiledWhilePatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n if (this._cachedCompiledWhilePatterns) {\n this._cachedCompiledWhilePatterns.dispose();\n this._cachedCompiledWhilePatterns = null;\n }\n }\n get debugBeginRegExp() {\n return `${this._begin.source}`;\n }\n get debugWhileRegExp() {\n return `${this._while.source}`;\n }\n getWhileWithResolvedBackReferences(lineText, captureIndices) {\n return this._while.resolveBackReferences(lineText, captureIndices);\n }\n collectPatterns(grammar, out) {\n out.push(this._begin);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n }\n return this._cachedCompiledPatterns;\n }\n compileWhile(grammar, endRegexSource) {\n return this._getCachedCompiledWhilePatterns(grammar, endRegexSource).compile(grammar);\n }\n compileWhileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledWhilePatterns(grammar, endRegexSource).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledWhilePatterns(grammar, endRegexSource) {\n if (!this._cachedCompiledWhilePatterns) {\n this._cachedCompiledWhilePatterns = new RegExpSourceList();\n this._cachedCompiledWhilePatterns.push(this._while.hasBackReferences ? this._while.clone() : this._while);\n }\n if (this._while.hasBackReferences) {\n this._cachedCompiledWhilePatterns.setSource(0, endRegexSource ? endRegexSource : \"\\uFFFF\");\n }\n return this._cachedCompiledWhilePatterns;\n }\n};\nvar RuleFactory = class _RuleFactory {\n static createCaptureRule(helper, $location, name, contentName, retokenizeCapturedWithRuleId) {\n return helper.registerRule((id) => {\n return new CaptureRule($location, id, name, contentName, retokenizeCapturedWithRuleId);\n });\n }\n static getCompiledRuleId(desc, helper, repository) {\n if (!desc.id) {\n helper.registerRule((id) => {\n desc.id = id;\n if (desc.match) {\n return new MatchRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.match,\n _RuleFactory._compileCaptures(desc.captures, helper, repository)\n );\n }\n if (typeof desc.begin === \"undefined\") {\n if (desc.repository) {\n repository = mergeObjects({}, repository, desc.repository);\n }\n let patterns = desc.patterns;\n if (typeof patterns === \"undefined\" && desc.include) {\n patterns = [{ include: desc.include }];\n }\n return new IncludeOnlyRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n _RuleFactory._compilePatterns(patterns, helper, repository)\n );\n }\n if (desc.while) {\n return new BeginWhileRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n desc.begin,\n _RuleFactory._compileCaptures(desc.beginCaptures || desc.captures, helper, repository),\n desc.while,\n _RuleFactory._compileCaptures(desc.whileCaptures || desc.captures, helper, repository),\n _RuleFactory._compilePatterns(desc.patterns, helper, repository)\n );\n }\n return new BeginEndRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n desc.begin,\n _RuleFactory._compileCaptures(desc.beginCaptures || desc.captures, helper, repository),\n desc.end,\n _RuleFactory._compileCaptures(desc.endCaptures || desc.captures, helper, repository),\n desc.applyEndPatternLast,\n _RuleFactory._compilePatterns(desc.patterns, helper, repository)\n );\n });\n }\n return desc.id;\n }\n static _compileCaptures(captures, helper, repository) {\n let r = [];\n if (captures) {\n let maximumCaptureId = 0;\n for (const captureId in captures) {\n if (captureId === \"$vscodeTextmateLocation\") {\n continue;\n }\n const numericCaptureId = parseInt(captureId, 10);\n if (numericCaptureId > maximumCaptureId) {\n maximumCaptureId = numericCaptureId;\n }\n }\n for (let i = 0; i <= maximumCaptureId; i++) {\n r[i] = null;\n }\n for (const captureId in captures) {\n if (captureId === \"$vscodeTextmateLocation\") {\n continue;\n }\n const numericCaptureId = parseInt(captureId, 10);\n let retokenizeCapturedWithRuleId = 0;\n if (captures[captureId].patterns) {\n retokenizeCapturedWithRuleId = _RuleFactory.getCompiledRuleId(captures[captureId], helper, repository);\n }\n r[numericCaptureId] = _RuleFactory.createCaptureRule(helper, captures[captureId].$vscodeTextmateLocation, captures[captureId].name, captures[captureId].contentName, retokenizeCapturedWithRuleId);\n }\n }\n return r;\n }\n static _compilePatterns(patterns, helper, repository) {\n let r = [];\n if (patterns) {\n for (let i = 0, len = patterns.length; i < len; i++) {\n const pattern = patterns[i];\n let ruleId = -1;\n if (pattern.include) {\n const reference = parseInclude(pattern.include);\n switch (reference.kind) {\n case 0 /* Base */:\n case 1 /* Self */:\n ruleId = _RuleFactory.getCompiledRuleId(repository[pattern.include], helper, repository);\n break;\n case 2 /* RelativeReference */:\n let localIncludedRule = repository[reference.ruleName];\n if (localIncludedRule) {\n ruleId = _RuleFactory.getCompiledRuleId(localIncludedRule, helper, repository);\n } else {\n }\n break;\n case 3 /* TopLevelReference */:\n case 4 /* TopLevelRepositoryReference */:\n const externalGrammarName = reference.scopeName;\n const externalGrammarInclude = reference.kind === 4 /* TopLevelRepositoryReference */ ? reference.ruleName : null;\n const externalGrammar = helper.getExternalGrammar(externalGrammarName, repository);\n if (externalGrammar) {\n if (externalGrammarInclude) {\n let externalIncludedRule = externalGrammar.repository[externalGrammarInclude];\n if (externalIncludedRule) {\n ruleId = _RuleFactory.getCompiledRuleId(externalIncludedRule, helper, externalGrammar.repository);\n } else {\n }\n } else {\n ruleId = _RuleFactory.getCompiledRuleId(externalGrammar.repository.$self, helper, externalGrammar.repository);\n }\n } else {\n }\n break;\n }\n } else {\n ruleId = _RuleFactory.getCompiledRuleId(pattern, helper, repository);\n }\n if (ruleId !== -1) {\n const rule = helper.getRule(ruleId);\n let skipRule = false;\n if (rule instanceof IncludeOnlyRule || rule instanceof BeginEndRule || rule instanceof BeginWhileRule) {\n if (rule.hasMissingPatterns && rule.patterns.length === 0) {\n skipRule = true;\n }\n }\n if (skipRule) {\n continue;\n }\n r.push(ruleId);\n }\n }\n }\n return {\n patterns: r,\n hasMissingPatterns: (patterns ? patterns.length : 0) !== r.length\n };\n }\n};\nvar RegExpSource = class _RegExpSource {\n source;\n ruleId;\n hasAnchor;\n hasBackReferences;\n _anchorCache;\n constructor(regExpSource, ruleId) {\n if (regExpSource && typeof regExpSource === \"string\") {\n const len = regExpSource.length;\n let lastPushedPos = 0;\n let output = [];\n let hasAnchor = false;\n for (let pos = 0; pos < len; pos++) {\n const ch = regExpSource.charAt(pos);\n if (ch === \"\\\\\") {\n if (pos + 1 < len) {\n const nextCh = regExpSource.charAt(pos + 1);\n if (nextCh === \"z\") {\n output.push(regExpSource.substring(lastPushedPos, pos));\n output.push(\"$(?!\\\\n)(?<!\\\\n)\");\n lastPushedPos = pos + 2;\n } else if (nextCh === \"A\" || nextCh === \"G\") {\n hasAnchor = true;\n }\n pos++;\n }\n }\n }\n this.hasAnchor = hasAnchor;\n if (lastPushedPos === 0) {\n this.source = regExpSource;\n } else {\n output.push(regExpSource.substring(lastPushedPos, len));\n this.source = output.join(\"\");\n }\n } else {\n this.hasAnchor = false;\n this.source = regExpSource;\n }\n if (this.hasAnchor) {\n this._anchorCache = this._buildAnchorCache();\n } else {\n this._anchorCache = null;\n }\n this.ruleId = ruleId;\n if (typeof this.source === \"string\") {\n this.hasBackReferences = HAS_BACK_REFERENCES.test(this.source);\n } else {\n this.hasBackReferences = false;\n }\n }\n clone() {\n return new _RegExpSource(this.source, this.ruleId);\n }\n setSource(newSource) {\n if (this.source === newSource) {\n return;\n }\n this.source = newSource;\n if (this.hasAnchor) {\n this._anchorCache = this._buildAnchorCache();\n }\n }\n resolveBackReferences(lineText, captureIndices) {\n if (typeof this.source !== \"string\") {\n throw new Error(\"This method should only be called if the source is a string\");\n }\n let capturedValues = captureIndices.map((capture) => {\n return lineText.substring(capture.start, capture.end);\n });\n BACK_REFERENCING_END.lastIndex = 0;\n return this.source.replace(BACK_REFERENCING_END, (match, g1) => {\n return escapeRegExpCharacters(capturedValues[parseInt(g1, 10)] || \"\");\n });\n }\n _buildAnchorCache() {\n if (typeof this.source !== \"string\") {\n throw new Error(\"This method should only be called if the source is a string\");\n }\n let A0_G0_result = [];\n let A0_G1_result = [];\n let A1_G0_result = [];\n let A1_G1_result = [];\n let pos, len, ch, nextCh;\n for (pos = 0, len = this.source.length; pos < len; pos++) {\n ch = this.source.charAt(pos);\n A0_G0_result[pos] = ch;\n A0_G1_result[pos] = ch;\n A1_G0_result[pos] = ch;\n A1_G1_result[pos] = ch;\n if (ch === \"\\\\\") {\n if (pos + 1 < len) {\n nextCh = this.source.charAt(pos + 1);\n if (nextCh === \"A\") {\n A0_G0_result[pos + 1] = \"\\uFFFF\";\n A0_G1_result[pos + 1] = \"\\uFFFF\";\n A1_G0_result[pos + 1] = \"A\";\n A1_G1_result[pos + 1] = \"A\";\n } else if (nextCh === \"G\") {\n A0_G0_result[pos + 1] = \"\\uFFFF\";\n A0_G1_result[pos + 1] = \"G\";\n A1_G0_result[pos + 1] = \"\\uFFFF\";\n A1_G1_result[pos + 1] = \"G\";\n } else {\n A0_G0_result[pos + 1] = nextCh;\n A0_G1_result[pos + 1] = nextCh;\n A1_G0_result[pos + 1] = nextCh;\n A1_G1_result[pos + 1] = nextCh;\n }\n pos++;\n }\n }\n }\n return {\n A0_G0: A0_G0_result.join(\"\"),\n A0_G1: A0_G1_result.join(\"\"),\n A1_G0: A1_G0_result.join(\"\"),\n A1_G1: A1_G1_result.join(\"\")\n };\n }\n resolveAnchors(allowA, allowG) {\n if (!this.hasAnchor || !this._anchorCache || typeof this.source !== \"string\") {\n return this.source;\n }\n if (allowA) {\n if (allowG) {\n return this._anchorCache.A1_G1;\n } else {\n return this._anchorCache.A1_G0;\n }\n } else {\n if (allowG) {\n return this._anchorCache.A0_G1;\n } else {\n return this._anchorCache.A0_G0;\n }\n }\n }\n};\nvar RegExpSourceList = class {\n _items;\n _hasAnchors;\n _cached;\n _anchorCache;\n constructor() {\n this._items = [];\n this._hasAnchors = false;\n this._cached = null;\n this._anchorCache = {\n A0_G0: null,\n A0_G1: null,\n A1_G0: null,\n A1_G1: null\n };\n }\n dispose() {\n this._disposeCaches();\n }\n _disposeCaches() {\n if (this._cached) {\n this._cached.dispose();\n this._cached = null;\n }\n if (this._anchorCache.A0_G0) {\n this._anchorCache.A0_G0.dispose();\n this._anchorCache.A0_G0 = null;\n }\n if (this._anchorCache.A0_G1) {\n this._anchorCache.A0_G1.dispose();\n this._anchorCache.A0_G1 = null;\n }\n if (this._anchorCache.A1_G0) {\n this._anchorCache.A1_G0.dispose();\n this._anchorCache.A1_G0 = null;\n }\n if (this._anchorCache.A1_G1) {\n this._anchorCache.A1_G1.dispose();\n this._anchorCache.A1_G1 = null;\n }\n }\n push(item) {\n this._items.push(item);\n this._hasAnchors = this._hasAnchors || item.hasAnchor;\n }\n unshift(item) {\n this._items.unshift(item);\n this._hasAnchors = this._hasAnchors || item.hasAnchor;\n }\n length() {\n return this._items.length;\n }\n setSource(index, newSource) {\n if (this._items[index].source !== newSource) {\n this._disposeCaches();\n this._items[index].setSource(newSource);\n }\n }\n compile(onigLib) {\n if (!this._cached) {\n let regExps = this._items.map((e) => e.source);\n this._cached = new CompiledRule(onigLib, regExps, this._items.map((e) => e.ruleId));\n }\n return this._cached;\n }\n compileAG(onigLib, allowA, allowG) {\n if (!this._hasAnchors) {\n return this.compile(onigLib);\n } else {\n if (allowA) {\n if (allowG) {\n if (!this._anchorCache.A1_G1) {\n this._anchorCache.A1_G1 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A1_G1;\n } else {\n if (!this._anchorCache.A1_G0) {\n this._anchorCache.A1_G0 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A1_G0;\n }\n } else {\n if (allowG) {\n if (!this._anchorCache.A0_G1) {\n this._anchorCache.A0_G1 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A0_G1;\n } else {\n if (!this._anchorCache.A0_G0) {\n this._anchorCache.A0_G0 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A0_G0;\n }\n }\n }\n }\n _resolveAnchors(onigLib, allowA, allowG) {\n let regExps = this._items.map((e) => e.resolveAnchors(allowA, allowG));\n return new CompiledRule(onigLib, regExps, this._items.map((e) => e.ruleId));\n }\n};\nvar CompiledRule = class {\n constructor(onigLib, regExps, rules) {\n this.regExps = regExps;\n this.rules = rules;\n this.scanner = onigLib.createOnigScanner(regExps);\n }\n scanner;\n dispose() {\n if (typeof this.scanner.dispose === \"function\") {\n this.scanner.dispose();\n }\n }\n toString() {\n const r = [];\n for (let i = 0, len = this.rules.length; i < len; i++) {\n r.push(\" - \" + this.rules[i] + \": \" + this.regExps[i]);\n }\n return r.join(\"\\n\");\n }\n findNextMatchSync(string, startPosition, options) {\n const result = this.scanner.findNextMatchSync(string, startPosition, options);\n if (!result) {\n return null;\n }\n return {\n ruleId: this.rules[result.index],\n captureIndices: result.captureIndices\n };\n }\n};\n\n// src/grammar/basicScopesAttributeProvider.ts\nvar BasicScopeAttributes = class {\n constructor(languageId, tokenType) {\n this.languageId = languageId;\n this.tokenType = tokenType;\n }\n};\nvar BasicScopeAttributesProvider = class _BasicScopeAttributesProvider {\n _defaultAttributes;\n _embeddedLanguagesMatcher;\n constructor(initialLanguageId, embeddedLanguages) {\n this._defaultAttributes = new BasicScopeAttributes(initialLanguageId, 8 /* NotSet */);\n this._embeddedLanguagesMatcher = new ScopeMatcher(Object.entries(embeddedLanguages || {}));\n }\n getDefaultAttributes() {\n return this._defaultAttributes;\n }\n getBasicScopeAttributes(scopeName) {\n if (scopeName === null) {\n return _BasicScopeAttributesProvider._NULL_SCOPE_METADATA;\n }\n return this._getBasicScopeAttributes.get(scopeName);\n }\n static _NULL_SCOPE_METADATA = new BasicScopeAttributes(0, 0);\n _getBasicScopeAttributes = new CachedFn((scopeName) => {\n const languageId = this._scopeToLanguage(scopeName);\n const standardTokenType = this._toStandardTokenType(scopeName);\n return new BasicScopeAttributes(languageId, standardTokenType);\n });\n /**\n * Given a produced TM scope, return the language that token describes or null if unknown.\n * e.g. source.html => html, source.css.embedded.html => css, punctuation.definition.tag.html => null\n */\n _scopeToLanguage(scope) {\n return this._embeddedLanguagesMatcher.match(scope) || 0;\n }\n _toStandardTokenType(scopeName) {\n const m = scopeName.match(_BasicScopeAttributesProvider.STANDARD_TOKEN_TYPE_REGEXP);\n if (!m) {\n return 8 /* NotSet */;\n }\n switch (m[1]) {\n case \"comment\":\n return 1 /* Comment */;\n case \"string\":\n return 2 /* String */;\n case \"regex\":\n return 3 /* RegEx */;\n case \"meta.embedded\":\n return 0 /* Other */;\n }\n throw new Error(\"Unexpected match for standard token type!\");\n }\n static STANDARD_TOKEN_TYPE_REGEXP = /\\b(comment|string|regex|meta\\.embedded)\\b/;\n};\nvar ScopeMatcher = class {\n values;\n scopesRegExp;\n constructor(values) {\n if (values.length === 0) {\n this.values = null;\n this.scopesRegExp = null;\n } else {\n this.values = new Map(values);\n const escapedScopes = values.map(\n ([scopeName, value]) => escapeRegExpCharacters(scopeName)\n );\n escapedScopes.sort();\n escapedScopes.reverse();\n this.scopesRegExp = new RegExp(\n `^((${escapedScopes.join(\")|(\")}))($|\\\\.)`,\n \"\"\n );\n }\n }\n match(scope) {\n if (!this.scopesRegExp) {\n return void 0;\n }\n const m = scope.match(this.scopesRegExp);\n if (!m) {\n return void 0;\n }\n return this.values.get(m[1]);\n }\n};\n\n// src/debug.ts\nvar DebugFlags = {\n InDebugMode: typeof process !== \"undefined\" && !!process.env[\"VSCODE_TEXTMATE_DEBUG\"]\n};\nvar UseOnigurumaFindOptions = false;\n\n// src/grammar/tokenizeString.ts\nvar TokenizeStringResult = class {\n constructor(stack, stoppedEarly) {\n this.stack = stack;\n this.stoppedEarly = stoppedEarly;\n }\n};\nfunction _tokenizeString(grammar, lineText, isFirstLine, linePos, stack, lineTokens, checkWhileConditions, timeLimit) {\n const lineLength = lineText.content.length;\n let STOP = false;\n let anchorPosition = -1;\n if (checkWhileConditions) {\n const whileCheckResult = _checkWhileConditions(\n grammar,\n lineText,\n isFirstLine,\n linePos,\n stack,\n lineTokens\n );\n stack = whileCheckResult.stack;\n linePos = whileCheckResult.linePos;\n isFirstLine = whileCheckResult.isFirstLine;\n anchorPosition = whileCheckResult.anchorPosition;\n }\n const startTime = Date.now();\n while (!STOP) {\n if (timeLimit !== 0) {\n const elapsedTime = Date.now() - startTime;\n if (elapsedTime > timeLimit) {\n return new TokenizeStringResult(stack, true);\n }\n }\n scanNext();\n }\n return new TokenizeStringResult(stack, false);\n function scanNext() {\n if (false) {\n console.log(\"\");\n console.log(\n `@@scanNext ${linePos}: |${lineText.content.substr(linePos).replace(/\\n$/, \"\\\\n\")}|`\n );\n }\n const r = matchRuleOrInjections(\n grammar,\n lineText,\n isFirstLine,\n linePos,\n stack,\n anchorPosition\n );\n if (!r) {\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n const captureIndices = r.captureIndices;\n const matchedRuleId = r.matchedRuleId;\n const hasAdvanced = captureIndices && captureIndices.length > 0 ? captureIndices[0].end > linePos : false;\n if (matchedRuleId === endRuleId) {\n const poppedRule = stack.getRule(grammar);\n if (false) {\n console.log(\n \" popping \" + poppedRule.debugName + \" - \" + poppedRule.debugEndRegExp\n );\n }\n lineTokens.produce(stack, captureIndices[0].start);\n stack = stack.withContentNameScopesList(stack.nameScopesList);\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n poppedRule.endCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n const popped = stack;\n stack = stack.parent;\n anchorPosition = popped.getAnchorPos();\n if (!hasAdvanced && popped.getEnterPos() === linePos) {\n if (false) {\n console.error(\n \"[1] - Grammar is in an endless loop - Grammar pushed & popped a rule without advancing\"\n );\n }\n stack = popped;\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else {\n const _rule = grammar.getRule(matchedRuleId);\n lineTokens.produce(stack, captureIndices[0].start);\n const beforePush = stack;\n const scopeName = _rule.getName(lineText.content, captureIndices);\n const nameScopesList = stack.contentNameScopesList.pushAttributed(\n scopeName,\n grammar\n );\n stack = stack.push(\n matchedRuleId,\n linePos,\n anchorPosition,\n captureIndices[0].end === lineLength,\n null,\n nameScopesList,\n nameScopesList\n );\n if (_rule instanceof BeginEndRule) {\n const pushedRule = _rule;\n if (false) {\n console.log(\n \" pushing \" + pushedRule.debugName + \" - \" + pushedRule.debugBeginRegExp\n );\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n pushedRule.beginCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n anchorPosition = captureIndices[0].end;\n const contentName = pushedRule.getContentName(\n lineText.content,\n captureIndices\n );\n const contentNameScopesList = nameScopesList.pushAttributed(\n contentName,\n grammar\n );\n stack = stack.withContentNameScopesList(contentNameScopesList);\n if (pushedRule.endHasBackReferences) {\n stack = stack.withEndRule(\n pushedRule.getEndWithResolvedBackReferences(\n lineText.content,\n captureIndices\n )\n );\n }\n if (!hasAdvanced && beforePush.hasSameRuleAs(stack)) {\n if (false) {\n console.error(\n \"[2] - Grammar is in an endless loop - Grammar pushed the same rule without advancing\"\n );\n }\n stack = stack.pop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else if (_rule instanceof BeginWhileRule) {\n const pushedRule = _rule;\n if (false) {\n console.log(\" pushing \" + pushedRule.debugName);\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n pushedRule.beginCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n anchorPosition = captureIndices[0].end;\n const contentName = pushedRule.getContentName(\n lineText.content,\n captureIndices\n );\n const contentNameScopesList = nameScopesList.pushAttributed(\n contentName,\n grammar\n );\n stack = stack.withContentNameScopesList(contentNameScopesList);\n if (pushedRule.whileHasBackReferences) {\n stack = stack.withEndRule(\n pushedRule.getWhileWithResolvedBackReferences(\n lineText.content,\n captureIndices\n )\n );\n }\n if (!hasAdvanced && beforePush.hasSameRuleAs(stack)) {\n if (false) {\n console.error(\n \"[3] - Grammar is in an endless loop - Grammar pushed the same rule without advancing\"\n );\n }\n stack = stack.pop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else {\n const matchingRule = _rule;\n if (false) {\n console.log(\n \" matched \" + matchingRule.debugName + \" - \" + matchingRule.debugMatchRegExp\n );\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n matchingRule.captures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n stack = stack.pop();\n if (!hasAdvanced) {\n if (false) {\n console.error(\n \"[4] - Grammar is in an endless loop - Grammar is not advancing, nor is it pushing/popping\"\n );\n }\n stack = stack.safePop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n }\n }\n if (captureIndices[0].end > linePos) {\n linePos = captureIndices[0].end;\n isFirstLine = false;\n }\n }\n}\nfunction _checkWhileConditions(grammar, lineText, isFirstLine, linePos, stack, lineTokens) {\n let anchorPosition = stack.beginRuleCapturedEOL ? 0 : -1;\n const whileRules = [];\n for (let node = stack; node; node = node.pop()) {\n const nodeRule = node.getRule(grammar);\n if (nodeRule instanceof BeginWhileRule) {\n whileRules.push({\n rule: nodeRule,\n stack: node\n });\n }\n }\n for (let whileRule = whileRules.pop(); whileRule; whileRule = whileRules.pop()) {\n const { ruleScanner, findOptions } = prepareRuleWhileSearch(whileRule.rule, grammar, whileRule.stack.endRule, isFirstLine, linePos === anchorPosition);\n const r = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (false) {\n console.log(\" scanning for while rule\");\n console.log(ruleScanner.toString());\n }\n if (r) {\n const matchedRuleId = r.ruleId;\n if (matchedRuleId !== whileRuleId) {\n stack = whileRule.stack.pop();\n break;\n }\n if (r.captureIndices && r.captureIndices.length) {\n lineTokens.produce(whileRule.stack, r.captureIndices[0].start);\n handleCaptures(grammar, lineText, isFirstLine, whileRule.stack, lineTokens, whileRule.rule.whileCaptures, r.captureIndices);\n lineTokens.produce(whileRule.stack, r.captureIndices[0].end);\n anchorPosition = r.captureIndices[0].end;\n if (r.captureIndices[0].end > linePos) {\n linePos = r.captureIndices[0].end;\n isFirstLine = false;\n }\n }\n } else {\n if (false) {\n console.log(\" popping \" + whileRule.rule.debugName + \" - \" + whileRule.rule.debugWhileRegExp);\n }\n stack = whileRule.stack.pop();\n break;\n }\n }\n return { stack, linePos, anchorPosition, isFirstLine };\n}\nfunction matchRuleOrInjections(grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n const matchResult = matchRule(grammar, lineText, isFirstLine, linePos, stack, anchorPosition);\n const injections = grammar.getInjections();\n if (injections.length === 0) {\n return matchResult;\n }\n const injectionResult = matchInjections(injections, grammar, lineText, isFirstLine, linePos, stack, anchorPosition);\n if (!injectionResult) {\n return matchResult;\n }\n if (!matchResult) {\n return injectionResult;\n }\n const matchResultScore = matchResult.captureIndices[0].start;\n const injectionResultScore = injectionResult.captureIndices[0].start;\n if (injectionResultScore < matchResultScore || injectionResult.priorityMatch && injectionResultScore === matchResultScore) {\n return injectionResult;\n }\n return matchResult;\n}\nfunction matchRule(grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n const rule = stack.getRule(grammar);\n const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, stack.endRule, isFirstLine, linePos === anchorPosition);\n const r = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (r) {\n return {\n captureIndices: r.captureIndices,\n matchedRuleId: r.ruleId\n };\n }\n return null;\n}\nfunction matchInjections(injections, grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n let bestMatchRating = Number.MAX_VALUE;\n let bestMatchCaptureIndices = null;\n let bestMatchRuleId;\n let bestMatchResultPriority = 0;\n const scopes = stack.contentNameScopesList.getScopeNames();\n for (let i = 0, len = injections.length; i < len; i++) {\n const injection = injections[i];\n if (!injection.matcher(scopes)) {\n continue;\n }\n const rule = grammar.getRule(injection.ruleId);\n const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, null, isFirstLine, linePos === anchorPosition);\n const matchResult = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (!matchResult) {\n continue;\n }\n if (false) {\n console.log(` matched injection: ${injection.debugSelector}`);\n console.log(ruleScanner.toString());\n }\n const matchRating = matchResult.captureIndices[0].start;\n if (matchRating >= bestMatchRating) {\n continue;\n }\n bestMatchRating = matchRating;\n bestMatchCaptureIndices = matchResult.captureIndices;\n bestMatchRuleId = matchResult.ruleId;\n bestMatchResultPriority = injection.priority;\n if (bestMatchRating === linePos) {\n break;\n }\n }\n if (bestMatchCaptureIndices) {\n return {\n priorityMatch: bestMatchResultPriority === -1,\n captureIndices: bestMatchCaptureIndices,\n matchedRuleId: bestMatchRuleId\n };\n }\n return null;\n}\nfunction prepareRuleSearch(rule, grammar, endRegexSource, allowA, allowG) {\n if (UseOnigurumaFindOptions) {\n const ruleScanner2 = rule.compile(grammar, endRegexSource);\n const findOptions = getFindOptions(allowA, allowG);\n return { ruleScanner: ruleScanner2, findOptions };\n }\n const ruleScanner = rule.compileAG(grammar, endRegexSource, allowA, allowG);\n return { ruleScanner, findOptions: 0 /* None */ };\n}\nfunction prepareRuleWhileSearch(rule, grammar, endRegexSource, allowA, allowG) {\n if (UseOnigurumaFindOptions) {\n const ruleScanner2 = rule.compileWhile(grammar, endRegexSource);\n const findOptions = getFindOptions(allowA, allowG);\n return { ruleScanner: ruleScanner2, findOptions };\n }\n const ruleScanner = rule.compileWhileAG(grammar, endRegexSource, allowA, allowG);\n return { ruleScanner, findOptions: 0 /* None */ };\n}\nfunction getFindOptions(allowA, allowG) {\n let options = 0 /* None */;\n if (!allowA) {\n options |= 1 /* NotBeginString */;\n }\n if (!allowG) {\n options |= 4 /* NotBeginPosition */;\n }\n return options;\n}\nfunction handleCaptures(grammar, lineText, isFirstLine, stack, lineTokens, captures, captureIndices) {\n if (captures.length === 0) {\n return;\n }\n const lineTextContent = lineText.content;\n const len = Math.min(captures.length, captureIndices.length);\n const localStack = [];\n const maxEnd = captureIndices[0].end;\n for (let i = 0; i < len; i++) {\n const captureRule = captures[i];\n if (captureRule === null) {\n continue;\n }\n const captureIndex = captureIndices[i];\n if (captureIndex.length === 0) {\n continue;\n }\n if (captureIndex.start > maxEnd) {\n break;\n }\n while (localStack.length > 0 && localStack[localStack.length - 1].endPos <= captureIndex.start) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, localStack[localStack.length - 1].endPos);\n localStack.pop();\n }\n if (localStack.length > 0) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, captureIndex.start);\n } else {\n lineTokens.produce(stack, captureIndex.start);\n }\n if (captureRule.retokenizeCapturedWithRuleId) {\n const scopeName = captureRule.getName(lineTextContent, captureIndices);\n const nameScopesList = stack.contentNameScopesList.pushAttributed(scopeName, grammar);\n const contentName = captureRule.getContentName(lineTextContent, captureIndices);\n const contentNameScopesList = nameScopesList.pushAttributed(contentName, grammar);\n const stackClone = stack.push(captureRule.retokenizeCapturedWithRuleId, captureIndex.start, -1, false, null, nameScopesList, contentNameScopesList);\n const onigSubStr = grammar.createOnigString(lineTextContent.substring(0, captureIndex.end));\n _tokenizeString(\n grammar,\n onigSubStr,\n isFirstLine && captureIndex.start === 0,\n captureIndex.start,\n stackClone,\n lineTokens,\n false,\n /* no time limit */\n 0\n );\n disposeOnigString(onigSubStr);\n continue;\n }\n const captureRuleScopeName = captureRule.getName(lineTextContent, captureIndices);\n if (captureRuleScopeName !== null) {\n const base = localStack.length > 0 ? localStack[localStack.length - 1].scopes : stack.contentNameScopesList;\n const captureRuleScopesList = base.pushAttributed(captureRuleScopeName, grammar);\n localStack.push(new LocalStackElement(captureRuleScopesList, captureIndex.end));\n }\n }\n while (localStack.length > 0) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, localStack[localStack.length - 1].endPos);\n localStack.pop();\n }\n}\nvar LocalStackElement = class {\n scopes;\n endPos;\n constructor(scopes, endPos) {\n this.scopes = scopes;\n this.endPos = endPos;\n }\n};\n\n// src/grammar/grammar.ts\nfunction createGrammar(scopeName, grammar, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors, grammarRepository, onigLib) {\n return new Grammar(\n scopeName,\n grammar,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors,\n grammarRepository,\n onigLib\n );\n}\nfunction collectInjections(result, selector, rule, ruleFactoryHelper, grammar) {\n const matchers = createMatchers(selector, nameMatcher);\n const ruleId = RuleFactory.getCompiledRuleId(rule, ruleFactoryHelper, grammar.repository);\n for (const matcher of matchers) {\n result.push({\n debugSelector: selector,\n matcher: matcher.matcher,\n ruleId,\n grammar,\n priority: matcher.priority\n });\n }\n}\nfunction nameMatcher(identifers, scopes) {\n if (scopes.length < identifers.length) {\n return false;\n }\n let lastIndex = 0;\n return identifers.every((identifier) => {\n for (let i = lastIndex; i < scopes.length; i++) {\n if (scopesAreMatching(scopes[i], identifier)) {\n lastIndex = i + 1;\n return true;\n }\n }\n return false;\n });\n}\nfunction scopesAreMatching(thisScopeName, scopeName) {\n if (!thisScopeName) {\n return false;\n }\n if (thisScopeName === scopeName) {\n return true;\n }\n const len = scopeName.length;\n return thisScopeName.length > len && thisScopeName.substr(0, len) === scopeName && thisScopeName[len] === \".\";\n}\nvar Grammar = class {\n constructor(_rootScopeName, grammar, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors, grammarRepository, _onigLib) {\n this._rootScopeName = _rootScopeName;\n this.balancedBracketSelectors = balancedBracketSelectors;\n this._onigLib = _onigLib;\n this._basicScopeAttributesProvider = new BasicScopeAttributesProvider(\n initialLanguage,\n embeddedLanguages\n );\n this._rootId = -1;\n this._lastRuleId = 0;\n this._ruleId2desc = [null];\n this._includedGrammars = {};\n this._grammarRepository = grammarRepository;\n this._grammar = initGrammar(grammar, null);\n this._injections = null;\n this._tokenTypeMatchers = [];\n if (tokenTypes) {\n for (const selector of Object.keys(tokenTypes)) {\n const matchers = createMatchers(selector, nameMatcher);\n for (const matcher of matchers) {\n this._tokenTypeMatchers.push({\n matcher: matcher.matcher,\n type: tokenTypes[selector]\n });\n }\n }\n }\n }\n _rootId;\n _lastRuleId;\n _ruleId2desc;\n _includedGrammars;\n _grammarRepository;\n _grammar;\n _injections;\n _basicScopeAttributesProvider;\n _tokenTypeMatchers;\n get themeProvider() {\n return this._grammarRepository;\n }\n dispose() {\n for (const rule of this._ruleId2desc) {\n if (rule) {\n rule.dispose();\n }\n }\n }\n createOnigScanner(sources) {\n return this._onigLib.createOnigScanner(sources);\n }\n createOnigString(sources) {\n return this._onigLib.createOnigString(sources);\n }\n getMetadataForScope(scope) {\n return this._basicScopeAttributesProvider.getBasicScopeAttributes(scope);\n }\n _collectInjections() {\n const grammarRepository = {\n lookup: (scopeName2) => {\n if (scopeName2 === this._rootScopeName) {\n return this._grammar;\n }\n return this.getExternalGrammar(scopeName2);\n },\n injections: (scopeName2) => {\n return this._grammarRepository.injections(scopeName2);\n }\n };\n const result = [];\n const scopeName = this._rootScopeName;\n const grammar = grammarRepository.lookup(scopeName);\n if (grammar) {\n const rawInjections = grammar.injections;\n if (rawInjections) {\n for (let expression in rawInjections) {\n collectInjections(\n result,\n expression,\n rawInjections[expression],\n this,\n grammar\n );\n }\n }\n const injectionScopeNames = this._grammarRepository.injections(scopeName);\n if (injectionScopeNames) {\n injectionScopeNames.forEach((injectionScopeName) => {\n const injectionGrammar = this.getExternalGrammar(injectionScopeName);\n if (injectionGrammar) {\n const selector = injectionGrammar.injectionSelector;\n if (selector) {\n collectInjections(\n result,\n selector,\n injectionGrammar,\n this,\n injectionGrammar\n );\n }\n }\n });\n }\n }\n result.sort((i1, i2) => i1.priority - i2.priority);\n return result;\n }\n getInjections() {\n if (this._injections === null) {\n this._injections = this._collectInjections();\n }\n return this._injections;\n }\n registerRule(factory) {\n const id = ++this._lastRuleId;\n const result = factory(ruleIdFromNumber(id));\n this._ruleId2desc[id] = result;\n return result;\n }\n getRule(ruleId) {\n return this._ruleId2desc[ruleIdToNumber(ruleId)];\n }\n getExternalGrammar(scopeName, repository) {\n if (this._includedGrammars[scopeName]) {\n return this._includedGrammars[scopeName];\n } else if (this._grammarRepository) {\n const rawIncludedGrammar = this._grammarRepository.lookup(scopeName);\n if (rawIncludedGrammar) {\n this._includedGrammars[scopeName] = initGrammar(\n rawIncludedGrammar,\n repository && repository.$base\n );\n return this._includedGrammars[scopeName];\n }\n }\n return void 0;\n }\n tokenizeLine(lineText, prevState, timeLimit = 0) {\n const r = this._tokenize(lineText, prevState, false, timeLimit);\n return {\n tokens: r.lineTokens.getResult(r.ruleStack, r.lineLength),\n ruleStack: r.ruleStack,\n stoppedEarly: r.stoppedEarly\n };\n }\n tokenizeLine2(lineText, prevState, timeLimit = 0) {\n const r = this._tokenize(lineText, prevState, true, timeLimit);\n return {\n tokens: r.lineTokens.getBinaryResult(r.ruleStack, r.lineLength),\n ruleStack: r.ruleStack,\n stoppedEarly: r.stoppedEarly\n };\n }\n _tokenize(lineText, prevState, emitBinaryTokens, timeLimit) {\n if (this._rootId === -1) {\n this._rootId = RuleFactory.getCompiledRuleId(\n this._grammar.repository.$self,\n this,\n this._grammar.repository\n );\n this.getInjections();\n }\n let isFirstLine;\n if (!prevState || prevState === StateStackImpl.NULL) {\n isFirstLine = true;\n const rawDefaultMetadata = this._basicScopeAttributesProvider.getDefaultAttributes();\n const defaultStyle = this.themeProvider.getDefaults();\n const defaultMetadata = EncodedTokenMetadata.set(\n 0,\n rawDefaultMetadata.languageId,\n rawDefaultMetadata.tokenType,\n null,\n defaultStyle.fontStyle,\n defaultStyle.foregroundId,\n defaultStyle.backgroundId\n );\n const rootScopeName = this.getRule(this._rootId).getName(\n null,\n null\n );\n let scopeList;\n if (rootScopeName) {\n scopeList = AttributedScopeStack.createRootAndLookUpScopeName(\n rootScopeName,\n defaultMetadata,\n this\n );\n } else {\n scopeList = AttributedScopeStack.createRoot(\n \"unknown\",\n defaultMetadata\n );\n }\n prevState = new StateStackImpl(\n null,\n this._rootId,\n -1,\n -1,\n false,\n null,\n scopeList,\n scopeList\n );\n } else {\n isFirstLine = false;\n prevState.reset();\n }\n lineText = lineText + \"\\n\";\n const onigLineText = this.createOnigString(lineText);\n const lineLength = onigLineText.content.length;\n const lineTokens = new LineTokens(\n emitBinaryTokens,\n lineText,\n this._tokenTypeMatchers,\n this.balancedBracketSelectors\n );\n const r = _tokenizeString(\n this,\n onigLineText,\n isFirstLine,\n 0,\n prevState,\n lineTokens,\n true,\n timeLimit\n );\n disposeOnigString(onigLineText);\n return {\n lineLength,\n lineTokens,\n ruleStack: r.stack,\n stoppedEarly: r.stoppedEarly\n };\n }\n};\nfunction initGrammar(grammar, base) {\n grammar = clone(grammar);\n grammar.repository = grammar.repository || {};\n grammar.repository.$self = {\n $vscodeTextmateLocation: grammar.$vscodeTextmateLocation,\n patterns: grammar.patterns,\n name: grammar.scopeName\n };\n grammar.repository.$base = base || grammar.repository.$self;\n return grammar;\n}\nvar AttributedScopeStack = class _AttributedScopeStack {\n /**\n * Invariant:\n * ```\n * if (parent && !scopePath.extends(parent.scopePath)) {\n * \tthrow new Error();\n * }\n * ```\n */\n constructor(parent, scopePath, tokenAttributes) {\n this.parent = parent;\n this.scopePath = scopePath;\n this.tokenAttributes = tokenAttributes;\n }\n static fromExtension(namesScopeList, contentNameScopesList) {\n let current = namesScopeList;\n let scopeNames = namesScopeList?.scopePath ?? null;\n for (const frame of contentNameScopesList) {\n scopeNames = ScopeStack.push(scopeNames, frame.scopeNames);\n current = new _AttributedScopeStack(current, scopeNames, frame.encodedTokenAttributes);\n }\n return current;\n }\n static createRoot(scopeName, tokenAttributes) {\n return new _AttributedScopeStack(null, new ScopeStack(null, scopeName), tokenAttributes);\n }\n static createRootAndLookUpScopeName(scopeName, tokenAttributes, grammar) {\n const rawRootMetadata = grammar.getMetadataForScope(scopeName);\n const scopePath = new ScopeStack(null, scopeName);\n const rootStyle = grammar.themeProvider.themeMatch(scopePath);\n const resolvedTokenAttributes = _AttributedScopeStack.mergeAttributes(\n tokenAttributes,\n rawRootMetadata,\n rootStyle\n );\n return new _AttributedScopeStack(null, scopePath, resolvedTokenAttributes);\n }\n get scopeName() {\n return this.scopePath.scopeName;\n }\n toString() {\n return this.getScopeNames().join(\" \");\n }\n equals(other) {\n return _AttributedScopeStack.equals(this, other);\n }\n static equals(a, b) {\n do {\n if (a === b) {\n return true;\n }\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n if (a.scopeName !== b.scopeName || a.tokenAttributes !== b.tokenAttributes) {\n return false;\n }\n a = a.parent;\n b = b.parent;\n } while (true);\n }\n static mergeAttributes(existingTokenAttributes, basicScopeAttributes, styleAttributes) {\n let fontStyle = -1 /* NotSet */;\n let foreground = 0;\n let background = 0;\n if (styleAttributes !== null) {\n fontStyle = styleAttributes.fontStyle;\n foreground = styleAttributes.foregroundId;\n background = styleAttributes.backgroundId;\n }\n return EncodedTokenMetadata.set(\n existingTokenAttributes,\n basicScopeAttributes.languageId,\n basicScopeAttributes.tokenType,\n null,\n fontStyle,\n foreground,\n background\n );\n }\n pushAttributed(scopePath, grammar) {\n if (scopePath === null) {\n return this;\n }\n if (scopePath.indexOf(\" \") === -1) {\n return _AttributedScopeStack._pushAttributed(this, scopePath, grammar);\n }\n const scopes = scopePath.split(/ /g);\n let result = this;\n for (const scope of scopes) {\n result = _AttributedScopeStack._pushAttributed(result, scope, grammar);\n }\n return result;\n }\n static _pushAttributed(target, scopeName, grammar) {\n const rawMetadata = grammar.getMetadataForScope(scopeName);\n const newPath = target.scopePath.push(scopeName);\n const scopeThemeMatchResult = grammar.themeProvider.themeMatch(newPath);\n const metadata = _AttributedScopeStack.mergeAttributes(\n target.tokenAttributes,\n rawMetadata,\n scopeThemeMatchResult\n );\n return new _AttributedScopeStack(target, newPath, metadata);\n }\n getScopeNames() {\n return this.scopePath.getSegments();\n }\n getExtensionIfDefined(base) {\n const result = [];\n let self = this;\n while (self && self !== base) {\n result.push({\n encodedTokenAttributes: self.tokenAttributes,\n scopeNames: self.scopePath.getExtensionIfDefined(self.parent?.scopePath ?? null)\n });\n self = self.parent;\n }\n return self === base ? result.reverse() : void 0;\n }\n};\nvar StateStackImpl = class _StateStackImpl {\n /**\n * Invariant:\n * ```\n * if (contentNameScopesList !== nameScopesList && contentNameScopesList?.parent !== nameScopesList) {\n * \tthrow new Error();\n * }\n * if (this.parent && !nameScopesList.extends(this.parent.contentNameScopesList)) {\n * \tthrow new Error();\n * }\n * ```\n */\n constructor(parent, ruleId, enterPos, anchorPos, beginRuleCapturedEOL, endRule, nameScopesList, contentNameScopesList) {\n this.parent = parent;\n this.ruleId = ruleId;\n this.beginRuleCapturedEOL = beginRuleCapturedEOL;\n this.endRule = endRule;\n this.nameScopesList = nameScopesList;\n this.contentNameScopesList = contentNameScopesList;\n this.depth = this.parent ? this.parent.depth + 1 : 1;\n this._enterPos = enterPos;\n this._anchorPos = anchorPos;\n }\n _stackElementBrand = void 0;\n // TODO remove me\n static NULL = new _StateStackImpl(\n null,\n 0,\n 0,\n 0,\n false,\n null,\n null,\n null\n );\n /**\n * The position on the current line where this state was pushed.\n * This is relevant only while tokenizing a line, to detect endless loops.\n * Its value is meaningless across lines.\n */\n _enterPos;\n /**\n * The captured anchor position when this stack element was pushed.\n * This is relevant only while tokenizing a line, to restore the anchor position when popping.\n * Its value is meaningless across lines.\n */\n _anchorPos;\n /**\n * The depth of the stack.\n */\n depth;\n equals(other) {\n if (other === null) {\n return false;\n }\n return _StateStackImpl._equals(this, other);\n }\n static _equals(a, b) {\n if (a === b) {\n return true;\n }\n if (!this._structuralEquals(a, b)) {\n return false;\n }\n return AttributedScopeStack.equals(a.contentNameScopesList, b.contentNameScopesList);\n }\n /**\n * A structural equals check. Does not take into account `scopes`.\n */\n static _structuralEquals(a, b) {\n do {\n if (a === b) {\n return true;\n }\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n if (a.depth !== b.depth || a.ruleId !== b.ruleId || a.endRule !== b.endRule) {\n return false;\n }\n a = a.parent;\n b = b.parent;\n } while (true);\n }\n clone() {\n return this;\n }\n static _reset(el) {\n while (el) {\n el._enterPos = -1;\n el._anchorPos = -1;\n el = el.parent;\n }\n }\n reset() {\n _StateStackImpl._reset(this);\n }\n pop() {\n return this.parent;\n }\n safePop() {\n if (this.parent) {\n return this.parent;\n }\n return this;\n }\n push(ruleId, enterPos, anchorPos, beginRuleCapturedEOL, endRule, nameScopesList, contentNameScopesList) {\n return new _StateStackImpl(\n this,\n ruleId,\n enterPos,\n anchorPos,\n beginRuleCapturedEOL,\n endRule,\n nameScopesList,\n contentNameScopesList\n );\n }\n getEnterPos() {\n return this._enterPos;\n }\n getAnchorPos() {\n return this._anchorPos;\n }\n getRule(grammar) {\n return grammar.getRule(this.ruleId);\n }\n toString() {\n const r = [];\n this._writeString(r, 0);\n return \"[\" + r.join(\",\") + \"]\";\n }\n _writeString(res, outIndex) {\n if (this.parent) {\n outIndex = this.parent._writeString(res, outIndex);\n }\n res[outIndex++] = `(${this.ruleId}, ${this.nameScopesList?.toString()}, ${this.contentNameScopesList?.toString()})`;\n return outIndex;\n }\n withContentNameScopesList(contentNameScopeStack) {\n if (this.contentNameScopesList === contentNameScopeStack) {\n return this;\n }\n return this.parent.push(\n this.ruleId,\n this._enterPos,\n this._anchorPos,\n this.beginRuleCapturedEOL,\n this.endRule,\n this.nameScopesList,\n contentNameScopeStack\n );\n }\n withEndRule(endRule) {\n if (this.endRule === endRule) {\n return this;\n }\n return new _StateStackImpl(\n this.parent,\n this.ruleId,\n this._enterPos,\n this._anchorPos,\n this.beginRuleCapturedEOL,\n endRule,\n this.nameScopesList,\n this.contentNameScopesList\n );\n }\n // Used to warn of endless loops\n hasSameRuleAs(other) {\n let el = this;\n while (el && el._enterPos === other._enterPos) {\n if (el.ruleId === other.ruleId) {\n return true;\n }\n el = el.parent;\n }\n return false;\n }\n toStateStackFrame() {\n return {\n ruleId: ruleIdToNumber(this.ruleId),\n beginRuleCapturedEOL: this.beginRuleCapturedEOL,\n endRule: this.endRule,\n nameScopesList: this.nameScopesList?.getExtensionIfDefined(this.parent?.nameScopesList ?? null) ?? [],\n contentNameScopesList: this.contentNameScopesList?.getExtensionIfDefined(this.nameScopesList) ?? []\n };\n }\n static pushFrame(self, frame) {\n const namesScopeList = AttributedScopeStack.fromExtension(self?.nameScopesList ?? null, frame.nameScopesList);\n return new _StateStackImpl(\n self,\n ruleIdFromNumber(frame.ruleId),\n frame.enterPos ?? -1,\n frame.anchorPos ?? -1,\n frame.beginRuleCapturedEOL,\n frame.endRule,\n namesScopeList,\n AttributedScopeStack.fromExtension(namesScopeList, frame.contentNameScopesList)\n );\n }\n};\nvar BalancedBracketSelectors = class {\n balancedBracketScopes;\n unbalancedBracketScopes;\n allowAny = false;\n constructor(balancedBracketScopes, unbalancedBracketScopes) {\n this.balancedBracketScopes = balancedBracketScopes.flatMap(\n (selector) => {\n if (selector === \"*\") {\n this.allowAny = true;\n return [];\n }\n return createMatchers(selector, nameMatcher).map((m) => m.matcher);\n }\n );\n this.unbalancedBracketScopes = unbalancedBracketScopes.flatMap(\n (selector) => createMatchers(selector, nameMatcher).map((m) => m.matcher)\n );\n }\n get matchesAlways() {\n return this.allowAny && this.unbalancedBracketScopes.length === 0;\n }\n get matchesNever() {\n return this.balancedBracketScopes.length === 0 && !this.allowAny;\n }\n match(scopes) {\n for (const excluder of this.unbalancedBracketScopes) {\n if (excluder(scopes)) {\n return false;\n }\n }\n for (const includer of this.balancedBracketScopes) {\n if (includer(scopes)) {\n return true;\n }\n }\n return this.allowAny;\n }\n};\nvar LineTokens = class {\n constructor(emitBinaryTokens, lineText, tokenTypeOverrides, balancedBracketSelectors) {\n this.balancedBracketSelectors = balancedBracketSelectors;\n this._emitBinaryTokens = emitBinaryTokens;\n this._tokenTypeOverrides = tokenTypeOverrides;\n if (false) {\n this._lineText = lineText;\n } else {\n this._lineText = null;\n }\n this._tokens = [];\n this._binaryTokens = [];\n this._lastTokenEndIndex = 0;\n }\n _emitBinaryTokens;\n /**\n * defined only if `false`.\n */\n _lineText;\n /**\n * used only if `_emitBinaryTokens` is false.\n */\n _tokens;\n /**\n * used only if `_emitBinaryTokens` is true.\n */\n _binaryTokens;\n _lastTokenEndIndex;\n _tokenTypeOverrides;\n produce(stack, endIndex) {\n this.produceFromScopes(stack.contentNameScopesList, endIndex);\n }\n produceFromScopes(scopesList, endIndex) {\n if (this._lastTokenEndIndex >= endIndex) {\n return;\n }\n if (this._emitBinaryTokens) {\n let metadata = scopesList?.tokenAttributes ?? 0;\n let containsBalancedBrackets = false;\n if (this.balancedBracketSelectors?.matchesAlways) {\n containsBalancedBrackets = true;\n }\n if (this._tokenTypeOverrides.length > 0 || this.balancedBracketSelectors && !this.balancedBracketSelectors.matchesAlways && !this.balancedBracketSelectors.matchesNever) {\n const scopes2 = scopesList?.getScopeNames() ?? [];\n for (const tokenType of this._tokenTypeOverrides) {\n if (tokenType.matcher(scopes2)) {\n metadata = EncodedTokenMetadata.set(\n metadata,\n 0,\n toOptionalTokenType(tokenType.type),\n null,\n -1 /* NotSet */,\n 0,\n 0\n );\n }\n }\n if (this.balancedBracketSelectors) {\n containsBalancedBrackets = this.balancedBracketSelectors.match(scopes2);\n }\n }\n if (containsBalancedBrackets) {\n metadata = EncodedTokenMetadata.set(\n metadata,\n 0,\n 8 /* NotSet */,\n containsBalancedBrackets,\n -1 /* NotSet */,\n 0,\n 0\n );\n }\n if (this._binaryTokens.length > 0 && this._binaryTokens[this._binaryTokens.length - 1] === metadata) {\n this._lastTokenEndIndex = endIndex;\n return;\n }\n this._binaryTokens.push(this._lastTokenEndIndex);\n this._binaryTokens.push(metadata);\n this._lastTokenEndIndex = endIndex;\n return;\n }\n const scopes = scopesList?.getScopeNames() ?? [];\n this._tokens.push({\n startIndex: this._lastTokenEndIndex,\n endIndex,\n // value: lineText.substring(lastTokenEndIndex, endIndex),\n scopes\n });\n this._lastTokenEndIndex = endIndex;\n }\n getResult(stack, lineLength) {\n if (this._tokens.length > 0 && this._tokens[this._tokens.length - 1].startIndex === lineLength - 1) {\n this._tokens.pop();\n }\n if (this._tokens.length === 0) {\n this._lastTokenEndIndex = -1;\n this.produce(stack, lineLength);\n this._tokens[this._tokens.length - 1].startIndex = 0;\n }\n return this._tokens;\n }\n getBinaryResult(stack, lineLength) {\n if (this._binaryTokens.length > 0 && this._binaryTokens[this._binaryTokens.length - 2] === lineLength - 1) {\n this._binaryTokens.pop();\n this._binaryTokens.pop();\n }\n if (this._binaryTokens.length === 0) {\n this._lastTokenEndIndex = -1;\n this.produce(stack, lineLength);\n this._binaryTokens[this._binaryTokens.length - 2] = 0;\n }\n const result = new Uint32Array(this._binaryTokens.length);\n for (let i = 0, len = this._binaryTokens.length; i < len; i++) {\n result[i] = this._binaryTokens[i];\n }\n return result;\n }\n};\n\n// src/registry.ts\nvar SyncRegistry = class {\n constructor(theme, _onigLib) {\n this._onigLib = _onigLib;\n this._theme = theme;\n }\n _grammars = /* @__PURE__ */ new Map();\n _rawGrammars = /* @__PURE__ */ new Map();\n _injectionGrammars = /* @__PURE__ */ new Map();\n _theme;\n dispose() {\n for (const grammar of this._grammars.values()) {\n grammar.dispose();\n }\n }\n setTheme(theme) {\n this._theme = theme;\n }\n getColorMap() {\n return this._theme.getColorMap();\n }\n /**\n * Add `grammar` to registry and return a list of referenced scope names\n */\n addGrammar(grammar, injectionScopeNames) {\n this._rawGrammars.set(grammar.scopeName, grammar);\n if (injectionScopeNames) {\n this._injectionGrammars.set(grammar.scopeName, injectionScopeNames);\n }\n }\n /**\n * Lookup a raw grammar.\n */\n lookup(scopeName) {\n return this._rawGrammars.get(scopeName);\n }\n /**\n * Returns the injections for the given grammar\n */\n injections(targetScope) {\n return this._injectionGrammars.get(targetScope);\n }\n /**\n * Get the default theme settings\n */\n getDefaults() {\n return this._theme.getDefaults();\n }\n /**\n * Match a scope in the theme.\n */\n themeMatch(scopePath) {\n return this._theme.match(scopePath);\n }\n /**\n * Lookup a grammar.\n */\n grammarForScopeName(scopeName, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors) {\n if (!this._grammars.has(scopeName)) {\n let rawGrammar = this._rawGrammars.get(scopeName);\n if (!rawGrammar) {\n return null;\n }\n this._grammars.set(scopeName, createGrammar(\n scopeName,\n rawGrammar,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors,\n this,\n this._onigLib\n ));\n }\n return this._grammars.get(scopeName);\n }\n};\n\n// src/index.ts\nvar Registry = class {\n _options;\n _syncRegistry;\n _ensureGrammarCache;\n constructor(options) {\n this._options = options;\n this._syncRegistry = new SyncRegistry(\n Theme.createFromRawTheme(options.theme, options.colorMap),\n options.onigLib\n );\n this._ensureGrammarCache = /* @__PURE__ */ new Map();\n }\n dispose() {\n this._syncRegistry.dispose();\n }\n /**\n * Change the theme. Once called, no previous `ruleStack` should be used anymore.\n */\n setTheme(theme, colorMap) {\n this._syncRegistry.setTheme(Theme.createFromRawTheme(theme, colorMap));\n }\n /**\n * Returns a lookup array for color ids.\n */\n getColorMap() {\n return this._syncRegistry.getColorMap();\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n * Please do not use language id 0.\n */\n loadGrammarWithEmbeddedLanguages(initialScopeName, initialLanguage, embeddedLanguages) {\n return this.loadGrammarWithConfiguration(initialScopeName, initialLanguage, { embeddedLanguages });\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n * Please do not use language id 0.\n */\n loadGrammarWithConfiguration(initialScopeName, initialLanguage, configuration) {\n return this._loadGrammar(\n initialScopeName,\n initialLanguage,\n configuration.embeddedLanguages,\n configuration.tokenTypes,\n new BalancedBracketSelectors(\n configuration.balancedBracketSelectors || [],\n configuration.unbalancedBracketSelectors || []\n )\n );\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n */\n loadGrammar(initialScopeName) {\n return this._loadGrammar(initialScopeName, 0, null, null, null);\n }\n _loadGrammar(initialScopeName, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors) {\n const dependencyProcessor = new ScopeDependencyProcessor(this._syncRegistry, initialScopeName);\n while (dependencyProcessor.Q.length > 0) {\n dependencyProcessor.Q.map((request) => this._loadSingleGrammar(request.scopeName));\n dependencyProcessor.processQueue();\n }\n return this._grammarForScopeName(\n initialScopeName,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors\n );\n }\n _loadSingleGrammar(scopeName) {\n if (!this._ensureGrammarCache.has(scopeName)) {\n this._doLoadSingleGrammar(scopeName);\n this._ensureGrammarCache.set(scopeName, true);\n }\n }\n _doLoadSingleGrammar(scopeName) {\n const grammar = this._options.loadGrammar(scopeName);\n if (grammar) {\n const injections = typeof this._options.getInjections === \"function\" ? this._options.getInjections(scopeName) : void 0;\n this._syncRegistry.addGrammar(grammar, injections);\n }\n }\n /**\n * Adds a rawGrammar.\n */\n addGrammar(rawGrammar, injections = [], initialLanguage = 0, embeddedLanguages = null) {\n this._syncRegistry.addGrammar(rawGrammar, injections);\n return this._grammarForScopeName(rawGrammar.scopeName, initialLanguage, embeddedLanguages);\n }\n /**\n * Get the grammar for `scopeName`. The grammar must first be created via `loadGrammar` or `addGrammar`.\n */\n _grammarForScopeName(scopeName, initialLanguage = 0, embeddedLanguages = null, tokenTypes = null, balancedBracketSelectors = null) {\n return this._syncRegistry.grammarForScopeName(\n scopeName,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors\n );\n }\n};\nvar INITIAL = StateStackImpl.NULL;\nexport {\n EncodedTokenMetadata,\n FindOption,\n FontStyle,\n INITIAL,\n Registry,\n Theme,\n disposeOnigString\n};\n","/**\n * @import {Element, Parents, Properties} from 'hast'\n * @import {State} from '../index.js'\n */\n\nimport {ccount} from 'ccount'\nimport {stringify as commas} from 'comma-separated-tokens'\nimport {find, svg} from 'property-information'\nimport {stringify as spaces} from 'space-separated-tokens'\nimport {stringifyEntities} from 'stringify-entities'\nimport {closing} from '../omission/closing.js'\nimport {opening} from '../omission/opening.js'\n\n/**\n * Maps of subsets.\n *\n * Each value is a matrix of tuples.\n * The value at `0` causes parse errors, the value at `1` is valid.\n * Of both, the value at `0` is unsafe, and the value at `1` is safe.\n *\n * @type {Record<'double' | 'name' | 'single' | 'unquoted', Array<[Array<string>, Array<string>]>>}\n */\nconst constants = {\n // See: <https://html.spec.whatwg.org/#attribute-name-state>.\n name: [\n ['\\t\\n\\f\\r &/=>'.split(''), '\\t\\n\\f\\r \"&\\'/=>`'.split('')],\n ['\\0\\t\\n\\f\\r \"&\\'/<=>'.split(''), '\\0\\t\\n\\f\\r \"&\\'/<=>`'.split('')]\n ],\n // See: <https://html.spec.whatwg.org/#attribute-value-(unquoted)-state>.\n unquoted: [\n ['\\t\\n\\f\\r &>'.split(''), '\\0\\t\\n\\f\\r \"&\\'<=>`'.split('')],\n ['\\0\\t\\n\\f\\r \"&\\'<=>`'.split(''), '\\0\\t\\n\\f\\r \"&\\'<=>`'.split('')]\n ],\n // See: <https://html.spec.whatwg.org/#attribute-value-(single-quoted)-state>.\n single: [\n [\"&'\".split(''), '\"&\\'`'.split('')],\n [\"\\0&'\".split(''), '\\0\"&\\'`'.split('')]\n ],\n // See: <https://html.spec.whatwg.org/#attribute-value-(double-quoted)-state>.\n double: [\n ['\"&'.split(''), '\"&\\'`'.split('')],\n ['\\0\"&'.split(''), '\\0\"&\\'`'.split('')]\n ]\n}\n\n/**\n * Serialize an element node.\n *\n * @param {Element} node\n * Node to handle.\n * @param {number | undefined} index\n * Index of `node` in `parent.\n * @param {Parents | undefined} parent\n * Parent of `node`.\n * @param {State} state\n * Info passed around about the current state.\n * @returns {string}\n * Serialized node.\n */\nexport function element(node, index, parent, state) {\n const schema = state.schema\n const omit = schema.space === 'svg' ? false : state.settings.omitOptionalTags\n let selfClosing =\n schema.space === 'svg'\n ? state.settings.closeEmptyElements\n : state.settings.voids.includes(node.tagName.toLowerCase())\n /** @type {Array<string>} */\n const parts = []\n /** @type {string} */\n let last\n\n if (schema.space === 'html' && node.tagName === 'svg') {\n state.schema = svg\n }\n\n const attributes = serializeAttributes(state, node.properties)\n\n const content = state.all(\n schema.space === 'html' && node.tagName === 'template' ? node.content : node\n )\n\n state.schema = schema\n\n // If the node is categorised as void, but it has children, remove the\n // categorisation.\n // This enables for example `menuitem`s, which are void in W3C HTML but not\n // void in WHATWG HTML, to be stringified properly.\n // Note: `menuitem` has since been removed from the HTML spec, and so is no\n // longer void.\n if (content) selfClosing = false\n\n if (attributes || !omit || !opening(node, index, parent)) {\n parts.push('<', node.tagName, attributes ? ' ' + attributes : '')\n\n if (\n selfClosing &&\n (schema.space === 'svg' || state.settings.closeSelfClosing)\n ) {\n last = attributes.charAt(attributes.length - 1)\n if (\n !state.settings.tightSelfClosing ||\n last === '/' ||\n (last && last !== '\"' && last !== \"'\")\n ) {\n parts.push(' ')\n }\n\n parts.push('/')\n }\n\n parts.push('>')\n }\n\n parts.push(content)\n\n if (!selfClosing && (!omit || !closing(node, index, parent))) {\n parts.push('</' + node.tagName + '>')\n }\n\n return parts.join('')\n}\n\n/**\n * @param {State} state\n * @param {Properties | null | undefined} properties\n * @returns {string}\n */\nfunction serializeAttributes(state, properties) {\n /** @type {Array<string>} */\n const values = []\n let index = -1\n /** @type {string} */\n let key\n\n if (properties) {\n for (key in properties) {\n if (properties[key] !== null && properties[key] !== undefined) {\n const value = serializeAttribute(state, key, properties[key])\n if (value) values.push(value)\n }\n }\n }\n\n while (++index < values.length) {\n const last = state.settings.tightAttributes\n ? values[index].charAt(values[index].length - 1)\n : undefined\n\n // In tight mode, don’t add a space after quoted attributes.\n if (index !== values.length - 1 && last !== '\"' && last !== \"'\") {\n values[index] += ' '\n }\n }\n\n return values.join('')\n}\n\n/**\n * @param {State} state\n * @param {string} key\n * @param {Properties[keyof Properties]} value\n * @returns {string}\n */\nfunction serializeAttribute(state, key, value) {\n const info = find(state.schema, key)\n const x =\n state.settings.allowParseErrors && state.schema.space === 'html' ? 0 : 1\n const y = state.settings.allowDangerousCharacters ? 0 : 1\n let quote = state.quote\n /** @type {string | undefined} */\n let result\n\n if (info.overloadedBoolean && (value === info.attribute || value === '')) {\n value = true\n } else if (\n (info.boolean || info.overloadedBoolean) &&\n (typeof value !== 'string' || value === info.attribute || value === '')\n ) {\n value = Boolean(value)\n }\n\n if (\n value === null ||\n value === undefined ||\n value === false ||\n (typeof value === 'number' && Number.isNaN(value))\n ) {\n return ''\n }\n\n const name = stringifyEntities(\n info.attribute,\n Object.assign({}, state.settings.characterReferences, {\n // Always encode without parse errors in non-HTML.\n subset: constants.name[x][y]\n })\n )\n\n // No value.\n // There is currently only one boolean property in SVG: `[download]` on\n // `<a>`.\n // This property does not seem to work in browsers (Firefox, Safari, Chrome),\n // so I can’t test if dropping the value works.\n // But I assume that it should:\n //\n // ```html\n // <!doctype html>\n // <svg viewBox=\"0 0 100 100\">\n // <a href=https://example.com download>\n // <circle cx=50 cy=40 r=35 />\n // </a>\n // </svg>\n // ```\n //\n // See: <https://github.com/wooorm/property-information/blob/main/lib/svg.js>\n if (value === true) return name\n\n // `spaces` doesn’t accept a second argument, but it’s given here just to\n // keep the code cleaner.\n value = Array.isArray(value)\n ? (info.commaSeparated ? commas : spaces)(value, {\n padLeft: !state.settings.tightCommaSeparatedLists\n })\n : String(value)\n\n if (state.settings.collapseEmptyAttributes && !value) return name\n\n // Check unquoted value.\n if (state.settings.preferUnquoted) {\n result = stringifyEntities(\n value,\n Object.assign({}, state.settings.characterReferences, {\n attribute: true,\n subset: constants.unquoted[x][y]\n })\n )\n }\n\n // If we don’t want unquoted, or if `value` contains character references when\n // unquoted…\n if (result !== value) {\n // If the alternative is less common than `quote`, switch.\n if (\n state.settings.quoteSmart &&\n ccount(value, quote) > ccount(value, state.alternative)\n ) {\n quote = state.alternative\n }\n\n result =\n quote +\n stringifyEntities(\n value,\n Object.assign({}, state.settings.characterReferences, {\n // Always encode without parse errors in non-HTML.\n subset: (quote === \"'\" ? constants.single : constants.double)[x][y],\n attribute: true\n })\n ) +\n quote\n }\n\n // Don’t add a `=` for unquoted empties.\n return name + (result ? '=' + result : result)\n}\n","import {incrementIfAtLeast, noncapturingDelim, spliceStr} from './utils-internals.js';\nimport {Context, replaceUnescaped} from 'regex-utilities';\n\nconst atomicPluginToken = new RegExp(String.raw`(?<noncapturingStart>${noncapturingDelim})|(?<capturingStart>\\((?:\\?<[^>]+>)?)|\\\\?.`, 'gsu');\n\n/**\nApply transformations for atomic groups: `(?>…)`.\n@param {string} expression\n@param {import('./regex.js').PluginData} [data]\n@returns {Required<import('./regex.js').PluginResult>}\n*/\nfunction atomic(expression, data) {\n const hiddenCaptures = data?.hiddenCaptures ?? [];\n // Capture transfer is used by <github.com/slevithan/oniguruma-to-es>\n let captureTransfers = data?.captureTransfers ?? new Map();\n if (!/\\(\\?>/.test(expression)) {\n return {\n pattern: expression,\n captureTransfers,\n hiddenCaptures,\n };\n }\n\n const aGDelim = '(?>';\n const emulatedAGDelim = '(?:(?=(';\n const captureNumMap = [0];\n const addedHiddenCaptures = [];\n let numCapturesBeforeAG = 0;\n let numAGs = 0;\n let aGPos = NaN;\n let hasProcessedAG;\n do {\n hasProcessedAG = false;\n let numCharClassesOpen = 0;\n let numGroupsOpenInAG = 0;\n let inAG = false;\n let match;\n atomicPluginToken.lastIndex = Number.isNaN(aGPos) ? 0 : aGPos + emulatedAGDelim.length;\n while (match = atomicPluginToken.exec(expression)) {\n const {0: m, index, groups: {capturingStart, noncapturingStart}} = match;\n if (m === '[') {\n numCharClassesOpen++;\n } else if (!numCharClassesOpen) {\n\n if (m === aGDelim && !inAG) {\n aGPos = index;\n inAG = true;\n } else if (inAG && noncapturingStart) {\n numGroupsOpenInAG++;\n } else if (capturingStart) {\n if (inAG) {\n numGroupsOpenInAG++;\n } else {\n numCapturesBeforeAG++;\n captureNumMap.push(numCapturesBeforeAG + numAGs);\n }\n } else if (m === ')' && inAG) {\n if (!numGroupsOpenInAG) {\n numAGs++;\n const addedCaptureNum = numCapturesBeforeAG + numAGs;\n // Replace `expression` and use `<$$N>` as a temporary wrapper for the backref so it\n // can avoid backref renumbering afterward. Wrap the whole substitution (including the\n // lookahead and following backref) in a noncapturing group to handle following\n // quantifiers and literal digits\n expression = `${expression.slice(0, aGPos)}${emulatedAGDelim}${\n expression.slice(aGPos + aGDelim.length, index)\n }))<$$${addedCaptureNum}>)${expression.slice(index + 1)}`;\n hasProcessedAG = true;\n addedHiddenCaptures.push(addedCaptureNum);\n incrementIfAtLeast(hiddenCaptures, addedCaptureNum);\n if (captureTransfers.size) {\n const newCaptureTransfers = new Map();\n captureTransfers.forEach((from, to) => {\n newCaptureTransfers.set(\n to >= addedCaptureNum ? to + 1 : to,\n from.map(f => f >= addedCaptureNum ? f + 1 : f)\n );\n });\n captureTransfers = newCaptureTransfers;\n }\n break;\n }\n numGroupsOpenInAG--;\n }\n\n } else if (m === ']') {\n numCharClassesOpen--;\n }\n }\n // Start over from the beginning of the atomic group's contents, in case the processed group\n // contains additional atomic groups\n } while (hasProcessedAG);\n\n hiddenCaptures.push(...addedHiddenCaptures);\n\n // Second pass to adjust numbered backrefs\n expression = replaceUnescaped(\n expression,\n String.raw`\\\\(?<backrefNum>[1-9]\\d*)|<\\$\\$(?<wrappedBackrefNum>\\d+)>`,\n ({0: m, groups: {backrefNum, wrappedBackrefNum}}) => {\n if (backrefNum) {\n const bNum = +backrefNum;\n if (bNum > captureNumMap.length - 1) {\n throw new Error(`Backref \"${m}\" greater than number of captures`);\n }\n return `\\\\${captureNumMap[bNum]}`;\n }\n return `\\\\${wrappedBackrefNum}`;\n },\n Context.DEFAULT\n );\n\n return {\n pattern: expression,\n captureTransfers,\n hiddenCaptures,\n };\n}\n\nconst baseQuantifier = String.raw`(?:[?*+]|\\{\\d+(?:,\\d*)?\\})`;\n// Complete tokenizer for base syntax; doesn't (need to) know about character-class-only syntax\nconst possessivePluginToken = new RegExp(String.raw`\n\\\\(?: \\d+\n | c[A-Za-z]\n | [gk]<[^>]+>\n | [pPu]\\{[^\\}]+\\}\n | u[A-Fa-f\\d]{4}\n | x[A-Fa-f\\d]{2}\n )\n| \\((?: \\? (?: [:=!>]\n | <(?:[=!]|[^>]+>)\n | [A-Za-z\\-]+:\n | \\(DEFINE\\)\n ))?\n| (?<qBase>${baseQuantifier})(?<qMod>[?+]?)(?<invalidQ>[?*+\\{]?)\n| \\\\?.\n`.replace(/\\s+/g, ''), 'gsu');\n\n/**\nTransform posessive quantifiers into atomic groups. The posessessive quantifiers are:\n`?+`, `*+`, `++`, `{N}+`, `{N,}+`, `{N,N}+`.\nThis follows Java, PCRE, Perl, and Python.\nPossessive quantifiers in Oniguruma and Onigmo are only: `?+`, `*+`, `++`.\n@param {string} expression\n@returns {import('./regex.js').PluginResult}\n*/\nfunction possessive(expression) {\n if (!(new RegExp(`${baseQuantifier}\\\\+`).test(expression))) {\n return {\n pattern: expression,\n };\n }\n\n const openGroupIndices = [];\n let lastGroupIndex = null;\n let lastCharClassIndex = null;\n let lastToken = '';\n let numCharClassesOpen = 0;\n let match;\n possessivePluginToken.lastIndex = 0;\n while (match = possessivePluginToken.exec(expression)) {\n const {0: m, index, groups: {qBase, qMod, invalidQ}} = match;\n if (m === '[') {\n if (!numCharClassesOpen) {\n lastCharClassIndex = index;\n }\n numCharClassesOpen++;\n } else if (m === ']') {\n if (numCharClassesOpen) {\n numCharClassesOpen--;\n // Unmatched `]`\n } else {\n lastCharClassIndex = null;\n }\n } else if (!numCharClassesOpen) {\n\n if (qMod === '+' && lastToken && !lastToken.startsWith('(')) {\n // Invalid following quantifier would become valid via the wrapping group\n if (invalidQ) {\n throw new Error(`Invalid quantifier \"${m}\"`);\n }\n let charsAdded = -1; // -1 for removed trailing `+`\n // Possessivizing fixed repetition quantifiers like `{2}` does't change their behavior, so\n // avoid doing so (convert them to greedy)\n if (/^\\{\\d+\\}$/.test(qBase)) {\n expression = spliceStr(expression, index + qBase.length, qMod, '');\n } else {\n if (lastToken === ')' || lastToken === ']') {\n const nodeIndex = lastToken === ')' ? lastGroupIndex : lastCharClassIndex;\n // Unmatched `)` would break out of the wrapping group and mess with handling.\n // Unmatched `]` wouldn't be a problem, but it's unnecessary to have dedicated support\n // for unescaped `]++` since this won't work with flag u or v anyway\n if (nodeIndex === null) {\n throw new Error(`Invalid unmatched \"${lastToken}\"`);\n }\n expression = `${expression.slice(0, nodeIndex)}(?>${expression.slice(nodeIndex, index)}${qBase})${expression.slice(index + m.length)}`;\n } else {\n expression = `${expression.slice(0, index - lastToken.length)}(?>${lastToken}${qBase})${expression.slice(index + m.length)}`;\n }\n charsAdded += 4; // `(?>)`\n }\n possessivePluginToken.lastIndex += charsAdded;\n } else if (m[0] === '(') {\n openGroupIndices.push(index);\n } else if (m === ')') {\n lastGroupIndex = openGroupIndices.length ? openGroupIndices.pop() : null;\n }\n\n }\n lastToken = m;\n }\n\n return {\n pattern: expression,\n };\n}\n\nexport {\n atomic,\n possessive,\n};\n","import {cp, r} from './utils.js';\n\nconst CharsWithoutIgnoreCaseExpansion = new Set([\n cp(0x130), // İ\n cp(0x131), // ı\n]);\n\nfunction getIgnoreCaseMatchChars(char) {\n // Some chars should not match the chars they case swap to\n if (CharsWithoutIgnoreCaseExpansion.has(char)) {\n return [char];\n }\n const set = new Set();\n const lower = char.toLowerCase();\n // Everything else is based on `lower`\n const upper = lower.toUpperCase();\n const title = LowerToTitleCaseMap.get(lower);\n const altLower = LowerToAlternativeLowerCaseMap.get(lower);\n const altUpper = LowerToAlternativeUpperCaseMap.get(lower);\n // Exclude ucase if multiple chars; count code point length. Excludes ucase versions of German\n // es-zed 'ß', ligatures like 'ff', and chars with no precomposed ucase like 'ʼn'. See\n // <unicode.org/Public/UNIDATA/SpecialCasing.txt>\n if ([...upper].length === 1) {\n set.add(upper);\n }\n altUpper && set.add(altUpper);\n title && set.add(title);\n // Lcase of 'İ' is multiple chars, but it's excluded by `CharsWithoutIgnoreCaseExpansion`\n set.add(lower);\n altLower && set.add(altLower);\n return [...set];\n}\n\n// The following set includes:\n// - All ES2024 general categories and their aliases (all are supported by Oniguruma). See\n// <github.com/mathiasbynens/unicode-match-property-value-ecmascript/blob/main/data/mappings.js>\n// - All ES2024 binary properties and their aliases (all are supported by Oniguruma). See\n// <tc39.es/ecma262/multipage/text-processing.html#table-binary-unicode-properties>\n// Unicode properties must be mapped to property names supported by JS, and must also apply JS's\n// stricter rules for casing, whitespace, and underscores in Unicode property names. In order to\n// remain lightweight, this library assumes properties not in this list are Unicode script names\n// (which require a `Script=` or `sc=` prefix in JS). Unlike JS, Oniguruma doesn't support script\n// extensions, and it supports some properties that aren't supported in JS (including blocks with\n// an `In_` prefix). See also:\n// - Properties supported in Oniguruma: <github.com/kkos/oniguruma/blob/master/doc/UNICODE_PROPERTIES>\n// - Properties supported in JS by spec version: <github.com/eslint-community/regexpp/blob/main/src/unicode/properties.ts>\nconst JsUnicodeProperties = new Set(\n`C Other\nCc Control cntrl\nCf Format\nCn Unassigned\nCo Private_Use\nCs Surrogate\nL Letter\nLC Cased_Letter\nLl Lowercase_Letter\nLm Modifier_Letter\nLo Other_Letter\nLt Titlecase_Letter\nLu Uppercase_Letter\nM Mark Combining_Mark\nMc Spacing_Mark\nMe Enclosing_Mark\nMn Nonspacing_Mark\nN Number\nNd Decimal_Number digit\nNl Letter_Number\nNo Other_Number\nP Punctuation punct\nPc Connector_Punctuation\nPd Dash_Punctuation\nPe Close_Punctuation\nPf Final_Punctuation\nPi Initial_Punctuation\nPo Other_Punctuation\nPs Open_Punctuation\nS Symbol\nSc Currency_Symbol\nSk Modifier_Symbol\nSm Math_Symbol\nSo Other_Symbol\nZ Separator\nZl Line_Separator\nZp Paragraph_Separator\nZs Space_Separator\nASCII\nASCII_Hex_Digit AHex\nAlphabetic Alpha\nAny\nAssigned\nBidi_Control Bidi_C\nBidi_Mirrored Bidi_M\nCase_Ignorable CI\nCased\nChanges_When_Casefolded CWCF\nChanges_When_Casemapped CWCM\nChanges_When_Lowercased CWL\nChanges_When_NFKC_Casefolded CWKCF\nChanges_When_Titlecased CWT\nChanges_When_Uppercased CWU\nDash\nDefault_Ignorable_Code_Point DI\nDeprecated Dep\nDiacritic Dia\nEmoji\nEmoji_Component EComp\nEmoji_Modifier EMod\nEmoji_Modifier_Base EBase\nEmoji_Presentation EPres\nExtended_Pictographic ExtPict\nExtender Ext\nGrapheme_Base Gr_Base\nGrapheme_Extend Gr_Ext\nHex_Digit Hex\nIDS_Binary_Operator IDSB\nIDS_Trinary_Operator IDST\nID_Continue IDC\nID_Start IDS\nIdeographic Ideo\nJoin_Control Join_C\nLogical_Order_Exception LOE\nLowercase Lower\nMath\nNoncharacter_Code_Point NChar\nPattern_Syntax Pat_Syn\nPattern_White_Space Pat_WS\nQuotation_Mark QMark\nRadical\nRegional_Indicator RI\nSentence_Terminal STerm\nSoft_Dotted SD\nTerminal_Punctuation Term\nUnified_Ideograph UIdeo\nUppercase Upper\nVariation_Selector VS\nWhite_Space space\nXID_Continue XIDC\nXID_Start XIDS`.split(/\\s/)\n);\n\nconst JsUnicodePropertiesMap = new Map();\nfor (const p of JsUnicodeProperties) {\n JsUnicodePropertiesMap.set(slug(p), p);\n}\n\nconst JsUnicodePropertiesOfStrings = new Set([\n // ES2024 properties of strings; none are supported by Oniguruma\n 'Basic_Emoji',\n 'Emoji_Keycap_Sequence',\n 'RGI_Emoji',\n 'RGI_Emoji_Flag_Sequence',\n 'RGI_Emoji_Modifier_Sequence',\n 'RGI_Emoji_Tag_Sequence',\n 'RGI_Emoji_ZWJ_Sequence',\n]);\n\nconst JsUnicodePropertiesOfStringsMap = new Map();\nfor (const p of JsUnicodePropertiesOfStrings) {\n JsUnicodePropertiesOfStringsMap.set(slug(p), p);\n}\n\nconst LowerToAlternativeLowerCaseMap = new Map([\n ['s', cp(0x17F)], // s, ſ\n [cp(0x17F), 's'], // ſ, s\n]);\n\nconst LowerToAlternativeUpperCaseMap = new Map([\n [cp(0xDF), cp(0x1E9E)], // ß, ẞ\n [cp(0x6B), cp(0x212A)], // k, K (Kelvin)\n [cp(0xE5), cp(0x212B)], // å, Å (Angstrom)\n [cp(0x3C9), cp(0x2126)], // ω, Ω (Ohm)\n]);\n\n// See <github.com/node-unicode/unicode-16.0.0/tree/main/General_Category/Titlecase_Letter>\nconst LowerToTitleCaseMap = new Map([\n titleEntry(0x1C5),\n titleEntry(0x1C8),\n titleEntry(0x1CB),\n titleEntry(0x1F2),\n ...titleRange(0x1F88, 0x1F8F),\n ...titleRange(0x1F98, 0x1F9F),\n ...titleRange(0x1FA8, 0x1FAF),\n titleEntry(0x1FBC),\n titleEntry(0x1FCC),\n titleEntry(0x1FFC),\n]);\n\n// Unlike Oniguruma's Unicode properties via `\\p` and `\\P`, these names are case sensitive and\n// don't allow inserting whitespace and underscores. Definitions at\n// <github.com/kkos/oniguruma/blob/master/doc/RE> (see: POSIX bracket: Unicode Case)\n// Note: Handling in the transformer assumes all values here are a single, negateable node that's\n// not pre-negated at the top level. It also uses ASCII versions of `graph` and `print` for target\n// `ES2018` (which doesn't allow intersection) if `accuracy` isn't `strict`\nconst PosixClassesMap = new Map([\n ['alnum', r`[\\p{Alpha}\\p{Nd}]`],\n ['alpha', r`\\p{Alpha}`],\n ['ascii', r`\\p{ASCII}`],\n ['blank', r`[\\p{Zs}\\t]`],\n ['cntrl', r`\\p{cntrl}`],\n ['digit', r`\\p{Nd}`],\n ['graph', r`[\\P{space}&&\\P{cntrl}&&\\P{Cn}&&\\P{Cs}]`],\n ['lower', r`\\p{Lower}`],\n ['print', r`[[\\P{space}&&\\P{cntrl}&&\\P{Cn}&&\\P{Cs}]\\p{Zs}]`],\n ['punct', r`[\\p{P}\\p{S}]`], // New value from Oniguruma 6.9.9\n ['space', r`\\p{space}`],\n ['upper', r`\\p{Upper}`],\n ['word', r`[\\p{Alpha}\\p{M}\\p{Nd}\\p{Pc}]`],\n ['xdigit', r`\\p{AHex}`],\n]);\n\n// Apart from the property names provided by Unicode, Oniguruma explicitly adds several names (see\n// <github.com/kkos/oniguruma/blob/master/doc/RE>) that can be used within `\\p{}` and `\\P{}` (those\n// below). These should be listed here in lowercase, though they aren't case sensitive when used\nconst PosixProperties = new Set([\n 'alnum',\n 'blank',\n 'graph',\n 'print',\n 'word',\n 'xdigit',\n // The following are available with the same name in JS (see `JsUnicodeProperties`), so can be\n // handled as standard Unicode properties\n // 'alpha', // (JS: Alpha)\n // 'ascii', // (JS: ASCII)\n // 'cntrl', // (JS: cntrl)\n // 'digit', // (JS: digit)\n // 'lower', // (JS: Lower)\n // 'punct', // (JS: punct)\n // 'space', // (JS: space)\n // 'upper', // (JS: Upper)\n]);\n\nfunction range(start, end) {\n // const range = Array.from(Array(end + 1 - start), (_, i) => i + start);\n // const range = Array(end + 1 - start).fill(start).map((x, i) => x + i);\n const range = [];\n for (let i = start; i <= end; i++) {\n range.push(i);\n }\n return range;\n}\n\n// Generates a Unicode property lookup name: lowercase, without spaces, hyphens, underscores\nfunction slug(name) {\n return name.replace(/[- _]+/g, '').toLowerCase();\n}\n\nfunction titleEntry(codePoint) {\n const char = cp(codePoint);\n return [char.toLowerCase(), char];\n}\n\nfunction titleRange(start, end) {\n return range(start, end).map(codePoint => titleEntry(codePoint));\n}\n\nconst UnicodePropertiesWithSpecificCase = new Set([\n 'Lower', 'Lowercase',\n 'Upper', 'Uppercase',\n 'Ll', 'Lowercase_Letter',\n 'Lt', 'Titlecase_Letter',\n 'Lu', 'Uppercase_Letter',\n // The `Changes_When_*` properties (and their aliases) could be included, but they're very rare.\n // Some other properties include a handful of chars with specific cases only, but these chars are\n // generally extreme edge cases and using such properties case insensitively generally produces\n // undesired behavior anyway\n]);\n\nexport {\n getIgnoreCaseMatchChars,\n JsUnicodeProperties,\n JsUnicodePropertiesMap,\n JsUnicodePropertiesOfStringsMap,\n PosixClassesMap,\n PosixProperties,\n slug,\n UnicodePropertiesWithSpecificCase,\n};\n","import {PosixClassesMap} from './unicode.js';\nimport {r} from './utils.js';\n\nconst TokenTypes = /** @type {const} */ ({\n Alternator: 'Alternator',\n Assertion: 'Assertion',\n Backreference: 'Backreference',\n Character: 'Character',\n CharacterClassClose: 'CharacterClassClose',\n CharacterClassHyphen: 'CharacterClassHyphen',\n CharacterClassIntersector: 'CharacterClassIntersector',\n CharacterClassOpen: 'CharacterClassOpen',\n CharacterSet: 'CharacterSet',\n Directive: 'Directive',\n GroupClose: 'GroupClose',\n GroupOpen: 'GroupOpen',\n Subroutine: 'Subroutine',\n Quantifier: 'Quantifier',\n // These aren't allowed in char classes, so they aren't equivalent to JS `[\\q{}]`\n VariableLengthCharacterSet: 'VariableLengthCharacterSet',\n // Intermediate representation not included in results\n EscapedNumber: 'EscapedNumber',\n});\n\nconst TokenCharacterSetKinds = {\n any: 'any',\n digit: 'digit',\n dot: 'dot',\n hex: 'hex',\n non_newline: 'non_newline',\n posix: 'posix',\n property: 'property',\n space: 'space',\n word: 'word',\n};\n\nconst TokenDirectiveKinds = {\n flags: 'flags',\n keep: 'keep',\n};\n\nconst TokenGroupKinds = {\n absent_repeater: 'absent_repeater',\n atomic: 'atomic',\n capturing: 'capturing',\n group: 'group',\n lookahead: 'lookahead',\n lookbehind: 'lookbehind',\n};\n\nconst EscapeCharCodes = new Map([\n ['a', 7], // alert/bell (Not available in JS)\n ['b', 8], // backspace (only in char classes)\n ['e', 27], // escape (Not available in JS)\n ['f', 12], // form feed\n ['n', 10], // line feed\n ['r', 13], // carriage return\n ['t', 9], // horizontal tab\n ['v', 11], // vertical tab\n]);\n\nconst charClassOpenPattern = r`\\[\\^?`;\nconst sharedEscapesPattern = `${\n // Control char\n 'c.? | C(?:-.?)?'\n}|${\n // Unicode property; Onig considers `\\p` an identity escape, but e.g. `\\p{`, `\\p{ ^L}`, and\n // `\\p{gc=L}` are invalid\n r`[pP]\\{(?:\\^?[-\\x20_]*[A-Za-z][-\\x20\\w]*\\})?`\n}|${\n // Hex encoded byte sequence; attempt match before other `\\xNN` hex char\n r`x[89A-Fa-f]\\p{AHex}(?:\\\\x[89A-Fa-f]\\p{AHex})*`\n}|${\n // Hex char\n r`u(?:\\p{AHex}{4})? | x\\{[^\\}]*\\}? | x\\p{AHex}{0,2}`\n}|${\n // Enclosed octal code point\n r`o\\{[^\\}]*\\}?`\n}|${\n // Escaped number\n r`\\d{1,3}`\n}`;\n// Even with flag x, Onig doesn't allow whitespace to separate a quantifier from the `?` or `+`\n// that makes it lazy or possessive. Possessive suffixes don't apply to interval quantifiers\nconst quantifierRe = /[?*+][?+]?|\\{(?:\\d+(?:,\\d*)?|,\\d+)\\}\\??/;\nconst tokenRe = new RegExp(r`\n \\\\ (?:\n ${sharedEscapesPattern}\n | [gk]<[^>]*>?\n | [gk]'[^']*'?\n | .\n )\n | \\( (?: \\? (?:\n [:=!>(]\n | <[=!]\n | <[^>]*>\n | '[^']*'\n | ~\\|?\n | # (?:[^)\\\\] | \\\\.?)*\n | [imx\\-]+[:)]\n )?)?\n | ${quantifierRe.source}\n | ${charClassOpenPattern}\n | .\n`.replace(/\\s+/g, ''), 'gsu');\nconst charClassTokenRe = new RegExp(r`\n \\\\ (?:\n ${sharedEscapesPattern}\n | .\n )\n | \\[:(?:\\^?\\p{Alpha}+|\\^):\\]\n | ${charClassOpenPattern}\n | &&\n | .\n`.replace(/\\s+/g, ''), 'gsu');\n\n/**\n@typedef {{\n type: keyof TokenTypes;\n raw: string;\n [key: string]: string | number | boolean;\n}} Token\n@typedef {{\n tokens: Array<Token>;\n flags: {\n dotAll: boolean;\n extended: boolean;\n ignoreCase: boolean;\n };\n rules: {\n captureGroup: boolean;\n singleline: boolean;\n };\n}} TokenizerResult\n*/\n/**\n@param {string} pattern Oniguruma pattern.\n@param {string} [flags] Oniguruma flags.\n@param {{\n captureGroup?: boolean;\n singleline?: boolean;\n}} [rules] Oniguruma compile-time options.\n@returns {TokenizerResult}\n*/\nfunction tokenize(pattern, flags = '', rules) {\n rules = {\n // `ONIG_OPTION_CAPTURE_GROUP`\n captureGroup: false,\n // `ONIG_OPTION_SINGLELINE`\n singleline: false,\n ...rules,\n };\n if (typeof pattern !== 'string') {\n throw new Error('String expected as pattern');\n }\n if (!/^[imxDSW]*$/.test(flags)) {\n throw new Error(`Flags \"${flags}\" includes unsupported value`);\n }\n const extended = flags.includes('x');\n const xStack = [extended];\n const context = {\n captureGroup: rules.captureGroup,\n getCurrentModX: () => xStack.at(-1),\n numOpenGroups: 0,\n popModX() {xStack.pop()},\n pushModX(isXOn) {xStack.push(isXOn)},\n replaceCurrentModX(isXOn) {xStack[xStack.length - 1] = isXOn},\n singleline: rules.singleline,\n };\n let tokens = [];\n let match;\n tokenRe.lastIndex = 0;\n while ((match = tokenRe.exec(pattern))) {\n const result = getTokenWithDetails(context, pattern, match[0], tokenRe.lastIndex);\n if (result.tokens) {\n tokens.push(...result.tokens);\n } else if (result.token) {\n tokens.push(result.token);\n }\n if (result.lastIndex !== undefined) {\n tokenRe.lastIndex = result.lastIndex;\n }\n }\n\n const potentialUnnamedCaptureTokens = [];\n let numNamedAndOptInUnnamedCaptures = 0;\n tokens.forEach(t => {\n if (t.type === TokenTypes.GroupOpen) {\n if (t.kind === TokenGroupKinds.capturing) {\n t.number = ++numNamedAndOptInUnnamedCaptures;\n } else if (t.raw === '(') {\n potentialUnnamedCaptureTokens.push(t);\n }\n }\n });\n // Enable unnamed capturing groups if no named captures (when `captureGroup` not enabled)\n if (!numNamedAndOptInUnnamedCaptures) {\n potentialUnnamedCaptureTokens.forEach((t, i) => {\n t.kind = TokenGroupKinds.capturing;\n t.number = i + 1;\n });\n }\n const numCaptures = numNamedAndOptInUnnamedCaptures || potentialUnnamedCaptureTokens.length;\n // Can now split escaped nums accurately, accounting for number of captures\n tokens = tokens.map(\n t => t.type === TokenTypes.EscapedNumber ? splitEscapedNumToken(t, numCaptures) : t\n ).flat();\n\n return {\n tokens,\n flags: {\n ignoreCase: flags.includes('i'),\n // Flag m is called `multiline` in Onig, but that has a different meaning in JS. Onig flag m\n // is equivalent to JS flag s\n dotAll: flags.includes('m'),\n // Flag x is fully handled during tokenization\n extended,\n // Flags D, S, W are currently only supported as top-level flags\n digitIsAscii: flags.includes('D'),\n spaceIsAscii: flags.includes('S'),\n wordIsAscii: flags.includes('W'),\n },\n rules,\n };\n}\n\nfunction getTokenWithDetails(context, pattern, m, lastIndex) {\n const [m0, m1, m2] = m;\n if (m0 === '[') {\n const result = getAllTokensForCharClass(pattern, m, lastIndex);\n return {\n // Array of all of the char class's tokens\n tokens: result.tokens,\n // Jump forward to the end of the char class\n lastIndex: result.lastIndex,\n };\n }\n if (m0 === '\\\\') {\n if ('AbBGzZ'.includes(m1)) {\n return {\n token: createToken(TokenTypes.Assertion, m, {\n kind: m,\n }),\n };\n }\n if (/^\\\\g[<']/.test(m)) {\n if (!/^\\\\g(?:<[^>]+>|'[^']+')$/.test(m)) {\n throw new Error(`Invalid group name \"${m}\"`);\n }\n return {\n token: createToken(TokenTypes.Subroutine, m),\n };\n }\n if (/^\\\\k[<']/.test(m)) {\n if (!/^\\\\k(?:<[^>]+>|'[^']+')$/.test(m)) {\n throw new Error(`Invalid group name \"${m}\"`);\n }\n return {\n token: createToken(TokenTypes.Backreference, m),\n };\n }\n if (m1 === 'K') {\n return {\n token: createToken(TokenTypes.Directive, m, {\n kind: TokenDirectiveKinds.keep,\n }),\n };\n }\n if (m1 === 'N') {\n return {\n token: createToken(TokenTypes.CharacterSet, m, {\n kind: TokenCharacterSetKinds.non_newline,\n }),\n };\n }\n if (m1 === 'O') {\n return {\n token: createToken(TokenTypes.CharacterSet, m, {\n kind: TokenCharacterSetKinds.any,\n }),\n };\n }\n if ('RX'.includes(m1)) {\n return {\n token: createToken(TokenTypes.VariableLengthCharacterSet, m, {\n kind: m,\n }),\n };\n }\n // Grapheme boundaries not yet unsupported; avoid treating as an identity escape\n if ('yY'.includes(m1)) {\n throw new Error(`Unsupported grapheme boundary \"${m}\"`);\n }\n // Run last since it assumes an identity escape as final condition\n const result = createTokenForSharedEscape(m, {inCharClass: false});\n return Array.isArray(result) ? {tokens: result} : {token: result};\n }\n if (m0 === '(') {\n // Comment group\n if (m2 === '#') {\n // The closing unescaped `)` isn't included in the match\n if (pattern[lastIndex] !== ')') {\n throw new Error('Unclosed comment group \"(?#\"');\n }\n return {\n lastIndex: lastIndex + 1,\n };\n }\n // Flag modifier (directive or group opener); allows solo `-`\n if ('-imx'.includes(m2)) {\n return {\n token: createTokenForFlagMod(m, context),\n };\n }\n // Remaining group types all reuse current flag x status\n context.pushModX(context.getCurrentModX());\n context.numOpenGroups++;\n if (\n // Unnamed capture if no named captures present and `captureGroup` not enabled, else\n // noncapturing group\n (m === '(' && !context.captureGroup) ||\n // Noncapturing group\n m === '(?:'\n ) {\n return {\n token: createToken(TokenTypes.GroupOpen, m, {\n // For `(`, will later change to `capturing` and add `number` prop if no named captures\n kind: TokenGroupKinds.group,\n }),\n };\n }\n // Atomic group\n if (m === '(?>') {\n return {\n token: createToken(TokenTypes.GroupOpen, m, {\n kind: TokenGroupKinds.atomic,\n }),\n };\n }\n // Lookaround\n if (m === '(?=' || m === '(?!' || m === '(?<=' || m === '(?<!') {\n return {\n token: createToken(TokenTypes.GroupOpen, m, {\n kind: m2 === '<' ? TokenGroupKinds.lookbehind : TokenGroupKinds.lookahead,\n negate: m.endsWith('!'),\n }),\n };\n }\n // Named capture (checked after lookbehind due to similar syntax), or unnamed capture when\n // `captureGroup` enabled\n if (m2 === '<' || m2 === \"'\" || (m === '(' && context.captureGroup)) {\n const token = createToken(TokenTypes.GroupOpen, m, {\n kind: TokenGroupKinds.capturing,\n // Will add `number` in a second pass\n });\n if (m !== '(') {\n token.name = m.slice(3, -1);\n }\n return {\n token,\n };\n }\n if (m2 === '~') {\n if (m === '(?~|') {\n throw new Error(`Unsupported absent function kind \"${m}\"`);\n }\n return {\n token: createToken(TokenTypes.GroupOpen, m, {\n kind: TokenGroupKinds.absent_repeater,\n }),\n };\n }\n if (m2 === '(') {\n // [TODO] Some forms are supportable\n throw new Error(`Unsupported conditional \"${m}\"`);\n }\n if (m === '(?') {\n throw new Error('Invalid group');\n }\n throw new Error(`Unexpected group \"${m}\"`);\n }\n if (m === ')') {\n context.popModX();\n context.numOpenGroups--;\n if (context.numOpenGroups < 0) {\n throw new Error('Unmatched \")\"');\n }\n return {\n token: createToken(TokenTypes.GroupClose, m),\n };\n }\n if (m === '#' && context.getCurrentModX()) {\n // Onig's only line break char is line feed\n const end = pattern.indexOf('\\n', lastIndex);\n return {\n // Jump forward to the end of the comment\n lastIndex: end === -1 ? pattern.length : end,\n };\n }\n if (/^\\s$/.test(m) && context.getCurrentModX()) {\n const re = /\\s+/y;\n re.lastIndex = lastIndex;\n const rest = re.exec(pattern);\n return {\n // Jump forward to the end of the whitespace\n lastIndex: rest ? re.lastIndex : lastIndex,\n };\n }\n if (m === '.') {\n return {\n token: createToken(TokenTypes.CharacterSet, m, {\n kind: TokenCharacterSetKinds.dot,\n }),\n };\n }\n if (m === '^' || m === '$') {\n const kind = context.singleline ? {\n '^': r`\\A`,\n '$': r`\\Z`,\n }[m] : m;\n return {\n token: createToken(TokenTypes.Assertion, m, {\n kind,\n }),\n };\n }\n if (m === '|') {\n return {\n token: createToken(TokenTypes.Alternator, m),\n };\n }\n if (quantifierRe.test(m)) {\n return {\n token: createTokenForQuantifier(m),\n };\n }\n assertSingleCodePoint(m);\n return {\n token: createToken(TokenTypes.Character, m, {\n value: m.codePointAt(0),\n }),\n };\n}\n\nfunction getAllTokensForCharClass(pattern, opener, lastIndex) {\n const tokens = [createToken(TokenTypes.CharacterClassOpen, opener, {\n negate: opener[1] === '^',\n })];\n let numCharClassesOpen = 1;\n let match;\n charClassTokenRe.lastIndex = lastIndex;\n while ((match = charClassTokenRe.exec(pattern))) {\n const m = match[0];\n // Start of nested char class\n // POSIX classes are handled as a single token; not as a nested char class\n if (m[0] === '[' && m[1] !== ':') {\n numCharClassesOpen++;\n tokens.push(createToken(TokenTypes.CharacterClassOpen, m, {\n negate: m[1] === '^',\n }));\n } else if (m === ']') {\n if (tokens.at(-1).type === TokenTypes.CharacterClassOpen) {\n // Allow unescaped `]` as leading char\n tokens.push(createToken(TokenTypes.Character, m, {\n value: 93,\n }));\n } else {\n numCharClassesOpen--;\n tokens.push(createToken(TokenTypes.CharacterClassClose, m));\n if (!numCharClassesOpen) {\n break;\n }\n }\n } else {\n const result = createTokenForAnyTokenWithinCharClass(m);\n if (Array.isArray(result)) {\n tokens.push(...result);\n } else {\n tokens.push(result);\n }\n }\n }\n return {\n tokens,\n lastIndex: charClassTokenRe.lastIndex || pattern.length,\n }\n}\n\nfunction createTokenForAnyTokenWithinCharClass(raw) {\n if (raw[0] === '\\\\') {\n // Assumes an identity escape as final condition\n return createTokenForSharedEscape(raw, {inCharClass: true});\n }\n // POSIX class: `[:name:]` or `[:^name:]`\n if (raw[0] === '[') {\n const posix = /\\[:(?<negate>\\^?)(?<name>[a-z]+):\\]/.exec(raw);\n if (!posix || !PosixClassesMap.get(posix.groups.name)) {\n throw new Error(`Invalid POSIX class \"${raw}\"`);\n }\n return createToken(TokenTypes.CharacterSet, raw, {\n kind: TokenCharacterSetKinds.posix,\n negate: !!posix.groups.negate,\n value: posix.groups.name,\n });\n }\n // Range (possibly invalid) or literal hyphen\n if (raw === '-') {\n return createToken(TokenTypes.CharacterClassHyphen, raw);\n }\n if (raw === '&&') {\n return createToken(TokenTypes.CharacterClassIntersector, raw);\n }\n assertSingleCodePoint(raw);\n return createToken(TokenTypes.Character, raw, {\n value: raw.codePointAt(0),\n });\n}\n\n// Tokens shared by base syntax and char class syntax that start with `\\`\nfunction createTokenForSharedEscape(raw, {inCharClass}) {\n const char1 = raw[1];\n if (char1 === 'c' || char1 === 'C') {\n return createTokenForControlChar(raw);\n }\n if ('dDhHsSwW'.includes(char1)) {\n return createTokenForShorthandCharClass(raw);\n }\n if (raw.startsWith(r`\\o{`)) {\n throw new Error(`Incomplete, invalid, or unsupported octal code point \"${raw}\"`);\n }\n if (/^\\\\[pP]\\{/.test(raw)) {\n if (raw.length === 3) {\n throw new Error(`Incomplete or invalid Unicode property \"${raw}\"`);\n }\n return createTokenForUnicodeProperty(raw);\n }\n // Hex UTF-8 encoded byte sequence\n if (/^\\\\x[89A-Fa-f]\\p{AHex}/u.test(raw)) {\n try {\n const bytes = raw.split(/\\\\x/).slice(1).map(hex => parseInt(hex, 16));\n const decoded = new TextDecoder('utf-8', {\n ignoreBOM: true,\n fatal: true,\n }).decode(new Uint8Array(bytes));\n const encoder = new TextEncoder();\n const tokens = [...decoded].map(char => {\n // Since this regenerates `raw`, it might have different casing for hex A-F than the input\n const raw = [...encoder.encode(char)].map(byte => `\\\\x${byte.toString(16)}`).join('');\n return createToken(TokenTypes.Character, raw, {\n value: char.codePointAt(0),\n });\n });\n return tokens;\n } catch {\n throw new Error(`Multibyte code \"${raw}\" incomplete or invalid in Oniguruma`);\n }\n }\n if (char1 === 'u' || char1 === 'x') {\n return createToken(TokenTypes.Character, raw, {\n value: getValidatedHexCharCode(raw),\n });\n }\n if (EscapeCharCodes.has(char1)) {\n return createToken(TokenTypes.Character, raw, {\n value: EscapeCharCodes.get(char1),\n });\n }\n // Escaped number: backref (possibly invalid), null, octal, or identity escape, possibly followed\n // by 1-2 literal digits\n if (/\\d/.test(char1)) {\n return createToken(TokenTypes.EscapedNumber, raw, {\n inCharClass,\n });\n }\n if (raw === '\\\\') {\n throw new Error(r`Incomplete escape \"\\\"`);\n }\n // Meta `\\M-x` and `\\M-\\C-x` are unsupported; avoid treating as an identity escape\n if (char1 === 'M') {\n // [TODO] Supportable; see <github.com/kkos/oniguruma/blob/master/doc/SYNTAX.md#12-onig_syn_op2_esc_capital_m_bar_meta-enable-m-x>, <github.com/kkos/oniguruma/blob/43a8c3f3daf263091f3a74019d4b32ebb6417093/src/regparse.c#L4695>, <https://github.com/ammar/regexp_parser/blob/8851030feda68223d74f502335fb254a20d77016/lib/regexp_parser/expression/classes/escape_sequence.rb#L75>\n throw new Error(`Unsupported meta \"${raw}\"`);\n }\n // Identity escape; count code point length\n if ([...raw].length === 2) {\n return createToken(TokenTypes.Character, raw, {\n value: raw.codePointAt(1),\n });\n }\n throw new Error(`Unexpected escape \"${raw}\"`);\n}\n\n/**\n@param {keyof TokenTypes} type\n@param {string} raw\n@param {{[key: string]: string | number | boolean;}} [data]\n@returns {Token}\n*/\nfunction createToken(type, raw, data) {\n return {\n type,\n raw,\n ...data,\n };\n}\n\n// Expects `\\cx` or `\\C-x`\nfunction createTokenForControlChar(raw) {\n const char = raw[1] === 'c' ? raw[2] : raw[3];\n if (!char || !/[A-Za-z]/.test(char)) {\n // Unlike JS, Onig allows any char to follow `\\c` or `\\C-`, but this is an extreme edge case\n // [TODO] Supportable; see <github.com/kkos/oniguruma/blob/master/doc/SYNTAX.md#11-onig_syn_op2_esc_capital_c_bar_control-enable-c-x>, <github.com/kkos/oniguruma/blob/43a8c3f3daf263091f3a74019d4b32ebb6417093/src/regparse.c#L4695>\n throw new Error(`Unsupported control character \"${raw}\"`);\n }\n return createToken(TokenTypes.Character, raw, {\n value: char.toUpperCase().codePointAt(0) - 64,\n });\n}\n\nfunction createTokenForFlagMod(raw, context) {\n // Allows multiple `-` and solo `-` without `on` or `off` flags\n let {on, off} = /^\\(\\?(?<on>[imx]*)(?:-(?<off>[imx\\-]*))?/.exec(raw).groups;\n // If the capturing group didn't participate\n off ??= '';\n // Flag x is used directly by the tokenizer since it changes how to interpret the pattern\n const isXOn = (context.getCurrentModX() || on.includes('x')) && !off.includes('x');\n const enabledFlags = getFlagPropsForToken(on);\n const disabledFlags = getFlagPropsForToken(off);\n const flagChanges = {};\n enabledFlags && (flagChanges.enable = enabledFlags);\n disabledFlags && (flagChanges.disable = disabledFlags);\n // Flag directive; ex: `(?im-x)`\n if (raw.endsWith(')')) {\n // Replace flag x value until the end of the current group\n context.replaceCurrentModX(isXOn);\n // Can't remove flag directives without flags like `(?-)`; they affect following quantifiers\n return createToken(TokenTypes.Directive, raw, {\n kind: TokenDirectiveKinds.flags,\n flags: flagChanges,\n });\n }\n // Flag group opener; ex: `(?im-x:`\n if (raw.endsWith(':')) {\n context.pushModX(isXOn);\n context.numOpenGroups++;\n const token = createToken(TokenTypes.GroupOpen, raw, {\n kind: TokenGroupKinds.group,\n });\n if (enabledFlags || disabledFlags) {\n token.flags = flagChanges;\n }\n return token;\n }\n throw new Error(`Unexpected flag modifier \"${raw}\"`);\n}\n\nfunction createTokenForQuantifier(raw) {\n const data = {};\n if (raw[0] === '{') {\n const {min, max} = /^\\{(?<min>\\d*)(?:,(?<max>\\d*))?/.exec(raw).groups;\n const limit = 100_000;\n if (+min > limit || +max > limit) {\n throw new Error('Quantifier value unsupported in Oniguruma');\n }\n data.min = +min;\n data.max = max === undefined ? +min : (max === '' ? Infinity : +max);\n data.greedy = !raw.endsWith('?');\n // By default, Onig doesn't support making interval quantifiers possessive\n data.possessive = false;\n } else {\n data.min = raw[0] === '+' ? 1 : 0;\n data.max = raw[0] === '?' ? 1 : Infinity;\n data.greedy = raw[1] !== '?';\n data.possessive = raw[1] === '+';\n }\n return createToken(TokenTypes.Quantifier, raw, data);\n}\n\nfunction createTokenForShorthandCharClass(raw) {\n const lower = raw[1].toLowerCase();\n return createToken(TokenTypes.CharacterSet, raw, {\n kind: {\n 'd': TokenCharacterSetKinds.digit,\n 'h': TokenCharacterSetKinds.hex, // Not available in JS\n 's': TokenCharacterSetKinds.space, // Different than JS\n 'w': TokenCharacterSetKinds.word,\n }[lower],\n negate: raw[1] !== lower,\n });\n}\n\nfunction createTokenForUnicodeProperty(raw) {\n const {p, neg, value} = /^\\\\(?<p>[pP])\\{(?<neg>\\^?)(?<value>[^}]+)/.exec(raw).groups;\n const negate = (p === 'P' && !neg) || (p === 'p' && !!neg);\n return createToken(TokenTypes.CharacterSet, raw, {\n kind: TokenCharacterSetKinds.property,\n negate,\n value,\n });\n}\n\nfunction getFlagPropsForToken(flags) {\n // Don't include `false` for flags that aren't included\n const obj = {};\n if (flags.includes('i')) {\n obj.ignoreCase = true;\n }\n if (flags.includes('m')) {\n // Onig flag m is equivalent to JS flag s\n obj.dotAll = true;\n }\n if (flags.includes('x')) {\n obj.extended = true;\n }\n return Object.keys(obj).length ? obj : null;\n}\n\n// - Unenclosed `\\xNN` above 0x7F is handled elsewhere as a UTF-8 encoded byte sequence\n// - Enclosed `\\x{}` with value above 0x10FFFF is allowed here; handled in the parser\nfunction getValidatedHexCharCode(raw) {\n // Note: Onig (tested 6.9.8) has a bug where bare `\\u` and `\\x` are identity escapes if they\n // appear at the very end of the pattern, so e.g. `\\u` matches `u`, but `\\u0`, `\\u.`, and `[\\u]`\n // are all errors, and `\\x.` and `[\\x]` aren't errors but instead the `\\x` is equivalent to `\\0`.\n // Don't emulate these bugs (see #21), and just treat these cases as errors. Also, Onig treats\n // incomplete `\\x{` (with the brace and not immediately followed by a hex digit) as an identity\n // escape, so e.g. `\\x{` matches `x{` and `^\\x{,2}$` matches `xx`, but `\\x{2,}` and `\\x{0,2}` are\n // errors. Don't emulate this pointless ambiguity; just treat incomplete `\\x{` as an error\n if (/^(?:\\\\u(?!\\p{AHex}{4})|\\\\x(?!\\p{AHex}{1,2}|\\{\\p{AHex}{1,8}\\}))/u.test(raw)) {\n throw new Error(`Incomplete or invalid escape \"${raw}\"`);\n }\n // Might include leading 0s\n const hex = raw[2] === '{' ?\n /^\\\\x\\{\\s*(?<hex>\\p{AHex}+)/u.exec(raw).groups.hex :\n raw.slice(2);\n const dec = parseInt(hex, 16);\n return dec;\n}\n\n// Value is 1-3 digits, which can be a backref (possibly invalid), null, octal, or identity escape,\n// possibly followed by 1-2 literal digits\nfunction splitEscapedNumToken(token, numCaptures) {\n const {raw, inCharClass} = token;\n // Keep any leading 0s since they indicate octal\n const value = raw.slice(1);\n // Backref (possibly invalid)\n if (\n !inCharClass &&\n ( // Single digit 1-9 outside a char class is always treated as a backref\n (value !== '0' && value.length === 1) ||\n // Leading 0 makes it octal; backrefs can't include following literal digits\n (value[0] !== '0' && +value <= numCaptures)\n )\n ) {\n return [createToken(TokenTypes.Backreference, raw)];\n }\n const tokens = [];\n // Returns 1-3 matches; the first (only) might be octal\n const matches = value.match(/^[0-7]+|\\d/g);\n for (let i = 0; i < matches.length; i++) {\n const m = matches[i];\n let value;\n // Octal digits are 0-7\n if (i === 0 && m !== '8' && m !== '9') {\n value = parseInt(m, 8);\n if (value > 0o177) {\n // Octal UTF-8 encoded byte sequence; not yet supported\n throw new Error(r`Octal encoded byte above 177 unsupported \"${raw}\"`);\n }\n } else {\n value = m.codePointAt(0);\n }\n tokens.push(createToken(TokenTypes.Character, (i === 0 ? '\\\\' : '') + m, {\n value,\n }));\n }\n return tokens;\n}\n\nfunction assertSingleCodePoint(raw) {\n if ([...raw].length !== 1) {\n throw new Error(`Expected \"${raw}\" to be a single code point`);\n }\n}\n\nexport {\n tokenize,\n TokenCharacterSetKinds,\n TokenDirectiveKinds,\n TokenGroupKinds,\n TokenTypes,\n};\n","import {Accuracy, Target} from './options.js';\nimport {AstAssertionKinds, AstCharacterSetKinds, AstDirectiveKinds, AstTypes, AstVariableLengthCharacterSetKinds, createAlternative, createAssertion, createBackreference, createCapturingGroup, createCharacterSet, createGroup, createLookaround, createQuantifier, createUnicodeProperty, parse} from './parse.js';\nimport {tokenize} from './tokenize.js';\nimport {traverse} from './traverse.js';\nimport {JsUnicodeProperties, PosixClassesMap} from './unicode.js';\nimport {cp, getNewCurrentFlags, getOrCreate, isMinTarget, r} from './utils.js';\nimport {hasOnlyChild, isAlwaysNonZeroLength, isAlwaysZeroLength, isConsumptiveGroup, isLookaround} from './utils-ast.js';\nimport emojiRegex from 'emoji-regex-xs';\n\n/**\n@typedef {{\n type: 'Regex';\n parent: null;\n pattern: Object;\n flags: Object;\n options: Object;\n _originMap: Map<Object, Object>;\n _strategy: string?;\n}} RegexAst\n*/\n/**\nTransforms an Oniguruma AST in-place to a [Regex+](https://github.com/slevithan/regex) AST.\nAssumes target ES2025, expecting the generator to down-convert to the desired JS target version.\n\nRegex+'s syntax and behavior is a strict superset of native JavaScript, so the AST is very close\nto representing native ES2025 `RegExp` but with some added features (atomic groups, possessive\nquantifiers, recursion). The AST doesn't use some of Regex+'s extended features like flag x or\nsubroutines because they follow PCRE behavior and work somewhat differently than in Oniguruma. The\nAST represents what's needed to precisely reproduce Oniguruma behavior using Regex+.\n@param {import('./parse.js').OnigurumaAst} ast\n@param {{\n accuracy?: keyof Accuracy;\n asciiWordBoundaries?: boolean;\n avoidSubclass?: boolean;\n bestEffortTarget?: keyof Target;\n}} [options]\n@returns {RegexAst}\n*/\nfunction transform(ast, options) {\n const opts = {\n // A couple edge cases exist where options `accuracy` and `bestEffortTarget` are used:\n // - `VariableLengthCharacterSet` kind `grapheme` (`\\X`): An exact representation would require\n // heavy Unicode data; a best-effort approximation requires knowing the target.\n // - `CharacterSet` kind `posix` with values `graph` and `print`: Their complex Unicode-based\n // representations would be hard to change to ASCII-based after the fact in the generator\n // based on `target`/`accuracy`, so produce the appropriate structure here.\n accuracy: 'default',\n asciiWordBoundaries: false,\n avoidSubclass: false,\n bestEffortTarget: 'ES2025',\n ...options,\n };\n const firstPassState = {\n accuracy: opts.accuracy,\n asciiWordBoundaries: opts.asciiWordBoundaries,\n avoidSubclass: opts.avoidSubclass,\n flagDirectivesByAlt: new Map(),\n jsGroupNameMap: new Map(),\n minTargetEs2024: isMinTarget(opts.bestEffortTarget, 'ES2024'),\n passedLookbehind: false,\n strategy: null,\n // Subroutines can appear before the groups they ref, so collect reffed nodes for a second pass \n subroutineRefMap: new Map(),\n supportedGNodes: new Set(),\n digitIsAscii: ast.flags.digitIsAscii,\n spaceIsAscii: ast.flags.spaceIsAscii,\n wordIsAscii: ast.flags.wordIsAscii,\n };\n traverse({node: ast}, firstPassState, FirstPassVisitor);\n // Global flags modified by the first pass\n const globalFlags = {\n dotAll: ast.flags.dotAll,\n ignoreCase: ast.flags.ignoreCase,\n };\n // The interplay of subroutines (with Onig's unique rules/behavior for them; see comments in the\n // parser for details) with backref multiplexing (a unique Onig feature), flag modifiers, and\n // duplicate group names (which might be indirectly referenced by subroutines even though\n // subroutines can't directly reference duplicate names) is extremely complicated to emulate in\n // JS in a way that handles all edge cases, so we need multiple passes to do it\n const secondPassState = {\n currentFlags: globalFlags,\n prevFlags: null,\n globalFlags,\n groupOriginByCopy: new Map(),\n groupsByName: new Map(),\n multiplexCapturesToLeftByRef: new Map(),\n openRefs: new Map(),\n reffedNodesByReferencer: new Map(),\n subroutineRefMap: firstPassState.subroutineRefMap,\n };\n traverse({node: ast}, secondPassState, SecondPassVisitor);\n const thirdPassState = {\n groupsByName: secondPassState.groupsByName,\n highestOrphanBackref: 0,\n numCapturesToLeft: 0,\n reffedNodesByReferencer: secondPassState.reffedNodesByReferencer,\n };\n traverse({node: ast}, thirdPassState, ThirdPassVisitor);\n ast._originMap = secondPassState.groupOriginByCopy;\n ast._strategy = firstPassState.strategy;\n return ast;\n}\n\nconst FirstPassVisitor = {\n AbsentFunction({node, replaceWith}) {\n // Convert absent repeater `(?~…)` to `(?:(?:(?!…)\\p{Any})*)`\n const group = prepContainer(createGroup(), [\n adoptAndSwapKids(createLookaround({negate: true}), node.alternatives),\n createUnicodeProperty('Any'),\n ]);\n const quantifier = createQuantifier(group, 0, Infinity);\n group.parent = quantifier;\n replaceWith(prepContainer(createGroup(), [quantifier]));\n },\n\n Alternative: {\n enter({node, parent, key}, {flagDirectivesByAlt}) {\n // Look for own-level flag directives when entering an alternative because after traversing\n // the directive itself, any subsequent flag directives will no longer be at the same level\n const flagDirectives = node.elements.filter(el => el.kind === AstDirectiveKinds.flags);\n for (let i = key + 1; i < parent.alternatives.length; i++) {\n const forwardSiblingAlt = parent.alternatives[i];\n getOrCreate(flagDirectivesByAlt, forwardSiblingAlt, []).push(...flagDirectives);\n }\n },\n exit({node}, {flagDirectivesByAlt}) {\n // Wait until exiting to wrap an alternative's nodes with flag groups that extend flag\n // directives from prior sibling alternatives because doing this at the end allows inner\n // nodes to accurately check their level in the tree\n if (flagDirectivesByAlt.get(node)?.length) {\n const flags = getCombinedFlagModsFromFlagNodes(flagDirectivesByAlt.get(node));\n if (flags) {\n const flagGroup = prepContainer(createGroup({flags}), node.elements);\n // Manually set the parent since we're not using `replaceWith`\n flagGroup.parent = node;\n node.elements = [flagGroup];\n }\n }\n },\n },\n\n Assertion({node, key, container, ast, remove, replaceWith}, state) {\n const {kind, negate} = node;\n const {asciiWordBoundaries, avoidSubclass, supportedGNodes, wordIsAscii} = state;\n if (kind === AstAssertionKinds.line_end) {\n // Onig's only line break char is line feed, unlike JS\n replaceWith(parseFragment(r`(?=\\z|\\n)`));\n } else if (kind === AstAssertionKinds.line_start) {\n // Onig's only line break char is line feed, unlike JS. Onig's `^` doesn't match after a\n // string-terminating line feed\n replaceWith(parseFragment(r`(?<=\\A|\\n(?!\\z))`, {skipLookbehindValidation: true}));\n } else if (kind === AstAssertionKinds.lookbehind) {\n state.passedLookbehind = true;\n } else if (kind === AstAssertionKinds.search_start) {\n if (supportedGNodes.has(node)) {\n ast.flags.sticky = true;\n remove();\n } else {\n const prev = container[key - 1]; // parent.elements[key - 1]\n // Not all ways of blocking the `\\G` from matching are covered (ex: a node prior to the\n // prev node could block), but blocked `\\G` is an edge case so it's okay if some blocked\n // cases resulting in the standard error for being unsupported\n if (prev && isAlwaysNonZeroLength(prev)) {\n replaceWith(prepContainer(createLookaround({negate: true})));\n } else if (avoidSubclass) {\n throw new Error(r`Uses \"\\G\" in a way that requires a subclass`);\n } else {\n replaceWith(createAssertion(AstAssertionKinds.string_start));\n state.strategy = 'clip_search';\n }\n }\n } else if (kind === AstAssertionKinds.string_end_newline) {\n replaceWith(parseFragment(r`(?=\\n?\\z)`));\n } else if (kind === AstAssertionKinds.word_boundary && !wordIsAscii && !asciiWordBoundaries) {\n const b = `(?:(?<=${defaultWordChar})(?!${defaultWordChar})|(?<!${defaultWordChar})(?=${defaultWordChar}))`;\n const B = `(?:(?<=${defaultWordChar})(?=${defaultWordChar})|(?<!${defaultWordChar})(?!${defaultWordChar}))`;\n replaceWith(parseFragment(negate ? B : b));\n }\n // Kinds `string_end` and `string_start` don't need transformation since JS flag m isn't used.\n // Kinds `lookahead` and `lookbehind` also don't need transformation\n },\n\n Backreference({node}, {jsGroupNameMap}) {\n let {ref} = node;\n if (typeof ref === 'string' && !isValidGroupNameJs(ref)) {\n ref = getAndStoreJsGroupName(ref, jsGroupNameMap);\n node.ref = ref;\n }\n },\n\n CapturingGroup({node}, {jsGroupNameMap, subroutineRefMap}) {\n let {name} = node;\n if (name && !isValidGroupNameJs(name)) {\n name = getAndStoreJsGroupName(name, jsGroupNameMap);\n node.name = name;\n }\n subroutineRefMap.set(node.number, node);\n if (name) {\n subroutineRefMap.set(name, node);\n }\n },\n\n CharacterSet({node, replaceWith}, {accuracy, minTargetEs2024, digitIsAscii, spaceIsAscii, wordIsAscii}) {\n const {kind, negate, value} = node;\n // Flag D with `\\d`, `\\p{Digit}`, `[[:digit:]]`\n if (digitIsAscii && (kind === AstCharacterSetKinds.digit || value === 'digit')) {\n replaceWith(createCharacterSet(AstCharacterSetKinds.digit, {negate}));\n return;\n }\n // Flag S with `\\s`, `\\p{Space}`, `[[:space:]]`\n if (spaceIsAscii && (kind === AstCharacterSetKinds.space || value === 'space')) {\n replaceWith(setNegate(parseFragment(asciiSpaceChar), negate));\n return;\n }\n // Flag W with `\\w`, `\\p{Word}`, `[[:word:]]`\n if (wordIsAscii && (kind === AstCharacterSetKinds.word || value === 'word')) {\n replaceWith(createCharacterSet(AstCharacterSetKinds.word, {negate}));\n return;\n }\n if (kind === AstCharacterSetKinds.any) {\n replaceWith(createUnicodeProperty('Any'));\n } else if (kind === AstCharacterSetKinds.digit) {\n replaceWith(createUnicodeProperty('Nd', {negate}));\n } else if (kind === AstCharacterSetKinds.hex) {\n replaceWith(createUnicodeProperty('AHex', {negate}));\n } else if (kind === AstCharacterSetKinds.non_newline) {\n replaceWith(parseFragment(r`[^\\n]`));\n } else if (kind === AstCharacterSetKinds.space) {\n // Can't use JS's Unicode-based `\\s` since unlike Onig it includes `\\uFEFF`, excludes `\\x85`\n replaceWith(createUnicodeProperty('space', {negate}));\n } else if (kind === AstCharacterSetKinds.word) {\n replaceWith(setNegate(parseFragment(defaultWordChar), negate));\n } else if (kind === AstCharacterSetKinds.property) {\n if (!JsUnicodeProperties.has(value)) {\n // Assume it's a script; no error checking is the price for avoiding heavyweight Unicode\n // data for all script names\n node.key = 'sc';\n }\n } else if (kind === AstCharacterSetKinds.posix) {\n if (!minTargetEs2024 && (value === 'graph' || value === 'print')) {\n if (accuracy === 'strict') {\n throw new Error(`POSIX class \"${value}\" requires min target ES2024 or non-strict accuracy`);\n }\n let ascii = {\n graph: '!-~',\n print: ' -~',\n }[value];\n if (negate) {\n // POSIX classes are always nested in a char class; manually invert the range rather than\n // using `[^…]` so it can be unwrapped since ES2018 doesn't support nested classes\n ascii = `\\0-${cp(ascii.codePointAt(0) - 1)}${cp(ascii.codePointAt(2) + 1)}-\\u{10FFFF}`;\n }\n replaceWith(parseFragment(`[${ascii}]`));\n } else {\n replaceWith(setNegate(parseFragment(PosixClassesMap.get(value)), negate));\n }\n }\n },\n\n Directive(path, state) {\n const {node, parent, ast, remove, replaceWith, removeAllPrevSiblings, removeAllNextSiblings} = path;\n const {kind, flags} = node;\n if (kind === AstDirectiveKinds.flags) {\n if (!flags.enable && !flags.disable) {\n // Flag directive without flags; ex: `(?-)`, `(?--)`\n remove();\n } else {\n const flagGroup = prepContainer(createGroup({flags}), removeAllNextSiblings());\n replaceWith(flagGroup);\n traverseReplacement(flagGroup, path, state, FirstPassVisitor);\n }\n } else if (kind === AstDirectiveKinds.keep) {\n const firstAltFirstEl = ast.pattern.alternatives[0].elements[0];\n // Supporting a full-pattern wrapper around `\\K` enables use with flag modifiers\n const hasWrapperGroup =\n // Not emulatable if within a `CapturingGroup`\n hasOnlyChild(ast.pattern, kid => kid.type === AstTypes.Group) &&\n firstAltFirstEl.alternatives.length === 1;\n const topLevel = hasWrapperGroup ? firstAltFirstEl : ast.pattern;\n if (parent.parent !== topLevel || topLevel.alternatives.length > 1) {\n throw new Error(r`Uses \"\\K\" in a way that's unsupported`);\n }\n replaceWith(prepContainer(createLookaround({behind: true}), removeAllPrevSiblings()));\n }\n },\n\n Flags({node, parent}) {\n // Remove Onig flags that aren't available in JS\n [ 'digitIsAscii', // Flag D\n 'extended', // Flag x\n 'spaceIsAscii', // Flag S\n 'wordIsAscii', // Flag W\n ].forEach(f => delete node[f]);\n Object.assign(node, {\n // JS flag g; no Onig equiv\n global: false,\n // JS flag d; no Onig equiv\n hasIndices: false,\n // JS flag m; no Onig equiv but its behavior is always on in Onig. Onig's only line break\n // char is line feed, unlike JS, so this flag isn't used since it would produce inaccurate\n // results (also allows `^` and `$` to be used in the generator for string start and end)\n multiline: false,\n // JS flag y; no Onig equiv, but used for `\\G` emulation\n sticky: node.sticky ?? false,\n // Note: Regex+ doesn't allow explicitly adding flags it handles implicitly, so leave out\n // properties `unicode` (JS flag u) and `unicodeSets` (JS flag v). Keep the existing values\n // for `ignoreCase` (flag i) and `dotAll` (JS flag s, but Onig flag m)\n });\n // Options accepted by Regex+; see <github.com/slevithan/regex#-options>\n parent.options = {\n disable: {\n // Onig uses different rules for flag x than Regex+, so disable the implicit flag\n x: true,\n // Onig has no flag to control \"named capture only\" mode but contextually applies its\n // behavior when named capturing is used, so disable Regex+'s implicit flag for it\n n: true,\n },\n force: {\n // Always add flag v because we're generating an AST that relies on it (it enables JS\n // support for Onig features nested classes, set intersection, Unicode properties, etc.).\n // However, the generator might disable flag v based on its `target` option\n v: true,\n },\n };\n },\n\n Group({node}) {\n if (!node.flags) {\n return;\n }\n const {enable, disable} = node.flags;\n // Onig's flag x (`extended`) isn't available in JS\n enable?.extended && delete enable.extended;\n disable?.extended && delete disable.extended;\n // JS doesn't support flag groups that enable and disable the same flag; ex: `(?i-i:)`\n enable?.dotAll && disable?.dotAll && delete enable.dotAll;\n enable?.ignoreCase && disable?.ignoreCase && delete enable.ignoreCase;\n // Cleanup\n enable && !Object.keys(enable).length && delete node.flags.enable;\n disable && !Object.keys(disable).length && delete node.flags.disable;\n !node.flags.enable && !node.flags.disable && delete node.flags;\n },\n\n Pattern: {\n enter({node}, {supportedGNodes}) {\n // For `\\G` to be accurately emulatable using JS flag y, it must be at (and only at) the start\n // of every top-level alternative (with complex rules for what determines being at the start).\n // Additional `\\G` error checking in `Assertion` visitor\n const leadingGs = [];\n let hasAltWithLeadG = false;\n let hasAltWithoutLeadG = false;\n for (const alt of node.alternatives) {\n if (alt.elements.length === 1 && alt.elements[0].kind === AstAssertionKinds.search_start) {\n // Remove the `\\G` (leaving behind an empty alternative, and without adding JS flag y)\n // since a top-level alternative that includes only `\\G` always matches at the start of the\n // match attempt. Note that this is based on Oniguruma's rules, and is different than other\n // regex flavors where `\\G` matches at the end of the previous match (a subtle distinction\n // that's relevant after zero-length matches)\n alt.elements.pop();\n } else {\n const leadingG = getLeadingG(alt.elements);\n if (leadingG) {\n hasAltWithLeadG = true;\n Array.isArray(leadingG) ?\n leadingGs.push(...leadingG) :\n leadingGs.push(leadingG);\n } else {\n hasAltWithoutLeadG = true;\n }\n }\n }\n if (hasAltWithLeadG && !hasAltWithoutLeadG) {\n // Supported `\\G` nodes will be removed (and add flag y) when traversed\n leadingGs.forEach(g => supportedGNodes.add(g));\n }\n },\n exit(_, {accuracy, passedLookbehind, strategy}) {\n if (accuracy === 'strict' && passedLookbehind && strategy) {\n throw new Error(r`Uses \"\\G\" in a way that requires non-strict accuracy`);\n }\n },\n },\n\n Quantifier({node}) {\n if (node.element.type === AstTypes.Quantifier) {\n // Change e.g. `a**` to `(?:a*)*`\n const group = prepContainer(createGroup(), [node.element]);\n // Manually set the parent since we're not using `replaceWith`\n group.parent = node;\n node.element = group;\n }\n },\n\n Subroutine({node}, {jsGroupNameMap}) {\n let {ref} = node;\n if (typeof ref === 'string' && !isValidGroupNameJs(ref)) {\n ref = getAndStoreJsGroupName(ref, jsGroupNameMap);\n node.ref = ref;\n }\n },\n\n VariableLengthCharacterSet({node, replaceWith}, {accuracy, minTargetEs2024}) {\n const {kind} = node;\n if (kind === AstVariableLengthCharacterSetKinds.newline) {\n replaceWith(parseFragment('(?>\\r\\n?|[\\n\\v\\f\\x85\\u2028\\u2029])'));\n } else if (kind === AstVariableLengthCharacterSetKinds.grapheme) {\n if (accuracy === 'strict') {\n throw new Error(r`Use of \"\\X\" requires non-strict accuracy`);\n }\n // `emojiRegex` is more permissive than `\\p{RGI_Emoji}` since it allows over/under-qualified\n // emoji using a general pattern that matches any Unicode sequence following the structure of\n // a valid emoji. That actually makes it more accurate for matching any grapheme\n const emoji = minTargetEs2024 ? r`\\p{RGI_Emoji}` : emojiRegex().source.replace(/\\\\u\\{/g, `\\\\x{`);\n // Close approximation of an extended grapheme cluster. Details: <unicode.org/reports/tr29/>.\n // Skip name check to allow `RGI_Emoji` through, which Onig doesn't support\n replaceWith(parseFragment(r`(?>\\r\\n|${emoji}|\\P{M}\\p{M}*)`, {skipPropertyNameValidation: true}));\n } else {\n throw new Error(`Unexpected varcharset kind \"${kind}\"`);\n }\n },\n};\n\nconst SecondPassVisitor = {\n Backreference({node}, {multiplexCapturesToLeftByRef, reffedNodesByReferencer}) {\n const {orphan, ref} = node;\n if (!orphan) {\n // Copy the current state for later multiplexing expansion. That's done in a subsequent pass\n // because backref numbers need to be recalculated after subroutine expansion\n reffedNodesByReferencer.set(node, [...multiplexCapturesToLeftByRef.get(ref).map(({node}) => node)]);\n }\n },\n\n CapturingGroup: {\n enter(\n { node,\n replaceWith,\n skip,\n },\n { groupOriginByCopy,\n groupsByName,\n multiplexCapturesToLeftByRef,\n openRefs,\n reffedNodesByReferencer,\n }\n ) {\n // Has value if we're within a subroutine expansion\n const origin = groupOriginByCopy.get(node);\n\n // ## Handle recursion; runs after subroutine expansion\n if (origin && openRefs.has(node.number)) {\n // Recursion doesn't affect any following backrefs to its `ref` (unlike other subroutines),\n // so don't wrap with a capture. The reffed group might have its name removed due to later\n // subroutine expansion\n const recursion = createRecursion(node.number);\n reffedNodesByReferencer.set(recursion, openRefs.get(node.number));\n replaceWith(recursion);\n // This node's kids have been removed from the tree, so no need to traverse them\n skip();\n return;\n }\n openRefs.set(node.number, node);\n\n // ## Track data for backref multiplexing\n multiplexCapturesToLeftByRef.set(node.number, []);\n if (node.name) {\n getOrCreate(multiplexCapturesToLeftByRef, node.name, []);\n }\n const multiplexNodes = multiplexCapturesToLeftByRef.get(node.name ?? node.number);\n for (let i = 0; i < multiplexNodes.length; i++) {\n // Captures added via subroutine expansion (maybe indirectly because they were descendant\n // captures of the reffed group or in a nested subroutine expansion) form a set with their\n // origin group and any other copies of it added via subroutines. Only the most recently\n // matched within this set is added to backref multiplexing. So search the list of already-\n // tracked multiplexed nodes for this group name or number to see if there's a node being\n // replaced by this capture\n const multiplex = multiplexNodes[i];\n if (\n // This group is from subroutine expansion, and there's a multiplex value from either the\n // origin node or a prior subroutine expansion group with the same origin\n (origin === multiplex.node || (origin && origin === multiplex.origin)) ||\n // This group is not from subroutine expansion, and it comes after a subroutine expansion\n // group that refers to this group\n node === multiplex.origin\n ) {\n multiplexNodes.splice(i, 1);\n break;\n }\n }\n multiplexCapturesToLeftByRef.get(node.number).push({node, origin});\n if (node.name) {\n multiplexCapturesToLeftByRef.get(node.name).push({node, origin});\n }\n\n // ## Track data for duplicate names\n // Pre-ES2025 doesn't allow duplicate names, but ES2025 allows duplicate names that are\n // unique per mutually exclusive alternation path. However, Oniguruma's handling for named\n // subpatterns on match results means we can't use this ES2025 feature even when in an ES2025\n // env. So, if using a duplicate name, remove the name from all but the first instance that\n // wasn't created by subroutine expansion\n if (node.name) {\n const groupsWithSameName = getOrCreate(groupsByName, node.name, new Map());\n let hasDuplicateNameToRemove = false;\n if (origin) {\n // Subroutines and their child captures shouldn't hold duplicate names in the final state\n hasDuplicateNameToRemove = true;\n } else {\n for (const groupInfo of groupsWithSameName.values()) {\n if (!groupInfo.hasDuplicateNameToRemove) {\n // Will change to an unnamed capture in a later pass\n hasDuplicateNameToRemove = true;\n break;\n }\n }\n }\n groupsByName.get(node.name).set(node, {node, hasDuplicateNameToRemove});\n }\n },\n exit({node}, {openRefs}) {\n openRefs.delete(node.number);\n },\n },\n\n Group: {\n enter({node}, state) {\n // Flag directives have already been converted to flag groups by the previous pass\n state.prevFlags = state.currentFlags;\n if (node.flags) {\n state.currentFlags = getNewCurrentFlags(state.currentFlags, node.flags);\n }\n },\n exit(_, state) {\n state.currentFlags = state.prevFlags;\n },\n },\n\n Recursion({node, parent}, {reffedNodesByReferencer}) {\n // Recursion nodes are created during the current traversal; they're only traversed here if a\n // recursion node created during traversal is then copied by a subroutine expansion, e.g. with\n // `(?<a>\\g<a>)\\g<a>`\n const {ref} = node;\n // Immediate parent is an alternative or quantifier; can skip\n let reffed = parent;\n while ((reffed = reffed.parent)) {\n if (reffed.type === AstTypes.CapturingGroup && (reffed.name === ref || reffed.number === ref)) {\n break;\n }\n }\n // Track the referenced node because `ref`s are rewritten in a subsequent pass; capturing group\n // names and numbers might change due to subroutine expansion and duplicate group names\n reffedNodesByReferencer.set(node, reffed);\n },\n\n Subroutine(path, state) {\n const {node, replaceWith} = path;\n const {ref} = node;\n const reffedGroupNode = state.subroutineRefMap.get(ref);\n // Other forms of recursion are handled by the `CapturingGroup` visitor\n const isGlobalRecursion = ref === 0;\n const expandedSubroutine = isGlobalRecursion ?\n createRecursion(0) :\n // The reffed group might itself contain subroutines, which are expanded during sub-traversal\n cloneCapturingGroup(reffedGroupNode, state.groupOriginByCopy, null);\n let replacement = expandedSubroutine;\n if (!isGlobalRecursion) {\n // Subroutines take their flags from the reffed group, not the flags surrounding themselves\n const reffedGroupFlagMods = getCombinedFlagModsFromFlagNodes(getAllParents(reffedGroupNode, node => {\n return node.type === AstTypes.Group && !!node.flags;\n }));\n const reffedGroupFlags = reffedGroupFlagMods ?\n getNewCurrentFlags(state.globalFlags, reffedGroupFlagMods) :\n state.globalFlags;\n if (!areFlagsEqual(reffedGroupFlags, state.currentFlags)) {\n replacement = prepContainer(createGroup({\n flags: getFlagModsFromFlags(reffedGroupFlags),\n }), [expandedSubroutine]);\n }\n }\n replaceWith(replacement);\n if (!isGlobalRecursion) {\n traverseReplacement(replacement, path, state, SecondPassVisitor);\n }\n },\n};\n\nconst ThirdPassVisitor = {\n Backreference({node, replaceWith}, state) {\n if (node.orphan) {\n state.highestOrphanBackref = Math.max(state.highestOrphanBackref, node.ref);\n // Don't renumber; used with `allowOrphanBackrefs`\n return;\n }\n const reffedNodes = state.reffedNodesByReferencer.get(node);\n const participants = reffedNodes.filter(reffed => canParticipateWithNode(reffed, node));\n // For the backref's `ref`, use `number` rather than `name` because group names might have been\n // removed if they're duplicates within their alternation path, or they might be removed later\n // by the generator (depending on target) if they're duplicates within the overall pattern.\n // Backrefs must come after groups they ref, so reffed node `number`s are already recalculated\n if (!participants.length) {\n // If no participating capture, convert backref to to `(?!)`; backrefs to nonparticipating\n // groups can't match in Onig but match the empty string in JS\n replaceWith(prepContainer(createLookaround({negate: true})));\n } else if (participants.length > 1) {\n // Multiplex\n const alts = participants.map(reffed => adoptAndSwapKids(\n createAlternative(),\n [createBackreference(reffed.number)]\n ));\n replaceWith(adoptAndSwapKids(createGroup(), alts));\n } else {\n node.ref = participants[0].number;\n }\n },\n\n CapturingGroup({node}, state) {\n // Recalculate the number since the current value might be wrong due to subroutine expansion\n node.number = ++state.numCapturesToLeft;\n if (node.name) {\n // Removing duplicate names here rather than in an earlier pass avoids extra complexity when\n // handling subroutine expansion and backref multiplexing\n if (state.groupsByName.get(node.name).get(node).hasDuplicateNameToRemove) {\n delete node.name;\n }\n }\n },\n\n Recursion({node}, state) {\n if (node.ref === 0) {\n return;\n }\n // For the recursion's `ref`, use `number` rather than `name` because group names might have\n // been removed if they're duplicates within their alternation path, or they might be removed\n // later by the generator (depending on target) if they're duplicates within the overall\n // pattern. Since recursion appears within the group it refs, the reffed node's `number` has\n // already been recalculated\n node.ref = state.reffedNodesByReferencer.get(node).number;\n },\n\n Regex: {\n exit({node}, state) {\n // [HACK] Add unnamed captures to the end of the regex if needed to allow orphaned backrefs\n // to be valid in JS with flag u/v. This is needed to support TextMate grammars, which\n // replace numbered backrefs in their `end` pattern with values matched by captures in their\n // `begin` pattern! See <github.com/microsoft/vscode-textmate/blob/7e0ea282f4f25fef12a6c84fa4fa7266f67b58dc/src/rule.ts#L661-L663>\n // An `end` pattern, prior to this substitution, might have backrefs to a group that doesn't\n // exist within `end`. This presents a dilemma since both Oniguruma and JS (with flag u/v)\n // error for backrefs to undefined captures. So adding captures to the end is a solution that\n // doesn't change what the regex matches, and lets invalid numbered backrefs through. Note:\n // Orphan backrefs are only allowed if `allowOrphanBackrefs` is enabled\n const numCapsNeeded = Math.max(state.highestOrphanBackref - state.numCapturesToLeft, 0);\n for (let i = 0; i < numCapsNeeded; i++) {\n const emptyCapture = createCapturingGroup();\n node.pattern.alternatives.at(-1).elements.push(emptyCapture);\n }\n },\n },\n};\n\n// `\\t\\n\\v\\f\\r\\x20`\nconst asciiSpaceChar = '[\\t-\\r ]';\n// Different than `PosixClassesMap`'s `word`\nconst defaultWordChar = r`[\\p{L}\\p{M}\\p{N}\\p{Pc}]`;\n\nfunction adoptAndSwapKids(parent, kids) {\n kids.forEach(kid => kid.parent = parent);\n parent[getContainerAccessor(parent)] = kids;\n return parent;\n}\n\nfunction areFlagsEqual(a, b) {\n return a.dotAll === b.dotAll && a.ignoreCase === b.ignoreCase;\n}\n\nfunction canParticipateWithNode(capture, node) {\n // Walks to the left (prev siblings), down (sibling descendants), up (parent), then back down\n // (parent's prev sibling descendants) the tree in a loop\n let rightmostPoint = node;\n do {\n if (rightmostPoint.type === AstTypes.Pattern) {\n // End of the line; capture is not in node's alternation path\n return false;\n }\n if (rightmostPoint.type === AstTypes.Alternative) {\n // Skip past alts to their parent because we don't want to look at the kids of preceding alts\n continue;\n }\n if (rightmostPoint === capture) {\n // Capture is ancestor of node\n return false;\n }\n const kidsOfParent = getKids(rightmostPoint.parent);\n for (const kid of kidsOfParent) {\n if (kid === rightmostPoint) {\n // Reached rightmost node in sibling list that we want to consider; break to parent loop\n break;\n }\n if (kid === capture) {\n return true;\n }\n if (hasDescendant(kid, capture)) {\n return true;\n }\n }\n } while ((rightmostPoint = rightmostPoint.parent));\n throw new Error('Unexpected path');\n}\n\n// Creates a deep copy of the provided node, with special handling:\n// - Make `parent` props point to their parent in the copy\n// - Update the provided `originMap` for each cloned capturing group (outer and nested)\nfunction cloneCapturingGroup(obj, originMap, up, up2) {\n const store = Array.isArray(obj) ? [] : {};\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'parent') {\n // If the last cloned item was a container array (for holding kids), use the object above it\n store.parent = Array.isArray(up) ? up2 : up;\n } else if (value && typeof value === 'object') {\n store[key] = cloneCapturingGroup(value, originMap, store, up);\n } else {\n if (key === 'type' && value === AstTypes.CapturingGroup) {\n // Key is the copied node, value is the origin node\n originMap.set(store, originMap.get(obj) ?? obj);\n }\n store[key] = value;\n }\n }\n return store;\n}\n\n// `Recursion` nodes are used only by the transformer\nfunction createRecursion(ref) {\n return {\n type: AstTypes.Recursion,\n ref,\n };\n}\n\nfunction getAllParents(node, filterFn) {\n const results = [];\n while ((node = node.parent)) {\n if (!filterFn || filterFn(node)) {\n results.push(node);\n }\n }\n return results;\n}\n\n// See also `isValidGroupNameJs`\nfunction getAndStoreJsGroupName(name, map) {\n if (map.has(name)) {\n return map.get(name);\n }\n // Onig group names can't start with `$`, but JS names can\n const jsName = `$${map.size}_${name.replace(/^[^$_\\p{IDS}]|[^$\\u200C\\u200D\\p{IDC}]/ug, '_')}`;\n map.set(name, jsName);\n return jsName;\n}\n\n// Returns the string key for the container that holds the node's kids\nfunction getContainerAccessor(node) {\n for (const accessor of ['alternatives', 'classes', 'elements']) {\n if (node[accessor]) {\n return accessor;\n }\n }\n return null;\n}\n\nfunction getCombinedFlagModsFromFlagNodes(flagNodes) {\n const flagProps = ['dotAll', 'ignoreCase'];\n const combinedFlags = {enable: {}, disable: {}};\n flagNodes.forEach(({flags}) => {\n flagProps.forEach(prop => {\n if (flags.enable?.[prop]) {\n // Need to remove `disable` since disabled flags take precedence\n delete combinedFlags.disable[prop];\n combinedFlags.enable[prop] = true;\n }\n if (flags.disable?.[prop]) {\n combinedFlags.disable[prop] = true;\n }\n });\n });\n if (!Object.keys(combinedFlags.enable).length) {\n delete combinedFlags.enable;\n }\n if (!Object.keys(combinedFlags.disable).length) {\n delete combinedFlags.disable;\n }\n if (combinedFlags.enable || combinedFlags.disable) {\n return combinedFlags;\n }\n return null;\n}\n\nfunction getFlagModsFromFlags({dotAll, ignoreCase}) {\n const mods = {};\n if (dotAll || ignoreCase) {\n mods.enable = {};\n dotAll && (mods.enable.dotAll = true);\n ignoreCase && (mods.enable.ignoreCase = true);\n }\n if (!dotAll || !ignoreCase) {\n mods.disable = {};\n !dotAll && (mods.disable.dotAll = true);\n !ignoreCase && (mods.disable.ignoreCase = true);\n }\n return mods;\n}\n\nfunction getKids(node) {\n if (!node) {\n throw new Error('Node expected');\n }\n // [NOTE] Not handling `Regex` kids (`pattern`, `flags`) and `CharacterClassRange` kids (`min`,\n // `max`) only because not needed by current callers\n if (node.type === AstTypes.Quantifier) {\n return [node.element];\n }\n const accessor = getContainerAccessor(node);\n return accessor && node[accessor];\n}\n\nfunction getLeadingG(els) {\n const firstToConsider = els.find(el => (\n el.kind === AstAssertionKinds.search_start ||\n isLoneGLookaround(el, {negate: false}) ||\n !isAlwaysZeroLength(el)\n ));\n if (!firstToConsider) {\n return null;\n }\n if (firstToConsider.kind === AstAssertionKinds.search_start) {\n return firstToConsider;\n }\n if (isLookaround(firstToConsider)) {\n return firstToConsider.alternatives[0].elements[0];\n }\n if (isConsumptiveGroup(firstToConsider)) {\n const gNodesForGroup = [];\n // Recursively find `\\G` nodes for all alternatives in the group\n for (const alt of firstToConsider.alternatives) {\n const leadingG = getLeadingG(alt.elements);\n if (!leadingG) {\n // Don't return `gNodesForGroup` collected so far since this alt didn't qualify\n return null;\n }\n Array.isArray(leadingG) ?\n gNodesForGroup.push(...leadingG) :\n gNodesForGroup.push(leadingG);\n }\n return gNodesForGroup;\n }\n return null;\n}\n\nfunction hasDescendant(node, descendant) {\n const kids = getKids(node) ?? [];\n for (const kid of kids) {\n if (\n kid === descendant ||\n hasDescendant(kid, descendant)\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLoneGLookaround(node, options) {\n const opts = {\n negate: null,\n ...options,\n };\n return (\n isLookaround(node) &&\n (opts.negate === null || node.negate === opts.negate) &&\n hasOnlyChild(node, kid => kid.kind === AstAssertionKinds.search_start)\n );\n}\n\n// See also `getAndStoreJsGroupName`\nfunction isValidGroupNameJs(name) {\n // JS group names are more restrictive than Onig; see `isValidGroupNameOniguruma` and\n // <developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers>\n return /^[$_\\p{IDS}][$\\u200C\\u200D\\p{IDC}]*$/u.test(name);\n}\n\n// Returns a single node, either the given node or all nodes wrapped in a noncapturing group\nfunction parseFragment(pattern, options) {\n const ast = parse(tokenize(pattern), options);\n const alts = ast.pattern.alternatives;\n if (alts.length > 1 || alts[0].elements.length > 1) {\n return adoptAndSwapKids(createGroup(), alts);\n }\n return alts[0].elements[0];\n}\n\nfunction prepContainer(node, kids) {\n const accessor = getContainerAccessor(node);\n // Set the parent for the default container of a new node\n node[accessor][0].parent = node;\n if (kids) {\n adoptAndSwapKids(node[accessor][0], kids);\n }\n return node;\n}\n\nfunction setNegate(node, negate) {\n node.negate = negate;\n return node;\n}\n\nfunction traverseReplacement(replacement, {parent, key, container}, state, visitor) {\n traverse({\n // Don't use the `node` from `path`\n node: replacement,\n parent,\n key,\n container,\n }, state, visitor);\n}\n\nexport {\n transform,\n};\n","import { ShikiError as ShikiError$1 } from '@shikijs/types';\nexport * from '@shikijs/types';\nimport { createOnigurumaEngine as createOnigurumaEngine$1, loadWasm as loadWasm$1, getDefaultWasmLoader } from '@shikijs/engine-oniguruma';\nimport { w as warnDeprecated } from './shared/core.5hv0Law9.mjs';\nexport { e as enableDeprecationWarnings } from './shared/core.5hv0Law9.mjs';\nimport { FontStyle, INITIAL, EncodedTokenMetadata, Registry as Registry$1, Theme } from '@shikijs/vscode-textmate';\nexport { FontStyle, EncodedTokenMetadata as StackElementMetadata } from '@shikijs/vscode-textmate';\nimport { toHtml } from 'hast-util-to-html';\nexport { toHtml as hastToHtml } from 'hast-util-to-html';\nimport { createJavaScriptRegexEngine as createJavaScriptRegexEngine$1, defaultJavaScriptRegexConstructor as defaultJavaScriptRegexConstructor$1 } from '@shikijs/engine-javascript';\n\nfunction createOnigurumaEngine(options) {\n warnDeprecated(\"import `createOnigurumaEngine` from `@shikijs/engine-oniguruma` or `shiki/engine/oniguruma` instead\");\n return createOnigurumaEngine$1(options);\n}\nfunction createWasmOnigEngine(options) {\n warnDeprecated(\"import `createOnigurumaEngine` from `@shikijs/engine-oniguruma` or `shiki/engine/oniguruma` instead\");\n return createOnigurumaEngine$1(options);\n}\nfunction loadWasm(options) {\n warnDeprecated(\"import `loadWasm` from `@shikijs/engine-oniguruma` or `shiki/engine/oniguruma` instead\");\n return loadWasm$1(options);\n}\n\nfunction toArray(x) {\n return Array.isArray(x) ? x : [x];\n}\nfunction splitLines(code, preserveEnding = false) {\n const parts = code.split(/(\\r?\\n)/g);\n let index = 0;\n const lines = [];\n for (let i = 0; i < parts.length; i += 2) {\n const line = preserveEnding ? parts[i] + (parts[i + 1] || \"\") : parts[i];\n lines.push([line, index]);\n index += parts[i].length;\n index += parts[i + 1]?.length || 0;\n }\n return lines;\n}\nfunction isPlainLang(lang) {\n return !lang || [\"plaintext\", \"txt\", \"text\", \"plain\"].includes(lang);\n}\nfunction isSpecialLang(lang) {\n return lang === \"ansi\" || isPlainLang(lang);\n}\nfunction isNoneTheme(theme) {\n return theme === \"none\";\n}\nfunction isSpecialTheme(theme) {\n return isNoneTheme(theme);\n}\nfunction addClassToHast(node, className) {\n if (!className)\n return node;\n node.properties ||= {};\n node.properties.class ||= [];\n if (typeof node.properties.class === \"string\")\n node.properties.class = node.properties.class.split(/\\s+/g);\n if (!Array.isArray(node.properties.class))\n node.properties.class = [];\n const targets = Array.isArray(className) ? className : className.split(/\\s+/g);\n for (const c of targets) {\n if (c && !node.properties.class.includes(c))\n node.properties.class.push(c);\n }\n return node;\n}\nfunction splitToken(token, offsets) {\n let lastOffset = 0;\n const tokens = [];\n for (const offset of offsets) {\n if (offset > lastOffset) {\n tokens.push({\n ...token,\n content: token.content.slice(lastOffset, offset),\n offset: token.offset + lastOffset\n });\n }\n lastOffset = offset;\n }\n if (lastOffset < token.content.length) {\n tokens.push({\n ...token,\n content: token.content.slice(lastOffset),\n offset: token.offset + lastOffset\n });\n }\n return tokens;\n}\nfunction splitTokens(tokens, breakpoints) {\n const sorted = Array.from(breakpoints instanceof Set ? breakpoints : new Set(breakpoints)).sort((a, b) => a - b);\n if (!sorted.length)\n return tokens;\n return tokens.map((line) => {\n return line.flatMap((token) => {\n const breakpointsInToken = sorted.filter((i) => token.offset < i && i < token.offset + token.content.length).map((i) => i - token.offset).sort((a, b) => a - b);\n if (!breakpointsInToken.length)\n return token;\n return splitToken(token, breakpointsInToken);\n });\n });\n}\nasync function normalizeGetter(p) {\n return Promise.resolve(typeof p === \"function\" ? p() : p).then((r) => r.default || r);\n}\nfunction resolveColorReplacements(theme, options) {\n const replacements = typeof theme === \"string\" ? {} : { ...theme.colorReplacements };\n const themeName = typeof theme === \"string\" ? theme : theme.name;\n for (const [key, value] of Object.entries(options?.colorReplacements || {})) {\n if (typeof value === \"string\")\n replacements[key] = value;\n else if (key === themeName)\n Object.assign(replacements, value);\n }\n return replacements;\n}\nfunction applyColorReplacements(color, replacements) {\n if (!color)\n return color;\n return replacements?.[color?.toLowerCase()] || color;\n}\nfunction getTokenStyleObject(token) {\n const styles = {};\n if (token.color)\n styles.color = token.color;\n if (token.bgColor)\n styles[\"background-color\"] = token.bgColor;\n if (token.fontStyle) {\n if (token.fontStyle & FontStyle.Italic)\n styles[\"font-style\"] = \"italic\";\n if (token.fontStyle & FontStyle.Bold)\n styles[\"font-weight\"] = \"bold\";\n if (token.fontStyle & FontStyle.Underline)\n styles[\"text-decoration\"] = \"underline\";\n }\n return styles;\n}\nfunction stringifyTokenStyle(token) {\n if (typeof token === \"string\")\n return token;\n return Object.entries(token).map(([key, value]) => `${key}:${value}`).join(\";\");\n}\nfunction createPositionConverter(code) {\n const lines = splitLines(code, true).map(([line]) => line);\n function indexToPos(index) {\n if (index === code.length) {\n return {\n line: lines.length - 1,\n character: lines[lines.length - 1].length\n };\n }\n let character = index;\n let line = 0;\n for (const lineText of lines) {\n if (character < lineText.length)\n break;\n character -= lineText.length;\n line++;\n }\n return { line, character };\n }\n function posToIndex(line, character) {\n let index = 0;\n for (let i = 0; i < line; i++)\n index += lines[i].length;\n index += character;\n return index;\n }\n return {\n lines,\n indexToPos,\n posToIndex\n };\n}\n\nclass ShikiError extends Error {\n constructor(message) {\n super(message);\n this.name = \"ShikiError\";\n }\n}\n\nconst _grammarStateMap = /* @__PURE__ */ new WeakMap();\nfunction setLastGrammarStateToMap(keys, state) {\n _grammarStateMap.set(keys, state);\n}\nfunction getLastGrammarStateFromMap(keys) {\n return _grammarStateMap.get(keys);\n}\nclass GrammarState {\n /**\n * Theme to Stack mapping\n */\n _stacks = {};\n lang;\n get themes() {\n return Object.keys(this._stacks);\n }\n get theme() {\n return this.themes[0];\n }\n get _stack() {\n return this._stacks[this.theme];\n }\n /**\n * Static method to create a initial grammar state.\n */\n static initial(lang, themes) {\n return new GrammarState(\n Object.fromEntries(toArray(themes).map((theme) => [theme, INITIAL])),\n lang\n );\n }\n constructor(...args) {\n if (args.length === 2) {\n const [stacksMap, lang] = args;\n this.lang = lang;\n this._stacks = stacksMap;\n } else {\n const [stack, lang, theme] = args;\n this.lang = lang;\n this._stacks = { [theme]: stack };\n }\n }\n /**\n * Get the internal stack object.\n * @internal\n */\n getInternalStack(theme = this.theme) {\n return this._stacks[theme];\n }\n /**\n * @deprecated use `getScopes` instead\n */\n get scopes() {\n warnDeprecated(\"GrammarState.scopes is deprecated, use GrammarState.getScopes() instead\");\n return getScopes(this._stacks[this.theme]);\n }\n getScopes(theme = this.theme) {\n return getScopes(this._stacks[theme]);\n }\n toJSON() {\n return {\n lang: this.lang,\n theme: this.theme,\n themes: this.themes,\n scopes: this.getScopes()\n };\n }\n}\nfunction getScopes(stack) {\n const scopes = [];\n const visited = /* @__PURE__ */ new Set();\n function pushScope(stack2) {\n if (visited.has(stack2))\n return;\n visited.add(stack2);\n const name = stack2?.nameScopesList?.scopeName;\n if (name)\n scopes.push(name);\n if (stack2.parent)\n pushScope(stack2.parent);\n }\n pushScope(stack);\n return scopes;\n}\nfunction getGrammarStack(state, theme) {\n if (!(state instanceof GrammarState))\n throw new ShikiError(\"Invalid grammar state\");\n return state.getInternalStack(theme);\n}\n\nfunction transformerDecorations() {\n const map = /* @__PURE__ */ new WeakMap();\n function getContext(shiki) {\n if (!map.has(shiki.meta)) {\n let normalizePosition = function(p) {\n if (typeof p === \"number\") {\n if (p < 0 || p > shiki.source.length)\n throw new ShikiError(`Invalid decoration offset: ${p}. Code length: ${shiki.source.length}`);\n return {\n ...converter.indexToPos(p),\n offset: p\n };\n } else {\n const line = converter.lines[p.line];\n if (line === undefined)\n throw new ShikiError(`Invalid decoration position ${JSON.stringify(p)}. Lines length: ${converter.lines.length}`);\n if (p.character < 0 || p.character > line.length)\n throw new ShikiError(`Invalid decoration position ${JSON.stringify(p)}. Line ${p.line} length: ${line.length}`);\n return {\n ...p,\n offset: converter.posToIndex(p.line, p.character)\n };\n }\n };\n const converter = createPositionConverter(shiki.source);\n const decorations = (shiki.options.decorations || []).map((d) => ({\n ...d,\n start: normalizePosition(d.start),\n end: normalizePosition(d.end)\n }));\n verifyIntersections(decorations);\n map.set(shiki.meta, {\n decorations,\n converter,\n source: shiki.source\n });\n }\n return map.get(shiki.meta);\n }\n return {\n name: \"shiki:decorations\",\n tokens(tokens) {\n if (!this.options.decorations?.length)\n return;\n const ctx = getContext(this);\n const breakpoints = ctx.decorations.flatMap((d) => [d.start.offset, d.end.offset]);\n const splitted = splitTokens(tokens, breakpoints);\n return splitted;\n },\n code(codeEl) {\n if (!this.options.decorations?.length)\n return;\n const ctx = getContext(this);\n const lines = Array.from(codeEl.children).filter((i) => i.type === \"element\" && i.tagName === \"span\");\n if (lines.length !== ctx.converter.lines.length)\n throw new ShikiError(`Number of lines in code element (${lines.length}) does not match the number of lines in the source (${ctx.converter.lines.length}). Failed to apply decorations.`);\n function applyLineSection(line, start, end, decoration) {\n const lineEl = lines[line];\n let text = \"\";\n let startIndex = -1;\n let endIndex = -1;\n if (start === 0)\n startIndex = 0;\n if (end === 0)\n endIndex = 0;\n if (end === Number.POSITIVE_INFINITY)\n endIndex = lineEl.children.length;\n if (startIndex === -1 || endIndex === -1) {\n for (let i = 0; i < lineEl.children.length; i++) {\n text += stringify(lineEl.children[i]);\n if (startIndex === -1 && text.length === start)\n startIndex = i + 1;\n if (endIndex === -1 && text.length === end)\n endIndex = i + 1;\n }\n }\n if (startIndex === -1)\n throw new ShikiError(`Failed to find start index for decoration ${JSON.stringify(decoration.start)}`);\n if (endIndex === -1)\n throw new ShikiError(`Failed to find end index for decoration ${JSON.stringify(decoration.end)}`);\n const children = lineEl.children.slice(startIndex, endIndex);\n if (!decoration.alwaysWrap && children.length === lineEl.children.length) {\n applyDecoration(lineEl, decoration, \"line\");\n } else if (!decoration.alwaysWrap && children.length === 1 && children[0].type === \"element\") {\n applyDecoration(children[0], decoration, \"token\");\n } else {\n const wrapper = {\n type: \"element\",\n tagName: \"span\",\n properties: {},\n children\n };\n applyDecoration(wrapper, decoration, \"wrapper\");\n lineEl.children.splice(startIndex, children.length, wrapper);\n }\n }\n function applyLine(line, decoration) {\n lines[line] = applyDecoration(lines[line], decoration, \"line\");\n }\n function applyDecoration(el, decoration, type) {\n const properties = decoration.properties || {};\n const transform = decoration.transform || ((i) => i);\n el.tagName = decoration.tagName || \"span\";\n el.properties = {\n ...el.properties,\n ...properties,\n class: el.properties.class\n };\n if (decoration.properties?.class)\n addClassToHast(el, decoration.properties.class);\n el = transform(el, type) || el;\n return el;\n }\n const lineApplies = [];\n const sorted = ctx.decorations.sort((a, b) => b.start.offset - a.start.offset || a.end.offset - b.end.offset);\n for (const decoration of sorted) {\n const { start, end } = decoration;\n if (start.line === end.line) {\n applyLineSection(start.line, start.character, end.character, decoration);\n } else if (start.line < end.line) {\n applyLineSection(start.line, start.character, Number.POSITIVE_INFINITY, decoration);\n for (let i = start.line + 1; i < end.line; i++)\n lineApplies.unshift(() => applyLine(i, decoration));\n applyLineSection(end.line, 0, end.character, decoration);\n }\n }\n lineApplies.forEach((i) => i());\n }\n };\n}\nfunction verifyIntersections(items) {\n for (let i = 0; i < items.length; i++) {\n const foo = items[i];\n if (foo.start.offset > foo.end.offset)\n throw new ShikiError(`Invalid decoration range: ${JSON.stringify(foo.start)} - ${JSON.stringify(foo.end)}`);\n for (let j = i + 1; j < items.length; j++) {\n const bar = items[j];\n const isFooHasBarStart = foo.start.offset <= bar.start.offset && bar.start.offset < foo.end.offset;\n const isFooHasBarEnd = foo.start.offset < bar.end.offset && bar.end.offset <= foo.end.offset;\n const isBarHasFooStart = bar.start.offset <= foo.start.offset && foo.start.offset < bar.end.offset;\n const isBarHasFooEnd = bar.start.offset < foo.end.offset && foo.end.offset <= bar.end.offset;\n if (isFooHasBarStart || isFooHasBarEnd || isBarHasFooStart || isBarHasFooEnd) {\n if (isFooHasBarStart && isFooHasBarEnd)\n continue;\n if (isBarHasFooStart && isBarHasFooEnd)\n continue;\n throw new ShikiError(`Decorations ${JSON.stringify(foo.start)} and ${JSON.stringify(bar.start)} intersect.`);\n }\n }\n }\n}\nfunction stringify(el) {\n if (el.type === \"text\")\n return el.value;\n if (el.type === \"element\")\n return el.children.map(stringify).join(\"\");\n return \"\";\n}\n\nconst builtInTransformers = [\n /* @__PURE__ */ transformerDecorations()\n];\nfunction getTransformers(options) {\n return [\n ...options.transformers || [],\n ...builtInTransformers\n ];\n}\n\n// src/colors.ts\nvar namedColors = [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"brightBlack\",\n \"brightRed\",\n \"brightGreen\",\n \"brightYellow\",\n \"brightBlue\",\n \"brightMagenta\",\n \"brightCyan\",\n \"brightWhite\"\n];\n\n// src/decorations.ts\nvar decorations = {\n 1: \"bold\",\n 2: \"dim\",\n 3: \"italic\",\n 4: \"underline\",\n 7: \"reverse\",\n 9: \"strikethrough\"\n};\n\n// src/parser.ts\nfunction findSequence(value, position) {\n const nextEscape = value.indexOf(\"\\x1B[\", position);\n if (nextEscape !== -1) {\n const nextClose = value.indexOf(\"m\", nextEscape);\n return {\n sequence: value.substring(nextEscape + 2, nextClose).split(\";\"),\n startPosition: nextEscape,\n position: nextClose + 1\n };\n }\n return {\n position: value.length\n };\n}\nfunction parseColor(sequence, index) {\n let offset = 1;\n const colorMode = sequence[index + offset++];\n let color;\n if (colorMode === \"2\") {\n const rgb = [\n sequence[index + offset++],\n sequence[index + offset++],\n sequence[index + offset]\n ].map((x) => Number.parseInt(x));\n if (rgb.length === 3 && !rgb.some((x) => Number.isNaN(x))) {\n color = {\n type: \"rgb\",\n rgb\n };\n }\n } else if (colorMode === \"5\") {\n const colorIndex = Number.parseInt(sequence[index + offset]);\n if (!Number.isNaN(colorIndex)) {\n color = { type: \"table\", index: Number(colorIndex) };\n }\n }\n return [offset, color];\n}\nfunction parseSequence(sequence) {\n const commands = [];\n for (let i = 0; i < sequence.length; i++) {\n const code = sequence[i];\n const codeInt = Number.parseInt(code);\n if (Number.isNaN(codeInt))\n continue;\n if (codeInt === 0) {\n commands.push({ type: \"resetAll\" });\n } else if (codeInt <= 9) {\n const decoration = decorations[codeInt];\n if (decoration) {\n commands.push({\n type: \"setDecoration\",\n value: decorations[codeInt]\n });\n }\n } else if (codeInt <= 29) {\n const decoration = decorations[codeInt - 20];\n if (decoration) {\n commands.push({\n type: \"resetDecoration\",\n value: decoration\n });\n }\n } else if (codeInt <= 37) {\n commands.push({\n type: \"setForegroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 30] }\n });\n } else if (codeInt === 38) {\n const [offset, color] = parseColor(sequence, i);\n if (color) {\n commands.push({\n type: \"setForegroundColor\",\n value: color\n });\n }\n i += offset;\n } else if (codeInt === 39) {\n commands.push({\n type: \"resetForegroundColor\"\n });\n } else if (codeInt <= 47) {\n commands.push({\n type: \"setBackgroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 40] }\n });\n } else if (codeInt === 48) {\n const [offset, color] = parseColor(sequence, i);\n if (color) {\n commands.push({\n type: \"setBackgroundColor\",\n value: color\n });\n }\n i += offset;\n } else if (codeInt === 49) {\n commands.push({\n type: \"resetBackgroundColor\"\n });\n } else if (codeInt >= 90 && codeInt <= 97) {\n commands.push({\n type: \"setForegroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 90 + 8] }\n });\n } else if (codeInt >= 100 && codeInt <= 107) {\n commands.push({\n type: \"setBackgroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 100 + 8] }\n });\n }\n }\n return commands;\n}\nfunction createAnsiSequenceParser() {\n let foreground = null;\n let background = null;\n let decorations2 = /* @__PURE__ */ new Set();\n return {\n parse(value) {\n const tokens = [];\n let position = 0;\n do {\n const findResult = findSequence(value, position);\n const text = findResult.sequence ? value.substring(position, findResult.startPosition) : value.substring(position);\n if (text.length > 0) {\n tokens.push({\n value: text,\n foreground,\n background,\n decorations: new Set(decorations2)\n });\n }\n if (findResult.sequence) {\n const commands = parseSequence(findResult.sequence);\n for (const styleToken of commands) {\n if (styleToken.type === \"resetAll\") {\n foreground = null;\n background = null;\n decorations2.clear();\n } else if (styleToken.type === \"resetForegroundColor\") {\n foreground = null;\n } else if (styleToken.type === \"resetBackgroundColor\") {\n background = null;\n } else if (styleToken.type === \"resetDecoration\") {\n decorations2.delete(styleToken.value);\n }\n }\n for (const styleToken of commands) {\n if (styleToken.type === \"setForegroundColor\") {\n foreground = styleToken.value;\n } else if (styleToken.type === \"setBackgroundColor\") {\n background = styleToken.value;\n } else if (styleToken.type === \"setDecoration\") {\n decorations2.add(styleToken.value);\n }\n }\n }\n position = findResult.position;\n } while (position < value.length);\n return tokens;\n }\n };\n}\n\n// src/palette.ts\nvar defaultNamedColorsMap = {\n black: \"#000000\",\n red: \"#bb0000\",\n green: \"#00bb00\",\n yellow: \"#bbbb00\",\n blue: \"#0000bb\",\n magenta: \"#ff00ff\",\n cyan: \"#00bbbb\",\n white: \"#eeeeee\",\n brightBlack: \"#555555\",\n brightRed: \"#ff5555\",\n brightGreen: \"#00ff00\",\n brightYellow: \"#ffff55\",\n brightBlue: \"#5555ff\",\n brightMagenta: \"#ff55ff\",\n brightCyan: \"#55ffff\",\n brightWhite: \"#ffffff\"\n};\nfunction createColorPalette(namedColorsMap = defaultNamedColorsMap) {\n function namedColor(name) {\n return namedColorsMap[name];\n }\n function rgbColor(rgb) {\n return `#${rgb.map((x) => Math.max(0, Math.min(x, 255)).toString(16).padStart(2, \"0\")).join(\"\")}`;\n }\n let colorTable;\n function getColorTable() {\n if (colorTable) {\n return colorTable;\n }\n colorTable = [];\n for (let i = 0; i < namedColors.length; i++) {\n colorTable.push(namedColor(namedColors[i]));\n }\n let levels = [0, 95, 135, 175, 215, 255];\n for (let r = 0; r < 6; r++) {\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n colorTable.push(rgbColor([levels[r], levels[g], levels[b]]));\n }\n }\n }\n let level = 8;\n for (let i = 0; i < 24; i++, level += 10) {\n colorTable.push(rgbColor([level, level, level]));\n }\n return colorTable;\n }\n function tableColor(index) {\n return getColorTable()[index];\n }\n function value(color) {\n switch (color.type) {\n case \"named\":\n return namedColor(color.name);\n case \"rgb\":\n return rgbColor(color.rgb);\n case \"table\":\n return tableColor(color.index);\n }\n }\n return {\n value\n };\n}\n\nfunction tokenizeAnsiWithTheme(theme, fileContents, options) {\n const colorReplacements = resolveColorReplacements(theme, options);\n const lines = splitLines(fileContents);\n const colorPalette = createColorPalette(\n Object.fromEntries(\n namedColors.map((name) => [\n name,\n theme.colors?.[`terminal.ansi${name[0].toUpperCase()}${name.substring(1)}`]\n ])\n )\n );\n const parser = createAnsiSequenceParser();\n return lines.map(\n (line) => parser.parse(line[0]).map((token) => {\n let color;\n let bgColor;\n if (token.decorations.has(\"reverse\")) {\n color = token.background ? colorPalette.value(token.background) : theme.bg;\n bgColor = token.foreground ? colorPalette.value(token.foreground) : theme.fg;\n } else {\n color = token.foreground ? colorPalette.value(token.foreground) : theme.fg;\n bgColor = token.background ? colorPalette.value(token.background) : undefined;\n }\n color = applyColorReplacements(color, colorReplacements);\n bgColor = applyColorReplacements(bgColor, colorReplacements);\n if (token.decorations.has(\"dim\"))\n color = dimColor(color);\n let fontStyle = FontStyle.None;\n if (token.decorations.has(\"bold\"))\n fontStyle |= FontStyle.Bold;\n if (token.decorations.has(\"italic\"))\n fontStyle |= FontStyle.Italic;\n if (token.decorations.has(\"underline\"))\n fontStyle |= FontStyle.Underline;\n return {\n content: token.value,\n offset: line[1],\n // TODO: more accurate offset? might need to fork ansi-sequence-parser\n color,\n bgColor,\n fontStyle\n };\n })\n );\n}\nfunction dimColor(color) {\n const hexMatch = color.match(/#([0-9a-f]{3})([0-9a-f]{3})?([0-9a-f]{2})?/);\n if (hexMatch) {\n if (hexMatch[3]) {\n const alpha = Math.round(Number.parseInt(hexMatch[3], 16) / 2).toString(16).padStart(2, \"0\");\n return `#${hexMatch[1]}${hexMatch[2]}${alpha}`;\n } else if (hexMatch[2]) {\n return `#${hexMatch[1]}${hexMatch[2]}80`;\n } else {\n return `#${Array.from(hexMatch[1]).map((x) => `${x}${x}`).join(\"\")}80`;\n }\n }\n const cssVarMatch = color.match(/var\\((--[\\w-]+-ansi-[\\w-]+)\\)/);\n if (cssVarMatch)\n return `var(${cssVarMatch[1]}-dim)`;\n return color;\n}\n\nfunction codeToTokensBase(internal, code, options = {}) {\n const {\n lang = \"text\",\n theme: themeName = internal.getLoadedThemes()[0]\n } = options;\n if (isPlainLang(lang) || isNoneTheme(themeName))\n return splitLines(code).map((line) => [{ content: line[0], offset: line[1] }]);\n const { theme, colorMap } = internal.setTheme(themeName);\n if (lang === \"ansi\")\n return tokenizeAnsiWithTheme(theme, code, options);\n const _grammar = internal.getLanguage(lang);\n if (options.grammarState) {\n if (options.grammarState.lang !== _grammar.name) {\n throw new ShikiError$1(`Grammar state language \"${options.grammarState.lang}\" does not match highlight language \"${_grammar.name}\"`);\n }\n if (!options.grammarState.themes.includes(theme.name)) {\n throw new ShikiError$1(`Grammar state themes \"${options.grammarState.themes}\" do not contain highlight theme \"${theme.name}\"`);\n }\n }\n return tokenizeWithTheme(code, _grammar, theme, colorMap, options);\n}\nfunction getLastGrammarState(...args) {\n if (args.length === 2) {\n return getLastGrammarStateFromMap(args[1]);\n }\n const [internal, code, options = {}] = args;\n const {\n lang = \"text\",\n theme: themeName = internal.getLoadedThemes()[0]\n } = options;\n if (isPlainLang(lang) || isNoneTheme(themeName))\n throw new ShikiError$1(\"Plain language does not have grammar state\");\n if (lang === \"ansi\")\n throw new ShikiError$1(\"ANSI language does not have grammar state\");\n const { theme, colorMap } = internal.setTheme(themeName);\n const _grammar = internal.getLanguage(lang);\n return new GrammarState(\n _tokenizeWithTheme(code, _grammar, theme, colorMap, options).stateStack,\n _grammar.name,\n theme.name\n );\n}\nfunction tokenizeWithTheme(code, grammar, theme, colorMap, options) {\n const result = _tokenizeWithTheme(code, grammar, theme, colorMap, options);\n const grammarState = new GrammarState(\n _tokenizeWithTheme(code, grammar, theme, colorMap, options).stateStack,\n grammar.name,\n theme.name\n );\n setLastGrammarStateToMap(result.tokens, grammarState);\n return result.tokens;\n}\nfunction _tokenizeWithTheme(code, grammar, theme, colorMap, options) {\n const colorReplacements = resolveColorReplacements(theme, options);\n const {\n tokenizeMaxLineLength = 0,\n tokenizeTimeLimit = 500\n } = options;\n const lines = splitLines(code);\n let stateStack = options.grammarState ? getGrammarStack(options.grammarState, theme.name) ?? INITIAL : options.grammarContextCode != null ? _tokenizeWithTheme(\n options.grammarContextCode,\n grammar,\n theme,\n colorMap,\n {\n ...options,\n grammarState: undefined,\n grammarContextCode: undefined\n }\n ).stateStack : INITIAL;\n let actual = [];\n const final = [];\n for (let i = 0, len = lines.length; i < len; i++) {\n const [line, lineOffset] = lines[i];\n if (line === \"\") {\n actual = [];\n final.push([]);\n continue;\n }\n if (tokenizeMaxLineLength > 0 && line.length >= tokenizeMaxLineLength) {\n actual = [];\n final.push([{\n content: line,\n offset: lineOffset,\n color: \"\",\n fontStyle: 0\n }]);\n continue;\n }\n let resultWithScopes;\n let tokensWithScopes;\n let tokensWithScopesIndex;\n if (options.includeExplanation) {\n resultWithScopes = grammar.tokenizeLine(line, stateStack);\n tokensWithScopes = resultWithScopes.tokens;\n tokensWithScopesIndex = 0;\n }\n const result = grammar.tokenizeLine2(line, stateStack, tokenizeTimeLimit);\n const tokensLength = result.tokens.length / 2;\n for (let j = 0; j < tokensLength; j++) {\n const startIndex = result.tokens[2 * j];\n const nextStartIndex = j + 1 < tokensLength ? result.tokens[2 * j + 2] : line.length;\n if (startIndex === nextStartIndex)\n continue;\n const metadata = result.tokens[2 * j + 1];\n const color = applyColorReplacements(\n colorMap[EncodedTokenMetadata.getForeground(metadata)],\n colorReplacements\n );\n const fontStyle = EncodedTokenMetadata.getFontStyle(metadata);\n const token = {\n content: line.substring(startIndex, nextStartIndex),\n offset: lineOffset + startIndex,\n color,\n fontStyle\n };\n if (options.includeExplanation) {\n const themeSettingsSelectors = [];\n if (options.includeExplanation !== \"scopeName\") {\n for (const setting of theme.settings) {\n let selectors;\n switch (typeof setting.scope) {\n case \"string\":\n selectors = setting.scope.split(/,/).map((scope) => scope.trim());\n break;\n case \"object\":\n selectors = setting.scope;\n break;\n default:\n continue;\n }\n themeSettingsSelectors.push({\n settings: setting,\n selectors: selectors.map((selector) => selector.split(/ /))\n });\n }\n }\n token.explanation = [];\n let offset = 0;\n while (startIndex + offset < nextStartIndex) {\n const tokenWithScopes = tokensWithScopes[tokensWithScopesIndex];\n const tokenWithScopesText = line.substring(\n tokenWithScopes.startIndex,\n tokenWithScopes.endIndex\n );\n offset += tokenWithScopesText.length;\n token.explanation.push({\n content: tokenWithScopesText,\n scopes: options.includeExplanation === \"scopeName\" ? explainThemeScopesNameOnly(\n tokenWithScopes.scopes\n ) : explainThemeScopesFull(\n themeSettingsSelectors,\n tokenWithScopes.scopes\n )\n });\n tokensWithScopesIndex += 1;\n }\n }\n actual.push(token);\n }\n final.push(actual);\n actual = [];\n stateStack = result.ruleStack;\n }\n return {\n tokens: final,\n stateStack\n };\n}\nfunction explainThemeScopesNameOnly(scopes) {\n return scopes.map((scope) => ({ scopeName: scope }));\n}\nfunction explainThemeScopesFull(themeSelectors, scopes) {\n const result = [];\n for (let i = 0, len = scopes.length; i < len; i++) {\n const scope = scopes[i];\n result[i] = {\n scopeName: scope,\n themeMatches: explainThemeScope(themeSelectors, scope, scopes.slice(0, i))\n };\n }\n return result;\n}\nfunction matchesOne(selector, scope) {\n return selector === scope || scope.substring(0, selector.length) === selector && scope[selector.length] === \".\";\n}\nfunction matches(selectors, scope, parentScopes) {\n if (!matchesOne(selectors[selectors.length - 1], scope))\n return false;\n let selectorParentIndex = selectors.length - 2;\n let parentIndex = parentScopes.length - 1;\n while (selectorParentIndex >= 0 && parentIndex >= 0) {\n if (matchesOne(selectors[selectorParentIndex], parentScopes[parentIndex]))\n selectorParentIndex -= 1;\n parentIndex -= 1;\n }\n if (selectorParentIndex === -1)\n return true;\n return false;\n}\nfunction explainThemeScope(themeSettingsSelectors, scope, parentScopes) {\n const result = [];\n for (const { selectors, settings } of themeSettingsSelectors) {\n for (const selectorPieces of selectors) {\n if (matches(selectorPieces, scope, parentScopes)) {\n result.push(settings);\n break;\n }\n }\n }\n return result;\n}\n\nfunction codeToTokensWithThemes(internal, code, options) {\n const themes = Object.entries(options.themes).filter((i) => i[1]).map((i) => ({ color: i[0], theme: i[1] }));\n const themedTokens = themes.map((t) => {\n const tokens2 = codeToTokensBase(internal, code, {\n ...options,\n theme: t.theme\n });\n const state = getLastGrammarStateFromMap(tokens2);\n const theme = typeof t.theme === \"string\" ? t.theme : t.theme.name;\n return {\n tokens: tokens2,\n state,\n theme\n };\n });\n const tokens = syncThemesTokenization(\n ...themedTokens.map((i) => i.tokens)\n );\n const mergedTokens = tokens[0].map(\n (line, lineIdx) => line.map((_token, tokenIdx) => {\n const mergedToken = {\n content: _token.content,\n variants: {},\n offset: _token.offset\n };\n if (\"includeExplanation\" in options && options.includeExplanation) {\n mergedToken.explanation = _token.explanation;\n }\n tokens.forEach((t, themeIdx) => {\n const {\n content: _,\n explanation: __,\n offset: ___,\n ...styles\n } = t[lineIdx][tokenIdx];\n mergedToken.variants[themes[themeIdx].color] = styles;\n });\n return mergedToken;\n })\n );\n const mergedGrammarState = themedTokens[0].state ? new GrammarState(\n Object.fromEntries(themedTokens.map((s) => [s.theme, s.state?.getInternalStack(s.theme)])),\n themedTokens[0].state.lang\n ) : undefined;\n if (mergedGrammarState)\n setLastGrammarStateToMap(mergedTokens, mergedGrammarState);\n return mergedTokens;\n}\nfunction syncThemesTokenization(...themes) {\n const outThemes = themes.map(() => []);\n const count = themes.length;\n for (let i = 0; i < themes[0].length; i++) {\n const lines = themes.map((t) => t[i]);\n const outLines = outThemes.map(() => []);\n outThemes.forEach((t, i2) => t.push(outLines[i2]));\n const indexes = lines.map(() => 0);\n const current = lines.map((l) => l[0]);\n while (current.every((t) => t)) {\n const minLength = Math.min(...current.map((t) => t.content.length));\n for (let n = 0; n < count; n++) {\n const token = current[n];\n if (token.content.length === minLength) {\n outLines[n].push(token);\n indexes[n] += 1;\n current[n] = lines[n][indexes[n]];\n } else {\n outLines[n].push({\n ...token,\n content: token.content.slice(0, minLength)\n });\n current[n] = {\n ...token,\n content: token.content.slice(minLength),\n offset: token.offset + minLength\n };\n }\n }\n }\n }\n return outThemes;\n}\n\nfunction codeToTokens(internal, code, options) {\n let bg;\n let fg;\n let tokens;\n let themeName;\n let rootStyle;\n let grammarState;\n if (\"themes\" in options) {\n const {\n defaultColor = \"light\",\n cssVariablePrefix = \"--shiki-\"\n } = options;\n const themes = Object.entries(options.themes).filter((i) => i[1]).map((i) => ({ color: i[0], theme: i[1] })).sort((a, b) => a.color === defaultColor ? -1 : b.color === defaultColor ? 1 : 0);\n if (themes.length === 0)\n throw new ShikiError$1(\"`themes` option must not be empty\");\n const themeTokens = codeToTokensWithThemes(\n internal,\n code,\n options\n );\n grammarState = getLastGrammarStateFromMap(themeTokens);\n if (defaultColor && !themes.find((t) => t.color === defaultColor))\n throw new ShikiError$1(`\\`themes\\` option must contain the defaultColor key \\`${defaultColor}\\``);\n const themeRegs = themes.map((t) => internal.getTheme(t.theme));\n const themesOrder = themes.map((t) => t.color);\n tokens = themeTokens.map((line) => line.map((token) => mergeToken(token, themesOrder, cssVariablePrefix, defaultColor)));\n if (grammarState)\n setLastGrammarStateToMap(tokens, grammarState);\n const themeColorReplacements = themes.map((t) => resolveColorReplacements(t.theme, options));\n fg = themes.map((t, idx) => (idx === 0 && defaultColor ? \"\" : `${cssVariablePrefix + t.color}:`) + (applyColorReplacements(themeRegs[idx].fg, themeColorReplacements[idx]) || \"inherit\")).join(\";\");\n bg = themes.map((t, idx) => (idx === 0 && defaultColor ? \"\" : `${cssVariablePrefix + t.color}-bg:`) + (applyColorReplacements(themeRegs[idx].bg, themeColorReplacements[idx]) || \"inherit\")).join(\";\");\n themeName = `shiki-themes ${themeRegs.map((t) => t.name).join(\" \")}`;\n rootStyle = defaultColor ? undefined : [fg, bg].join(\";\");\n } else if (\"theme\" in options) {\n const colorReplacements = resolveColorReplacements(options.theme, options);\n tokens = codeToTokensBase(\n internal,\n code,\n options\n );\n const _theme = internal.getTheme(options.theme);\n bg = applyColorReplacements(_theme.bg, colorReplacements);\n fg = applyColorReplacements(_theme.fg, colorReplacements);\n themeName = _theme.name;\n grammarState = getLastGrammarStateFromMap(tokens);\n } else {\n throw new ShikiError$1(\"Invalid options, either `theme` or `themes` must be provided\");\n }\n return {\n tokens,\n fg,\n bg,\n themeName,\n rootStyle,\n grammarState\n };\n}\nfunction mergeToken(merged, variantsOrder, cssVariablePrefix, defaultColor) {\n const token = {\n content: merged.content,\n explanation: merged.explanation,\n offset: merged.offset\n };\n const styles = variantsOrder.map((t) => getTokenStyleObject(merged.variants[t]));\n const styleKeys = new Set(styles.flatMap((t) => Object.keys(t)));\n const mergedStyles = {};\n styles.forEach((cur, idx) => {\n for (const key of styleKeys) {\n const value = cur[key] || \"inherit\";\n if (idx === 0 && defaultColor) {\n mergedStyles[key] = value;\n } else {\n const keyName = key === \"color\" ? \"\" : key === \"background-color\" ? \"-bg\" : `-${key}`;\n const varKey = cssVariablePrefix + variantsOrder[idx] + (key === \"color\" ? \"\" : keyName);\n mergedStyles[varKey] = value;\n }\n }\n });\n token.htmlStyle = mergedStyles;\n return token;\n}\n\nfunction codeToHast(internal, code, options, transformerContext = {\n meta: {},\n options,\n codeToHast: (_code, _options) => codeToHast(internal, _code, _options),\n codeToTokens: (_code, _options) => codeToTokens(internal, _code, _options)\n}) {\n let input = code;\n for (const transformer of getTransformers(options))\n input = transformer.preprocess?.call(transformerContext, input, options) || input;\n let {\n tokens,\n fg,\n bg,\n themeName,\n rootStyle,\n grammarState\n } = codeToTokens(internal, input, options);\n const {\n mergeWhitespaces = true\n } = options;\n if (mergeWhitespaces === true)\n tokens = mergeWhitespaceTokens(tokens);\n else if (mergeWhitespaces === \"never\")\n tokens = splitWhitespaceTokens(tokens);\n const contextSource = {\n ...transformerContext,\n get source() {\n return input;\n }\n };\n for (const transformer of getTransformers(options))\n tokens = transformer.tokens?.call(contextSource, tokens) || tokens;\n return tokensToHast(\n tokens,\n {\n ...options,\n fg,\n bg,\n themeName,\n rootStyle\n },\n contextSource,\n grammarState\n );\n}\nfunction tokensToHast(tokens, options, transformerContext, grammarState = getLastGrammarStateFromMap(tokens)) {\n const transformers = getTransformers(options);\n const lines = [];\n const root = {\n type: \"root\",\n children: []\n };\n const {\n structure = \"classic\",\n tabindex = \"0\"\n } = options;\n let preNode = {\n type: \"element\",\n tagName: \"pre\",\n properties: {\n class: `shiki ${options.themeName || \"\"}`,\n style: options.rootStyle || `background-color:${options.bg};color:${options.fg}`,\n ...tabindex !== false && tabindex != null ? {\n tabindex: tabindex.toString()\n } : {},\n ...Object.fromEntries(\n Array.from(\n Object.entries(options.meta || {})\n ).filter(([key]) => !key.startsWith(\"_\"))\n )\n },\n children: []\n };\n let codeNode = {\n type: \"element\",\n tagName: \"code\",\n properties: {},\n children: lines\n };\n const lineNodes = [];\n const context = {\n ...transformerContext,\n structure,\n addClassToHast,\n get source() {\n return transformerContext.source;\n },\n get tokens() {\n return tokens;\n },\n get options() {\n return options;\n },\n get root() {\n return root;\n },\n get pre() {\n return preNode;\n },\n get code() {\n return codeNode;\n },\n get lines() {\n return lineNodes;\n }\n };\n tokens.forEach((line, idx) => {\n if (idx) {\n if (structure === \"inline\")\n root.children.push({ type: \"element\", tagName: \"br\", properties: {}, children: [] });\n else if (structure === \"classic\")\n lines.push({ type: \"text\", value: \"\\n\" });\n }\n let lineNode = {\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"line\" },\n children: []\n };\n let col = 0;\n for (const token of line) {\n let tokenNode = {\n type: \"element\",\n tagName: \"span\",\n properties: {\n ...token.htmlAttrs\n },\n children: [{ type: \"text\", value: token.content }]\n };\n if (typeof token.htmlStyle === \"string\")\n warnDeprecated(\"`htmlStyle` as a string is deprecated. Use an object instead.\");\n const style = stringifyTokenStyle(token.htmlStyle || getTokenStyleObject(token));\n if (style)\n tokenNode.properties.style = style;\n for (const transformer of transformers)\n tokenNode = transformer?.span?.call(context, tokenNode, idx + 1, col, lineNode, token) || tokenNode;\n if (structure === \"inline\")\n root.children.push(tokenNode);\n else if (structure === \"classic\")\n lineNode.children.push(tokenNode);\n col += token.content.length;\n }\n if (structure === \"classic\") {\n for (const transformer of transformers)\n lineNode = transformer?.line?.call(context, lineNode, idx + 1) || lineNode;\n lineNodes.push(lineNode);\n lines.push(lineNode);\n }\n });\n if (structure === \"classic\") {\n for (const transformer of transformers)\n codeNode = transformer?.code?.call(context, codeNode) || codeNode;\n preNode.children.push(codeNode);\n for (const transformer of transformers)\n preNode = transformer?.pre?.call(context, preNode) || preNode;\n root.children.push(preNode);\n }\n let result = root;\n for (const transformer of transformers)\n result = transformer?.root?.call(context, result) || result;\n if (grammarState)\n setLastGrammarStateToMap(result, grammarState);\n return result;\n}\nfunction mergeWhitespaceTokens(tokens) {\n return tokens.map((line) => {\n const newLine = [];\n let carryOnContent = \"\";\n let firstOffset = 0;\n line.forEach((token, idx) => {\n const isUnderline = token.fontStyle && token.fontStyle & FontStyle.Underline;\n const couldMerge = !isUnderline;\n if (couldMerge && token.content.match(/^\\s+$/) && line[idx + 1]) {\n if (!firstOffset)\n firstOffset = token.offset;\n carryOnContent += token.content;\n } else {\n if (carryOnContent) {\n if (couldMerge) {\n newLine.push({\n ...token,\n offset: firstOffset,\n content: carryOnContent + token.content\n });\n } else {\n newLine.push(\n {\n content: carryOnContent,\n offset: firstOffset\n },\n token\n );\n }\n firstOffset = 0;\n carryOnContent = \"\";\n } else {\n newLine.push(token);\n }\n }\n });\n return newLine;\n });\n}\nfunction splitWhitespaceTokens(tokens) {\n return tokens.map((line) => {\n return line.flatMap((token) => {\n if (token.content.match(/^\\s+$/))\n return token;\n const match = token.content.match(/^(\\s*)(.*?)(\\s*)$/);\n if (!match)\n return token;\n const [, leading, content, trailing] = match;\n if (!leading && !trailing)\n return token;\n const expanded = [{\n ...token,\n offset: token.offset + leading.length,\n content\n }];\n if (leading) {\n expanded.unshift({\n content: leading,\n offset: token.offset\n });\n }\n if (trailing) {\n expanded.push({\n content: trailing,\n offset: token.offset + leading.length + content.length\n });\n }\n return expanded;\n });\n });\n}\n\nfunction codeToHtml(internal, code, options) {\n const context = {\n meta: {},\n options,\n codeToHast: (_code, _options) => codeToHast(internal, _code, _options),\n codeToTokens: (_code, _options) => codeToTokens(internal, _code, _options)\n };\n let result = toHtml(codeToHast(internal, code, options, context));\n for (const transformer of getTransformers(options))\n result = transformer.postprocess?.call(context, result, options) || result;\n return result;\n}\n\nconst VSCODE_FALLBACK_EDITOR_FG = { light: \"#333333\", dark: \"#bbbbbb\" };\nconst VSCODE_FALLBACK_EDITOR_BG = { light: \"#fffffe\", dark: \"#1e1e1e\" };\nconst RESOLVED_KEY = \"__shiki_resolved\";\nfunction normalizeTheme(rawTheme) {\n if (rawTheme?.[RESOLVED_KEY])\n return rawTheme;\n const theme = {\n ...rawTheme\n };\n if (theme.tokenColors && !theme.settings) {\n theme.settings = theme.tokenColors;\n delete theme.tokenColors;\n }\n theme.type ||= \"dark\";\n theme.colorReplacements = { ...theme.colorReplacements };\n theme.settings ||= [];\n let { bg, fg } = theme;\n if (!bg || !fg) {\n const globalSetting = theme.settings ? theme.settings.find((s) => !s.name && !s.scope) : undefined;\n if (globalSetting?.settings?.foreground)\n fg = globalSetting.settings.foreground;\n if (globalSetting?.settings?.background)\n bg = globalSetting.settings.background;\n if (!fg && theme?.colors?.[\"editor.foreground\"])\n fg = theme.colors[\"editor.foreground\"];\n if (!bg && theme?.colors?.[\"editor.background\"])\n bg = theme.colors[\"editor.background\"];\n if (!fg)\n fg = theme.type === \"light\" ? VSCODE_FALLBACK_EDITOR_FG.light : VSCODE_FALLBACK_EDITOR_FG.dark;\n if (!bg)\n bg = theme.type === \"light\" ? VSCODE_FALLBACK_EDITOR_BG.light : VSCODE_FALLBACK_EDITOR_BG.dark;\n theme.fg = fg;\n theme.bg = bg;\n }\n if (!(theme.settings[0] && theme.settings[0].settings && !theme.settings[0].scope)) {\n theme.settings.unshift({\n settings: {\n foreground: theme.fg,\n background: theme.bg\n }\n });\n }\n let replacementCount = 0;\n const replacementMap = /* @__PURE__ */ new Map();\n function getReplacementColor(value) {\n if (replacementMap.has(value))\n return replacementMap.get(value);\n replacementCount += 1;\n const hex = `#${replacementCount.toString(16).padStart(8, \"0\").toLowerCase()}`;\n if (theme.colorReplacements?.[`#${hex}`])\n return getReplacementColor(value);\n replacementMap.set(value, hex);\n return hex;\n }\n theme.settings = theme.settings.map((setting) => {\n const replaceFg = setting.settings?.foreground && !setting.settings.foreground.startsWith(\"#\");\n const replaceBg = setting.settings?.background && !setting.settings.background.startsWith(\"#\");\n if (!replaceFg && !replaceBg)\n return setting;\n const clone = {\n ...setting,\n settings: {\n ...setting.settings\n }\n };\n if (replaceFg) {\n const replacement = getReplacementColor(setting.settings.foreground);\n theme.colorReplacements[replacement] = setting.settings.foreground;\n clone.settings.foreground = replacement;\n }\n if (replaceBg) {\n const replacement = getReplacementColor(setting.settings.background);\n theme.colorReplacements[replacement] = setting.settings.background;\n clone.settings.background = replacement;\n }\n return clone;\n });\n for (const key of Object.keys(theme.colors || {})) {\n if (key === \"editor.foreground\" || key === \"editor.background\" || key.startsWith(\"terminal.ansi\")) {\n if (!theme.colors[key]?.startsWith(\"#\")) {\n const replacement = getReplacementColor(theme.colors[key]);\n theme.colorReplacements[replacement] = theme.colors[key];\n theme.colors[key] = replacement;\n }\n }\n }\n Object.defineProperty(theme, RESOLVED_KEY, {\n enumerable: false,\n writable: false,\n value: true\n });\n return theme;\n}\n\nasync function resolveLangs(langs) {\n return Array.from(new Set((await Promise.all(\n langs.filter((l) => !isSpecialLang(l)).map(async (lang) => await normalizeGetter(lang).then((r) => Array.isArray(r) ? r : [r]))\n )).flat()));\n}\nasync function resolveThemes(themes) {\n const resolved = await Promise.all(\n themes.map(\n async (theme) => isSpecialTheme(theme) ? null : normalizeTheme(await normalizeGetter(theme))\n )\n );\n return resolved.filter((i) => !!i);\n}\n\nclass Registry extends Registry$1 {\n constructor(_resolver, _themes, _langs, _alias = {}) {\n super(_resolver);\n this._resolver = _resolver;\n this._themes = _themes;\n this._langs = _langs;\n this._alias = _alias;\n this._themes.map((t) => this.loadTheme(t));\n this.loadLanguages(this._langs);\n }\n _resolvedThemes = /* @__PURE__ */ new Map();\n _resolvedGrammars = /* @__PURE__ */ new Map();\n _langMap = /* @__PURE__ */ new Map();\n _langGraph = /* @__PURE__ */ new Map();\n _textmateThemeCache = /* @__PURE__ */ new WeakMap();\n _loadedThemesCache = null;\n _loadedLanguagesCache = null;\n getTheme(theme) {\n if (typeof theme === \"string\")\n return this._resolvedThemes.get(theme);\n else\n return this.loadTheme(theme);\n }\n loadTheme(theme) {\n const _theme = normalizeTheme(theme);\n if (_theme.name) {\n this._resolvedThemes.set(_theme.name, _theme);\n this._loadedThemesCache = null;\n }\n return _theme;\n }\n getLoadedThemes() {\n if (!this._loadedThemesCache)\n this._loadedThemesCache = [...this._resolvedThemes.keys()];\n return this._loadedThemesCache;\n }\n // Override and re-implement this method to cache the textmate themes as `TextMateTheme.createFromRawTheme`\n // is expensive. Themes can switch often especially for dual-theme support.\n //\n // The parent class also accepts `colorMap` as the second parameter, but since we don't use that,\n // we omit here so it's easier to cache the themes.\n setTheme(theme) {\n let textmateTheme = this._textmateThemeCache.get(theme);\n if (!textmateTheme) {\n textmateTheme = Theme.createFromRawTheme(theme);\n this._textmateThemeCache.set(theme, textmateTheme);\n }\n this._syncRegistry.setTheme(textmateTheme);\n }\n getGrammar(name) {\n if (this._alias[name]) {\n const resolved = /* @__PURE__ */ new Set([name]);\n while (this._alias[name]) {\n name = this._alias[name];\n if (resolved.has(name))\n throw new ShikiError(`Circular alias \\`${Array.from(resolved).join(\" -> \")} -> ${name}\\``);\n resolved.add(name);\n }\n }\n return this._resolvedGrammars.get(name);\n }\n loadLanguage(lang) {\n if (this.getGrammar(lang.name))\n return;\n const embeddedLazilyBy = new Set(\n [...this._langMap.values()].filter((i) => i.embeddedLangsLazy?.includes(lang.name))\n );\n this._resolver.addLanguage(lang);\n const grammarConfig = {\n balancedBracketSelectors: lang.balancedBracketSelectors || [\"*\"],\n unbalancedBracketSelectors: lang.unbalancedBracketSelectors || []\n };\n this._syncRegistry._rawGrammars.set(lang.scopeName, lang);\n const g = this.loadGrammarWithConfiguration(lang.scopeName, 1, grammarConfig);\n g.name = lang.name;\n this._resolvedGrammars.set(lang.name, g);\n if (lang.aliases) {\n lang.aliases.forEach((alias) => {\n this._alias[alias] = lang.name;\n });\n }\n this._loadedLanguagesCache = null;\n if (embeddedLazilyBy.size) {\n for (const e of embeddedLazilyBy) {\n this._resolvedGrammars.delete(e.name);\n this._loadedLanguagesCache = null;\n this._syncRegistry?._injectionGrammars?.delete(e.scopeName);\n this._syncRegistry?._grammars?.delete(e.scopeName);\n this.loadLanguage(this._langMap.get(e.name));\n }\n }\n }\n dispose() {\n super.dispose();\n this._resolvedThemes.clear();\n this._resolvedGrammars.clear();\n this._langMap.clear();\n this._langGraph.clear();\n this._loadedThemesCache = null;\n }\n loadLanguages(langs) {\n for (const lang of langs)\n this.resolveEmbeddedLanguages(lang);\n const langsGraphArray = Array.from(this._langGraph.entries());\n const missingLangs = langsGraphArray.filter(([_, lang]) => !lang);\n if (missingLangs.length) {\n const dependents = langsGraphArray.filter(([_, lang]) => lang && lang.embeddedLangs?.some((l) => missingLangs.map(([name]) => name).includes(l))).filter((lang) => !missingLangs.includes(lang));\n throw new ShikiError(`Missing languages ${missingLangs.map(([name]) => `\\`${name}\\``).join(\", \")}, required by ${dependents.map(([name]) => `\\`${name}\\``).join(\", \")}`);\n }\n for (const [_, lang] of langsGraphArray)\n this._resolver.addLanguage(lang);\n for (const [_, lang] of langsGraphArray)\n this.loadLanguage(lang);\n }\n getLoadedLanguages() {\n if (!this._loadedLanguagesCache) {\n this._loadedLanguagesCache = [\n .../* @__PURE__ */ new Set([...this._resolvedGrammars.keys(), ...Object.keys(this._alias)])\n ];\n }\n return this._loadedLanguagesCache;\n }\n resolveEmbeddedLanguages(lang) {\n this._langMap.set(lang.name, lang);\n this._langGraph.set(lang.name, lang);\n if (lang.embeddedLangs) {\n for (const embeddedLang of lang.embeddedLangs)\n this._langGraph.set(embeddedLang, this._langMap.get(embeddedLang));\n }\n }\n}\n\nclass Resolver {\n _langs = /* @__PURE__ */ new Map();\n _scopeToLang = /* @__PURE__ */ new Map();\n _injections = /* @__PURE__ */ new Map();\n _onigLib;\n constructor(engine, langs) {\n this._onigLib = {\n createOnigScanner: (patterns) => engine.createScanner(patterns),\n createOnigString: (s) => engine.createString(s)\n };\n langs.forEach((i) => this.addLanguage(i));\n }\n get onigLib() {\n return this._onigLib;\n }\n getLangRegistration(langIdOrAlias) {\n return this._langs.get(langIdOrAlias);\n }\n loadGrammar(scopeName) {\n return this._scopeToLang.get(scopeName);\n }\n addLanguage(l) {\n this._langs.set(l.name, l);\n if (l.aliases) {\n l.aliases.forEach((a) => {\n this._langs.set(a, l);\n });\n }\n this._scopeToLang.set(l.scopeName, l);\n if (l.injectTo) {\n l.injectTo.forEach((i) => {\n if (!this._injections.get(i))\n this._injections.set(i, []);\n this._injections.get(i).push(l.scopeName);\n });\n }\n }\n getInjections(scopeName) {\n const scopeParts = scopeName.split(\".\");\n let injections = [];\n for (let i = 1; i <= scopeParts.length; i++) {\n const subScopeName = scopeParts.slice(0, i).join(\".\");\n injections = [...injections, ...this._injections.get(subScopeName) || []];\n }\n return injections;\n }\n}\n\nlet instancesCount = 0;\nfunction createShikiInternalSync(options) {\n instancesCount += 1;\n if (options.warnings !== false && instancesCount >= 10 && instancesCount % 10 === 0)\n console.warn(`[Shiki] ${instancesCount} instances have been created. Shiki is supposed to be used as a singleton, consider refactoring your code to cache your highlighter instance; Or call \\`highlighter.dispose()\\` to release unused instances.`);\n let isDisposed = false;\n if (!options.engine)\n throw new ShikiError(\"`engine` option is required for synchronous mode\");\n const langs = (options.langs || []).flat(1);\n const themes = (options.themes || []).flat(1).map(normalizeTheme);\n const resolver = new Resolver(options.engine, langs);\n const _registry = new Registry(resolver, themes, langs, options.langAlias);\n let _lastTheme;\n function getLanguage(name) {\n ensureNotDisposed();\n const _lang = _registry.getGrammar(typeof name === \"string\" ? name : name.name);\n if (!_lang)\n throw new ShikiError(`Language \\`${name}\\` not found, you may need to load it first`);\n return _lang;\n }\n function getTheme(name) {\n if (name === \"none\")\n return { bg: \"\", fg: \"\", name: \"none\", settings: [], type: \"dark\" };\n ensureNotDisposed();\n const _theme = _registry.getTheme(name);\n if (!_theme)\n throw new ShikiError(`Theme \\`${name}\\` not found, you may need to load it first`);\n return _theme;\n }\n function setTheme(name) {\n ensureNotDisposed();\n const theme = getTheme(name);\n if (_lastTheme !== name) {\n _registry.setTheme(theme);\n _lastTheme = name;\n }\n const colorMap = _registry.getColorMap();\n return {\n theme,\n colorMap\n };\n }\n function getLoadedThemes() {\n ensureNotDisposed();\n return _registry.getLoadedThemes();\n }\n function getLoadedLanguages() {\n ensureNotDisposed();\n return _registry.getLoadedLanguages();\n }\n function loadLanguageSync(...langs2) {\n ensureNotDisposed();\n _registry.loadLanguages(langs2.flat(1));\n }\n async function loadLanguage(...langs2) {\n return loadLanguageSync(await resolveLangs(langs2));\n }\n function loadThemeSync(...themes2) {\n ensureNotDisposed();\n for (const theme of themes2.flat(1)) {\n _registry.loadTheme(theme);\n }\n }\n async function loadTheme(...themes2) {\n ensureNotDisposed();\n return loadThemeSync(await resolveThemes(themes2));\n }\n function ensureNotDisposed() {\n if (isDisposed)\n throw new ShikiError(\"Shiki instance has been disposed\");\n }\n function dispose() {\n if (isDisposed)\n return;\n isDisposed = true;\n _registry.dispose();\n instancesCount -= 1;\n }\n return {\n setTheme,\n getTheme,\n getLanguage,\n getLoadedThemes,\n getLoadedLanguages,\n loadLanguage,\n loadLanguageSync,\n loadTheme,\n loadThemeSync,\n dispose,\n [Symbol.dispose]: dispose\n };\n}\n\nasync function createShikiInternal(options) {\n if (options.loadWasm) {\n warnDeprecated(\"`loadWasm` option is deprecated. Use `engine: createOnigurumaEngine(loadWasm)` instead.\");\n }\n if (!options.engine) {\n warnDeprecated(\"`engine` option is required. Use `createOnigurumaEngine` or `createJavaScriptRegexEngine` to create an engine.\");\n }\n const [\n themes,\n langs,\n engine\n ] = await Promise.all([\n resolveThemes(options.themes || []),\n resolveLangs(options.langs || []),\n options.engine || createOnigurumaEngine$1(options.loadWasm || getDefaultWasmLoader())\n ]);\n return createShikiInternalSync({\n ...options,\n themes,\n langs,\n engine\n });\n}\nfunction getShikiInternal(options) {\n warnDeprecated(\"`getShikiInternal` is deprecated. Use `createShikiInternal` instead.\");\n return createShikiInternal(options);\n}\n\nasync function createHighlighterCore(options) {\n const internal = await createShikiInternal(options);\n return {\n getLastGrammarState: (...args) => getLastGrammarState(internal, ...args),\n codeToTokensBase: (code, options2) => codeToTokensBase(internal, code, options2),\n codeToTokensWithThemes: (code, options2) => codeToTokensWithThemes(internal, code, options2),\n codeToTokens: (code, options2) => codeToTokens(internal, code, options2),\n codeToHast: (code, options2) => codeToHast(internal, code, options2),\n codeToHtml: (code, options2) => codeToHtml(internal, code, options2),\n ...internal,\n getInternalContext: () => internal\n };\n}\nfunction createHighlighterCoreSync(options) {\n const internal = createShikiInternalSync(options);\n return {\n getLastGrammarState: (...args) => getLastGrammarState(internal, ...args),\n codeToTokensBase: (code, options2) => codeToTokensBase(internal, code, options2),\n codeToTokensWithThemes: (code, options2) => codeToTokensWithThemes(internal, code, options2),\n codeToTokens: (code, options2) => codeToTokens(internal, code, options2),\n codeToHast: (code, options2) => codeToHast(internal, code, options2),\n codeToHtml: (code, options2) => codeToHtml(internal, code, options2),\n ...internal,\n getInternalContext: () => internal\n };\n}\nfunction makeSingletonHighlighterCore(createHighlighter) {\n let _shiki;\n async function getSingletonHighlighterCore2(options) {\n if (!_shiki) {\n _shiki = createHighlighter({\n ...options,\n themes: options.themes || [],\n langs: options.langs || []\n });\n return _shiki;\n } else {\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n }\n }\n return getSingletonHighlighterCore2;\n}\nconst getSingletonHighlighterCore = /* @__PURE__ */ makeSingletonHighlighterCore(createHighlighterCore);\nfunction getHighlighterCore(options) {\n warnDeprecated(\"`getHighlighterCore` is deprecated. Use `createHighlighterCore` or `getSingletonHighlighterCore` instead.\");\n return createHighlighterCore(options);\n}\n\nfunction createdBundledHighlighter(arg1, arg2, arg3) {\n let bundledLanguages;\n let bundledThemes;\n let engine;\n if (arg2) {\n warnDeprecated(\"`createdBundledHighlighter` signature with `bundledLanguages` and `bundledThemes` is deprecated. Use the options object signature instead.\");\n bundledLanguages = arg1;\n bundledThemes = arg2;\n engine = () => createOnigurumaEngine(arg3);\n } else {\n const options = arg1;\n bundledLanguages = options.langs;\n bundledThemes = options.themes;\n engine = options.engine;\n }\n async function createHighlighter(options) {\n function resolveLang(lang) {\n if (typeof lang === \"string\") {\n if (isSpecialLang(lang))\n return [];\n const bundle = bundledLanguages[lang];\n if (!bundle)\n throw new ShikiError$1(`Language \\`${lang}\\` is not included in this bundle. You may want to load it from external source.`);\n return bundle;\n }\n return lang;\n }\n function resolveTheme(theme) {\n if (isSpecialTheme(theme))\n return \"none\";\n if (typeof theme === \"string\") {\n const bundle = bundledThemes[theme];\n if (!bundle)\n throw new ShikiError$1(`Theme \\`${theme}\\` is not included in this bundle. You may want to load it from external source.`);\n return bundle;\n }\n return theme;\n }\n const _themes = (options.themes ?? []).map((i) => resolveTheme(i));\n const langs = (options.langs ?? []).map((i) => resolveLang(i));\n const core = await createHighlighterCore({\n engine: options.engine ?? engine(),\n ...options,\n themes: _themes,\n langs\n });\n return {\n ...core,\n loadLanguage(...langs2) {\n return core.loadLanguage(...langs2.map(resolveLang));\n },\n loadTheme(...themes) {\n return core.loadTheme(...themes.map(resolveTheme));\n }\n };\n }\n return createHighlighter;\n}\nfunction makeSingletonHighlighter(createHighlighter) {\n let _shiki;\n async function getSingletonHighlighter(options = {}) {\n if (!_shiki) {\n _shiki = createHighlighter({\n ...options,\n themes: options.themes || [],\n langs: options.langs || []\n });\n return _shiki;\n } else {\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n }\n }\n return getSingletonHighlighter;\n}\nfunction createSingletonShorthands(createHighlighter) {\n const getSingletonHighlighter = makeSingletonHighlighter(createHighlighter);\n return {\n getSingletonHighlighter(options) {\n return getSingletonHighlighter(options);\n },\n async codeToHtml(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: \"theme\" in options ? [options.theme] : Object.values(options.themes)\n });\n return shiki.codeToHtml(code, options);\n },\n async codeToHast(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: \"theme\" in options ? [options.theme] : Object.values(options.themes)\n });\n return shiki.codeToHast(code, options);\n },\n async codeToTokens(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: \"theme\" in options ? [options.theme] : Object.values(options.themes)\n });\n return shiki.codeToTokens(code, options);\n },\n async codeToTokensBase(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: [options.theme]\n });\n return shiki.codeToTokensBase(code, options);\n },\n async codeToTokensWithThemes(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: Object.values(options.themes).filter(Boolean)\n });\n return shiki.codeToTokensWithThemes(code, options);\n },\n async getLastGrammarState(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: [options.theme]\n });\n return shiki.getLastGrammarState(code, options);\n }\n };\n}\n\nfunction createJavaScriptRegexEngine(options) {\n warnDeprecated(\"import `createJavaScriptRegexEngine` from `@shikijs/engine-javascript` or `shiki/engine/javascript` instead\");\n return createJavaScriptRegexEngine$1(options);\n}\nfunction defaultJavaScriptRegexConstructor(pattern) {\n warnDeprecated(\"import `defaultJavaScriptRegexConstructor` from `@shikijs/engine-javascript` or `shiki/engine/javascript` instead\");\n return defaultJavaScriptRegexConstructor$1(pattern);\n}\n\nfunction createCssVariablesTheme(options = {}) {\n const {\n name = \"css-variables\",\n variablePrefix = \"--shiki-\",\n fontStyle = true\n } = options;\n const variable = (name2) => {\n if (options.variableDefaults?.[name2])\n return `var(${variablePrefix}${name2}, ${options.variableDefaults[name2]})`;\n return `var(${variablePrefix}${name2})`;\n };\n const theme = {\n name,\n type: \"dark\",\n colors: {\n \"editor.foreground\": variable(\"foreground\"),\n \"editor.background\": variable(\"background\"),\n \"terminal.ansiBlack\": variable(\"ansi-black\"),\n \"terminal.ansiRed\": variable(\"ansi-red\"),\n \"terminal.ansiGreen\": variable(\"ansi-green\"),\n \"terminal.ansiYellow\": variable(\"ansi-yellow\"),\n \"terminal.ansiBlue\": variable(\"ansi-blue\"),\n \"terminal.ansiMagenta\": variable(\"ansi-magenta\"),\n \"terminal.ansiCyan\": variable(\"ansi-cyan\"),\n \"terminal.ansiWhite\": variable(\"ansi-white\"),\n \"terminal.ansiBrightBlack\": variable(\"ansi-bright-black\"),\n \"terminal.ansiBrightRed\": variable(\"ansi-bright-red\"),\n \"terminal.ansiBrightGreen\": variable(\"ansi-bright-green\"),\n \"terminal.ansiBrightYellow\": variable(\"ansi-bright-yellow\"),\n \"terminal.ansiBrightBlue\": variable(\"ansi-bright-blue\"),\n \"terminal.ansiBrightMagenta\": variable(\"ansi-bright-magenta\"),\n \"terminal.ansiBrightCyan\": variable(\"ansi-bright-cyan\"),\n \"terminal.ansiBrightWhite\": variable(\"ansi-bright-white\")\n },\n tokenColors: [\n {\n scope: [\n \"keyword.operator.accessor\",\n \"meta.group.braces.round.function.arguments\",\n \"meta.template.expression\",\n \"markup.fenced_code meta.embedded.block\"\n ],\n settings: {\n foreground: variable(\"foreground\")\n }\n },\n {\n scope: \"emphasis\",\n settings: {\n fontStyle: \"italic\"\n }\n },\n {\n scope: [\"strong\", \"markup.heading.markdown\", \"markup.bold.markdown\"],\n settings: {\n fontStyle: \"bold\"\n }\n },\n {\n scope: [\"markup.italic.markdown\"],\n settings: {\n fontStyle: \"italic\"\n }\n },\n {\n scope: \"meta.link.inline.markdown\",\n settings: {\n fontStyle: \"underline\",\n foreground: variable(\"token-link\")\n }\n },\n {\n scope: [\"string\", \"markup.fenced_code\", \"markup.inline\"],\n settings: {\n foreground: variable(\"token-string\")\n }\n },\n {\n scope: [\"comment\", \"string.quoted.docstring.multi\"],\n settings: {\n foreground: variable(\"token-comment\")\n }\n },\n {\n scope: [\n \"constant.numeric\",\n \"constant.language\",\n \"constant.other.placeholder\",\n \"constant.character.format.placeholder\",\n \"variable.language.this\",\n \"variable.other.object\",\n \"variable.other.class\",\n \"variable.other.constant\",\n \"meta.property-name\",\n \"meta.property-value\",\n \"support\"\n ],\n settings: {\n foreground: variable(\"token-constant\")\n }\n },\n {\n scope: [\n \"keyword\",\n \"storage.modifier\",\n \"storage.type\",\n \"storage.control.clojure\",\n \"entity.name.function.clojure\",\n \"entity.name.tag.yaml\",\n \"support.function.node\",\n \"support.type.property-name.json\",\n \"punctuation.separator.key-value\",\n \"punctuation.definition.template-expression\"\n ],\n settings: {\n foreground: variable(\"token-keyword\")\n }\n },\n {\n scope: \"variable.parameter.function\",\n settings: {\n foreground: variable(\"token-parameter\")\n }\n },\n {\n scope: [\n \"support.function\",\n \"entity.name.type\",\n \"entity.other.inherited-class\",\n \"meta.function-call\",\n \"meta.instance.constructor\",\n \"entity.other.attribute-name\",\n \"entity.name.function\",\n \"constant.keyword.clojure\"\n ],\n settings: {\n foreground: variable(\"token-function\")\n }\n },\n {\n scope: [\n \"entity.name.tag\",\n \"string.quoted\",\n \"string.regexp\",\n \"string.interpolated\",\n \"string.template\",\n \"string.unquoted.plain.out.yaml\",\n \"keyword.other.template\"\n ],\n settings: {\n foreground: variable(\"token-string-expression\")\n }\n },\n {\n scope: [\n \"punctuation.definition.arguments\",\n \"punctuation.definition.dict\",\n \"punctuation.separator\",\n \"meta.function-call.arguments\"\n ],\n settings: {\n foreground: variable(\"token-punctuation\")\n }\n },\n {\n // [Custom] Markdown links\n scope: [\n \"markup.underline.link\",\n \"punctuation.definition.metadata.markdown\"\n ],\n settings: {\n foreground: variable(\"token-link\")\n }\n },\n {\n // [Custom] Markdown list\n scope: [\"beginning.punctuation.definition.list.markdown\"],\n settings: {\n foreground: variable(\"token-string\")\n }\n },\n {\n // [Custom] Markdown punctuation definition brackets\n scope: [\n \"punctuation.definition.string.begin.markdown\",\n \"punctuation.definition.string.end.markdown\",\n \"string.other.link.title.markdown\",\n \"string.other.link.description.markdown\"\n ],\n settings: {\n foreground: variable(\"token-keyword\")\n }\n },\n {\n // [Custom] Diff\n scope: [\n \"markup.inserted\",\n \"meta.diff.header.to-file\",\n \"punctuation.definition.inserted\"\n ],\n settings: {\n foreground: variable(\"token-inserted\")\n }\n },\n {\n scope: [\n \"markup.deleted\",\n \"meta.diff.header.from-file\",\n \"punctuation.definition.deleted\"\n ],\n settings: {\n foreground: variable(\"token-deleted\")\n }\n },\n {\n scope: [\n \"markup.changed\",\n \"punctuation.definition.changed\"\n ],\n settings: {\n foreground: variable(\"token-changed\")\n }\n }\n ]\n };\n if (!fontStyle) {\n theme.tokenColors = theme.tokenColors?.map((tokenColor) => {\n if (tokenColor.settings?.fontStyle)\n delete tokenColor.settings.fontStyle;\n return tokenColor;\n });\n }\n return theme;\n}\n\nexport { addClassToHast, applyColorReplacements, codeToHast, codeToHtml, codeToTokens, codeToTokensBase, codeToTokensWithThemes, createCssVariablesTheme, createHighlighterCore, createHighlighterCoreSync, createJavaScriptRegexEngine, createOnigurumaEngine, createPositionConverter, createShikiInternal, createShikiInternalSync, createSingletonShorthands, createWasmOnigEngine, createdBundledHighlighter, defaultJavaScriptRegexConstructor, getHighlighterCore, getShikiInternal, getSingletonHighlighterCore, getTokenStyleObject, isNoneTheme, isPlainLang, isSpecialLang, isSpecialTheme, loadWasm, makeSingletonHighlighter, makeSingletonHighlighterCore, normalizeGetter, normalizeTheme, resolveColorReplacements, splitLines, splitToken, splitTokens, stringifyTokenStyle, toArray, tokenizeAnsiWithTheme, tokenizeWithTheme, tokensToHast, transformerDecorations, warnDeprecated };\n","// TODO: We should find some other ways to do this.\nconst pre = (markdown: string): string =>\n // IE11 does not support \"u\" flag and Babel could not remove it. We intentionally omitting the \"u\" flag here.\n // eslint-disable-next-line require-unicode-regexp\n markdown.replace(/\\n\\r|\\r\\n/g, carriageReturn => (carriageReturn === '\\n\\r' ? '\\r\\n' : '\\n\\r'));\n\nexport { pre };\n","import {\n parseDocumentFragmentFromString,\n serializeDocumentFragmentIntoString,\n type HighlightCodeFn\n} from 'botframework-webchat-component/internal';\nimport { onErrorResumeNext } from 'botframework-webchat-core';\nimport katex from 'katex';\nimport { micromark } from 'micromark';\nimport { gfm, gfmHtml } from 'micromark-extension-gfm';\n\nimport { math, mathHtml } from './mathExtension';\nimport betterLinkDocumentMod, { BetterLinkDocumentModDecoration } from './private/betterLinkDocumentMod';\nimport iterateLinkDefinitions from './private/iterateLinkDefinitions';\nimport { pre as respectCRLFPre } from './private/respectCRLF';\n\ntype RenderInit = Readonly<{\n codeBlockCopyButtonTagName: string;\n externalLinkAlt: string;\n highlightCode: HighlightCodeFn;\n}>;\n\nconst ALLOWED_SCHEMES = ['data', 'http', 'https', 'ftp', 'mailto', 'sip', 'tel'];\n\nexport default function render(\n markdown: string,\n { markdownRespectCRLF, markdownRenderHTML }: Readonly<{ markdownRespectCRLF: boolean; markdownRenderHTML?: boolean }>,\n { externalLinkAlt }: RenderInit\n): string {\n const linkDefinitions = Array.from(iterateLinkDefinitions(markdown));\n\n if (markdownRespectCRLF) {\n markdown = respectCRLFPre(markdown);\n }\n\n const decorate = (href: string, textContent: string): BetterLinkDocumentModDecoration => {\n const decoration: BetterLinkDocumentModDecoration = {\n rel: 'noopener noreferrer',\n target: '_blank',\n wrapZeroWidthSpace: true\n };\n\n const ariaLabelSegments: string[] = [textContent];\n const classes: Set<string> = new Set();\n const linkDefinition = linkDefinitions.find(({ url }) => url === href);\n const protocol = onErrorResumeNext(() => new URL(href).protocol);\n\n if (linkDefinition) {\n ariaLabelSegments.push(\n linkDefinition.title || onErrorResumeNext(() => new URL(linkDefinition.url).host) || linkDefinition.url\n );\n\n // linkDefinition.identifier is uppercase, while linkDefinition.label is as-is.\n linkDefinition.label === textContent && classes.add('webchat__render-markdown__pure-identifier');\n }\n\n // Let javascript: fell through. Our sanitizer will catch and remove it from <a href>.\n // Otherwise, it will be turn into <button value=\"javascript:\"> and won't able to catch it.\n\n // False-positive.\n // eslint-disable-next-line no-script-url\n if (protocol !== 'javascript:') {\n // For links that would be sanitized out, let's turn them into a button so we could handle them later.\n if (!ALLOWED_SCHEMES.map(scheme => `${scheme}:`).includes(protocol)) {\n decoration.asButton = true;\n\n classes.add('webchat__render-markdown__citation');\n } else if (protocol === 'http:' || protocol === 'https:') {\n decoration.iconAlt = externalLinkAlt;\n decoration.iconClassName = 'webchat__render-markdown__external-link-icon';\n\n ariaLabelSegments.push(externalLinkAlt);\n }\n }\n\n // The first segment is textContent. Putting textContent is aria-label is useless.\n if (ariaLabelSegments.length > 1) {\n // If \"aria-label\" is already applied, do not overwrite it.\n decoration.ariaLabel = (value: string) => value || ariaLabelSegments.join(' ');\n }\n\n decoration.className = Array.from(classes).join(' ');\n\n // However, \"title\" may be narrated by screen reader:\n // - Edge\n // - <a> will narrate \"aria-label\" but not \"title\"\n // - <button> will narrate both \"aria-label\" and \"title\"\n // - NVDA\n // - <a> will narrate both \"aria-label\" and \"title\"\n // - <button> will narrate both \"aria-label\" and \"title\"\n\n // Title makes it very difficult to control narrations by the screen reader. Thus, we are disabling it in favor of \"aria-label\".\n // This will not affect our accessibility compliance but UX. We could use a non-native tooltip or other forms of visual hint.\n\n decoration.title = false;\n\n return decoration;\n };\n\n const htmlAfterMarkdown = micromark(markdown, {\n allowDangerousHtml: markdownRenderHTML ?? true,\n // We need to handle links like cite:1 or other URL handlers.\n // And we will remove dangerous protocol during sanitization.\n allowDangerousProtocol: true,\n extensions: [gfm(), math()],\n htmlExtensions: [\n gfmHtml(),\n mathHtml({\n renderMath: (content, isDisplay) =>\n katex.renderToString(content, {\n displayMode: isDisplay,\n output: 'mathml'\n })\n })\n ]\n });\n\n // TODO: [P1] In some future, we should apply \"better link\" and \"sanitization\" outside of the Markdown engine.\n // Particularly, apply them at `useRenderMarkdownAsHTML` instead of inside the default `renderMarkdown`.\n // If web devs want to bring their own Markdown engine, they don't need to rebuild \"better link\" and sanitization themselves.\n\n const documentFragmentAfterMarkdown = parseDocumentFragmentFromString(htmlAfterMarkdown);\n\n betterLinkDocumentMod(documentFragmentAfterMarkdown, decorate);\n\n return serializeDocumentFragmentIntoString(documentFragmentAfterMarkdown);\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport * as fs from \"fs\";\r\nimport { IAudioDestination } from \"../../common/Exports\";\r\nimport { Contracts } from \"../Contracts\";\r\nimport { AudioStreamFormat } from \"../Exports\";\r\nimport { AudioOutputFormatImpl } from \"./AudioOutputFormat\";\r\n\r\nexport class AudioFileWriter implements IAudioDestination {\r\n private privAudioFormat: AudioOutputFormatImpl;\r\n private privFd: number;\r\n private privId: string;\r\n private privWriteStream: fs.WriteStream;\r\n\r\n public constructor(filename: fs.PathLike) {\r\n Contracts.throwIfNullOrUndefined(fs.openSync, \"\\nFile System access not available, please use Push or PullAudioOutputStream\");\r\n this.privFd = fs.openSync(filename, \"w\");\r\n }\r\n\r\n public set format(format: AudioStreamFormat) {\r\n Contracts.throwIfNotUndefined(this.privAudioFormat, \"format is already set\");\r\n this.privAudioFormat = format as AudioOutputFormatImpl;\r\n let headerOffset: number = 0;\r\n if (this.privAudioFormat.hasHeader) {\r\n headerOffset = this.privAudioFormat.header.byteLength;\r\n }\r\n if (this.privFd !== undefined) {\r\n this.privWriteStream = fs.createWriteStream(\"\", {fd: this.privFd, start: headerOffset, autoClose: false});\r\n }\r\n }\r\n\r\n public write(buffer: ArrayBuffer): void {\r\n Contracts.throwIfNullOrUndefined(this.privAudioFormat, \"must set format before writing.\");\r\n if (this.privWriteStream !== undefined) {\r\n this.privWriteStream.write(new Uint8Array(buffer.slice(0)));\r\n }\r\n }\r\n\r\n public close(): void {\r\n if (this.privFd !== undefined) {\r\n this.privWriteStream.on(\"finish\", () => {\r\n if (this.privAudioFormat.hasHeader) {\r\n this.privAudioFormat.updateHeader(this.privWriteStream.bytesWritten);\r\n fs.writeSync(this.privFd,\r\n new Int8Array(this.privAudioFormat.header),\r\n 0,\r\n this.privAudioFormat.header.byteLength,\r\n 0);\r\n }\r\n fs.closeSync(this.privFd);\r\n this.privFd = undefined;\r\n });\r\n this.privWriteStream.end();\r\n }\r\n }\r\n\r\n public id = (): string => {\r\n return this.privId;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { ReplayableAudioNode } from \"../common.browser/Exports\";\r\nimport { ConnectionOpenResponse } from \"../common/ConnectionOpenResponse\";\r\nimport {\r\n ArgumentNullError,\r\n ConnectionClosedEvent,\r\n ConnectionEvent,\r\n ConnectionState,\r\n createNoDashGuid,\r\n EventSource,\r\n IAudioSource,\r\n IAudioStreamNode,\r\n IConnection,\r\n IDisposable,\r\n IStreamChunk,\r\n MessageType,\r\n ServiceEvent,\r\n Timeout\r\n} from \"../common/Exports\";\r\nimport { AudioStreamFormatImpl } from \"../sdk/Audio/AudioStreamFormat\";\r\nimport {\r\n CancellationErrorCode,\r\n CancellationReason,\r\n PropertyId,\r\n RecognitionEventArgs,\r\n Recognizer,\r\n SessionEventArgs,\r\n SpeechRecognitionResult,\r\n} from \"../sdk/Exports\";\r\nimport { Callback } from \"../sdk/Transcription/IConversation\";\r\nimport {\r\n AgentConfig,\r\n DynamicGrammarBuilder,\r\n ISpeechConfigAudioDevice,\r\n RecognitionMode,\r\n RequestSession,\r\n SpeechContext,\r\n SpeechDetected,\r\n type\r\n} from \"./Exports\";\r\nimport {\r\n AuthInfo,\r\n IAuthentication,\r\n} from \"./IAuthentication\";\r\nimport { IConnectionFactory } from \"./IConnectionFactory\";\r\nimport { RecognizerConfig } from \"./RecognizerConfig\";\r\nimport { SpeechConnectionMessage } from \"./SpeechConnectionMessage.Internal\";\r\n\r\nexport abstract class ServiceRecognizerBase implements IDisposable {\r\n private privAuthentication: IAuthentication;\r\n private privConnectionFactory: IConnectionFactory;\r\n\r\n // A promise for a configured connection.\r\n // Do not consume directly, call fetchConnection instead.\r\n private privConnectionConfigurationPromise: Promise<IConnection>;\r\n\r\n // A promise for a connection, but one that has not had the speech context sent yet.\r\n // Do not consume directly, call fetchConnection instead.\r\n private privConnectionPromise: Promise<IConnection>;\r\n private privAuthFetchEventId: string;\r\n private privIsDisposed: boolean;\r\n private privMustReportEndOfStream: boolean;\r\n private privConnectionEvents: EventSource<ConnectionEvent>;\r\n private privServiceEvents: EventSource<ServiceEvent>;\r\n private privDynamicGrammar: DynamicGrammarBuilder;\r\n private privAgentConfig: AgentConfig;\r\n private privServiceHasSentMessage: boolean;\r\n private privActivityTemplate: string;\r\n private privSetTimeout: (cb: () => void, delay: number) => number = setTimeout;\r\n private privAudioSource: IAudioSource;\r\n private privIsLiveAudio: boolean = false;\r\n protected privSpeechContext: SpeechContext;\r\n protected privRequestSession: RequestSession;\r\n protected privConnectionId: string;\r\n protected privRecognizerConfig: RecognizerConfig;\r\n protected privRecognizer: Recognizer;\r\n protected privSuccessCallback: (e: SpeechRecognitionResult) => void;\r\n protected privErrorCallback: (e: string) => void;\r\n\r\n public constructor(\r\n authentication: IAuthentication,\r\n connectionFactory: IConnectionFactory,\r\n audioSource: IAudioSource,\r\n recognizerConfig: RecognizerConfig,\r\n recognizer: Recognizer) {\r\n\r\n if (!authentication) {\r\n throw new ArgumentNullError(\"authentication\");\r\n }\r\n\r\n if (!connectionFactory) {\r\n throw new ArgumentNullError(\"connectionFactory\");\r\n }\r\n\r\n if (!audioSource) {\r\n throw new ArgumentNullError(\"audioSource\");\r\n }\r\n\r\n if (!recognizerConfig) {\r\n throw new ArgumentNullError(\"recognizerConfig\");\r\n }\r\n\r\n this.privMustReportEndOfStream = false;\r\n this.privAuthentication = authentication;\r\n this.privConnectionFactory = connectionFactory;\r\n this.privAudioSource = audioSource;\r\n this.privRecognizerConfig = recognizerConfig;\r\n this.privIsDisposed = false;\r\n this.privRecognizer = recognizer;\r\n this.privRequestSession = new RequestSession(this.privAudioSource.id());\r\n this.privConnectionEvents = new EventSource<ConnectionEvent>();\r\n this.privServiceEvents = new EventSource<ServiceEvent>();\r\n this.privDynamicGrammar = new DynamicGrammarBuilder();\r\n this.privSpeechContext = new SpeechContext(this.privDynamicGrammar);\r\n this.privAgentConfig = new AgentConfig();\r\n if (typeof (Blob) !== \"undefined\" && typeof (Worker) !== \"undefined\") {\r\n this.privSetTimeout = Timeout.setTimeout;\r\n }\r\n\r\n this.connectionEvents.attach(async (connectionEvent: ConnectionEvent): Promise<void> => {\r\n if (connectionEvent.name === \"ConnectionClosedEvent\") {\r\n const connectionClosedEvent = connectionEvent as ConnectionClosedEvent;\r\n if (connectionClosedEvent.statusCode === 1003 ||\r\n connectionClosedEvent.statusCode === 1007 ||\r\n connectionClosedEvent.statusCode === 1002 ||\r\n connectionClosedEvent.statusCode === 4000 ||\r\n this.privRequestSession.numConnectionAttempts > this.privRecognizerConfig.maxRetryCount\r\n ) {\r\n await this.cancelRecognitionLocal(CancellationReason.Error,\r\n connectionClosedEvent.statusCode === 1007 ? CancellationErrorCode.BadRequestParameters : CancellationErrorCode.ConnectionFailure,\r\n connectionClosedEvent.reason + \" websocket error code: \" + connectionClosedEvent.statusCode);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public get audioSource(): IAudioSource {\r\n return this.privAudioSource;\r\n }\r\n\r\n public get speechContext(): SpeechContext {\r\n return this.privSpeechContext;\r\n }\r\n\r\n public get dynamicGrammar(): DynamicGrammarBuilder {\r\n return this.privDynamicGrammar;\r\n }\r\n\r\n public get agentConfig(): AgentConfig {\r\n return this.privAgentConfig;\r\n }\r\n\r\n public set conversationTranslatorToken(token: string) {\r\n this.privRecognizerConfig.parameters.setProperty(PropertyId.ConversationTranslator_Token, token);\r\n }\r\n\r\n public set authentication(auth: IAuthentication) {\r\n this.privAuthentication = this.authentication;\r\n }\r\n\r\n public isDisposed(): boolean {\r\n return this.privIsDisposed;\r\n }\r\n\r\n public async dispose(reason?: string): Promise<void> {\r\n this.privIsDisposed = true;\r\n if (this.privConnectionConfigurationPromise) {\r\n try {\r\n const connection: IConnection = await this.privConnectionConfigurationPromise;\r\n await connection.dispose(reason);\r\n } catch (error) {\r\n // The connection is in a bad state. But we're trying to kill it, so...\r\n return;\r\n }\r\n }\r\n }\r\n\r\n public get connectionEvents(): EventSource<ConnectionEvent> {\r\n return this.privConnectionEvents;\r\n }\r\n\r\n public get serviceEvents(): EventSource<ServiceEvent> {\r\n return this.privServiceEvents;\r\n }\r\n\r\n public get recognitionMode(): RecognitionMode {\r\n return this.privRecognizerConfig.recognitionMode;\r\n }\r\n\r\n protected recognizeOverride: (recoMode: RecognitionMode, sc: (e: SpeechRecognitionResult) => void, ec: (e: string) => void) => any = undefined;\r\n\r\n public async recognize(\r\n recoMode: RecognitionMode,\r\n successCallback: (e: SpeechRecognitionResult) => void,\r\n errorCallBack: (e: string) => void,\r\n ): Promise<void> {\r\n\r\n if (this.recognizeOverride !== undefined) {\r\n return this.recognizeOverride(recoMode, successCallback, errorCallBack);\r\n }\r\n // Clear the existing configuration promise to force a re-transmission of config and context.\r\n this.privConnectionConfigurationPromise = null;\r\n this.privRecognizerConfig.recognitionMode = recoMode;\r\n\r\n this.privSuccessCallback = successCallback;\r\n this.privErrorCallback = errorCallBack;\r\n\r\n this.privRequestSession.startNewRecognition();\r\n this.privRequestSession.listenForServiceTelemetry(this.privAudioSource.events);\r\n\r\n // Start the connection to the service. The promise this will create is stored and will be used by configureConnection().\r\n const conPromise: Promise<IConnection> = this.connectImpl();\r\n let audioNode: ReplayableAudioNode;\r\n\r\n try {\r\n const audioStreamNode: IAudioStreamNode = await this.audioSource.attach(this.privRequestSession.audioNodeId);\r\n const format: AudioStreamFormatImpl = await this.audioSource.format;\r\n const deviceInfo: ISpeechConfigAudioDevice = await this.audioSource.deviceInfo;\r\n this.privIsLiveAudio = deviceInfo.type && deviceInfo.type === type.Microphones;\r\n\r\n audioNode = new ReplayableAudioNode(audioStreamNode, format.avgBytesPerSec);\r\n await this.privRequestSession.onAudioSourceAttachCompleted(audioNode, false);\r\n this.privRecognizerConfig.SpeechServiceConfig.Context.audio = { source: deviceInfo };\r\n\r\n } catch (error) {\r\n await this.privRequestSession.onStopRecognizing();\r\n throw error;\r\n }\r\n\r\n try {\r\n await conPromise;\r\n } catch (error) {\r\n await this.cancelRecognitionLocal(CancellationReason.Error, CancellationErrorCode.ConnectionFailure, error);\r\n return;\r\n }\r\n\r\n const sessionStartEventArgs: SessionEventArgs = new SessionEventArgs(this.privRequestSession.sessionId);\r\n\r\n if (!!this.privRecognizer.sessionStarted) {\r\n this.privRecognizer.sessionStarted(this.privRecognizer, sessionStartEventArgs);\r\n }\r\n\r\n const messageRetrievalPromise = this.receiveMessage();\r\n const audioSendPromise = this.sendAudio(audioNode);\r\n\r\n audioSendPromise.catch(async (error: string) => {\r\n await this.cancelRecognitionLocal(CancellationReason.Error, CancellationErrorCode.RuntimeError, error);\r\n });\r\n\r\n return;\r\n }\r\n\r\n public async stopRecognizing(): Promise<void> {\r\n if (this.privRequestSession.isRecognizing) {\r\n try {\r\n await this.audioSource.turnOff();\r\n await this.sendFinalAudio();\r\n await this.privRequestSession.onStopRecognizing();\r\n await this.privRequestSession.turnCompletionPromise;\r\n } finally {\r\n await this.privRequestSession.dispose();\r\n }\r\n }\r\n return;\r\n }\r\n\r\n public async connect(): Promise<void> {\r\n await this.connectImpl();\r\n return Promise.resolve();\r\n }\r\n\r\n public connectAsync(cb?: Callback, err?: Callback): void {\r\n this.connectImpl().then((connection: IConnection): void => {\r\n try {\r\n if (!!cb) {\r\n cb();\r\n }\r\n } catch (e) {\r\n if (!!err) {\r\n err(e);\r\n }\r\n }\r\n }, (reason: any): void => {\r\n try {\r\n if (!!err) {\r\n err(reason);\r\n }\r\n /* tslint:disable:no-empty */\r\n } catch (error) {\r\n }\r\n });\r\n }\r\n\r\n protected disconnectOverride: () => Promise<void> = undefined;\r\n\r\n public async disconnect(): Promise<void> {\r\n await this.cancelRecognitionLocal(CancellationReason.Error,\r\n CancellationErrorCode.NoError,\r\n \"Disconnecting\");\r\n\r\n if (this.disconnectOverride !== undefined) {\r\n await this.disconnectOverride();\r\n }\r\n\r\n try {\r\n await (await this.privConnectionPromise).dispose();\r\n } catch (error) {\r\n\r\n }\r\n\r\n this.privConnectionPromise = null;\r\n }\r\n\r\n // Called when telemetry data is sent to the service.\r\n // Used for testing Telemetry capture.\r\n public static telemetryData: (json: string) => void;\r\n public static telemetryDataEnabled: boolean = true;\r\n\r\n public sendMessage(message: string): void { }\r\n\r\n public async sendNetworkMessage(path: string, payload: string | ArrayBuffer): Promise<void> {\r\n const type: MessageType = typeof payload === \"string\" ? MessageType.Text : MessageType.Binary;\r\n const contentType: string = typeof payload === \"string\" ? \"application/json\" : \"\";\r\n\r\n const connection: IConnection = await this.fetchConnection();\r\n return connection.send(new SpeechConnectionMessage(type, path, this.privRequestSession.requestId, contentType, payload));\r\n }\r\n\r\n public set activityTemplate(messagePayload: string) { this.privActivityTemplate = messagePayload; }\r\n public get activityTemplate(): string { return this.privActivityTemplate; }\r\n\r\n protected abstract processTypeSpecificMessages(\r\n connectionMessage: SpeechConnectionMessage,\r\n successCallback?: (e: SpeechRecognitionResult) => void,\r\n errorCallBack?: (e: string) => void): Promise<boolean>;\r\n\r\n protected async sendTelemetryData(): Promise<void> {\r\n const telemetryData = this.privRequestSession.getTelemetry();\r\n if (ServiceRecognizerBase.telemetryDataEnabled !== true ||\r\n this.privIsDisposed ||\r\n null === telemetryData) {\r\n return;\r\n }\r\n\r\n if (!!ServiceRecognizerBase.telemetryData) {\r\n try {\r\n ServiceRecognizerBase.telemetryData(telemetryData);\r\n /* tslint:disable:no-empty */\r\n } catch { }\r\n }\r\n\r\n const connection: IConnection = await this.fetchConnection();\r\n await connection.send(new SpeechConnectionMessage(\r\n MessageType.Text,\r\n \"telemetry\",\r\n this.privRequestSession.requestId,\r\n \"application/json\",\r\n telemetryData));\r\n }\r\n\r\n // Cancels recognition.\r\n protected abstract cancelRecognition(\r\n sessionId: string,\r\n requestId: string,\r\n cancellationReason: CancellationReason,\r\n errorCode: CancellationErrorCode,\r\n error: string): void;\r\n\r\n // Cancels recognition.\r\n protected async cancelRecognitionLocal(\r\n cancellationReason: CancellationReason,\r\n errorCode: CancellationErrorCode,\r\n error: string): Promise<void> {\r\n\r\n if (!!this.privRequestSession.isRecognizing) {\r\n await this.privRequestSession.onStopRecognizing();\r\n\r\n this.cancelRecognition(\r\n this.privRequestSession.sessionId,\r\n this.privRequestSession.requestId,\r\n cancellationReason,\r\n errorCode,\r\n error);\r\n }\r\n }\r\n\r\n protected receiveMessageOverride: () => Promise<void> = undefined;\r\n\r\n protected async receiveMessage(): Promise<void> {\r\n try {\r\n if (this.privIsDisposed) {\r\n // We're done.\r\n return;\r\n }\r\n\r\n let connection = await this.fetchConnection();\r\n const message = await connection.read();\r\n\r\n if (this.receiveMessageOverride !== undefined) {\r\n return this.receiveMessageOverride();\r\n }\r\n\r\n // indicates we are draining the queue and it came with no message;\r\n if (!message) {\r\n if (!this.privRequestSession.isRecognizing) {\r\n return;\r\n } else {\r\n return this.receiveMessage();\r\n }\r\n }\r\n\r\n this.privServiceHasSentMessage = true;\r\n const connectionMessage = SpeechConnectionMessage.fromConnectionMessage(message);\r\n\r\n if (connectionMessage.requestId.toLowerCase() === this.privRequestSession.requestId.toLowerCase()) {\r\n switch (connectionMessage.path.toLowerCase()) {\r\n case \"turn.start\":\r\n this.privMustReportEndOfStream = true;\r\n this.privRequestSession.onServiceTurnStartResponse();\r\n break;\r\n\r\n case \"speech.startdetected\":\r\n const speechStartDetected: SpeechDetected = SpeechDetected.fromJSON(connectionMessage.textBody);\r\n const speechStartEventArgs = new RecognitionEventArgs(speechStartDetected.Offset, this.privRequestSession.sessionId);\r\n if (!!this.privRecognizer.speechStartDetected) {\r\n this.privRecognizer.speechStartDetected(this.privRecognizer, speechStartEventArgs);\r\n }\r\n break;\r\n\r\n case \"speech.enddetected\":\r\n let json: string;\r\n if (connectionMessage.textBody.length > 0) {\r\n json = connectionMessage.textBody;\r\n } else {\r\n // If the request was empty, the JSON returned is empty.\r\n json = \"{ Offset: 0 }\";\r\n }\r\n const speechStopDetected: SpeechDetected = SpeechDetected.fromJSON(json);\r\n // Only shrink the buffers for continuous recognition.\r\n // For single shot, the speech.phrase message will come after the speech.end and it should own buffer shrink.\r\n if (this.privRecognizerConfig.isContinuousRecognition) {\r\n this.privRequestSession.onServiceRecognized(speechStopDetected.Offset + this.privRequestSession.currentTurnAudioOffset);\r\n }\r\n const speechStopEventArgs = new RecognitionEventArgs(speechStopDetected.Offset + this.privRequestSession.currentTurnAudioOffset, this.privRequestSession.sessionId);\r\n if (!!this.privRecognizer.speechEndDetected) {\r\n this.privRecognizer.speechEndDetected(this.privRecognizer, speechStopEventArgs);\r\n }\r\n break;\r\n\r\n case \"turn.end\":\r\n await this.sendTelemetryData();\r\n if (this.privRequestSession.isSpeechEnded && this.privMustReportEndOfStream) {\r\n this.privMustReportEndOfStream = false;\r\n await this.cancelRecognitionLocal(CancellationReason.EndOfStream, CancellationErrorCode.NoError, undefined);\r\n }\r\n const sessionStopEventArgs: SessionEventArgs = new SessionEventArgs(this.privRequestSession.sessionId);\r\n await this.privRequestSession.onServiceTurnEndResponse(this.privRecognizerConfig.isContinuousRecognition);\r\n if (!this.privRecognizerConfig.isContinuousRecognition || this.privRequestSession.isSpeechEnded || !this.privRequestSession.isRecognizing) {\r\n if (!!this.privRecognizer.sessionStopped) {\r\n this.privRecognizer.sessionStopped(this.privRecognizer, sessionStopEventArgs);\r\n }\r\n return;\r\n } else {\r\n connection = await this.fetchConnection();\r\n await this.sendPrePayloadJSON(connection);\r\n }\r\n break;\r\n\r\n default:\r\n if (!await this.processTypeSpecificMessages(connectionMessage)) {\r\n // here are some messages that the derived class has not processed, dispatch them to connect class\r\n if (!!this.privServiceEvents) {\r\n this.serviceEvents.onEvent(new ServiceEvent(connectionMessage.path.toLowerCase(), connectionMessage.textBody));\r\n }\r\n }\r\n }\r\n }\r\n return this.receiveMessage();\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n protected sendSpeechContext = (connection: IConnection): Promise<void> => {\r\n const speechContextJson = this.speechContext.toJSON();\r\n\r\n if (speechContextJson) {\r\n return connection.send(new SpeechConnectionMessage(\r\n MessageType.Text,\r\n \"speech.context\",\r\n this.privRequestSession.requestId,\r\n \"application/json\",\r\n speechContextJson));\r\n }\r\n return;\r\n }\r\n\r\n protected sendPrePayloadJSONOverride: (connection: IConnection) => Promise<void> = undefined;\r\n\r\n // Encapsulated for derived service recognizers that need to send additional JSON\r\n protected async sendPrePayloadJSON(connection: IConnection): Promise<void> {\r\n if (this.sendPrePayloadJSONOverride !== undefined) {\r\n return this.sendPrePayloadJSONOverride(connection);\r\n }\r\n\r\n await this.sendSpeechContext(connection);\r\n await this.sendWaveHeader(connection);\r\n return;\r\n }\r\n\r\n protected async sendWaveHeader(connection: IConnection): Promise<void> {\r\n const format: AudioStreamFormatImpl = await this.audioSource.format;\r\n // this.writeBufferToConsole(format.header);\r\n return connection.send(new SpeechConnectionMessage(\r\n MessageType.Binary,\r\n \"audio\",\r\n this.privRequestSession.requestId,\r\n \"audio/x-wav\",\r\n format.header\r\n ));\r\n }\r\n\r\n protected postConnectImplOverride: (connection: Promise<IConnection>) => Promise<IConnection> = undefined;\r\n\r\n // Establishes a websocket connection to the end point.\r\n protected connectImpl(): Promise<IConnection> {\r\n if (this.privConnectionPromise) {\r\n return this.privConnectionPromise.then((connection: IConnection): Promise<IConnection> => {\r\n if (connection.state() === ConnectionState.Disconnected) {\r\n this.privConnectionId = null;\r\n this.privConnectionPromise = null;\r\n this.privServiceHasSentMessage = false;\r\n return this.connectImpl();\r\n }\r\n return this.privConnectionPromise;\r\n }, (error: string): Promise<IConnection> => {\r\n this.privConnectionId = null;\r\n this.privConnectionPromise = null;\r\n this.privServiceHasSentMessage = false;\r\n return this.connectImpl();\r\n });\r\n }\r\n\r\n this.privConnectionPromise = this.retryableConnect();\r\n\r\n // Attach an empty handler to allow the promise to run in the background while\r\n // other startup events happen. It'll eventually be awaited on.\r\n this.privConnectionPromise.catch(() => { });\r\n\r\n if (this.postConnectImplOverride !== undefined) {\r\n return this.postConnectImplOverride(this.privConnectionPromise);\r\n }\r\n\r\n return this.privConnectionPromise;\r\n }\r\n\r\n protected configConnectionOverride: (connection: IConnection) => Promise<IConnection> = undefined;\r\n\r\n protected sendSpeechServiceConfig = (connection: IConnection, requestSession: RequestSession, SpeechServiceConfigJson: string): Promise<void> => {\r\n // filter out anything that is not required for the service to work.\r\n if (ServiceRecognizerBase.telemetryDataEnabled !== true) {\r\n const withTelemetry = JSON.parse(SpeechServiceConfigJson);\r\n\r\n const replacement: any = {\r\n context: {\r\n system: withTelemetry.context.system,\r\n },\r\n };\r\n\r\n SpeechServiceConfigJson = JSON.stringify(replacement);\r\n }\r\n\r\n if (this.privRecognizerConfig.parameters.getProperty(\"TranscriptionService_SingleChannel\", \"false\").toLowerCase() === \"true\") {\r\n const json: { context: any } = JSON.parse(SpeechServiceConfigJson);\r\n json.context.DisableReferenceChannel = \"True\";\r\n json.context.MicSpec = \"1_0_0\";\r\n SpeechServiceConfigJson = JSON.stringify(json);\r\n }\r\n\r\n if (SpeechServiceConfigJson) {\r\n return connection.send(new SpeechConnectionMessage(\r\n MessageType.Text,\r\n \"speech.config\",\r\n requestSession.requestId,\r\n \"application/json\",\r\n SpeechServiceConfigJson));\r\n }\r\n\r\n return;\r\n }\r\n\r\n protected async fetchConnection(): Promise<IConnection> {\r\n if (this.privConnectionConfigurationPromise) {\r\n return this.privConnectionConfigurationPromise.then((connection: IConnection): Promise<IConnection> => {\r\n if (connection.state() === ConnectionState.Disconnected) {\r\n this.privConnectionId = null;\r\n this.privConnectionConfigurationPromise = null;\r\n this.privServiceHasSentMessage = false;\r\n return this.fetchConnection();\r\n }\r\n return this.privConnectionConfigurationPromise;\r\n }, (error: string): Promise<IConnection> => {\r\n this.privConnectionId = null;\r\n this.privConnectionConfigurationPromise = null;\r\n this.privServiceHasSentMessage = false;\r\n return this.fetchConnection();\r\n });\r\n }\r\n\r\n this.privConnectionConfigurationPromise = this.configureConnection();\r\n return await this.privConnectionConfigurationPromise;\r\n }\r\n\r\n protected async sendAudio(audioStreamNode: IAudioStreamNode): Promise<void> {\r\n const audioFormat: AudioStreamFormatImpl = await this.audioSource.format;\r\n\r\n // The time we last sent data to the service.\r\n let nextSendTime: number = Date.now();\r\n\r\n // Max amount to send before we start to throttle\r\n const fastLaneSizeMs: string = this.privRecognizerConfig.parameters.getProperty(\"SPEECH-TransmitLengthBeforThrottleMs\", \"5000\");\r\n const maxSendUnthrottledBytes: number = audioFormat.avgBytesPerSec / 1000 * parseInt(fastLaneSizeMs, 10);\r\n const startRecogNumber: number = this.privRequestSession.recogNumber;\r\n\r\n const readAndUploadCycle = async (): Promise<void> => {\r\n // If speech is done, stop sending audio.\r\n if (!this.privIsDisposed &&\r\n !this.privRequestSession.isSpeechEnded &&\r\n this.privRequestSession.isRecognizing &&\r\n this.privRequestSession.recogNumber === startRecogNumber) {\r\n\r\n const connection: IConnection = await this.fetchConnection();\r\n const audioStreamChunk: IStreamChunk<ArrayBuffer> = await audioStreamNode.read();\r\n // we have a new audio chunk to upload.\r\n if (this.privRequestSession.isSpeechEnded) {\r\n // If service already recognized audio end then don't send any more audio\r\n return;\r\n }\r\n\r\n let payload: ArrayBuffer;\r\n let sendDelay: number;\r\n\r\n if (!audioStreamChunk || audioStreamChunk.isEnd) {\r\n payload = null;\r\n sendDelay = 0;\r\n } else {\r\n payload = audioStreamChunk.buffer;\r\n\r\n this.privRequestSession.onAudioSent(payload.byteLength);\r\n\r\n if (maxSendUnthrottledBytes >= this.privRequestSession.bytesSent) {\r\n sendDelay = 0;\r\n } else {\r\n sendDelay = Math.max(0, nextSendTime - Date.now());\r\n }\r\n }\r\n\r\n if (0 !== sendDelay) {\r\n await this.delay(sendDelay);\r\n }\r\n\r\n if (payload !== null) {\r\n nextSendTime = Date.now() + (payload.byteLength * 1000 / (audioFormat.avgBytesPerSec * 2));\r\n }\r\n\r\n // Are we still alive?\r\n if (!this.privIsDisposed &&\r\n !this.privRequestSession.isSpeechEnded &&\r\n this.privRequestSession.isRecognizing &&\r\n this.privRequestSession.recogNumber === startRecogNumber) {\r\n connection.send(\r\n new SpeechConnectionMessage(MessageType.Binary, \"audio\", this.privRequestSession.requestId, null, payload)\r\n ).catch(() => {\r\n this.privRequestSession.onServiceTurnEndResponse(this.privRecognizerConfig.isContinuousRecognition).catch(() => { });\r\n });\r\n\r\n if (!audioStreamChunk?.isEnd) {\r\n // this.writeBufferToConsole(payload);\r\n // Regardless of success or failure, schedule the next upload.\r\n // If the underlying connection was broken, the next cycle will\r\n // get a new connection and re-transmit missing audio automatically.\r\n return readAndUploadCycle();\r\n } else {\r\n // the audio stream has been closed, no need to schedule next\r\n // read-upload cycle.\r\n if (!this.privIsLiveAudio) {\r\n this.privRequestSession.onSpeechEnded();\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n return readAndUploadCycle();\r\n }\r\n\r\n private async retryableConnect(): Promise<IConnection> {\r\n let isUnAuthorized: boolean = false;\r\n\r\n this.privAuthFetchEventId = createNoDashGuid();\r\n const sessionId: string = this.privRequestSession.sessionId;\r\n this.privConnectionId = (sessionId !== undefined) ? sessionId : createNoDashGuid();\r\n\r\n this.privRequestSession.onPreConnectionStart(this.privAuthFetchEventId, this.privConnectionId);\r\n let lastStatusCode: number = 0;\r\n let lastReason: string = \"\";\r\n\r\n while (this.privRequestSession.numConnectionAttempts <= this.privRecognizerConfig.maxRetryCount) {\r\n\r\n // Get the auth information for the connection. This is a bit of overkill for the current API surface, but leaving the plumbing in place to be able to raise a developer-customer\r\n // facing event when a connection fails to let them try and provide new auth information.\r\n const authPromise = isUnAuthorized ? this.privAuthentication.fetchOnExpiry(this.privAuthFetchEventId) : this.privAuthentication.fetch(this.privAuthFetchEventId);\r\n const auth: AuthInfo = await authPromise;\r\n\r\n await this.privRequestSession.onAuthCompleted(false);\r\n\r\n // Create the connection\r\n const connection: IConnection = this.privConnectionFactory.create(this.privRecognizerConfig, auth, this.privConnectionId);\r\n // Attach the telemetry handlers.\r\n this.privRequestSession.listenForServiceTelemetry(connection.events);\r\n\r\n // Attach to the underlying event. No need to hold onto the detach pointers as in the event the connection goes away,\r\n // it'll stop sending events.\r\n connection.events.attach((event: ConnectionEvent) => {\r\n this.connectionEvents.onEvent(event);\r\n });\r\n\r\n const response: ConnectionOpenResponse = await connection.open();\r\n // 200 == everything is fine.\r\n if (response.statusCode === 200) {\r\n await this.privRequestSession.onConnectionEstablishCompleted(response.statusCode);\r\n return Promise.resolve(connection);\r\n } else if (response.statusCode === 1006) {\r\n isUnAuthorized = true;\r\n }\r\n\r\n lastStatusCode = response.statusCode;\r\n lastReason = response.reason;\r\n\r\n this.privRequestSession.onRetryConnection();\r\n }\r\n\r\n await this.privRequestSession.onConnectionEstablishCompleted(lastStatusCode, lastReason);\r\n return Promise.reject(`Unable to contact server. StatusCode: ${lastStatusCode}, ${this.privRecognizerConfig.parameters.getProperty(PropertyId.SpeechServiceConnection_Endpoint)} Reason: ${lastReason}`);\r\n }\r\n\r\n private delay(delayMs: number): Promise<void> {\r\n return new Promise((resolve: () => void, reject: (error: string) => void) => {\r\n this.privSetTimeout(resolve, delayMs);\r\n });\r\n }\r\n\r\n private writeBufferToConsole(buffer: ArrayBuffer): void {\r\n let out: string = \"Buffer Size: \";\r\n if (null === buffer) {\r\n out += \"null\";\r\n } else {\r\n const readView: Uint8Array = new Uint8Array(buffer);\r\n out += buffer.byteLength + \"\\r\\n\";\r\n for (let i: number = 0; i < buffer.byteLength; i++) {\r\n out += readView[i].toString(16).padStart(2, \"0\") + \" \";\r\n }\r\n }\r\n // tslint:disable-next-line:no-console\r\n console.info(out);\r\n }\r\n\r\n private async sendFinalAudio(): Promise<void> {\r\n const connection: IConnection = await this.fetchConnection();\r\n await connection.send(new SpeechConnectionMessage(MessageType.Binary, \"audio\", this.privRequestSession.requestId, null, null));\r\n return;\r\n }\r\n\r\n // Takes an established websocket connection to the endpoint and sends speech configuration information.\r\n private async configureConnection(): Promise<IConnection> {\r\n const connection: IConnection = await this.connectImpl();\r\n if (this.configConnectionOverride !== undefined) {\r\n return this.configConnectionOverride(connection);\r\n }\r\n await this.sendSpeechServiceConfig(connection, this.privRequestSession, this.privRecognizerConfig.SpeechServiceConfig.serialize());\r\n await this.sendPrePayloadJSON(connection);\r\n return connection;\r\n }\r\n}\r\n","// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport {\r\n ConnectionMessage,\r\n Deferred,\r\n IStringDictionary,\r\n IWebsocketMessageFormatter,\r\n MessageType,\r\n RawWebsocketMessage,\r\n} from \"../common/Exports\";\r\n\r\nconst CRLF: string = \"\\r\\n\";\r\n\r\nexport class WebsocketMessageFormatter implements IWebsocketMessageFormatter {\r\n\r\n public toConnectionMessage = (message: RawWebsocketMessage): Promise<ConnectionMessage> => {\r\n const deferral = new Deferred<ConnectionMessage>();\r\n\r\n try {\r\n if (message.messageType === MessageType.Text) {\r\n const textMessage: string = message.textContent;\r\n let headers: IStringDictionary<string> = {};\r\n let body: string = null;\r\n\r\n if (textMessage) {\r\n const headerBodySplit = textMessage.split(\"\\r\\n\\r\\n\");\r\n if (headerBodySplit && headerBodySplit.length > 0) {\r\n headers = this.parseHeaders(headerBodySplit[0]);\r\n if (headerBodySplit.length > 1) {\r\n body = headerBodySplit[1];\r\n }\r\n }\r\n }\r\n\r\n deferral.resolve(new ConnectionMessage(message.messageType, body, headers, message.id));\r\n } else if (message.messageType === MessageType.Binary) {\r\n const binaryMessage: ArrayBuffer = message.binaryContent;\r\n let headers: IStringDictionary<string> = {};\r\n let body: ArrayBuffer = null;\r\n\r\n if (!binaryMessage || binaryMessage.byteLength < 2) {\r\n throw new Error(\"Invalid binary message format. Header length missing.\");\r\n }\r\n\r\n const dataView = new DataView(binaryMessage);\r\n const headerLength = dataView.getInt16(0);\r\n\r\n if (binaryMessage.byteLength < headerLength + 2) {\r\n throw new Error(\"Invalid binary message format. Header content missing.\");\r\n }\r\n\r\n let headersString = \"\";\r\n for (let i = 0; i < headerLength; i++) {\r\n headersString += String.fromCharCode((dataView).getInt8(i + 2));\r\n }\r\n\r\n headers = this.parseHeaders(headersString);\r\n\r\n if (binaryMessage.byteLength > headerLength + 2) {\r\n body = binaryMessage.slice(2 + headerLength);\r\n }\r\n\r\n deferral.resolve(new ConnectionMessage(message.messageType, body, headers, message.id));\r\n }\r\n } catch (e) {\r\n deferral.reject(`Error formatting the message. Error: ${e}`);\r\n }\r\n\r\n return deferral.promise;\r\n }\r\n\r\n public fromConnectionMessage = (message: ConnectionMessage): Promise<RawWebsocketMessage> => {\r\n const deferral = new Deferred<RawWebsocketMessage>();\r\n\r\n try {\r\n if (message.messageType === MessageType.Text) {\r\n const payload = `${this.makeHeaders(message)}${CRLF}${message.textBody ? message.textBody : \"\"}`;\r\n\r\n deferral.resolve(new RawWebsocketMessage(MessageType.Text, payload, message.id));\r\n\r\n } else if (message.messageType === MessageType.Binary) {\r\n const headersString = this.makeHeaders(message);\r\n const content = message.binaryBody;\r\n\r\n const headerBuffer = this.stringToArrayBuffer(headersString);\r\n const headerInt8Array = new Int8Array(headerBuffer);\r\n const headerLength = headerInt8Array.byteLength;\r\n\r\n const payloadInt8Array = new Int8Array(2 + headerLength + (content ? content.byteLength : 0));\r\n payloadInt8Array[0] = ((headerLength >> 8) & 0xff);\r\n payloadInt8Array[1] = headerLength & 0xff;\r\n payloadInt8Array.set(headerInt8Array, 2);\r\n\r\n if (content) {\r\n const bodyInt8Array = new Int8Array(content);\r\n payloadInt8Array.set(bodyInt8Array, 2 + headerLength);\r\n }\r\n\r\n const payload: ArrayBuffer = payloadInt8Array.buffer;\r\n\r\n deferral.resolve(new RawWebsocketMessage(MessageType.Binary, payload, message.id));\r\n }\r\n } catch (e) {\r\n deferral.reject(`Error formatting the message. ${e}`);\r\n }\r\n\r\n return deferral.promise;\r\n }\r\n\r\n private makeHeaders = (message: ConnectionMessage): string => {\r\n let headersString: string = \"\";\r\n\r\n if (message.headers) {\r\n for (const header in message.headers) {\r\n if (header) {\r\n headersString += `${header}: ${message.headers[header]}${CRLF}`;\r\n }\r\n }\r\n }\r\n\r\n return headersString;\r\n }\r\n\r\n private parseHeaders = (headersString: string): IStringDictionary<string> => {\r\n const headers: IStringDictionary<string> = {};\r\n\r\n if (headersString) {\r\n const headerMatches = headersString.match(/[^\\r\\n]+/g);\r\n if (headers) {\r\n for (const header of headerMatches) {\r\n if (header) {\r\n const separatorIndex = header.indexOf(\":\");\r\n const headerName = separatorIndex > 0 ? header.substr(0, separatorIndex).trim().toLowerCase() : header;\r\n const headerValue =\r\n separatorIndex > 0 && header.length > (separatorIndex + 1) ?\r\n header.substr(separatorIndex + 1).trim() :\r\n \"\";\r\n\r\n headers[headerName] = headerValue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n private stringToArrayBuffer = (str: string): ArrayBuffer => {\r\n const buffer = new ArrayBuffer(str.length);\r\n const view = new DataView(buffer);\r\n for (let i = 0; i < str.length; i++) {\r\n view.setUint8(i, str.charCodeAt(i));\r\n }\r\n return buffer;\r\n }\r\n}\r\n","import { EventTarget } from \"./event-target\" // Used as only type, so no circular.\nimport { Warning } from \"./warning-handler\"\n\nexport const InitEventWasCalledWhileDispatching = new Warning<[]>(\n \"W01\",\n \"Unable to initialize event under dispatching.\",\n)\n\nexport const FalsyWasAssignedToCancelBubble = new Warning<[]>(\n \"W02\",\n \"Assigning any falsy value to 'cancelBubble' property has no effect.\",\n)\n\nexport const TruthyWasAssignedToReturnValue = new Warning<[]>(\n \"W03\",\n \"Assigning any truthy value to 'returnValue' property has no effect.\",\n)\n\nexport const NonCancelableEventWasCanceled = new Warning<[]>(\n \"W04\",\n \"Unable to preventDefault on non-cancelable events.\",\n)\n\nexport const CanceledInPassiveListener = new Warning<[]>(\n \"W05\",\n \"Unable to preventDefault inside passive event listener invocation.\",\n)\n\nexport const EventListenerWasDuplicated = new Warning<\n [type: \"bubble\" | \"capture\", callback: EventTarget.EventListener<any, any>]\n>(\n \"W06\",\n \"An event listener wasn't added because it has been added already: %o, %o\",\n)\n\nexport const OptionWasIgnored = new Warning<\n [name: \"passive\" | \"once\" | \"signal\"]\n>(\n \"W07\",\n \"The %o option value was abandoned because the event listener wasn't added as duplicated.\",\n)\n\nexport const InvalidEventListener = new Warning<\n [callback: EventTarget.EventListener<any, any> | {} | null | undefined]\n>(\n \"W08\",\n \"The 'callback' argument must be a function or an object that has 'handleEvent' method: %o\",\n)\n\nexport const InvalidAttributeHandler = new Warning<\n [callback: EventTarget.EventListener<any, any> | {}]\n>(\"W09\", \"Event attribute handler must be a function: %o\")\n","/* eslint no-magic-numbers: [\"error\", { \"ignore\": [0, 1, 100] }] */\n\n// Cognitive Services does not support unsigned percentage\n// It must be converted into +/- first.\nfunction relativePercentage(value) {\n let relative = Math.round((value - 1) * 100);\n\n if (relative >= 0) {\n relative = '+' + relative;\n }\n\n return relative + '%';\n}\n\nexport default function buildSSML({ lang, pitch = 1, rate = 1, text, voice, volume }) {\n return `<speak version=\"1.0\" xml:lang=\"${lang}\">\n <voice xml:lang=\"${lang}\" name=\"${voice}\">\n <prosody pitch=\"${relativePercentage(pitch)}\" rate=\"${relativePercentage(rate)}\" volume=\"${relativePercentage(\n volume\n )}\">\n ${text}\n </prosody>\n </voice>\n</speak>`;\n}\n","import { decode } from 'base64-arraybuffer';\nimport buildSSML from './buildSSML';\nimport isSSML from './isSSML';\n\nconst DEFAULT_LANGUAGE = 'en-US';\nconst DEFAULT_OUTPUT_FORMAT = 'riff-16khz-16bit-mono-pcm';\nconst DEFAULT_VOICE = 'Microsoft Server Speech Text to Speech Voice (en-US, AriaNeural)';\nconst EMPTY_MP3_BASE64 =\n 'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjU2LjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAACAAABhgC7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3LjY0AAAAAAAAAAAAAAAAJAUHAAAAAAAAAYYoRBqpAAAAAAD/+xDEAAPAAAGkAAAAIAAANIAAAARMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EMQpg8AAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV';\n\nexport default async function ({\n deploymentId,\n fetchCredentials,\n lang = DEFAULT_LANGUAGE,\n outputFormat = DEFAULT_OUTPUT_FORMAT,\n pitch,\n rate,\n text,\n voice = DEFAULT_VOICE,\n volume\n}) {\n if (!text) {\n // If text is empty, play a short audio clip. This allows developers to easily prime the AudioContext object by playing an empty string.\n return decode(EMPTY_MP3_BASE64);\n }\n\n const { authorizationToken, region, speechSynthesisHostname, subscriptionKey } = await fetchCredentials();\n\n if ((authorizationToken && subscriptionKey) || (!authorizationToken && !subscriptionKey)) {\n throw new Error('Only \"authorizationToken\" or \"subscriptionKey\" should be set.');\n } else if ((region && speechSynthesisHostname) || (!region && !speechSynthesisHostname)) {\n throw new Error('Only \"region\" or \"speechSynthesisHostnamename\" should be set.');\n }\n\n const ssml = isSSML(text) ? text : buildSSML({ lang, pitch, rate, text, voice, volume });\n\n // Although calling encodeURI on hostname does not actually works, it fails faster and safer.\n const hostname =\n speechSynthesisHostname ||\n (deploymentId\n ? `${encodeURI(region)}.voice.speech.microsoft.com`\n : `${encodeURI(region)}.tts.speech.microsoft.com`);\n const search = deploymentId ? `?deploymentId=${encodeURI(deploymentId)}` : '';\n const url = `https://${hostname}/cognitiveservices/v1${search}`;\n\n const res = await fetch(url, {\n headers: {\n 'Content-Type': 'application/ssml+xml',\n 'X-Microsoft-OutputFormat': outputFormat,\n ...(authorizationToken\n ? {\n Authorization: `Bearer ${authorizationToken}`\n }\n : {\n 'Ocp-Apim-Subscription-Key': subscriptionKey\n })\n },\n method: 'POST',\n body: ssml\n });\n\n if (!res.ok) {\n throw new Error(`web-speech-cognitive-services: Failed to syntheis speech, server returned ${res.status}`);\n }\n\n return res.arrayBuffer();\n}\n"]}
|