diff --git a/src/CrestApps.Core.Docs/docs/changelog/2.0.0.md b/src/CrestApps.Core.Docs/docs/changelog/2.0.0.md index 6ecd79ee..93371eb2 100644 --- a/src/CrestApps.Core.Docs/docs/changelog/2.0.0.md +++ b/src/CrestApps.Core.Docs/docs/changelog/2.0.0.md @@ -680,6 +680,14 @@ microphone, desk speakers): ## Change Logs +- **Added: uploaded knowledge files can now be downloaded again.** Files attached to an AI Profile or a + Chat Interaction are stored on the server, but there was previously no way to retrieve the original + file after uploading it. Each attached document now shows a download button next to its remove button + in both the MVC and Blazor hosts. Downloads are served by the existing + `ai/documents/{documentId}/download` endpoint, which now authorizes AI Profile documents in addition to + Chat Interaction and chat-session documents. Hosts authorize profile downloads through the same + resource-based `AIChatDocumentOperations.ManageDocuments` requirement; the sample hosts register a + `SampleAIProfileDocumentAuthorizationHandler` that grants it to administrators. - **Fixed: totals from an uploaded spreadsheet could come back several times too large.** A worksheet that prints its own subtotals — a per-group `... Total` line beneath each group, then a grand total beneath those — used to import every one of those rows alongside the rows they summarize. `SUM` over diff --git a/src/Primitives/CrestApps.Core.AI.Documents/Endpoints/DownloadAIDocument.cs b/src/Primitives/CrestApps.Core.AI.Documents/Endpoints/DownloadAIDocument.cs index a5b593d0..094323e7 100644 --- a/src/Primitives/CrestApps.Core.AI.Documents/Endpoints/DownloadAIDocument.cs +++ b/src/Primitives/CrestApps.Core.AI.Documents/Endpoints/DownloadAIDocument.cs @@ -130,6 +130,22 @@ private static async Task AuthorizeAsync( new AIChatSessionDocumentAuthorizationContext(profile, session), [AIChatDocumentOperations.ManageDocuments]); + return authorization.Succeeded ? null : CreateUnauthorizedResult(httpContext); + } + case AIReferenceTypes.Document.Profile: + { + var profile = await profileManager.FindByIdAsync(document.ReferenceId); + + if (profile is null) + { + return Results.NotFound(); + } + + var authorization = await authorizationService.AuthorizeAsync( + httpContext.User, + profile, + [AIChatDocumentOperations.ManageDocuments]); + return authorization.Succeeded ? null : CreateUnauthorizedResult(httpContext); } default: diff --git a/src/Resources/CrestApps.AI.Resources/Assets/js/chat-interaction.js b/src/Resources/CrestApps.AI.Resources/Assets/js/chat-interaction.js index 254e653a..9b52f385 100644 --- a/src/Resources/CrestApps.AI.Resources/Assets/js/chat-interaction.js +++ b/src/Resources/CrestApps.AI.Resources/Assets/js/chat-interaction.js @@ -2758,15 +2758,38 @@ window.chatInteractionDocumentManager = function () { interactionDocuments.forEach(documentInfo => { const row = window.document.createElement('div'); - row.className = 'd-flex justify-content-between align-items-start gap-2 border rounded px-2 py-2 bg-white chat-document-row'; + row.className = 'd-flex align-items-center gap-2 border rounded px-2 py-2 bg-white chat-document-row'; row.dataset.chatDocumentId = documentInfo.documentId; row.dataset.chatDocumentName = documentInfo.fileName; row.dataset.chatDocumentSize = documentInfo.fileSize; + const actions = window.document.createElement('div'); + actions.className = 'd-flex gap-1'; + + const downloadBaseUrl = config.downloadDocumentBaseUrl || '/ai/documents/'; + const downloadLink = createTextElement('a', 'btn btn-sm btn-outline-secondary', ''); + downloadLink.title = 'Download'; + downloadLink.href = downloadBaseUrl + encodeURIComponent(documentInfo.documentId) + '/download'; + const downloadIcon = window.document.createElement('i'); + downloadIcon.className = 'fa-solid fa-download'; + downloadLink.appendChild(downloadIcon); + + const removeButton = createTextElement('button', 'btn btn-sm btn-outline-danger remove-chat-document-btn', ''); + removeButton.type = 'button'; + removeButton.title = 'Remove'; + removeButton.dataset.documentId = documentInfo.documentId; + const removeIcon = window.document.createElement('i'); + removeIcon.className = 'fa-solid fa-trash'; + removeButton.appendChild(removeIcon); + removeButton.addEventListener('click', () => removeDocument(documentInfo.documentId)); + + actions.appendChild(downloadLink); + actions.appendChild(removeButton); + const details = window.document.createElement('div'); - details.className = 'me-2 min-w-0'; + details.className = 'min-w-0'; - const name = createTextElement('div', 'fw-semibold small', documentInfo.fileName || 'Document'); + const name = createTextElement('div', 'fw-semibold small text-truncate', documentInfo.fileName || 'Document'); const icon = window.document.createElement('i'); icon.className = 'fa-solid fa-file-lines me-1'; name.prepend(icon); @@ -2776,16 +2799,8 @@ window.chatInteractionDocumentManager = function () { details.appendChild(name); details.appendChild(size); - const removeButton = createTextElement('button', 'btn btn-sm btn-outline-danger remove-chat-document-btn', ' Remove'); - removeButton.type = 'button'; - removeButton.dataset.documentId = documentInfo.documentId; - const removeIcon = window.document.createElement('i'); - removeIcon.className = 'fa-solid fa-trash'; - removeButton.prepend(removeIcon); - removeButton.addEventListener('click', () => removeDocument(documentInfo.documentId)); - + row.appendChild(actions); row.appendChild(details); - row.appendChild(removeButton); documentsList.appendChild(row); }); } diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js index acecb2b6..f380afb4 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js @@ -2727,30 +2727,42 @@ window.chatInteractionDocumentManager = function () { } interactionDocuments.forEach(function (documentInfo) { var row = window.document.createElement('div'); - row.className = 'd-flex justify-content-between align-items-start gap-2 border rounded px-2 py-2 bg-white chat-document-row'; + row.className = 'd-flex align-items-center gap-2 border rounded px-2 py-2 bg-white chat-document-row'; row.dataset.chatDocumentId = documentInfo.documentId; row.dataset.chatDocumentName = documentInfo.fileName; row.dataset.chatDocumentSize = documentInfo.fileSize; - var details = window.document.createElement('div'); - details.className = 'me-2 min-w-0'; - var name = createTextElement('div', 'fw-semibold small', documentInfo.fileName || 'Document'); - var icon = window.document.createElement('i'); - icon.className = 'fa-solid fa-file-lines me-1'; - name.prepend(icon); - var size = createTextElement('div', 'text-muted small', formatFileSize(documentInfo.fileSize)); - details.appendChild(name); - details.appendChild(size); - var removeButton = createTextElement('button', 'btn btn-sm btn-outline-danger remove-chat-document-btn', ' Remove'); + var actions = window.document.createElement('div'); + actions.className = 'd-flex gap-1'; + var downloadBaseUrl = config.downloadDocumentBaseUrl || '/ai/documents/'; + var downloadLink = createTextElement('a', 'btn btn-sm btn-outline-secondary', ''); + downloadLink.title = 'Download'; + downloadLink.href = downloadBaseUrl + encodeURIComponent(documentInfo.documentId) + '/download'; + var downloadIcon = window.document.createElement('i'); + downloadIcon.className = 'fa-solid fa-download'; + downloadLink.appendChild(downloadIcon); + var removeButton = createTextElement('button', 'btn btn-sm btn-outline-danger remove-chat-document-btn', ''); removeButton.type = 'button'; + removeButton.title = 'Remove'; removeButton.dataset.documentId = documentInfo.documentId; var removeIcon = window.document.createElement('i'); removeIcon.className = 'fa-solid fa-trash'; - removeButton.prepend(removeIcon); + removeButton.appendChild(removeIcon); removeButton.addEventListener('click', function () { return removeDocument(documentInfo.documentId); }); + actions.appendChild(downloadLink); + actions.appendChild(removeButton); + var details = window.document.createElement('div'); + details.className = 'min-w-0'; + var name = createTextElement('div', 'fw-semibold small text-truncate', documentInfo.fileName || 'Document'); + var icon = window.document.createElement('i'); + icon.className = 'fa-solid fa-file-lines me-1'; + name.prepend(icon); + var size = createTextElement('div', 'text-muted small', formatFileSize(documentInfo.fileSize)); + details.appendChild(name); + details.appendChild(size); + row.appendChild(actions); row.appendChild(details); - row.appendChild(removeButton); documentsList.appendChild(row); }); } diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map index cc626169..0c40f392 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map @@ -1 +1 @@ -{"version":3,"sources":["chat-interaction.js"],"names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","Array","from","isArray","_arrayLikeToArray","_objectWithoutProperties","_objectWithoutPropertiesLoose","getOwnPropertySymbols","indexOf","propertyIsEnumerable","hasOwnProperty","_createForOfIteratorHelper","_n","F","s","next","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","push","_typeof","window","chatInteractionManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","codeCopiedText","copyTitle","copiedTitle","copyResetDelayMs","assistantLabel","messageTemplate","indicatorTemplate","untitledText","clearHistoryTitle","clearHistoryMessage","clearHistoryOkText","clearHistoryCancelText","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","containsFontAwesomePlaceholders","root","nodeType","selector","matches","querySelector","refreshFontAwesomeIcons","fontAwesome","FontAwesome","dom","i2svg","node","observeFontAwesomeIcons","MutationObserver","observer","mutations","forEach","mutation","addedNodes","observe","childList","subtree","normalizeReference","reference","_ref","_normalized$index","_ref2","_normalized$text","_ref3","_normalized$title","_ref4","_normalized$link","_ref5","_normalized$reference","_normalized$isGenerat","normalized","assign","index","Index","Text","title","Title","link","Link","referenceType","ReferenceType","isGenerated","IsGenerated","isDownloadCitationReference","toLowerCase","normalizeReferences","references","_i","_Object$entries","entries","_normalizeReference","_Object$entries$_i","key","getCitationLabel","buildCitationDisplay","content","processedContent","messageReferences","referenceEntries","citations","citedRefs","filter","_ref6","_ref7","includes","generatedRefs","_ref8","_ref9","sort","_ref0","_ref1","_ref10","_ref11","b","_ref12","_ref13","_ref14","_ref15","displayIndex","_iterator","_step","_step$value","placeholder","concat","replaceAll","referenceKey","label","isDownload","err","_i2","_citations","citation","_iterator2","_step2","_step2$value","map","_ref16","_excluded","buildCopyContent","copyContent","_iterator3","_step3","_iterator4","_step4","trimEnd","updateMessagePresentation","message","rawContent","citationDisplay","displayContent","citationReferences","htmlContent","parseMarkdownContent","renderer","marked","Renderer","data","href","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","__chartConfigs","createChartHtml","chartId","use","extensions","level","start","idx","undefined","tokenizer","extracted","tryExtractChartMarker","startIndex","type","raw","substring","endIndex","json","token","config","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","renderChartsInMessage","charts","requestAnimationFrame","_iterator5","_step5","canvas","getElementById","Chart","console","warn","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","compactObject","source","fromEntries","_ref17","_ref18","initialize","instanceConfig","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","isInteractionStarted","isPlaceholderVisible","isStreaming","isNavigatingAway","autoScroll","stream","messages","prompt","initialFieldValues","Map","settingsDirty","saveSettingsTimeout","saveIndicatorTimeout","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","Math","random","conversationModeEnabled","conversationButton","isConversationMode","realtimeController","notifications","notificationDismissTimers","copiedMessageIndex","copyResetTimeoutId","activeCopyButton","computed","lastAssistantIndex","role","methods","handleBeforeUnload","startConnection","_this","_callee","_t","_context","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","initializeInteraction","itemId","titleInput","msg","addMessage","$nextTick","historyItem","showSaveIndicator","stopRecording","isFinal","_conversationPartialTranscript","escaped","replace","_conversationPartialMessage","hidePlaceholder","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","turnId","_realtimePendingTurns","pending","stopAudio","emptyIndex","splice","_conversationAssistantMessage","at","userMsg","messageId","responseId","appearance","_conversationAssistantResponseId","prev","hideTypingIndicator","j","msgIndex","newMessage","id","normalizeAssistantAppearance","base64Audio","contentType","binaryString","atob","bytes","Uint8Array","charCodeAt","receivePcm","playCollectedAudio","showPlaceholder","clearHistoryBtn","classList","add","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentInteraction","onclose","addMessageInternal","_this2","fireEvent","CustomEvent","detail","_this3","_message$rawContent","remove","event","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","isIndicator","sendMessage","_this4","_callee2","trimmedPrompt","_context2","flushPendingSave","streamMessage","_this5","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentItemId","getItemId","subscribe","chunk","sessionId","setItemId","keys","_i3","_Object$entries2","_normalizeReference2","_Object$entries2$_i","complete","_this5$stream","processReferences","streamingFinished","synthesizeSpeech","_this5$stream2","getServiceDownMessage","_this6","_ref19","_message$rawContent2","stopIcon","getAttribute","replaceChildren","RETURN_DOM_FRAGMENT","startIcon","icons","querySelectorAll","debouncedSaveSettings","handleExternalTtsStop","_e$detail","sourceId","updateTtsPlaybackButtons","_this7","buttons","button","buttonIndex","Number","isPlaying","iconHtml","toggle","setAttribute","updateCopyButtons","_this8","isCopied","setCopyButtonState","cacheIndex","_this9","_ttsCacheIndex","invoke","toggleMessageTts","_this0","playAudioBlob","_this1","totalLength","reduce","sum","combined","offset","_iterator6","_step6","set","blob","Blob","_this10","URL","createObjectURL","audio","Audio","addEventListener","revokeObjectURL","playNextInQueue","play","_this11","nextBlob","shift","conversationModeOnAudioEnded","_this12","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this13","updateConversationButton","navigator","mediaDevices","getUserMedia","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","_conversationSubject","Subject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","micSource","createMediaStreamSource","connect","pendingChunk","analyser","interruptVolumeThreshold","size","freqData","frequencyBinCount","getByteFrequencyData","k","avg","_callee3","uint8Array","base64","_context3","arrayBuffer","str","byte","String","fromCharCode","btoa","getTracks","track","stop","documentElement","send","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","originalLength","removedCount","_this14","setTimeout","scrollTop","scrollHeight","clientHeight","handleUserInput","target","getSaveIndicatorElement","saveIndicatorElementSelector","className","_this15","indicator","clearTimeout","clearPendingSettingsSave","getFieldLabel","input","_input$closest","closest","dataset","setting","getValidationFeedbackElement","feedback","nextElementSibling","contains","insertAdjacentElement","clearSettingValidationError","removeAttribute","setSettingValidationError","getSettingValidationMessage","disabled","number","fieldLabel","isNaN","min","max","validateSettingInput","validateSettings","_this16","isValid","getSettingInputs","queueSettingsSave","explicitInputs","getSelectedGroupValues","groupName","fallbackSelector","explicitSelections","values","checkbox","checkboxes","baseName","hiddenInput","getPromptTemplateSelections","promptTemplates","card","templateIdInput","promptParametersInput","templateId","promptParameters","clearNotificationDismiss","findIndex","scheduleNotificationDismiss","_this17","timerId","dismissNotification","handleNotificationAction","actionName","resetInteraction","initializeApp","_this18","placeholderElementSelector","loadInteraction","threshold","atBottom","shiftKey","click","lastMsg","pop","chatInteractionItems","getElementsByClassName","preventDefault","initialMessages","btn","block","codeEl","clipboard","writeText","copiedText","clearHistory","micButtonElementSelector","style","display","toggleRecording","conversationButtonElementSelector","CoreAIRealtime","realtimeButtonElementSelector","attach","ensureConnected","sendStart","subject","voice","silenceMs","vadThreshold","allowInterruption","webRtcEnabled","realtimeWebRtcEnabled","sendStartWebRtc","offerSdp","webRtcIceServers","realtimeWebRtcIceServers","voiceName","realtimeVoiceName","getVoiceName","el","realtimeVoiceSelectElementSelector","capableDeployments","realtimeCapableDeployments","realtimeEnabled","selectors","realtimeButton","sendButton","deploymentSelect","deploymentSelectElementSelector","onActivate","onDeactivate","onEnterRealtimeMode","isActive","onUserTurnPending","onUserTurnDropped","dropped","setupRealtimeVoicePicker","realtimeVoicesUrl","voiceSelect","voiceGroup","realtimeVoiceGroupElementSelector","capable","savedVoiceId","isRealtimeDeployment","loadVoices","_loadVoices","_callee4","deploymentName","realtime","response","result","grouped","_iterator7","_step7","_t2","_context4","fetch","encodeURIComponent","credentials","voices","gender","has","get","localeCompare","optgroup","option","selected","appendChild","self","clearHistoryConfirmed","confirmDialog","okText","cancelText","callback","confirmed","confirm","_this19","saveSettings","getSelectedToolNames","getSelectedMcpConnectionIds","getSelectedA2AConnectionIds","getSelectedAgentNames","_this20","settings","inputs","match","checked","parseFloat","toolNames","mcpConnectionIds","a2aConnectionIds","agentNames","promptTemplateIds","template","force","clearCopiedMessageState","copyResponse","_ref21","_message$copyContent","_event$target","_event$target$closest","_this21","currentTarget","startRecording","_this22","_callee5","_context5","updateMicButton","watch","active","_this23","mounted","_this24","_callee6","_context6","$el","fontAwesomeObserver","beforeUnmount","removeEventListener","disconnect","mount","autoInitializeSelector","parseJsonAttribute","element","attributeName","description","rawValue","initializeFromElement","chatInteractionInitialized","__chatInteractionApp","scanForAutoInitialization","startAutoInitialization","body","readyState","once","chatInteractionDocumentManager","managerStateKey","normalizeDocumentInfo","documentId","DocumentId","fileName","FileName","fileSize","FileSize","formatFileSize","toFixed","getDocumentKey","isDuplicateFile","file","knownKeys","getDocumentsFromDom","container","chatDocumentId","chatDocumentName","chatDocumentSize","fileInput","documentsList","status","progressContainer","progressBar","uploadQueue","previousState","interactionDocuments","existingDocuments","uploadItems","isUploadingDocuments","createTextElement","tagName","renderDocuments","documentInfo","row","details","prepend","removeButton","removeIcon","removeDocument","showUploadStatus","showUploadProgress","progress","width","roundedProgress","round","getUploadStatePresentation","state","badgeClass","progressClass","formatUploadMessage","item","renderUploadQueue","presentation","header","fileDetails","badge","progressState","createUploadItem","lastModified","Date","now","updateUploadItem","updates","removeUploadItems","predicate","uploadSingleDocument","itemIdToUpdate","fileIndex","totalFiles","reject","formData","FormData","append","xhr","XMLHttpRequest","open","uploadDocumentUrl","upload","lengthComputable","fileProgress","loaded","total","overallProgress","responseText","Error","uploadDocuments","_x","_uploadDocuments","_callee7","files","filesToUpload","duplicateItems","knownDocumentKeys","pendingItems","uploadedCount","failedUploads","pendingItem","uploaded","failed","missingUploadMessage","failedMessage","errorMessage","_t3","_t4","_context7","Set","join","entry","_x2","_removeDocument","_callee8","serverDocuments","_t5","_t6","_context8","removeDocumentUrl","method","headers","stringify","ok","documents","onFileInputChange","selectedFiles","chatInteractionDocumentManagerInitialized","download","toDataURL","img","startsWith","res","removeChild"],"mappings":";;;;;;0BACA,uKAAAA,CAAA,EAAAC,CAAA,EAAAC,CAAA,wBAAAC,MAAA,GAAAA,MAAA,OAAAC,CAAA,GAAAF,CAAA,CAAAG,QAAA,kBAAAC,CAAA,GAAAJ,CAAA,CAAAK,WAAA,8BAAAC,EAAAN,CAAA,EAAAE,CAAA,EAAAE,CAAA,EAAAE,CAAA,QAAAC,CAAA,GAAAL,CAAA,IAAAA,CAAA,CAAAM,SAAA,YAAAC,SAAA,GAAAP,CAAA,GAAAO,SAAA,EAAAC,CAAA,GAAAC,MAAA,CAAAC,MAAA,CAAAL,CAAA,CAAAC,SAAA,UAAAK,mBAAA,CAAAH,CAAA,uBAAAV,CAAA,EAAAE,CAAA,EAAAE,CAAA,QAAAE,CAAA,EAAAC,CAAA,EAAAG,CAAA,EAAAI,CAAA,MAAAC,CAAA,GAAAX,CAAA,QAAAY,CAAA,OAAAC,CAAA,KAAAF,CAAA,KAAAb,CAAA,KAAAgB,CAAA,EAAApB,CAAA,EAAAqB,CAAA,EAAAC,CAAA,EAAAN,CAAA,EAAAM,CAAA,CAAAC,IAAA,CAAAvB,CAAA,MAAAsB,CAAA,WAAAA,EAAArB,CAAA,EAAAC,CAAA,WAAAM,CAAA,GAAAP,CAAA,EAAAQ,CAAA,MAAAG,CAAA,GAAAZ,CAAA,EAAAmB,CAAA,CAAAf,CAAA,GAAAF,CAAA,EAAAmB,CAAA,gBAAAC,EAAApB,CAAA,EAAAE,CAAA,SAAAK,CAAA,GAAAP,CAAA,EAAAU,CAAA,GAAAR,CAAA,EAAAH,CAAA,OAAAiB,CAAA,IAAAF,CAAA,KAAAV,CAAA,IAAAL,CAAA,GAAAgB,CAAA,CAAAO,MAAA,EAAAvB,CAAA,UAAAK,CAAA,EAAAE,CAAA,GAAAS,CAAA,CAAAhB,CAAA,GAAAqB,CAAA,GAAAH,CAAA,CAAAF,CAAA,EAAAQ,CAAA,GAAAjB,CAAA,KAAAN,CAAA,QAAAI,CAAA,GAAAmB,CAAA,KAAArB,CAAA,MAAAQ,CAAA,GAAAJ,CAAA,EAAAC,CAAA,GAAAD,CAAA,YAAAC,CAAA,WAAAD,CAAA,MAAAA,CAAA,MAAAR,CAAA,IAAAQ,CAAA,OAAAc,CAAA,MAAAhB,CAAA,GAAAJ,CAAA,QAAAoB,CAAA,GAAAd,CAAA,QAAAC,CAAA,MAAAU,CAAA,CAAAC,CAAA,GAAAhB,CAAA,EAAAe,CAAA,CAAAf,CAAA,GAAAI,CAAA,OAAAc,CAAA,GAAAG,CAAA,KAAAnB,CAAA,GAAAJ,CAAA,QAAAM,CAAA,MAAAJ,CAAA,IAAAA,CAAA,GAAAqB,CAAA,MAAAjB,CAAA,MAAAN,CAAA,EAAAM,CAAA,MAAAJ,CAAA,EAAAe,CAAA,CAAAf,CAAA,GAAAqB,CAAA,EAAAhB,CAAA,cAAAH,CAAA,IAAAJ,CAAA,aAAAmB,CAAA,QAAAH,CAAA,OAAAd,CAAA,qBAAAE,CAAA,EAAAW,CAAA,EAAAQ,CAAA,QAAAT,CAAA,YAAAU,SAAA,uCAAAR,CAAA,UAAAD,CAAA,IAAAK,CAAA,CAAAL,CAAA,EAAAQ,CAAA,GAAAhB,CAAA,GAAAQ,CAAA,EAAAL,CAAA,GAAAa,CAAA,GAAAxB,CAAA,GAAAQ,CAAA,OAAAT,CAAA,GAAAY,CAAA,MAAAM,CAAA,KAAAV,CAAA,KAAAC,CAAA,GAAAA,CAAA,QAAAA,CAAA,SAAAU,CAAA,CAAAf,CAAA,QAAAkB,CAAA,CAAAb,CAAA,EAAAG,CAAA,KAAAO,CAAA,CAAAf,CAAA,GAAAQ,CAAA,GAAAO,CAAA,CAAAC,CAAA,GAAAR,CAAA,aAAAI,CAAA,MAAAR,CAAA,QAAAC,CAAA,KAAAH,CAAA,YAAAL,CAAA,GAAAO,CAAA,CAAAF,CAAA,WAAAL,CAAA,GAAAA,CAAA,CAAA0B,IAAA,CAAAnB,CAAA,EAAAI,CAAA,UAAAc,SAAA,2CAAAzB,CAAA,CAAA2B,IAAA,SAAA3B,CAAA,EAAAW,CAAA,GAAAX,CAAA,CAAA4B,KAAA,EAAApB,CAAA,SAAAA,CAAA,oBAAAA,CAAA,KAAAR,CAAA,GAAAO,CAAA,eAAAP,CAAA,CAAA0B,IAAA,CAAAnB,CAAA,GAAAC,CAAA,SAAAG,CAAA,GAAAc,SAAA,uCAAApB,CAAA,gBAAAG,CAAA,OAAAD,CAAA,GAAAR,CAAA,cAAAC,CAAA,IAAAiB,CAAA,GAAAC,CAAA,CAAAf,CAAA,QAAAQ,CAAA,GAAAV,CAAA,CAAAyB,IAAA,CAAAvB,CAAA,EAAAe,CAAA,OAAAE,CAAA,kBAAApB,CAAA,IAAAO,CAAA,GAAAR,CAAA,EAAAS,CAAA,MAAAG,CAAA,GAAAX,CAAA,cAAAe,CAAA,mBAAAa,KAAA,EAAA5B,CAAA,EAAA2B,IAAA,EAAAV,CAAA,SAAAhB,CAAA,EAAAI,CAAA,EAAAE,CAAA,QAAAI,CAAA,QAAAS,CAAA,gBAAAV,UAAA,cAAAmB,kBAAA,cAAAC,2BAAA,KAAA9B,CAAA,GAAAY,MAAA,CAAAmB,cAAA,MAAAvB,CAAA,MAAAL,CAAA,IAAAH,CAAA,CAAAA,CAAA,IAAAG,CAAA,SAAAW,mBAAA,CAAAd,CAAA,OAAAG,CAAA,iCAAAH,CAAA,GAAAW,CAAA,GAAAmB,0BAAA,CAAArB,SAAA,GAAAC,SAAA,CAAAD,SAAA,GAAAG,MAAA,CAAAC,MAAA,CAAAL,CAAA,YAAAO,EAAAhB,CAAA,WAAAa,MAAA,CAAAoB,cAAA,GAAApB,MAAA,CAAAoB,cAAA,CAAAjC,CAAA,EAAA+B,0BAAA,KAAA/B,CAAA,CAAAkC,SAAA,GAAAH,0BAAA,EAAAhB,mBAAA,CAAAf,CAAA,EAAAM,CAAA,yBAAAN,CAAA,CAAAU,SAAA,GAAAG,MAAA,CAAAC,MAAA,CAAAF,CAAA,GAAAZ,CAAA,WAAA8B,iBAAA,CAAApB,SAAA,GAAAqB,0BAAA,EAAAhB,mBAAA,CAAAH,CAAA,iBAAAmB,0BAAA,GAAAhB,mBAAA,CAAAgB,0BAAA,iBAAAD,iBAAA,GAAAA,iBAAA,CAAAK,WAAA,wBAAApB,mBAAA,CAAAgB,0BAAA,EAAAzB,CAAA,wBAAAS,mBAAA,CAAAH,CAAA,GAAAG,mBAAA,CAAAH,CAAA,EAAAN,CAAA,gBAAAS,mBAAA,CAAAH,CAAA,EAAAR,CAAA,iCAAAW,mBAAA,CAAAH,CAAA,8DAAAwB,YAAA,YAAAA,aAAA,aAAAC,CAAA,EAAA7B,CAAA,EAAA8B,CAAA,EAAAtB,CAAA;AAAA,SAAAD,oBAAAf,CAAA,EAAAE,CAAA,EAAAE,CAAA,EAAAH,CAAA,QAAAO,CAAA,GAAAK,MAAA,CAAA0B,cAAA,QAAA/B,CAAA,uBAAAR,CAAA,IAAAQ,CAAA,QAAAO,mBAAA,YAAAyB,mBAAAxC,CAAA,EAAAE,CAAA,EAAAE,CAAA,EAAAH,CAAA,aAAAK,EAAAJ,CAAA,EAAAE,CAAA,IAAAW,mBAAA,CAAAf,CAAA,EAAAE,CAAA,YAAAF,CAAA,gBAAAyC,OAAA,CAAAvC,CAAA,EAAAE,CAAA,EAAAJ,CAAA,SAAAE,CAAA,GAAAM,CAAA,GAAAA,CAAA,CAAAR,CAAA,EAAAE,CAAA,IAAA2B,KAAA,EAAAzB,CAAA,EAAAsC,UAAA,GAAAzC,CAAA,EAAA0C,YAAA,GAAA1C,CAAA,EAAA2C,QAAA,GAAA3C,CAAA,MAAAD,CAAA,CAAAE,CAAA,IAAAE,CAAA,IAAAE,CAAA,aAAAA,CAAA,cAAAA,CAAA,mBAAAS,mBAAA,CAAAf,CAAA,EAAAE,CAAA,EAAAE,CAAA,EAAAH,CAAA;AAAA,SAAA4C,mBAAAzC,CAAA,EAAAH,CAAA,EAAAD,CAAA,EAAAE,CAAA,EAAAI,CAAA,EAAAe,CAAA,EAAAZ,CAAA,cAAAD,CAAA,GAAAJ,CAAA,CAAAiB,CAAA,EAAAZ,CAAA,GAAAG,CAAA,GAAAJ,CAAA,CAAAqB,KAAA,WAAAzB,CAAA,gBAAAJ,CAAA,CAAAI,CAAA,KAAAI,CAAA,CAAAoB,IAAA,GAAA3B,CAAA,CAAAW,CAAA,IAAAkC,OAAA,CAAAC,OAAA,CAAAnC,CAAA,EAAAoC,IAAA,CAAA9C,CAAA,EAAAI,CAAA;AAAA,SAAA2C,kBAAA7C,CAAA,6BAAAH,CAAA,SAAAD,CAAA,GAAAkD,SAAA,aAAAJ,OAAA,WAAA5C,CAAA,EAAAI,CAAA,QAAAe,CAAA,GAAAjB,CAAA,CAAA+C,KAAA,CAAAlD,CAAA,EAAAD,CAAA,YAAAoD,MAAAhD,CAAA,IAAAyC,kBAAA,CAAAxB,CAAA,EAAAnB,CAAA,EAAAI,CAAA,EAAA8C,KAAA,EAAAC,MAAA,UAAAjD,CAAA,cAAAiD,OAAAjD,CAAA,IAAAyC,kBAAA,CAAAxB,CAAA,EAAAnB,CAAA,EAAAI,CAAA,EAAA8C,KAAA,EAAAC,MAAA,WAAAjD,CAAA,KAAAgD,KAAA;AAAA,SAAAE,mBAAApD,CAAA,WAAAqD,kBAAA,CAAArD,CAAA,KAAAsD,gBAAA,CAAAtD,CAAA,KAAAuD,2BAAA,CAAAvD,CAAA,KAAAwD,kBAAA;AAAA,SAAAA,mBAAA,cAAAhC,SAAA;AAAA,SAAA8B,iBAAAtD,CAAA,8BAAAC,MAAA,YAAAD,CAAA,CAAAC,MAAA,CAAAE,QAAA,aAAAH,CAAA,uBAAAyD,KAAA,CAAAC,IAAA,CAAA1D,CAAA;AAAA,SAAAqD,mBAAArD,CAAA,QAAAyD,KAAA,CAAAE,OAAA,CAAA3D,CAAA,UAAA4D,iBAAA,CAAA5D,CAAA;AAAA,SAAA6D,yBAAA/D,CAAA,EAAAC,CAAA,gBAAAD,CAAA,iBAAAM,CAAA,EAAAJ,CAAA,EAAAM,CAAA,GAAAwD,6BAAA,CAAAhE,CAAA,EAAAC,CAAA,OAAAY,MAAA,CAAAoD,qBAAA,QAAA7D,CAAA,GAAAS,MAAA,CAAAoD,qBAAA,CAAAjE,CAAA,QAAAE,CAAA,MAAAA,CAAA,GAAAE,CAAA,CAAAoB,MAAA,EAAAtB,CAAA,IAAAI,CAAA,GAAAF,CAAA,CAAAF,CAAA,UAAAD,CAAA,CAAAiE,OAAA,CAAA5D,CAAA,QAAA6D,oBAAA,CAAAxC,IAAA,CAAA3B,CAAA,EAAAM,CAAA,MAAAE,CAAA,CAAAF,CAAA,IAAAN,CAAA,CAAAM,CAAA,aAAAE,CAAA;AAAA,SAAAwD,8BAAA9D,CAAA,EAAAF,CAAA,gBAAAE,CAAA,iBAAAD,CAAA,gBAAAG,CAAA,IAAAF,CAAA,SAAAkE,cAAA,CAAAzC,IAAA,CAAAzB,CAAA,EAAAE,CAAA,gBAAAJ,CAAA,CAAAkE,OAAA,CAAA9D,CAAA,aAAAH,CAAA,CAAAG,CAAA,IAAAF,CAAA,CAAAE,CAAA,YAAAH,CAAA;AAAA,SAAAoE,2BAAAnE,CAAA,EAAAF,CAAA,QAAAC,CAAA,yBAAAE,MAAA,IAAAD,CAAA,CAAAC,MAAA,CAAAE,QAAA,KAAAH,CAAA,qBAAAD,CAAA,QAAA0D,KAAA,CAAAE,OAAA,CAAA3D,CAAA,MAAAD,CAAA,GAAAwD,2BAAA,CAAAvD,CAAA,MAAAF,CAAA,IAAAE,CAAA,uBAAAA,CAAA,CAAAsB,MAAA,IAAAvB,CAAA,KAAAC,CAAA,GAAAD,CAAA,OAAAqE,EAAA,MAAAC,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAnE,CAAA,WAAAA,EAAA,WAAAkE,EAAA,IAAApE,CAAA,CAAAsB,MAAA,KAAAI,IAAA,WAAAA,IAAA,MAAAC,KAAA,EAAA3B,CAAA,CAAAoE,EAAA,UAAAtE,CAAA,WAAAA,EAAAE,CAAA,UAAAA,CAAA,KAAAc,CAAA,EAAAuD,CAAA,gBAAA7C,SAAA,iJAAApB,CAAA,EAAAe,CAAA,OAAAT,CAAA,gBAAA4D,CAAA,WAAAA,EAAA,IAAAvE,CAAA,GAAAA,CAAA,CAAA0B,IAAA,CAAAzB,CAAA,MAAAE,CAAA,WAAAA,EAAA,QAAAF,CAAA,GAAAD,CAAA,CAAAwE,IAAA,WAAApD,CAAA,GAAAnB,CAAA,CAAA0B,IAAA,EAAA1B,CAAA,KAAAF,CAAA,WAAAA,EAAAE,CAAA,IAAAU,CAAA,OAAAN,CAAA,GAAAJ,CAAA,KAAAc,CAAA,WAAAA,EAAA,UAAAK,CAAA,YAAApB,CAAA,cAAAA,CAAA,8BAAAW,CAAA,QAAAN,CAAA;AAAA,SAAAoE,eAAAxE,CAAA,EAAAF,CAAA,WAAA2E,eAAA,CAAAzE,CAAA,KAAA0E,qBAAA,CAAA1E,CAAA,EAAAF,CAAA,KAAAyD,2BAAA,CAAAvD,CAAA,EAAAF,CAAA,KAAA6E,gBAAA;AAAA,SAAAA,iBAAA,cAAAnD,SAAA;AAAA,SAAA+B,4BAAAvD,CAAA,EAAAmB,CAAA,QAAAnB,CAAA,2BAAAA,CAAA,SAAA4D,iBAAA,CAAA5D,CAAA,EAAAmB,CAAA,OAAApB,CAAA,MAAA6E,QAAA,CAAAnD,IAAA,CAAAzB,CAAA,EAAA6E,KAAA,6BAAA9E,CAAA,IAAAC,CAAA,CAAA8E,WAAA,KAAA/E,CAAA,GAAAC,CAAA,CAAA8E,WAAA,CAAAC,IAAA,aAAAhF,CAAA,cAAAA,CAAA,GAAA0D,KAAA,CAAAC,IAAA,CAAA1D,CAAA,oBAAAD,CAAA,+CAAAiF,IAAA,CAAAjF,CAAA,IAAA6D,iBAAA,CAAA5D,CAAA,EAAAmB,CAAA;AAAA,SAAAyC,kBAAA5D,CAAA,EAAAmB,CAAA,aAAAA,CAAA,IAAAA,CAAA,GAAAnB,CAAA,CAAAsB,MAAA,MAAAH,CAAA,GAAAnB,CAAA,CAAAsB,MAAA,YAAAxB,CAAA,MAAAI,CAAA,GAAAuD,KAAA,CAAAtC,CAAA,GAAArB,CAAA,GAAAqB,CAAA,EAAArB,CAAA,IAAAI,CAAA,CAAAJ,CAAA,IAAAE,CAAA,CAAAF,CAAA,UAAAI,CAAA;AAAA,SAAAwE,sBAAA1E,CAAA,EAAAuB,CAAA,QAAAxB,CAAA,WAAAC,CAAA,gCAAAC,MAAA,IAAAD,CAAA,CAAAC,MAAA,CAAAE,QAAA,KAAAH,CAAA,4BAAAD,CAAA,QAAAD,CAAA,EAAAI,CAAA,EAAAI,CAAA,EAAAI,CAAA,EAAAS,CAAA,OAAAL,CAAA,OAAAV,CAAA,iBAAAE,CAAA,IAAAP,CAAA,GAAAA,CAAA,CAAA0B,IAAA,CAAAzB,CAAA,GAAAuE,IAAA,QAAAhD,CAAA,QAAAZ,MAAA,CAAAZ,CAAA,MAAAA,CAAA,UAAAe,CAAA,uBAAAA,CAAA,IAAAhB,CAAA,GAAAQ,CAAA,CAAAmB,IAAA,CAAA1B,CAAA,GAAA2B,IAAA,MAAAP,CAAA,CAAA8D,IAAA,CAAAnF,CAAA,CAAA6B,KAAA,GAAAR,CAAA,CAAAG,MAAA,KAAAC,CAAA,GAAAT,CAAA,iBAAAd,CAAA,IAAAI,CAAA,OAAAF,CAAA,GAAAF,CAAA,yBAAAc,CAAA,YAAAf,CAAA,eAAAW,CAAA,GAAAX,CAAA,cAAAY,MAAA,CAAAD,CAAA,MAAAA,CAAA,2BAAAN,CAAA,QAAAF,CAAA,aAAAiB,CAAA;AAAA,SAAAsD,gBAAAzE,CAAA,QAAAyD,KAAA,CAAAE,OAAA,CAAA3D,CAAA,UAAAA,CAAA;AAAA,SAAAkF,QAAA9E,CAAA,sCAAA8E,OAAA,wBAAAjF,MAAA,uBAAAA,MAAA,CAAAE,QAAA,aAAAC,CAAA,kBAAAA,CAAA,gBAAAA,CAAA,WAAAA,CAAA,yBAAAH,MAAA,IAAAG,CAAA,CAAA0E,WAAA,KAAA7E,MAAA,IAAAG,CAAA,KAAAH,MAAA,CAAAO,SAAA,qBAAAJ,CAAA,KAAA8E,OAAA,CAAA9E,CAAA;AADA+E,MAAM,CAACC,sBAAsB,GAAG,YAAY;EAExC;EACA,IAAIC,aAAa,GAAG;IAChB;IACAC,qBAAqB,EAAE,iBAAiB;IACxCC,sBAAsB,EAAE,GAAG;IAC3BC,kBAAkB,EAAE,gBAAgB;IACpCC,kBAAkB,EAAE,yBAAyB;IAC7CC,uBAAuB,EAAE,UAAU;IACnCC,cAAc,EAAE,SAAS;IACzBC,SAAS,EAAE,2CAA2C;IACtDC,WAAW,EAAE,+BAA+B;IAC5CC,gBAAgB,EAAE,IAAI;IACtBC,cAAc,EAAE,WAAW;IAE3BC,eAAe,42IA6Cd;IACDC,iBAAiB,+PAKhB;IACD;IACAC,YAAY,EAAE,UAAU;IACxBC,iBAAiB,EAAE,eAAe;IAClCC,mBAAmB,EAAE,yIAAyI;IAC9JC,kBAAkB,EAAE,KAAK;IACzBC,sBAAsB,EAAE;EAC5B,CAAC;;EAED;EACA,SAASC,WAAWA,CAACC,GAAG,EAAE;IACtB,IAAI,CAACA,GAAG,EAAE,OAAO,EAAE;IACnB,IAAIC,OAAO,GAAGD,GAAG,CAACE,IAAI,CAAC,CAAC;IACxB,IAAI,eAAe,CAAC1B,IAAI,CAACyB,OAAO,CAAC,IAAI,aAAa,CAACzB,IAAI,CAACyB,OAAO,CAAC,IAAI,mBAAmB,CAACzB,IAAI,CAACyB,OAAO,CAAC,EAAE;MACnG,OAAO,EAAE;IACb;IACA,OAAOD,GAAG;EACd;;EAEA;EACA,SAASG,kBAAkBA,CAACC,IAAI,EAAE;IAC9B,IAAIC,IAAI,GAAGC,QAAQ,CAACC,aAAa,CAAC,MAAM,CAAC;IACzCF,IAAI,CAACG,WAAW,GAAGJ,IAAI;IACvB,OAAOC,IAAI,CAACI,SAAS;EACzB;EAEA,SAASC,+BAA+BA,CAACC,IAAI,EAAE;IAC3C,IAAI,CAACA,IAAI,IAAIA,IAAI,CAACC,QAAQ,KAAK,CAAC,EAAE;MAC9B,OAAO,KAAK;IAChB;IAEA,IAAIC,QAAQ,GAAG,wCAAwC;IACvD,IAAI,OAAOF,IAAI,CAACG,OAAO,KAAK,UAAU,IAAIH,IAAI,CAACG,OAAO,CAACD,QAAQ,CAAC,EAAE;MAC9D,OAAO,IAAI;IACf;IAEA,OAAO,OAAOF,IAAI,CAACI,aAAa,KAAK,UAAU,IAAI,CAAC,CAACJ,IAAI,CAACI,aAAa,CAACF,QAAQ,CAAC;EACrF;EAEA,SAASG,uBAAuBA,CAACL,IAAI,EAAE;IACnC,IAAIM,WAAW,GAAGtC,MAAM,CAACuC,WAAW;IACpC,IAAI,CAACR,+BAA+B,CAACC,IAAI,CAAC,IAAI,CAACM,WAAW,IAAI,CAACA,WAAW,CAACE,GAAG,IAAI,OAAOF,WAAW,CAACE,GAAG,CAACC,KAAK,KAAK,UAAU,EAAE;MAC3H;IACJ;IAEAH,WAAW,CAACE,GAAG,CAACC,KAAK,CAAC;MAAEC,IAAI,EAAEV;IAAK,CAAC,CAAC;EACzC;EAEA,SAASW,uBAAuBA,CAACX,IAAI,EAAE;IACnC,IAAI,CAACA,IAAI,IAAI,OAAOY,gBAAgB,KAAK,WAAW,EAAE;MAClD,OAAO,IAAI;IACf;IAEA,IAAIC,QAAQ,GAAG,IAAID,gBAAgB,CAAC,UAAUE,SAAS,EAAE;MACrDA,SAAS,CAACC,OAAO,CAAC,UAAUC,QAAQ,EAAE;QAClCA,QAAQ,CAACC,UAAU,CAACF,OAAO,CAAC,UAAUL,IAAI,EAAE;UACxCL,uBAAuB,CAACK,IAAI,CAAC;QACjC,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC;IAEFG,QAAQ,CAACK,OAAO,CAAClB,IAAI,EAAE;MACnBmB,SAAS,EAAE,IAAI;MACfC,OAAO,EAAE;IACb,CAAC,CAAC;IAEF,OAAOP,QAAQ;EACnB;EAEA,SAASQ,kBAAkBA,CAACC,SAAS,EAAE;IAAA,IAAAC,IAAA,EAAAC,iBAAA,EAAAC,KAAA,EAAAC,gBAAA,EAAAC,KAAA,EAAAC,iBAAA,EAAAC,KAAA,EAAAC,gBAAA,EAAAC,KAAA,EAAAC,qBAAA,EAAAC,qBAAA;IACnC,IAAI,CAACX,SAAS,IAAIvD,OAAA,CAAOuD,SAAS,MAAK,QAAQ,EAAE;MAC7C,OAAO,IAAI;IACf;IAEA,IAAMY,UAAU,GAAG1I,MAAM,CAAC2I,MAAM,CAAC,CAAC,CAAC,EAAEb,SAAS,CAAC;IAC/CY,UAAU,CAACE,KAAK,IAAAb,IAAA,IAAAC,iBAAA,GAAGU,UAAU,CAACE,KAAK,cAAAZ,iBAAA,cAAAA,iBAAA,GAAIU,UAAU,CAACG,KAAK,cAAAd,IAAA,cAAAA,IAAA,GAAI,CAAC;IAC5DW,UAAU,CAACzC,IAAI,IAAAgC,KAAA,IAAAC,gBAAA,GAAGQ,UAAU,CAACzC,IAAI,cAAAiC,gBAAA,cAAAA,gBAAA,GAAIQ,UAAU,CAACI,IAAI,cAAAb,KAAA,cAAAA,KAAA,GAAI,IAAI;IAC5DS,UAAU,CAACK,KAAK,IAAAZ,KAAA,IAAAC,iBAAA,GAAGM,UAAU,CAACK,KAAK,cAAAX,iBAAA,cAAAA,iBAAA,GAAIM,UAAU,CAACM,KAAK,cAAAb,KAAA,cAAAA,KAAA,GAAI,IAAI;IAC/DO,UAAU,CAACO,IAAI,GAAGrD,WAAW,EAAAyC,KAAA,IAAAC,gBAAA,GAACI,UAAU,CAACO,IAAI,cAAAX,gBAAA,cAAAA,gBAAA,GAAII,UAAU,CAACQ,IAAI,cAAAb,KAAA,cAAAA,KAAA,GAAI,IAAI,CAAC;IACzEK,UAAU,CAACS,aAAa,IAAAZ,KAAA,IAAAC,qBAAA,GAAGE,UAAU,CAACS,aAAa,cAAAX,qBAAA,cAAAA,qBAAA,GAAIE,UAAU,CAACU,aAAa,cAAAb,KAAA,cAAAA,KAAA,GAAI,IAAI;IACvFG,UAAU,CAACW,WAAW,GAAG,EAAAZ,qBAAA,GAACC,UAAU,CAACW,WAAW,cAAAZ,qBAAA,cAAAA,qBAAA,GAAIC,UAAU,CAACY,WAAW,MAAM,IAAI;IAEpF,OAAOZ,UAAU;EACrB;EAEA,SAASa,2BAA2BA,CAACzB,SAAS,EAAE;IAC5C,IAAI,CAACA,SAAS,IAAIvD,OAAA,CAAOuD,SAAS,MAAK,QAAQ,EAAE;MAC7C,OAAO,KAAK;IAChB;IAEA,IAAI,OAAOA,SAAS,CAACqB,aAAa,KAAK,QAAQ,IAAIrB,SAAS,CAACqB,aAAa,CAACK,WAAW,CAAC,CAAC,KAAK,UAAU,EAAE;MACrG,OAAO,IAAI;IACf;IAEA,IAAI,OAAO1B,SAAS,CAACmB,IAAI,KAAK,QAAQ,IAAI,wCAAwC,CAAC5E,IAAI,CAACyD,SAAS,CAACmB,IAAI,CAAC,EAAE;MACrG,OAAO,IAAI;IACf;IAEA,OAAO,KAAK;EAChB;EAEA,SAASQ,mBAAmBA,CAACC,UAAU,EAAE;IACrC,IAAI,CAACA,UAAU,IAAInF,OAAA,CAAOmF,UAAU,MAAK,QAAQ,EAAE;MAC/C,OAAO,CAAC,CAAC;IACb;IAEA,IAAMhB,UAAU,GAAG,CAAC,CAAC;IAErB,SAAAiB,EAAA,MAAAC,eAAA,GAA2B5J,MAAM,CAAC6J,OAAO,CAACH,UAAU,CAAC,EAAAC,EAAA,GAAAC,eAAA,CAAAjJ,MAAA,EAAAgJ,EAAA,IAAE;MAAA,IAAAG,mBAAA;MAAlD,IAAAC,kBAAA,GAAAlG,cAAA,CAAA+F,eAAA,CAAAD,EAAA;QAAOK,GAAG,GAAAD,kBAAA;QAAE/I,KAAK,GAAA+I,kBAAA;MAClBrB,UAAU,CAACsB,GAAG,CAAC,IAAAF,mBAAA,GAAGjC,kBAAkB,CAAC7G,KAAK,CAAC,cAAA8I,mBAAA,cAAAA,mBAAA,GAAI,CAAC,CAAC;IACrD;IAEA,OAAOpB,UAAU;EACrB;EAEA,SAASuB,gBAAgBA,CAACnC,SAAS,EAAEkC,GAAG,EAAE;IACtC,OAAOlC,SAAS,CAACiB,KAAK,IAAIjB,SAAS,CAAC7B,IAAI,IAAI+D,GAAG;EACnD;EAEA,SAASE,oBAAoBA,CAACC,OAAO,EAAET,UAAU,EAAE;IAC/C,IAAIU,gBAAgB,GAAG,CAACD,OAAO,IAAI,EAAE,EAAEpE,IAAI,CAAC,CAAC;IAC7C,IAAMsE,iBAAiB,GAAGZ,mBAAmB,CAACC,UAAU,CAAC;IACzD,IAAMY,gBAAgB,GAAGtK,MAAM,CAAC6J,OAAO,CAACQ,iBAAiB,CAAC;IAE1D,IAAI,CAACC,gBAAgB,CAAC3J,MAAM,EAAE;MAC1B,OAAO;QAAEwJ,OAAO,EAAEC,gBAAgB;QAAEG,SAAS,EAAE;MAAG,CAAC;IACvD;IAEA,IAAMC,SAAS,GAAGF,gBAAgB,CAACG,MAAM,CAAC,UAAAC,KAAA;MAAA,IAAAC,KAAA,GAAA9G,cAAA,CAAA6G,KAAA;QAAEV,GAAG,GAAAW,KAAA;MAAA,OAAMP,gBAAgB,CAACQ,QAAQ,CAACZ,GAAG,CAAC;IAAA,EAAC;IACpF,IAAMa,aAAa,GAAGP,gBAAgB,CAACG,MAAM,CAAC,UAAAK,KAAA;MAAA,IAAAC,KAAA,GAAAlH,cAAA,CAAAiH,KAAA;QAAEd,GAAG,GAAAe,KAAA;QAAE/J,KAAK,GAAA+J,KAAA;MAAA,OAAM/J,KAAK,CAACqI,WAAW,IAAI,CAACe,gBAAgB,CAACQ,QAAQ,CAACZ,GAAG,CAAC;IAAA,EAAC;IAErH,IAAI,CAACQ,SAAS,CAAC7J,MAAM,IAAI,CAACkK,aAAa,CAAClK,MAAM,EAAE;MAC5C,OAAO;QAAEwJ,OAAO,EAAEC,gBAAgB;QAAEG,SAAS,EAAE;MAAG,CAAC;IACvD;IAEAC,SAAS,CAACQ,IAAI,CAAC,UAAAC,KAAA,EAAAC,KAAA;MAAA,IAAAC,MAAA,GAAAtH,cAAA,CAAAoH,KAAA;QAAIzK,CAAC,GAAA2K,MAAA;MAAA,IAAAC,MAAA,GAAAvH,cAAA,CAAAqH,KAAA;QAAMG,CAAC,GAAAD,MAAA;MAAA,OAAM5K,CAAC,CAACoI,KAAK,GAAGyC,CAAC,CAACzC,KAAK;IAAA,EAAC;IACnDiC,aAAa,CAACG,IAAI,CAAC,UAAAM,MAAA,EAAAC,MAAA;MAAA,IAAAC,MAAA,GAAA3H,cAAA,CAAAyH,MAAA;QAAI9K,CAAC,GAAAgL,MAAA;MAAA,IAAAC,MAAA,GAAA5H,cAAA,CAAA0H,MAAA;QAAMF,CAAC,GAAAI,MAAA;MAAA,OAAMjL,CAAC,CAACoI,KAAK,GAAGyC,CAAC,CAACzC,KAAK;IAAA,EAAC;IAEvD,IAAM2B,SAAS,GAAG,EAAE;IACpB,IAAImB,YAAY,GAAG,CAAC;IAAC,IAAAC,SAAA,GAAAnI,0BAAA,CAEMgH,SAAS;MAAAoB,KAAA;IAAA;MAApC,KAAAD,SAAA,CAAAhI,CAAA,MAAAiI,KAAA,GAAAD,SAAA,CAAApM,CAAA,IAAAwB,IAAA,GAAsC;QAAA,IAAA8K,WAAA,GAAAhI,cAAA,CAAA+H,KAAA,CAAA5K,KAAA;UAA1BgJ,GAAG,GAAA6B,WAAA;UAAE7K,KAAK,GAAA6K,WAAA;QAClB,IAAMC,WAAW,aAAAC,MAAA,CAAaL,YAAY,OAAAK,MAAA,CAAI/K,KAAK,CAAC4H,KAAK,IAAI8C,YAAY,OAAI;QAC7EtB,gBAAgB,GAAGA,gBAAgB,CAAC4B,UAAU,CAAChC,GAAG,EAAE8B,WAAW,CAAC;QAChEvB,SAAS,CAACjG,IAAI,CAAC;UACX2H,YAAY,EAAEjC,GAAG;UACjB0B,YAAY,EAAEA,YAAY;UAC1BQ,KAAK,EAAEjC,gBAAgB,CAACjJ,KAAK,EAAEgJ,GAAG,CAAC;UACnCf,IAAI,EAAEjI,KAAK,CAACiI,IAAI,IAAI,IAAI;UACxBkD,UAAU,EAAE5C,2BAA2B,CAACvI,KAAK,CAAC;UAC9C8K,WAAW,EAAEA;QACjB,CAAC,CAAC;QAEFJ,YAAY,EAAE;MAClB;IAAC,SAAAU,GAAA;MAAAT,SAAA,CAAAxM,CAAA,CAAAiN,GAAA;IAAA;MAAAT,SAAA,CAAAxL,CAAA;IAAA;IAED,SAAAkM,GAAA,MAAAC,UAAA,GAAuB/B,SAAS,EAAA8B,GAAA,GAAAC,UAAA,CAAA3L,MAAA,EAAA0L,GAAA,IAAE;MAA7B,IAAME,QAAQ,GAAAD,UAAA,CAAAD,GAAA;MACfjC,gBAAgB,GAAGA,gBAAgB,CAAC4B,UAAU,CAACO,QAAQ,CAACT,WAAW,UAAAC,MAAA,CAAUQ,QAAQ,CAACb,YAAY,WAAQ,CAAC;IAC/G;IAEAtB,gBAAgB,GAAGA,gBAAgB,CAAC4B,UAAU,CAAC,aAAa,EAAE,yBAAyB,CAAC;;IAExF;IACA;IAAA,IAAAQ,UAAA,GAAAhJ,0BAAA,CAC2BqH,aAAa;MAAA4B,MAAA;IAAA;MAAxC,KAAAD,UAAA,CAAA7I,CAAA,MAAA8I,MAAA,GAAAD,UAAA,CAAAjN,CAAA,IAAAwB,IAAA,GAA0C;QAAA,IAAA2L,YAAA,GAAA7I,cAAA,CAAA4I,MAAA,CAAAzL,KAAA;UAA9BgJ,IAAG,GAAA0C,YAAA;UAAE1L,MAAK,GAAA0L,YAAA;QAClBnC,SAAS,CAACjG,IAAI,CAAC;UACX2H,YAAY,EAAEjC,IAAG;UACjB0B,YAAY,EAAEA,YAAY;UAC1BQ,KAAK,EAAEjC,gBAAgB,CAACjJ,MAAK,EAAEgJ,IAAG,CAAC;UACnCf,IAAI,EAAEjI,MAAK,CAACiI,IAAI,IAAI,IAAI;UACxBkD,UAAU,EAAE,IAAI;UAChBL,WAAW,EAAE;QACjB,CAAC,CAAC;QAEFJ,YAAY,EAAE;MAClB;IAAC,SAAAU,GAAA;MAAAI,UAAA,CAAArN,CAAA,CAAAiN,GAAA;IAAA;MAAAI,UAAA,CAAArM,CAAA;IAAA;IAED,OAAO;MACHgK,OAAO,EAAEC,gBAAgB;MACzBG,SAAS,EAAEA,SAAS,CAACoC,GAAG,CAAC,UAAAC,MAAA;QAAA,IAAGd,WAAW,GAAAc,MAAA,CAAXd,WAAW;UAAKS,QAAQ,GAAArJ,wBAAA,CAAA0J,MAAA,EAAAC,SAAA;QAAA,OAAON,QAAQ;MAAA;IACvE,CAAC;EACL;EAEA,SAASO,gBAAgBA,CAAC3C,OAAO,EAAEI,SAAS,EAAE;IAC1C,IAAIwC,WAAW,GAAG,CAAC5C,OAAO,IAAI,EAAE,EAAEpE,IAAI,CAAC,CAAC;IAExC,IAAI,CAACgH,WAAW,IAAI,CAACjK,KAAK,CAACE,OAAO,CAACuH,SAAS,CAAC,IAAIA,SAAS,CAAC5J,MAAM,KAAK,CAAC,EAAE;MACrE,OAAOoM,WAAW;IACtB;IAAC,IAAAC,UAAA,GAAAxJ,0BAAA,CAEsB+G,SAAS;MAAA0C,MAAA;IAAA;MAAhC,KAAAD,UAAA,CAAArJ,CAAA,MAAAsJ,MAAA,GAAAD,UAAA,CAAAzN,CAAA,IAAAwB,IAAA,GAAkC;QAAA,IAAvBwL,QAAQ,GAAAU,MAAA,CAAAjM,KAAA;QACf+L,WAAW,GAAGA,WAAW,CAACf,UAAU,CAACO,QAAQ,CAACN,YAAY,MAAAF,MAAA,CAAMQ,QAAQ,CAACb,YAAY,MAAG,CAAC;MAC7F;IAAC,SAAAU,GAAA;MAAAY,UAAA,CAAA7N,CAAA,CAAAiN,GAAA;IAAA;MAAAY,UAAA,CAAA7M,CAAA;IAAA;IAED4M,WAAW,IAAI,mBAAmB;IAAC,IAAAG,UAAA,GAAA1J,0BAAA,CAEZ+G,SAAS;MAAA4C,MAAA;IAAA;MAAhC,KAAAD,UAAA,CAAAvJ,CAAA,MAAAwJ,MAAA,GAAAD,UAAA,CAAA3N,CAAA,IAAAwB,IAAA,GAAkC;QAAA,IAAvBwL,SAAQ,GAAAY,MAAA,CAAAnM,KAAA;QACf+L,WAAW,OAAAhB,MAAA,CAAOQ,SAAQ,CAACb,YAAY,QAAAK,MAAA,CAAKQ,SAAQ,CAACL,KAAK,CAAE;QAE5D,IAAIK,SAAQ,CAACtD,IAAI,EAAE;UACf8D,WAAW,UAAAhB,MAAA,CAAUQ,SAAQ,CAACtD,IAAI,CAAE;QACxC;QAEA8D,WAAW,IAAI,IAAI;MACvB;IAAC,SAAAX,GAAA;MAAAc,UAAA,CAAA/N,CAAA,CAAAiN,GAAA;IAAA;MAAAc,UAAA,CAAA/M,CAAA;IAAA;IAED,OAAO4M,WAAW,CAACK,OAAO,CAAC,CAAC;EAChC;EAEA,SAASC,yBAAyBA,CAACC,OAAO,EAAE5D,UAAU,EAAE;IACpD,IAAMW,iBAAiB,GAAGZ,mBAAmB,CAACC,UAAU,aAAVA,UAAU,cAAVA,UAAU,GAAI4D,OAAO,CAAC5D,UAAU,CAAC;IAC/E,IAAM6D,UAAU,GAAG,OAAOD,OAAO,CAACC,UAAU,KAAK,QAAQ,GACnDD,OAAO,CAACC,UAAU,GAClB,OAAOD,OAAO,CAACnD,OAAO,KAAK,QAAQ,GAC/BmD,OAAO,CAACnD,OAAO,GACf,EAAE;IACZ,IAAMqD,eAAe,GAAGtD,oBAAoB,CAACqD,UAAU,EAAElD,iBAAiB,CAAC;IAE3EiD,OAAO,CAACC,UAAU,GAAGA,UAAU;IAC/BD,OAAO,CAACnD,OAAO,GAAGoD,UAAU;IAC5BD,OAAO,CAACG,cAAc,GAAGD,eAAe,CAACrD,OAAO;IAChDmD,OAAO,CAAC5D,UAAU,GAAGW,iBAAiB;IACtCiD,OAAO,CAACI,kBAAkB,GAAGF,eAAe,CAACjD,SAAS;IACtD+C,OAAO,CAACP,WAAW,GAAGD,gBAAgB,CAACS,UAAU,EAAEC,eAAe,CAACjD,SAAS,CAAC;IAC7E+C,OAAO,CAACK,WAAW,GAAGC,oBAAoB,CAACJ,eAAe,CAACrD,OAAO,EAAEmD,OAAO,CAAC;IAE5E,OAAOA,OAAO;EAClB;EAEA,IAAMO,QAAQ,GAAG,IAAIC,MAAM,CAACC,QAAQ,CAAC,CAAC;;EAEtC;EACAF,QAAQ,CAAC5E,IAAI,GAAG,UAAU+E,IAAI,EAAE;IAC5B,IAAIC,IAAI,GAAGrI,WAAW,CAACoI,IAAI,CAACC,IAAI,CAAC;IACjC,IAAI,CAACA,IAAI,EAAE,OAAOD,IAAI,CAAC/H,IAAI,IAAI,EAAE;IACjC,oBAAA8F,MAAA,CAAmBkC,IAAI,uDAAAlC,MAAA,CAA+CiC,IAAI,CAAC/H,IAAI;EACnF,CAAC;;EAED;EACA4H,QAAQ,CAACK,IAAI,GAAG,UAAUF,IAAI,EAAE;IAC5B,IAAIE,IAAI,GAAGF,IAAI,CAAC/H,IAAI,IAAI,EAAE;IAC1B,IAAIkI,IAAI,GAAG,CAACH,IAAI,CAACG,IAAI,IAAI,EAAE,EAAEpI,IAAI,CAAC,CAAC;IACnC,IAAIqI,WAAW,GAAGF,IAAI;IAEtB,IAAI,OAAOG,IAAI,KAAK,WAAW,EAAE;MAC7B,IAAIF,IAAI,IAAIE,IAAI,CAACC,WAAW,CAACH,IAAI,CAAC,EAAE;QAChC,IAAI;UACAC,WAAW,GAAGC,IAAI,CAACE,SAAS,CAACL,IAAI,EAAE;YAAEM,QAAQ,EAAEL;UAAK,CAAC,CAAC,CAACnN,KAAK;QAChE,CAAC,CAAC,OAAOyN,CAAC,EAAE,CAAE;MAClB,CAAC,MAAM;QACH,IAAI;UACAL,WAAW,GAAGC,IAAI,CAACK,aAAa,CAACR,IAAI,CAAC,CAAClN,KAAK;QAChD,CAAC,CAAC,OAAOyN,CAAC,EAAE,CAAE;MAClB;IACJ,CAAC,MAAM;MACHL,WAAW,GAAGpI,kBAAkB,CAACkI,IAAI,CAAC;IAC1C;IAEA,IAAIS,WAAW,GAAGR,IAAI,GAAGnI,kBAAkB,CAACmI,IAAI,CAAC,GAAG,MAAM;IAC1D,qIAAApC,MAAA,CAA6H4C,WAAW,8JAAA5C,MAAA,CAAkJoC,IAAI,GAAG,YAAY,GAAGA,IAAI,GAAG,EAAE,SAAApC,MAAA,CAAKqC,WAAW;EAC7U,CAAC;;EAED;EACA;EACAP,QAAQ,CAACe,KAAK,GAAG,UAAUZ,IAAI,EAAE;IAC7B,IAAMa,GAAG,GAAGjJ,WAAW,CAACoI,IAAI,CAACC,IAAI,CAAC;IAClC,IAAI,CAACY,GAAG,EAAE,OAAO,EAAE;IACnB,IAAMC,GAAG,GAAGd,IAAI,CAAC/H,IAAI,IAAIvB,aAAa,CAACC,qBAAqB;IAC5D,IAAMoK,QAAQ,GAAGrK,aAAa,CAACE,sBAAsB;IACrD,4EAAAmH,MAAA,CACgB8C,GAAG,eAAA9C,MAAA,CAAU+C,GAAG,oDAAA/C,MAAA,CAA6CgD,QAAQ,0FAAAhD,MAAA,CAElE8C,GAAG,sCAAA9C,MAAA,CAA+B+C,GAAG,iBAAA/C,MAAA,CAAYrH,aAAa,CAACG,kBAAkB;EAKxG,CAAC;;EAED;EACA,IAAImK,YAAY,GAAG,CAAC;;EAEpB;EACA,IAAIC,cAAc,GAAG,EAAE;;EAEvB;EACAzK,MAAM,CAAC0K,cAAc,GAAG1K,MAAM,CAAC0K,cAAc,IAAI,CAAC,CAAC;EAEnD,SAASC,eAAeA,CAACC,OAAO,EAAE;IAC9B,OAAO,oIAAArD,MAAA,CACcqD,OAAO,iBAAa,WAC3B,yBACY,4GAAArD,MAAA,CACgFqD,OAAO,iBAAArD,MAAA,CAAYrH,aAAa,CAACI,kBAAkB,QAAI,6CAAAiH,MAAA,CACnHrH,aAAa,CAACK,uBAAuB,CAAE,cACpE,WACH;EAClB;;EAEA;EACA;EACA+I,MAAM,CAACuB,GAAG,CAAC;IACPC,UAAU,EAAE,CAAC;MACTlL,IAAI,EAAE,OAAO;MACbmL,KAAK,EAAE,OAAO;MACdC,KAAK,WAALA,KAAKA,CAACX,GAAG,EAAE;QACP,IAAMY,GAAG,GAAGZ,GAAG,CAACxL,OAAO,CAAC,SAAS,CAAC;QAClC,OAAOoM,GAAG,IAAI,CAAC,GAAGA,GAAG,GAAGC,SAAS;MACrC,CAAC;MACDC,SAAS,WAATA,SAASA,CAACd,GAAG,EAAE;QACX,IAAMe,SAAS,GAAGC,qBAAqB,CAAChB,GAAG,CAAC;QAC5C,IAAI,CAACe,SAAS,IAAIA,SAAS,CAACE,UAAU,KAAK,CAAC,EAAE;UAC1C,OAAOJ,SAAS;QACpB;QAEA,IAAMN,OAAO,iBAAArD,MAAA,CAAiB,EAAEiD,YAAY,CAAE;QAE9C,OAAO;UACHe,IAAI,EAAE,OAAO;UACbC,GAAG,EAAEnB,GAAG,CAACoB,SAAS,CAAC,CAAC,EAAEL,SAAS,CAACM,QAAQ,CAAC;UACzCd,OAAO,EAAEA,OAAO;UAChBe,IAAI,EAAEP,SAAS,CAACO;QACpB,CAAC;MACL,CAAC;MACDtC,QAAQ,WAARA,QAAQA,CAACuC,KAAK,EAAE;QACZnB,cAAc,CAAC3K,IAAI,CAAC;UAAE8K,OAAO,EAAEgB,KAAK,CAAChB,OAAO;UAAEiB,MAAM,EAAED,KAAK,CAACD;QAAK,CAAC,CAAC;QACnE3L,MAAM,CAAC0K,cAAc,CAACkB,KAAK,CAAChB,OAAO,CAAC,GAAGgB,KAAK,CAACD,IAAI;QACjD,OAAOhB,eAAe,CAACiB,KAAK,CAAChB,OAAO,CAAC;MACzC;IACJ,CAAC;EACL,CAAC,CAAC;;EAEF;EACA,SAASS,qBAAqBA,CAAC5J,IAAI,EAAE;IACjC,IAAMmK,KAAK,GAAG,SAAS;IACvB,IAAMZ,KAAK,GAAGvJ,IAAI,CAAC5C,OAAO,CAAC+M,KAAK,CAAC;IACjC,IAAIZ,KAAK,GAAG,CAAC,EAAE;MACX,OAAO,IAAI;IACf;;IAEA;IACA,IAAMc,SAAS,GAAGd,KAAK,GAAGY,KAAK,CAACzP,MAAM;IACtC,IAAIhB,CAAC,GAAG2Q,SAAS;IACjB,OAAO3Q,CAAC,GAAGsG,IAAI,CAACtF,MAAM,KAAKsF,IAAI,CAACtG,CAAC,CAAC,KAAK,GAAG,IAAIsG,IAAI,CAACtG,CAAC,CAAC,KAAK,IAAI,IAAIsG,IAAI,CAACtG,CAAC,CAAC,KAAK,IAAI,IAAIsG,IAAI,CAACtG,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;MACrGA,CAAC,EAAE;IACP;IAEA,IAAIA,CAAC,IAAIsG,IAAI,CAACtF,MAAM,IAAIsF,IAAI,CAACtG,CAAC,CAAC,KAAK,GAAG,EAAE;MACrC,OAAO,IAAI;IACf;IAEA,IAAI4Q,KAAK,GAAG,CAAC;IACb,IAAIC,QAAQ,GAAG,KAAK;IACpB,IAAIC,MAAM,GAAG,KAAK;IAElB,OAAO9Q,CAAC,GAAGsG,IAAI,CAACtF,MAAM,EAAEhB,CAAC,EAAE,EAAE;MACzB,IAAM+Q,EAAE,GAAGzK,IAAI,CAACtG,CAAC,CAAC;MAElB,IAAI6Q,QAAQ,EAAE;QACV,IAAIC,MAAM,EAAE;UACRA,MAAM,GAAG,KAAK;UACd;QACJ;QACA,IAAIC,EAAE,KAAK,IAAI,EAAE;UACbD,MAAM,GAAG,IAAI;UACb;QACJ;QACA,IAAIC,EAAE,KAAK,GAAG,EAAE;UACZF,QAAQ,GAAG,KAAK;QACpB;QACA;MACJ;MAEA,IAAIE,EAAE,KAAK,GAAG,EAAE;QACZF,QAAQ,GAAG,IAAI;QACf;MACJ;MAEA,IAAIE,EAAE,KAAK,GAAG,EAAE;QACZH,KAAK,EAAE;MACX,CAAC,MAAM,IAAIG,EAAE,KAAK,GAAG,EAAE;QACnBH,KAAK,EAAE;QACP,IAAIA,KAAK,KAAK,CAAC,EAAE;UACb,IAAMI,OAAO,GAAGhR,CAAC;UACjB;UACA,IAAMiR,iBAAiB,GAAG3K,IAAI,CAAC5C,OAAO,CAAC,GAAG,EAAEsN,OAAO,GAAG,CAAC,CAAC;UACxD,IAAIC,iBAAiB,GAAG,CAAC,EAAE;YACvB,OAAO,IAAI;UACf;UAEA,IAAMT,IAAI,GAAGlK,IAAI,CAACgK,SAAS,CAACK,SAAS,EAAEK,OAAO,GAAG,CAAC,CAAC,CAAC5K,IAAI,CAAC,CAAC;UAC1D,OAAO;YACH+J,UAAU,EAAEN,KAAK;YACjBU,QAAQ,EAAEU,iBAAiB,GAAG,CAAC;YAC/BT,IAAI,EAAEA;UACV,CAAC;QACL;MACJ;IACJ;IAEA,OAAO,IAAI;EACf;EAEA,SAASU,qBAAqBA,CAACvD,OAAO,EAAE;IACpC,IAAI,CAACA,OAAO,IAAI,CAACA,OAAO,CAAC2B,cAAc,IAAI,CAAC3B,OAAO,CAAC2B,cAAc,CAACtO,MAAM,EAAE;MACvE;IACJ;;IAEA;IACA,IAAMmQ,MAAM,GAAArO,kBAAA,CAAO6K,OAAO,CAAC2B,cAAc,CAAC;IAC1C3B,OAAO,CAAC2B,cAAc,GAAG,EAAE;;IAE3B;IACA;IACA8B,qBAAqB,CAAC,YAAM;MAAA,IAAAC,UAAA,GAAAxN,0BAAA,CACRsN,MAAM;QAAAG,MAAA;MAAA;QAAtB,KAAAD,UAAA,CAAArN,CAAA,MAAAsN,MAAA,GAAAD,UAAA,CAAAzR,CAAA,IAAAwB,IAAA,GAAwB;UAAA,IAAbnB,CAAC,GAAAqR,MAAA,CAAAjQ,KAAA;UACR,IAAMkQ,MAAM,GAAG/K,QAAQ,CAACgL,cAAc,CAACvR,CAAC,CAACwP,OAAO,CAAC;UACjD,IAAI,CAAC8B,MAAM,EAAE;YACT;UACJ;UAEA,IAAI,OAAOE,KAAK,KAAK,WAAW,EAAE;YAC9BC,OAAO,CAACC,IAAI,CAAC,+LAA+L,CAAC;YAC7M;UACJ;;UAEA;UACA;UACA,IAAIJ,MAAM,CAACK,YAAY,KAAK,IAAI,EAAE;YAC9B/M,MAAM,CAAC0K,cAAc,CAACtP,CAAC,CAACwP,OAAO,CAAC,GAAGxP,CAAC,CAACyQ,MAAM;YAC3C;UACJ;UAEA,IAAI;YAAA,IAAAmB,YAAA,EAAAC,aAAA,EAAAC,qBAAA;YACA;YACA,IAAIR,MAAM,CAACS,cAAc,EAAE;cACvBT,MAAM,CAACS,cAAc,CAACC,OAAO,CAAC,CAAC;YACnC;YAEA,IAAMC,GAAG,GAAG,OAAOjS,CAAC,CAACyQ,MAAM,KAAK,QAAQ,GAAGyB,IAAI,CAACC,KAAK,CAACnS,CAAC,CAACyQ,MAAM,CAAC,GAAGzQ,CAAC,CAACyQ,MAAM;YAC1E,CAAAmB,YAAA,GAAAK,GAAG,CAACG,OAAO,cAAAR,YAAA,cAAAA,YAAA,GAAXK,GAAG,CAACG,OAAO,GAAK,CAAC,CAAC;YAClBH,GAAG,CAACG,OAAO,CAACC,UAAU,GAAG,IAAI;YAC7BJ,GAAG,CAACG,OAAO,CAACE,mBAAmB,GAAG,IAAI;YACtC,CAAAR,qBAAA,IAAAD,aAAA,GAAAI,GAAG,CAACG,OAAO,EAACG,WAAW,cAAAT,qBAAA,cAAAA,qBAAA,GAAvBD,aAAA,CAAYU,WAAW,GAAK,CAAC,GAAG,CAAC;YAEjCjB,MAAM,CAACS,cAAc,GAAG,IAAIP,KAAK,CAACF,MAAM,EAAEW,GAAG,CAAC;UAClD,CAAC,CAAC,OAAO1S,CAAC,EAAE;YACRkS,OAAO,CAACe,KAAK,CAAC,uBAAuB,EAAEjT,CAAC,CAAC;UAC7C;QACJ;MAAC,SAAAiN,GAAA;QAAA4E,UAAA,CAAA7R,CAAA,CAAAiN,GAAA;MAAA;QAAA4E,UAAA,CAAA7Q,CAAA;MAAA;IACL,CAAC,CAAC;EACN;;EAEA;EACA;EACA;EACA,SAASyN,oBAAoBA,CAACzD,OAAO,EAAEmD,OAAO,EAAE;IAC5C2B,cAAc,GAAG,EAAE;IACnB,IAAMoD,IAAI,GAAGvE,MAAM,CAACiE,KAAK,CAAC5H,OAAO,EAAE;MAAE0D,QAAQ,EAARA;IAAS,CAAC,CAAC;IAChDP,OAAO,CAAC2B,cAAc,GAAGA,cAAc,CAACtO,MAAM,GAAG,CAAC,GAAA8B,kBAAA,CAAOwM,cAAc,IAAI,EAAE;IAC7E,OAAOqD,SAAS,CAACC,QAAQ,CAACF,IAAI,EAAE;MAAEG,QAAQ,EAAE,CAAC,QAAQ,CAAC;MAAEC,QAAQ,EAAE,CAAC,QAAQ;IAAE,CAAC,CAAC;EACnF;EAEA,SAASC,aAAaA,CAACC,MAAM,EAAE;IAC3B,IAAI,CAACA,MAAM,IAAIpO,OAAA,CAAOoO,MAAM,MAAK,QAAQ,EAAE;MACvC,OAAO,CAAC,CAAC;IACb;IAEA,OAAO3S,MAAM,CAAC4S,WAAW,CACrB5S,MAAM,CAAC6J,OAAO,CAAC8I,MAAM,CAAC,CAAClI,MAAM,CAAC,UAAAoI,MAAA;MAAA,IAAAC,MAAA,GAAAjP,cAAA,CAAAgP,MAAA;QAAI7R,KAAK,GAAA8R,MAAA;MAAA,OAAM9R,KAAK,KAAK0O,SAAS;IAAA,EACpE,CAAC;EACL;EAEA,IAAMqD,UAAU,GAAG,SAAbA,UAAUA,CAAIC,cAAc,EAAK;IACnC,IAAM3C,MAAM,GAAGrQ,MAAM,CAAC2I,MAAM,CAAC,CAAC,CAAC,EAAEjE,aAAa,EAAEgO,aAAa,CAACM,cAAc,CAAC,CAAC;IAC9E;IACAtO,aAAa,GAAG2L,MAAM;IAEtB,IAAI,CAACA,MAAM,CAAC4C,aAAa,EAAE;MACvB5B,OAAO,CAACe,KAAK,CAAC,gCAAgC,CAAC;MAC/C;IACJ;IAEA,IAAI,CAAC/B,MAAM,CAAC6C,kBAAkB,EAAE;MAC5B7B,OAAO,CAACe,KAAK,CAAC,qCAAqC,CAAC;MACpD;IACJ;IAEA,IAAI,CAAC/B,MAAM,CAAC8C,4BAA4B,EAAE;MACtC9B,OAAO,CAACe,KAAK,CAAC,+CAA+C,CAAC;MAC9D;IACJ;IAEA,IAAI,CAAC/B,MAAM,CAAC+C,oBAAoB,EAAE;MAC9B/B,OAAO,CAACe,KAAK,CAAC,uCAAuC,CAAC;MACtD;IACJ;IAEA,IAAI,CAAC/B,MAAM,CAACgD,yBAAyB,EAAE;MACnChC,OAAO,CAACe,KAAK,CAAC,4CAA4C,CAAC;MAC3D;IACJ;IAEA,IAAMkB,GAAG,GAAGC,GAAG,CAACC,SAAS,CAAC;MACtBxF,IAAI,WAAJA,IAAIA,CAAA,EAAG;QACH,OAAO;UACHyF,YAAY,EAAE,IAAI;UAClBC,aAAa,EAAE,IAAI;UACnBC,aAAa,EAAE,IAAI;UACnB7H,WAAW,EAAE,IAAI;UACjB8H,oBAAoB,EAAE,KAAK;UAC3BC,oBAAoB,EAAE,IAAI;UAC1BC,WAAW,EAAE,KAAK;UAClBC,gBAAgB,EAAE,KAAK;UACvBC,UAAU,EAAE,IAAI;UAChBC,MAAM,EAAE,IAAI;UACZC,QAAQ,EAAE,EAAE;UACZC,MAAM,EAAE,EAAE;UACVC,kBAAkB,EAAE,IAAIC,GAAG,CAAC,CAAC;UAC7BC,aAAa,EAAE,KAAK;UACpBC,mBAAmB,EAAE,IAAI;UACzBC,oBAAoB,EAAE,IAAI;UAC1BC,WAAW,EAAE,KAAK;UAClBC,aAAa,EAAE,IAAI;UACnBC,kBAAkB,EAAE,EAAE;UACtBC,SAAS,EAAE,IAAI;UACfC,mBAAmB,EAAExE,MAAM,CAACyE,QAAQ,KAAK,YAAY,IAAIzE,MAAM,CAACyE,QAAQ,KAAK,cAAc;UAC3FC,mBAAmB,EAAE1E,MAAM,CAACyE,QAAQ,KAAK,cAAc,IAAI,CAAC,CAACzE,MAAM,CAAC0E,mBAAmB;UACvFC,YAAY,EAAE3E,MAAM,CAAC2E,YAAY,IAAI,IAAI;UACzCC,WAAW,EAAE,EAAE;UACfC,cAAc,EAAE,EAAE;UAClBC,cAAc,EAAE,KAAK;UACrBC,mBAAmB,EAAE,IAAI;UACzBC,eAAe,EAAE,IAAI;UACrBC,sBAAsB,EAAE,CAAC,CAAC;UAC1BC,aAAa,EAAE,CAAC,CAAC;UACjBC,aAAa,EAAE,mBAAmB,GAAGC,IAAI,CAACC,MAAM,CAAC,CAAC,CAACzR,QAAQ,CAAC,EAAE,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC;UACxEyR,uBAAuB,EAAEtF,MAAM,CAACyE,QAAQ,KAAK,cAAc;UAC3Dc,kBAAkB,EAAE,IAAI;UACxBC,kBAAkB,EAAE,KAAK;UACzB;UACAC,kBAAkB,EAAE,IAAI;UACxBC,aAAa,EAAE,EAAE;UACjBC,yBAAyB,EAAE,CAAC,CAAC;UAC7B/Q,SAAS,EAAEoL,MAAM,CAACpL,SAAS;UAC3BC,WAAW,EAAEmL,MAAM,CAACnL,WAAW;UAC/B+Q,kBAAkB,EAAE,CAAC,CAAC;UACtBC,kBAAkB,EAAE,IAAI;UACxBC,gBAAgB,EAAE;QACtB,CAAC;MACL,CAAC;MACDC,QAAQ,EAAE;QACNC,kBAAkB,WAAlBA,kBAAkBA,CAAA,EAAG;UACjB,KAAK,IAAI1W,CAAC,GAAG,IAAI,CAACuU,QAAQ,CAACvT,MAAM,GAAG,CAAC,EAAEhB,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;YAChD,IAAI,IAAI,CAACuU,QAAQ,CAACvU,CAAC,CAAC,CAAC2W,IAAI,KAAK,WAAW,EAAE;cACvC,OAAO3W,CAAC;YACZ;UACJ;UACA,OAAO,CAAC,CAAC;QACb;MACJ,CAAC;MACD4W,OAAO,EAAE;QACLC,kBAAkB,WAAlBA,kBAAkBA,CAAA,EAAG;UACjB,IAAI,CAACzC,gBAAgB,GAAG,IAAI;QAChC,CAAC;QACK0C,eAAe,WAAfA,eAAeA,CAAA,EAAG;UAAA,IAAAC,KAAA;UAAA,OAAAtU,iBAAA,cAAAb,YAAA,GAAAE,CAAA,UAAAkV,QAAA;YAAA,IAAAC,EAAA;YAAA,OAAArV,YAAA,GAAAC,CAAA,WAAAqV,QAAA;cAAA,kBAAAA,QAAA,CAAAzW,CAAA,GAAAyW,QAAA,CAAAtX,CAAA;gBAAA;kBACpBmX,KAAI,CAACI,UAAU,GAAG,IAAIC,OAAO,CAACC,oBAAoB,CAAC,CAAC,CAC/CC,OAAO,CAAC5G,MAAM,CAAC4C,aAAa,CAAC,CAC7BiE,sBAAsB,CAAC,CAAC,CACxBC,KAAK,CAAC,CAAC;;kBAEZ;kBACA;kBACAT,KAAI,CAACI,UAAU,CAACM,2BAA2B,GAAG,MAAM;kBACpDV,KAAI,CAACI,UAAU,CAACO,+BAA+B,GAAG,KAAK;kBAEvDX,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,iBAAiB,EAAE,UAACtJ,IAAI,EAAK;oBAAA,IAAAuJ,cAAA;oBAC5Cb,KAAI,CAACc,qBAAqB,CAACxJ,IAAI,CAACyJ,MAAM,EAAE,IAAI,CAAC;oBAC7Cf,KAAI,CAACxC,QAAQ,GAAG,EAAE,CAAC;oBACnB,IAAMwD,UAAU,GAAGvR,QAAQ,CAACS,aAAa,CAAC,+HAA+H,CAAC;oBAC1K,IAAI8Q,UAAU,IAAI1J,IAAI,CAACjF,KAAK,EAAE;sBAC1B2O,UAAU,CAAC1W,KAAK,GAAGgN,IAAI,CAACjF,KAAK;oBACjC;oBAEA,EAAAwO,cAAA,GAACvJ,IAAI,CAACkG,QAAQ,cAAAqD,cAAA,cAAAA,cAAA,GAAI,EAAE,EAAEhQ,OAAO,CAAC,UAAAoQ,GAAG,EAAI;sBACjCjB,KAAI,CAACkB,UAAU,CAACD,GAAG,CAAC;sBAEpBjB,KAAI,CAACmB,SAAS,CAAC,YAAM;wBACjBhH,qBAAqB,CAAC8G,GAAG,CAAC;sBAC9B,CAAC,CAAC;oBACN,CAAC,CAAC;kBACN,CAAC,CAAC;kBAEFjB,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,eAAe,EAAE,UAACG,MAAM,EAAE1O,KAAK,EAAK;oBACnD;oBACA;oBACA,IAAM+O,WAAW,GAAG3R,QAAQ,CAACS,aAAa,yDAAAmF,MAAA,CAAwD0L,MAAM,QAAI,CAAC;oBAC7G,IAAIK,WAAW,EAAE;sBACbA,WAAW,CAACzR,WAAW,GAAG0C,KAAK,IAAIsH,MAAM,CAAC9K,YAAY;oBAC1D;oBAEA,IAAMmS,UAAU,GAAGvR,QAAQ,CAACS,aAAa,CAAC,+HAA+H,CAAC;oBAC1K,IAAI8Q,UAAU,IAAI3O,KAAK,EAAE;sBACrB2O,UAAU,CAAC1W,KAAK,GAAG+H,KAAK;oBAC5B;oBAEA2N,KAAI,CAACqB,iBAAiB,CAAC,OAAO,EAAE,cAAc,CAAC;kBACnD,CAAC,CAAC;kBAEFrB,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,cAAc,EAAE,UAAClF,KAAK,EAAK;oBAC1Cf,OAAO,CAACe,KAAK,CAAC,iBAAiB,EAAEA,KAAK,CAAC;oBACvCsE,KAAI,CAACqB,iBAAiB,CAAC,aAAa,EAAE,aAAa,CAAC;oBAEpD,IAAIrB,KAAI,CAACjC,WAAW,EAAE;sBAClBiC,KAAI,CAACsB,aAAa,CAAC,CAAC;oBACxB;kBACJ,CAAC,CAAC;kBAEFtB,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,mBAAmB,EAAE,UAACG,MAAM,EAAExR,IAAI,EAAEgS,OAAO,EAAK;oBAC/D,IAAIvB,KAAI,CAACb,kBAAkB,EAAE;sBACzB,IAAI,CAACoC,OAAO,IAAIhS,IAAI,EAAE;wBAClByQ,KAAI,CAACwB,8BAA8B,GAAGjS,IAAI;wBAC1C,IAAIkS,OAAO,GAAGlS,IAAI,CAACmS,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;wBACrF,IAAI/F,IAAI,GAAG,mCAAmC,GAAG8F,OAAO,GAAG,MAAM;;wBAEjE;wBACA,IAAI,CAACzB,KAAI,CAAC2B,2BAA2B,EAAE;0BACnC3B,KAAI,CAAC4B,eAAe,CAAC,CAAC;0BACtB5B,KAAI,CAAC2B,2BAA2B,GAAG;4BAC/B/B,IAAI,EAAE,MAAM;4BACZnM,OAAO,EAAElE,IAAI;4BACb0H,WAAW,EAAE0E,IAAI;4BACjBkG,SAAS,EAAE;0BACf,CAAC;0BACD7B,KAAI,CAACxC,QAAQ,CAAC5P,IAAI,CAACoS,KAAI,CAAC2B,2BAA2B,CAAC;wBACxD,CAAC,MAAM;0BACH3B,KAAI,CAAC2B,2BAA2B,CAAClO,OAAO,GAAGlE,IAAI;0BAC/CyQ,KAAI,CAAC2B,2BAA2B,CAAC1K,WAAW,GAAG0E,IAAI;wBACvD;wBACAqE,KAAI,CAAC8B,cAAc,CAAC,CAAC;sBACzB;sBACA;oBACJ;oBAEA,IAAIvS,IAAI,IAAI,CAACyQ,KAAI,CAAC+B,eAAe,EAAE;sBAC/B/B,KAAI,CAACvC,MAAM,GAAGuC,KAAI,CAAC/B,kBAAkB,GAAG1O,IAAI;sBAC5C,IAAIyQ,KAAI,CAACjD,YAAY,EAAE;wBACnBiD,KAAI,CAACjD,YAAY,CAACzS,KAAK,GAAG0V,KAAI,CAACvC,MAAM;wBACrCuC,KAAI,CAACjD,YAAY,CAACiF,aAAa,CAAC,IAAIC,KAAK,CAAC,OAAO,CAAC,CAAC;sBACvD;oBACJ;kBACJ,CAAC,CAAC;kBAEFjC,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,gCAAgC,EAAE,UAACG,MAAM,EAAEmB,MAAM,EAAE3S,IAAI,EAAK;oBAC3E;oBACA;oBACA,IAAI2S,MAAM,IAAIlC,KAAI,CAACmC,qBAAqB,IAAInC,KAAI,CAACmC,qBAAqB,CAACD,MAAM,CAAC,EAAE;sBAC5E,IAAIE,OAAO,GAAGpC,KAAI,CAACmC,qBAAqB,CAACD,MAAM,CAAC;sBAChD,OAAOlC,KAAI,CAACmC,qBAAqB,CAACD,MAAM,CAAC;sBACzClC,KAAI,CAACqC,SAAS,CAAC,CAAC;sBAChB,IAAI9S,IAAI,EAAE;wBACN6S,OAAO,CAAC3O,OAAO,GAAGlE,IAAI;wBACtB6S,OAAO,CAACvL,UAAU,GAAGtH,IAAI;wBACzB6S,OAAO,CAACP,SAAS,GAAG,KAAK;wBACzBlL,yBAAyB,CAACyL,OAAO,EAAEA,OAAO,CAACpP,UAAU,CAAC;sBAC1D,CAAC,MAAM;wBACH,IAAIsP,UAAU,GAAGtC,KAAI,CAACxC,QAAQ,CAAC7Q,OAAO,CAACyV,OAAO,CAAC;wBAC/C,IAAIE,UAAU,IAAI,CAAC,EAAE;0BAAEtC,KAAI,CAACxC,QAAQ,CAAC+E,MAAM,CAACD,UAAU,EAAE,CAAC,CAAC;wBAAE;sBAChE;sBAEA;oBACJ;oBAEA,IAAI/S,IAAI,EAAE;sBACNyQ,KAAI,CAACqC,SAAS,CAAC,CAAC;;sBAEhB;sBACA,IAAIrC,KAAI,CAAC2B,2BAA2B,EAAE;wBAClC,IAAIF,OAAO,GAAGlS,IAAI,CAACmS,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;wBACrF1B,KAAI,CAAC2B,2BAA2B,CAAClO,OAAO,GAAGlE,IAAI;wBAC/CyQ,KAAI,CAAC2B,2BAA2B,CAAC1K,WAAW,GAAG,KAAK,GAAGwK,OAAO,GAAG,MAAM;wBACvEzB,KAAI,CAAC2B,2BAA2B,CAACE,SAAS,GAAG,KAAK;wBAClD7B,KAAI,CAAC2B,2BAA2B,GAAG,IAAI;sBAC3C,CAAC,MAAM,IAAI3B,KAAI,CAACwC,6BAA6B,EAAE;wBAC3C;wBACA;wBACA;wBACA;wBACA,IAAIC,EAAE,GAAGzC,KAAI,CAACwC,6BAA6B,CAACtQ,KAAK;wBACjD,IAAIwQ,OAAO,GAAG;0BAAE9C,IAAI,EAAE,MAAM;0BAAEnM,OAAO,EAAElE,IAAI;0BAAEsH,UAAU,EAAEtH,IAAI;0BAAEyD,UAAU,EAAE,CAAC;wBAAE,CAAC;wBAC/E2D,yBAAyB,CAAC+L,OAAO,EAAEA,OAAO,CAAC1P,UAAU,CAAC;wBACtDgN,KAAI,CAACxC,QAAQ,CAAC+E,MAAM,CAACE,EAAE,EAAE,CAAC,EAAEC,OAAO,CAAC;wBACpC1C,KAAI,CAACwC,6BAA6B,CAACtQ,KAAK,GAAGuQ,EAAE,GAAG,CAAC;sBACrD,CAAC,MAAM;wBACHzC,KAAI,CAACkB,UAAU,CAAC;0BACZtB,IAAI,EAAE,MAAM;0BACZnM,OAAO,EAAElE;wBACb,CAAC,CAAC;sBACN;sBACAyQ,KAAI,CAAC8B,cAAc,CAAC,CAAC;oBACzB;kBACJ,CAAC,CAAC;kBAEF9B,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,mCAAmC,EAAE,UAACG,MAAM,EAAE4B,SAAS,EAAEjJ,KAAK,EAAEkJ,UAAU,EAAE5P,UAAU,EAAE6P,UAAU,EAAK;oBACtH;oBACA;oBACA,IAAI7C,KAAI,CAACwC,6BAA6B,IAAIxC,KAAI,CAAC8C,gCAAgC,IAAIF,UAAU,IAAI5C,KAAI,CAAC8C,gCAAgC,KAAKF,UAAU,EAAE;sBACnJ,IAAIG,IAAI,GAAG/C,KAAI,CAACxC,QAAQ,CAACwC,KAAI,CAACwC,6BAA6B,CAACtQ,KAAK,CAAC;sBAClE,IAAI6Q,IAAI,EAAE;wBAAEA,IAAI,CAAC3F,WAAW,GAAG,KAAK;sBAAE;sBACtC4C,KAAI,CAACwC,6BAA6B,GAAG,IAAI;oBAC7C;oBACA,IAAI,CAACxC,KAAI,CAACwC,6BAA6B,EAAE;sBACrCxC,KAAI,CAACqC,SAAS,CAAC,CAAC;sBAChBrC,KAAI,CAACgD,mBAAmB,CAAC,CAAC;;sBAE1B;sBACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGjD,KAAI,CAACxC,QAAQ,CAACvT,MAAM,EAAEgZ,CAAC,EAAE,EAAE;wBAC3C,IAAIjD,KAAI,CAACxC,QAAQ,CAACyF,CAAC,CAAC,CAAC7F,WAAW,EAAE;0BAC9B4C,KAAI,CAACxC,QAAQ,CAACyF,CAAC,CAAC,CAAC7F,WAAW,GAAG,KAAK;wBACxC;sBACJ;sBAEA,IAAI8F,QAAQ,GAAGlD,KAAI,CAACxC,QAAQ,CAACvT,MAAM;sBACnC,IAAIkZ,UAAU,GAAG;wBACbC,EAAE,EAAET,SAAS;wBACb/C,IAAI,EAAE,WAAW;wBACjBnM,OAAO,EAAE,EAAE;wBACXwD,WAAW,EAAE,EAAE;wBACfmG,WAAW,EAAE,IAAI;wBACjByF,UAAU,EAAE7C,KAAI,CAACqD,4BAA4B,CAACR,UAAU,CAAC;wBACzD7P,UAAU,EAAE,CAAC;sBACjB,CAAC;sBACDgN,KAAI,CAACxC,QAAQ,CAAC5P,IAAI,CAACuV,UAAU,CAAC;sBAC9BnD,KAAI,CAACwC,6BAA6B,GAAG;wBAAEtQ,KAAK,EAAEgR,QAAQ;wBAAEzP,OAAO,EAAE;sBAAG,CAAC;sBACrEuM,KAAI,CAAC8C,gCAAgC,GAAGF,UAAU;oBACtD;oBAEA5C,KAAI,CAACwC,6BAA6B,CAAC/O,OAAO,IAAIiG,KAAK;oBACnD,IAAIuH,GAAG,GAAGjB,KAAI,CAACxC,QAAQ,CAACwC,KAAI,CAACwC,6BAA6B,CAACtQ,KAAK,CAAC;oBACjE,IAAI+O,GAAG,EAAE;sBACL,IAAI,CAACA,GAAG,CAAC4B,UAAU,EAAE;wBACjB5B,GAAG,CAAC4B,UAAU,GAAG7C,KAAI,CAACqD,4BAA4B,CAACR,UAAU,CAAC;sBAClE;sBACA5B,GAAG,CAACpK,UAAU,GAAGmJ,KAAI,CAACwC,6BAA6B,CAAC/O,OAAO;sBAC3DwN,GAAG,CAACjO,UAAU,GAAGD,mBAAmB,CAACzJ,MAAM,CAAC2I,MAAM,CAAC,CAAC,CAAC,EAAEgP,GAAG,CAACjO,UAAU,IAAI,CAAC,CAAC,EAAEA,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;sBAC/F2D,yBAAyB,CAACsK,GAAG,EAAEA,GAAG,CAACjO,UAAU,CAAC;sBAC9CgN,KAAI,CAACmB,SAAS,CAAC,YAAM;wBACjBhH,qBAAqB,CAAC8G,GAAG,CAAC;wBAC1BjB,KAAI,CAAC8B,cAAc,CAAC,CAAC;sBACzB,CAAC,CAAC;oBACN;kBACJ,CAAC,CAAC;kBAEF9B,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,sCAAsC,EAAE,UAACG,MAAM,EAAE4B,SAAS,EAAE3P,UAAU,EAAK;oBAC1F,IAAIgN,KAAI,CAACwC,6BAA6B,EAAE;sBACpC,IAAIvB,GAAG,GAAGjB,KAAI,CAACxC,QAAQ,CAACwC,KAAI,CAACwC,6BAA6B,CAACtQ,KAAK,CAAC;sBACjE,IAAI+O,GAAG,EAAE;wBACLA,GAAG,CAAC7D,WAAW,GAAG,KAAK;wBACvB6D,GAAG,CAACjO,UAAU,GAAGD,mBAAmB,CAACzJ,MAAM,CAAC2I,MAAM,CAAC,CAAC,CAAC,EAAEgP,GAAG,CAACjO,UAAU,IAAI,CAAC,CAAC,EAAEA,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC/F2D,yBAAyB,CAACsK,GAAG,EAAEA,GAAG,CAACjO,UAAU,CAAC;sBAClD;sBACAgN,KAAI,CAACwC,6BAA6B,GAAG,IAAI;sBACzCxC,KAAI,CAAC8C,gCAAgC,GAAG,IAAI;oBAChD;kBACJ,CAAC,CAAC;kBAEF9C,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,mBAAmB,EAAE,UAACG,MAAM,EAAEuC,WAAW,EAAEC,WAAW,EAAK;oBAC1E,IAAID,WAAW,EAAE;sBACb,IAAME,YAAY,GAAGC,IAAI,CAACH,WAAW,CAAC;sBACtC,IAAMI,KAAK,GAAG,IAAIC,UAAU,CAACH,YAAY,CAACvZ,MAAM,CAAC;sBACjD,KAAK,IAAIhB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGua,YAAY,CAACvZ,MAAM,EAAEhB,CAAC,EAAE,EAAE;wBAC1Cya,KAAK,CAACza,CAAC,CAAC,GAAGua,YAAY,CAACI,UAAU,CAAC3a,CAAC,CAAC;sBACzC;sBACA;sBACA,IAAIsa,WAAW,KAAK,WAAW,IAAIvD,KAAI,CAACZ,kBAAkB,EAAE;wBACxDY,KAAI,CAACZ,kBAAkB,CAACyE,UAAU,CAACH,KAAK,CAAC;sBAC7C,CAAC,MAAM;wBACH1D,KAAI,CAACzB,WAAW,CAAC3Q,IAAI,CAAC8V,KAAK,CAAC;sBAChC;oBACJ;kBACJ,CAAC,CAAC;kBAEF1D,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,sBAAsB,EAAE,UAACG,MAAM,EAAK;oBACnDf,KAAI,CAAC8D,kBAAkB,CAAC,CAAC;kBAC7B,CAAC,CAAC;kBAEF9D,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,gBAAgB,EAAE,UAACG,MAAM,EAAK;oBAC7C;oBACAf,KAAI,CAACxC,QAAQ,GAAG,EAAE;oBAClBwC,KAAI,CAAC+D,eAAe,CAAC,CAAC;;oBAEtB;oBACA,IAAMC,eAAe,GAAGvU,QAAQ,CAACgL,cAAc,CAAC,iBAAiB,CAAC;oBAClE,IAAIuJ,eAAe,EAAE;sBACjBA,eAAe,CAACC,SAAS,CAACC,GAAG,CAAC,QAAQ,CAAC;oBAC3C;kBACJ,CAAC,CAAC;kBAEFlE,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,qBAAqB,EAAE,UAACuD,YAAY,EAAK;oBACxDnE,KAAI,CAACoE,mBAAmB,CAACD,YAAY,CAAC;kBAC1C,CAAC,CAAC;kBAEFnE,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,oBAAoB,EAAE,UAACuD,YAAY,EAAK;oBACvDnE,KAAI,CAACqE,kBAAkB,CAACF,YAAY,CAAC;kBACzC,CAAC,CAAC;kBAEFnE,KAAI,CAACI,UAAU,CAACQ,EAAE,CAAC,oBAAoB,EAAE,UAAC0D,gBAAgB,EAAK;oBAC3DtE,KAAI,CAACuE,kBAAkB,CAACD,gBAAgB,CAAC;kBAC7C,CAAC,CAAC;kBAEFtE,KAAI,CAACI,UAAU,CAACoE,cAAc,CAAC,YAAM;oBACjC7J,OAAO,CAACC,IAAI,CAAC,0BAA0B,CAAC;kBAC5C,CAAC,CAAC;kBAEFoF,KAAI,CAACI,UAAU,CAACqE,aAAa,CAAC,YAAM;oBAChC9J,OAAO,CAAC+J,IAAI,CAAC,uBAAuB,CAAC;oBACrC1E,KAAI,CAAC2E,wBAAwB,CAAC,CAAC;kBACnC,CAAC,CAAC;kBAEF3E,KAAI,CAACI,UAAU,CAACwE,OAAO,CAAC,UAAClJ,KAAK,EAAK;oBAC/B,IAAIsE,KAAI,CAAC3C,gBAAgB,EAAE;sBACvB;oBACJ;oBAEA,IAAI3B,KAAK,EAAE;sBACPf,OAAO,CAACC,IAAI,CAAC,uCAAuC,EAAEc,KAAK,CAAC9E,OAAO,IAAI8E,KAAK,CAAC;oBACjF;kBACJ,CAAC,CAAC;kBAACyE,QAAA,CAAAzW,CAAA;kBAAAyW,QAAA,CAAAtX,CAAA;kBAAA,OAGOmX,KAAI,CAACI,UAAU,CAACtH,KAAK,CAAC,CAAC;gBAAA;kBAAAqH,QAAA,CAAAtX,CAAA;kBAAA;gBAAA;kBAAAsX,QAAA,CAAAzW,CAAA;kBAAAwW,EAAA,GAAAC,QAAA,CAAAtW,CAAA;kBAE7B8Q,OAAO,CAACe,KAAK,CAAC,4BAA4B,EAAAwE,EAAK,CAAC;gBAAC;kBAAA,OAAAC,QAAA,CAAArW,CAAA;cAAA;YAAA,GAAAmW,OAAA;UAAA;QAEzD,CAAC;QACD4E,kBAAkB,WAAlBA,kBAAkBA,CAACjO,OAAO,EAAE;UAAA,IAAAkO,MAAA;UACxB,IAAIlO,OAAO,CAACgJ,IAAI,KAAK,WAAW,EAAE;YAC9BhJ,OAAO,CAACiM,UAAU,GAAG,IAAI,CAACQ,4BAA4B,CAACzM,OAAO,CAACiM,UAAU,CAAC;UAC9E;UAEA,IAAIjM,OAAO,CAACnD,OAAO,IAAI,CAACmD,OAAO,CAACK,WAAW,EAAE;YACzCL,OAAO,CAACK,WAAW,GAAGC,oBAAoB,CAACN,OAAO,CAACnD,OAAO,EAAEmD,OAAO,CAAC;UACxE;UACA,IAAI,CAACmO,SAAS,CAAC,IAAIC,WAAW,CAAC,8BAA8B,EAAE;YAAEC,MAAM,EAAE;cAAErO,OAAO,EAAEA;YAAQ;UAAE,CAAC,CAAC,CAAC;UACjG,IAAI,CAAC4G,QAAQ,CAAC5P,IAAI,CAACgJ,OAAO,CAAC;UAE3B,IAAI,CAACuK,SAAS,CAAC,YAAM;YACjB2D,MAAI,CAACC,SAAS,CAAC,IAAIC,WAAW,CAAC,6BAA6B,EAAE;cAAEC,MAAM,EAAE;gBAAErO,OAAO,EAAEA;cAAQ;YAAE,CAAC,CAAC,CAAC;UACpG,CAAC,CAAC;QACN,CAAC;QACDsK,UAAU,WAAVA,UAAUA,CAACtK,OAAO,EAAE;UAAA,IAAAsO,MAAA;UAChB,IAAItO,OAAO,CAACnD,OAAO,EAAE;YAAA,IAAA0R,mBAAA;YACjBvO,OAAO,CAACC,UAAU,IAAAsO,mBAAA,GAAGvO,OAAO,CAACC,UAAU,cAAAsO,mBAAA,cAAAA,mBAAA,GAAIvO,OAAO,CAACnD,OAAO;YAC1DkD,yBAAyB,CAACC,OAAO,EAAEA,OAAO,CAAC5D,UAAU,CAAC;UAC1D;UAEA,IAAI,CAAC6R,kBAAkB,CAACjO,OAAO,CAAC;UAChC,IAAI,CAACgL,eAAe,CAAC,CAAC;UAEtB,IAAI,CAACT,SAAS,CAAC,YAAM;YACjB;YACAhH,qBAAqB,CAACvD,OAAO,CAAC;YAC9BsO,MAAI,CAACpD,cAAc,CAAC,CAAC;UACzB,CAAC,CAAC;QACN,CAAC;QACDF,eAAe,WAAfA,eAAeA,CAAA,EAAG;UACd,IAAI,IAAI,CAACxM,WAAW,EAAE;YAClB,IAAI,CAACA,WAAW,CAAC6O,SAAS,CAACC,GAAG,CAAC,QAAQ,CAAC;UAC5C;UACA,IAAI,CAAC/G,oBAAoB,GAAG,KAAK;QACrC,CAAC;QACD4G,eAAe,WAAfA,eAAeA,CAAA,EAAG;UACd,IAAI,IAAI,CAAC3O,WAAW,EAAE;YAClB,IAAI,CAACA,WAAW,CAAC6O,SAAS,CAACmB,MAAM,CAAC,QAAQ,CAAC;UAC/C;UACA,IAAI,CAACjI,oBAAoB,GAAG,IAAI;QACpC,CAAC;QACD4H,SAAS,WAATA,SAASA,CAACM,KAAK,EAAE;UACb5V,QAAQ,CAACuS,aAAa,CAACqD,KAAK,CAAC;QACjC,CAAC;QACDhC,4BAA4B,WAA5BA,4BAA4BA,CAACR,UAAU,EAAE;UACrC,IAAI,CAACA,UAAU,EAAE;YACb,OAAO,IAAI;UACf;UAEA,IAAIrN,KAAK,GAAG,OAAOqN,UAAU,CAACrN,KAAK,KAAK,QAAQ,GAAGqN,UAAU,CAACrN,KAAK,CAACnG,IAAI,CAAC,CAAC,GAAG,EAAE;UAC/E,IAAIiW,IAAI,GAAG,OAAOzC,UAAU,CAACyC,IAAI,KAAK,QAAQ,GAAGzC,UAAU,CAACyC,IAAI,CAACjW,IAAI,CAAC,CAAC,GAAG,EAAE;UAC5E,IAAIkW,QAAQ,GAAG,OAAO1C,UAAU,CAAC0C,QAAQ,KAAK,QAAQ,GAAG1C,UAAU,CAAC0C,QAAQ,CAAClW,IAAI,CAAC,CAAC,GAAG,EAAE;UACxF,IAAImW,yBAAyB,GAAG,CAAC,CAAC3C,UAAU,CAAC2C,yBAAyB;UAEtE,IAAI,CAAChQ,KAAK,IAAI,CAAC8P,IAAI,IAAI,CAACC,QAAQ,IAAI,CAACC,yBAAyB,EAAE;YAC5D,OAAO,IAAI;UACf;UAEA,OAAO;YACHhQ,KAAK,EAAEA,KAAK;YACZ8P,IAAI,EAAEA,IAAI;YACVC,QAAQ,EAAEA,QAAQ;YAClBC,yBAAyB,EAAEA;UAC/B,CAAC;QACL,CAAC;QACDC,iBAAiB,WAAjBA,iBAAiBA,CAAC7O,OAAO,EAAE;UACvB,IAAIiM,UAAU,GAAGjM,OAAO,GAAG,IAAI,CAACyM,4BAA4B,CAACzM,OAAO,CAACiM,UAAU,CAAC,GAAG,IAAI;UACvF,OAAOA,UAAU,IAAIA,UAAU,CAACrN,KAAK,GAAGqN,UAAU,CAACrN,KAAK,GAAGxH,aAAa,CAACU,cAAc;QAC3F,CAAC;QACDgX,uBAAuB,WAAvBA,uBAAuBA,CAAC9O,OAAO,EAAE;UAC7B,IAAIiM,UAAU,GAAGjM,OAAO,GAAG,IAAI,CAACyM,4BAA4B,CAACzM,OAAO,CAACiM,UAAU,CAAC,GAAG,IAAI;UACvF,IAAI8C,OAAO,GAAG,CAAC,kBAAkB,CAAC;UAElC,IAAI9C,UAAU,IAAIA,UAAU,CAAC0C,QAAQ,EAAE;YACnCI,OAAO,CAAC/X,IAAI,CAACiV,UAAU,CAAC0C,QAAQ,CAAC;UACrC,CAAC,MAAM;YACHI,OAAO,CAAC/X,IAAI,CAAC,4BAA4B,CAAC;UAC9C;UAEA,OAAO+X,OAAO;QAClB,CAAC;QACDC,uBAAuB,WAAvBA,uBAAuBA,CAAChP,OAAO,EAAE1E,KAAK,EAAE;UACpC,IAAI2Q,UAAU,GAAGjM,OAAO,GAAG,IAAI,CAACyM,4BAA4B,CAACzM,OAAO,CAACiM,UAAU,CAAC,GAAG,IAAI;UACvF,OAAO,CAAC,IAAI,CAACgD,0BAA0B,CAACjP,OAAO,EAAE1E,KAAK,CAAC,GAAG,mBAAmB,GAAG,aAAa,EAAE2Q,UAAU,IAAIA,UAAU,CAAC0C,QAAQ,GAAG1C,UAAU,CAAC0C,QAAQ,GAAG,EAAE,CAAC;QAChK,CAAC;QACDO,gBAAgB,WAAhBA,gBAAgBA,CAAClP,OAAO,EAAE;UACtB,IAAIiM,UAAU,GAAGjM,OAAO,GAAG,IAAI,CAACyM,4BAA4B,CAACzM,OAAO,CAACiM,UAAU,CAAC,GAAG,IAAI;UACvF,OAAOA,UAAU,IAAIA,UAAU,CAACyC,IAAI,GAAGzC,UAAU,CAACyC,IAAI,GAAG,aAAa;QAC1E,CAAC;QACDO,0BAA0B,WAA1BA,0BAA0BA,CAACjP,OAAO,EAAE1E,KAAK,EAAE;UACvC,IAAI2Q,UAAU,GAAGjM,OAAO,GAAG,IAAI,CAACyM,4BAA4B,CAACzM,OAAO,CAACiM,UAAU,CAAC,GAAG,IAAI;UACvF,OAAO,CAAC,CAACjM,OAAO,IACZA,OAAO,CAACwG,WAAW,IACnBlL,KAAK,KAAK,IAAI,CAACyN,kBAAkB,IACjC,EAAEkD,UAAU,IAAIA,UAAU,CAAC2C,yBAAyB,CAAC;QAC7D,CAAC;QACDO,WAAW,WAAXA,WAAWA,CAACnP,OAAO,EAAE;UACjB,OAAOA,OAAO,CAACgJ,IAAI,KAAK,WAAW;QACvC,CAAC;QACKoG,WAAW,WAAXA,WAAWA,CAAA,EAAG;UAAA,IAAAC,MAAA;UAAA,OAAAva,iBAAA,cAAAb,YAAA,GAAAE,CAAA,UAAAmb,SAAA;YAAA,IAAAC,aAAA,EAAAnC,eAAA;YAAA,OAAAnZ,YAAA,GAAAC,CAAA,WAAAsb,SAAA;cAAA,kBAAAA,SAAA,CAAAvd,CAAA;gBAAA;kBACZsd,aAAa,GAAGF,MAAI,CAACxI,MAAM,CAACpO,IAAI,CAAC,CAAC;kBAAA,IAEjC8W,aAAa;oBAAAC,SAAA,CAAAvd,CAAA;oBAAA;kBAAA;kBAAA,OAAAud,SAAA,CAAAtc,CAAA;gBAAA;kBAIlB;kBACA,IAAImc,MAAI,CAAClI,WAAW,EAAE;oBAClBkI,MAAI,CAAC3E,aAAa,CAAC,CAAC;kBACxB;;kBAEA;kBACA2E,MAAI,CAAClE,eAAe,GAAG,IAAI;;kBAE3B;kBACA;kBAAAqE,SAAA,CAAAvd,CAAA;kBAAA,OACMod,MAAI,CAACI,gBAAgB,CAAC,CAAC;gBAAA;kBAE7BJ,MAAI,CAAC/E,UAAU,CAAC;oBACZtB,IAAI,EAAE,MAAM;oBACZnM,OAAO,EAAE0S;kBACb,CAAC,CAAC;;kBAEF;kBACMnC,eAAe,GAAGvU,QAAQ,CAACgL,cAAc,CAAC,iBAAiB,CAAC;kBAClE,IAAIuJ,eAAe,EAAE;oBACjBA,eAAe,CAACC,SAAS,CAACmB,MAAM,CAAC,QAAQ,CAAC;kBAC9C;kBAEAa,MAAI,CAACK,aAAa,CAACH,aAAa,CAAC;kBACjCF,MAAI,CAAClJ,YAAY,CAACzS,KAAK,GAAG,EAAE;kBAC5B2b,MAAI,CAACxI,MAAM,GAAG,EAAE;gBAAC;kBAAA,OAAA2I,SAAA,CAAAtc,CAAA;cAAA;YAAA,GAAAoc,QAAA;UAAA;QACrB,CAAC;QACDI,aAAa,WAAbA,aAAaA,CAACH,aAAa,EAAE;UAAA,IAAAI,MAAA;UACzB,IAAI,IAAI,CAAChJ,MAAM,EAAE;YACb,IAAI,CAACA,MAAM,CAACiJ,OAAO,CAAC,CAAC;YACrB,IAAI,CAACjJ,MAAM,GAAG,IAAI;UACtB;UAEA,IAAI,CAACkJ,gBAAgB,CAAC,CAAC;UACvB,IAAI,CAACC,mBAAmB,CAAC,CAAC;UAC1B,IAAI,CAACpJ,UAAU,GAAG,IAAI;UAEtB,IAAI7J,OAAO,GAAG,EAAE;UAChB,IAAIT,UAAU,GAAG,CAAC,CAAC;UACnB,IAAI2T,cAAc,GAAG,IAAI;UAEzB,IAAIC,YAAY,GAAG,IAAI,CAACpJ,QAAQ,CAACvT,MAAM;UACvC,IAAI4c,aAAa,GAAG,IAAI,CAACC,SAAS,CAAC,CAAC;UAEpC,IAAI,CAACvJ,MAAM,GAAG,IAAI,CAAC6C,UAAU,CAAC7C,MAAM,CAAC,aAAa,EAAEsJ,aAAa,EAAEV,aAAa,CAAC,CAC5EY,SAAS,CAAC;YACP7Z,IAAI,EAAE,SAANA,IAAIA,CAAG8Z,KAAK,EAAK;cACb,IAAIpQ,OAAO,GAAG2P,MAAI,CAAC/I,QAAQ,CAACoJ,YAAY,CAAC;cAEzC,IAAI,CAAChQ,OAAO,EAAE;gBACV,IAAIoQ,KAAK,CAACC,SAAS,IAAI,CAACJ,aAAa,EAAE;kBACnCN,MAAI,CAACW,SAAS,CAACF,KAAK,CAACC,SAAS,CAAC;gBACnC;gBAEAV,MAAI,CAACvD,mBAAmB,CAAC,CAAC;gBAC1B4D,YAAY,GAAGL,MAAI,CAAC/I,QAAQ,CAACvT,MAAM;gBACnC,IAAIkZ,UAAU,GAAG;kBACbvD,IAAI,EAAE,WAAW;kBACjBnM,OAAO,EAAE,EAAE;kBACXwD,WAAW,EAAE,EAAE;kBACfmG,WAAW,EAAE;gBACjB,CAAC;gBAEDmJ,MAAI,CAAC/I,QAAQ,CAAC5P,IAAI,CAACuV,UAAU,CAAC;gBAC9BvM,OAAO,GAAGuM,UAAU;cACxB;cAEA,IAAI6D,KAAK,CAAChU,UAAU,IAAInF,OAAA,CAAOmZ,KAAK,CAAChU,UAAU,MAAK,QAAQ,IAAI1J,MAAM,CAAC6d,IAAI,CAACH,KAAK,CAAChU,UAAU,CAAC,CAAC/I,MAAM,EAAE;gBAClG,SAAAmd,GAAA,MAAAC,gBAAA,GAA2B/d,MAAM,CAAC6J,OAAO,CAAC6T,KAAK,CAAChU,UAAU,CAAC,EAAAoU,GAAA,GAAAC,gBAAA,CAAApd,MAAA,EAAAmd,GAAA,IAAE;kBAAA,IAAAE,oBAAA;kBAAxD,IAAAC,mBAAA,GAAApa,cAAA,CAAAka,gBAAA,CAAAD,GAAA;oBAAO9T,GAAG,GAAAiU,mBAAA;oBAAEjd,KAAK,GAAAid,mBAAA;kBAClBvU,UAAU,CAACM,GAAG,CAAC,IAAAgU,oBAAA,GAAGnW,kBAAkB,CAAC7G,KAAK,CAAC,cAAAgd,oBAAA,cAAAA,oBAAA,GAAI,CAAC,CAAC;gBACrD;cACJ;cAEA,IAAIN,KAAK,CAACvT,OAAO,EAAE;gBACf;gBACA;gBACA,IAAIuT,KAAK,CAACpE,UAAU,IAAI+D,cAAc,IAAIK,KAAK,CAACpE,UAAU,KAAK+D,cAAc,EAAE;kBAC3ElT,OAAO,IAAI,MAAM;gBACrB;gBAEA,IAAIuT,KAAK,CAACpE,UAAU,EAAE;kBAClB+D,cAAc,GAAGK,KAAK,CAACpE,UAAU;gBACrC;gBAEAnP,OAAO,IAAIuT,KAAK,CAACvT,OAAO;cAC5B;cAEAmD,OAAO,CAACC,UAAU,GAAGpD,OAAO;cAC5BkD,yBAAyB,CAACC,OAAO,EAAE5D,UAAU,CAAC;cAE9CuT,MAAI,CAAC/I,QAAQ,CAACoJ,YAAY,CAAC,GAAGhQ,OAAO;cAErC2P,MAAI,CAACpF,SAAS,CAAC,YAAM;gBACjBhH,qBAAqB,CAACvD,OAAO,CAAC;gBAC9B2P,MAAI,CAACzE,cAAc,CAAC,CAAC;cACzB,CAAC,CAAC;YACN,CAAC;YACD0F,QAAQ,EAAE,SAAVA,QAAQA,CAAA,EAAQ;cAAA,IAAAC,aAAA;cACZlB,MAAI,CAACmB,iBAAiB,CAAC1U,UAAU,EAAE4T,YAAY,CAAC;cAChDL,MAAI,CAACoB,iBAAiB,CAAC,CAAC;cAExB,IAAI1G,GAAG,GAAGsF,MAAI,CAAC/I,QAAQ,CAACoJ,YAAY,CAAC;cACrC,IAAI3F,GAAG,EAAE;gBACLA,GAAG,CAAC7D,WAAW,GAAG,KAAK;cAC3B;cAEA,IAAI,CAAC6D,GAAG,IAAI,CAACA,GAAG,CAACxN,OAAO,EAAE;gBACtB;gBACA8S,MAAI,CAACvD,mBAAmB,CAAC,CAAC;cAC9B;;cAEA;cACA,IAAIuD,MAAI,CAACpH,kBAAkB,IAAIoH,MAAI,CAAClI,mBAAmB,IAAI4C,GAAG,IAAIA,GAAG,CAACxN,OAAO,EAAE;gBAC3E8S,MAAI,CAACqB,gBAAgB,CAAC3G,GAAG,CAACxN,OAAO,CAAC;cACtC;cAEA,CAAAgU,aAAA,GAAAlB,MAAI,CAAChJ,MAAM,cAAAkK,aAAA,eAAXA,aAAA,CAAajB,OAAO,CAAC,CAAC;cACtBD,MAAI,CAAChJ,MAAM,GAAG,IAAI;YACtB,CAAC;YACD7B,KAAK,EAAE,SAAPA,KAAKA,CAAGhG,GAAG,EAAK;cAAA,IAAAmS,cAAA;cACZtB,MAAI,CAACmB,iBAAiB,CAAC1U,UAAU,EAAE4T,YAAY,CAAC;cAChDL,MAAI,CAACoB,iBAAiB,CAAC,CAAC;cAExB,IAAI1G,GAAG,GAAGsF,MAAI,CAAC/I,QAAQ,CAACoJ,YAAY,CAAC;cACrC,IAAI3F,GAAG,EAAE;gBACLA,GAAG,CAAC7D,WAAW,GAAG,KAAK;cAC3B;cAEAmJ,MAAI,CAACvD,mBAAmB,CAAC,CAAC;cAE1B,IAAI,CAACuD,MAAI,CAAClJ,gBAAgB,EAAE;gBACxBkJ,MAAI,CAACrF,UAAU,CAACqF,MAAI,CAACuB,qBAAqB,CAAC,CAAC,CAAC;cACjD;cAEA,CAAAD,cAAA,GAAAtB,MAAI,CAAChJ,MAAM,cAAAsK,cAAA,eAAXA,cAAA,CAAarB,OAAO,CAAC,CAAC;cACtBD,MAAI,CAAChJ,MAAM,GAAG,IAAI;cAElB5C,OAAO,CAACe,KAAK,CAAC,eAAe,EAAEhG,GAAG,CAAC;YACvC;UACJ,CAAC,CAAC;QACV,CAAC;QACDoS,qBAAqB,WAArBA,qBAAqBA,CAAA,EAAG;UACpB,OAAO;YACHlI,IAAI,EAAE,WAAW;YACjBnM,OAAO,EAAE,mGAAmG;YAC5GwD,WAAW,EAAE;UACjB,CAAC;QACL,CAAC;QACDyQ,iBAAiB,WAAjBA,iBAAiBA,CAAC1U,UAAU,EAAE4T,YAAY,EAAE;UAAA,IAAAmB,MAAA;UACxC/U,UAAU,GAAGD,mBAAmB,CAACC,UAAU,CAAC;UAE5C,IAAI1J,MAAM,CAAC6d,IAAI,CAACnU,UAAU,CAAC,CAAC/I,MAAM,EAAE;YAAA,IAAA+d,MAAA,EAAAC,oBAAA;YAChC,IAAIrR,OAAO,GAAG,IAAI,CAAC4G,QAAQ,CAACoJ,YAAY,CAAC;YACzChQ,OAAO,CAACC,UAAU,IAAAmR,MAAA,IAAAC,oBAAA,GAAGrR,OAAO,CAACC,UAAU,cAAAoR,oBAAA,cAAAA,oBAAA,GAAIrR,OAAO,CAACnD,OAAO,cAAAuU,MAAA,cAAAA,MAAA,GAAI,EAAE;YAChErR,yBAAyB,CAACC,OAAO,EAAE5D,UAAU,CAAC;YAE9C,IAAI,CAACwK,QAAQ,CAACoJ,YAAY,CAAC,GAAGhQ,OAAO;YAErC,IAAI,CAACuK,SAAS,CAAC,YAAM;cACjBhH,qBAAqB,CAACvD,OAAO,CAAC;cAC9BmR,MAAI,CAACjG,cAAc,CAAC,CAAC;YACzB,CAAC,CAAC;UACN;QACJ,CAAC;QACD2E,gBAAgB,WAAhBA,gBAAgBA,CAAA,EAAG;UACf,IAAIyB,QAAQ,GAAG,IAAI,CAAClL,aAAa,CAACmL,YAAY,CAAC,gBAAgB,CAAC;UAEhE,IAAID,QAAQ,EAAE;YACV,IAAI,CAAClL,aAAa,CAACoL,eAAe,CAACxM,SAAS,CAACC,QAAQ,CAACqM,QAAQ,EAAE;cAAEG,mBAAmB,EAAE;YAAK,CAAC,CAAC,CAAC;UACnG;QACJ,CAAC;QACDV,iBAAiB,WAAjBA,iBAAiBA,CAAA,EAAG;UAChB,IAAIW,SAAS,GAAG,IAAI,CAACtL,aAAa,CAACmL,YAAY,CAAC,iBAAiB,CAAC;UAElE,IAAIG,SAAS,EAAE;YACX,IAAI,CAACtL,aAAa,CAACoL,eAAe,CAACxM,SAAS,CAACC,QAAQ,CAACyM,SAAS,EAAE;cAAED,mBAAmB,EAAE;YAAK,CAAC,CAAC,CAAC;UACpG;;UAEA;UACA,IAAI,IAAI,CAACpL,aAAa,EAAE;YACpB,IAAIsL,KAAK,GAAG,IAAI,CAACtL,aAAa,CAACuL,gBAAgB,CAAC,oBAAoB,CAAC;YACrE,KAAK,IAAIvf,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGsf,KAAK,CAACte,MAAM,EAAEhB,CAAC,EAAE,EAAE;cACnCsf,KAAK,CAACtf,CAAC,CAAC,CAACgb,SAAS,CAACmB,MAAM,CAAC,mBAAmB,CAAC;cAC9CmD,KAAK,CAACtf,CAAC,CAAC,CAACgb,SAAS,CAACC,GAAG,CAAC,aAAa,CAAC;YACzC;UACJ;;UAEA;UACA,KAAK,IAAIjb,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACuU,QAAQ,CAACvT,MAAM,EAAEhB,CAAC,EAAE,EAAE;YAC3C,IAAI,IAAI,CAACuU,QAAQ,CAACvU,CAAC,CAAC,CAACmU,WAAW,EAAE;cAC9B,IAAI,CAACI,QAAQ,CAACvU,CAAC,CAAC,CAACmU,WAAW,GAAG,KAAK;YACxC;UACJ;;UAEA;UACA,IAAI,IAAI,CAACQ,aAAa,EAAE;YACpB,IAAI,CAAC6K,qBAAqB,CAAC,CAAC;UAChC;QACJ,CAAC;QACDC,qBAAqB,WAArBA,qBAAqBA,CAACjgB,CAAC,EAAE;UAAA,IAAAkgB,SAAA;UACrB,IAAI,CAAAlgB,CAAC,aAADA,CAAC,gBAAAkgB,SAAA,GAADlgB,CAAC,CAAEwc,MAAM,cAAA0D,SAAA,uBAATA,SAAA,CAAWC,QAAQ,MAAK,IAAI,CAAC9J,aAAa,EAAE;YAC5C;UACJ;UAEA,IAAI,CAACuD,SAAS,CAAC,KAAK,CAAC;QACzB,CAAC;QACDwG,wBAAwB,WAAxBA,wBAAwBA,CAAA,EAAG;UAAA,IAAAC,MAAA;UACvB,IAAI,CAAC,IAAI,CAAC7L,aAAa,EAAE;YACrB;UACJ;UAEA,IAAI8L,OAAO,GAAG,IAAI,CAAC9L,aAAa,CAACuL,gBAAgB,CAAC,0BAA0B,CAAC;UAE7EO,OAAO,CAAClY,OAAO,CAAC,UAAAmY,MAAM,EAAI;YACtB,IAAIC,WAAW,GAAGC,MAAM,CAACF,MAAM,CAACb,YAAY,CAAC,wBAAwB,CAAC,CAAC;YACvE,IAAIgB,SAAS,GAAGF,WAAW,KAAKH,MAAI,CAAClK,sBAAsB;YAC3D,IAAIwK,QAAQ,GAAGD,SAAS,GAClB,0CAA0C,GAC1C,yCAAyC;YAE/CH,MAAM,CAAC/E,SAAS,CAACoF,MAAM,CAAC,aAAa,EAAEF,SAAS,CAAC;YACjDH,MAAM,CAACM,YAAY,CAAC,OAAO,EAAEH,SAAS,GAAG,aAAa,GAAG,YAAY,CAAC;YACtEH,MAAM,CAACZ,eAAe,CAACxM,SAAS,CAACC,QAAQ,CAACuN,QAAQ,EAAE;cAAEf,mBAAmB,EAAE;YAAK,CAAC,CAAC,CAAC;UACvF,CAAC,CAAC;QACN,CAAC;QACDkB,iBAAiB,WAAjBA,iBAAiBA,CAAA,EAAG;UAAA,IAAAC,MAAA;UAChB,IAAI,CAAC,IAAI,CAACvM,aAAa,EAAE;YACrB;UACJ;UAEA,IAAI8L,OAAO,GAAG,IAAI,CAAC9L,aAAa,CAACuL,gBAAgB,CAAC,2BAA2B,CAAC;UAE9EO,OAAO,CAAClY,OAAO,CAAC,UAAAmY,MAAM,EAAI;YACtB,IAAIC,WAAW,GAAGC,MAAM,CAACF,MAAM,CAACb,YAAY,CAAC,yBAAyB,CAAC,CAAC;YACxE,IAAIsB,QAAQ,GAAGR,WAAW,KAAKO,MAAI,CAACjK,kBAAkB;YACtD,IAAI6J,QAAQ,GAAGK,QAAQ,GACjB,mCAAmC,GACnC,kCAAkC;YAExCT,MAAM,CAAC/E,SAAS,CAACoF,MAAM,CAAC,cAAc,EAAEI,QAAQ,CAAC;YACjDT,MAAM,CAAC/E,SAAS,CAACoF,MAAM,CAAC,gBAAgB,EAAE,CAACI,QAAQ,CAAC;YACpDT,MAAM,CAACM,YAAY,CAAC,OAAO,EAAEG,QAAQ,GAAGD,MAAI,CAAChb,WAAW,GAAGgb,MAAI,CAACjb,SAAS,CAAC;YAC1Eya,MAAM,CAACZ,eAAe,CAACxM,SAAS,CAACC,QAAQ,CAACuN,QAAQ,EAAE;cAAEf,mBAAmB,EAAE;YAAK,CAAC,CAAC,CAAC;UACvF,CAAC,CAAC;QACN,CAAC;QACDqB,kBAAkB,WAAlBA,kBAAkBA,CAACV,MAAM,EAAES,QAAQ,EAAE;UACjC,IAAI,CAACT,MAAM,EAAE;YACT;UACJ;UAEA,IAAII,QAAQ,GAAGK,QAAQ,GACjB,mCAAmC,GACnC,kCAAkC;UAExCT,MAAM,CAAC/E,SAAS,CAACoF,MAAM,CAAC,cAAc,EAAEI,QAAQ,CAAC;UACjDT,MAAM,CAAC/E,SAAS,CAACoF,MAAM,CAAC,gBAAgB,EAAE,CAACI,QAAQ,CAAC;UACpDT,MAAM,CAACM,YAAY,CAAC,OAAO,EAAEG,QAAQ,GAAG,IAAI,CAACjb,WAAW,GAAG,IAAI,CAACD,SAAS,CAAC;UAC1Eya,MAAM,CAACZ,eAAe,CAACxM,SAAS,CAACC,QAAQ,CAACuN,QAAQ,EAAE;YAAEf,mBAAmB,EAAE;UAAK,CAAC,CAAC,CAAC;QACvF,CAAC;QACDT,gBAAgB,WAAhBA,gBAAgBA,CAACrY,IAAI,EAAEoa,UAAU,EAAE;UAAA,IAAAC,MAAA;UAC/B,IAAI,CAAC,IAAI,CAACvL,mBAAmB,IAAI,CAAC9O,IAAI,IAAI,CAAC,IAAI,CAAC6Q,UAAU,EAAE;YACxD;UACJ;UAEA,IAAI,CAAC7B,WAAW,GAAG,EAAE;UACrB,IAAI,CAACE,cAAc,GAAG,IAAI;UAC1B,IAAI,CAACoL,cAAc,GAAGF,UAAU,KAAK3Q,SAAS,GAAG2Q,UAAU,GAAG,CAAC,CAAC;UAEhE,IAAI,CAACvJ,UAAU,CAAC0J,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAChD,SAAS,CAAC,CAAC,EAAEvX,IAAI,EAAE,IAAI,CAAC+O,YAAY,CAAC,SAC3E,CAAC,UAAA5I,GAAG,EAAI;YACViF,OAAO,CAACe,KAAK,CAAC,sBAAsB,EAAEhG,GAAG,CAAC;YAC1CkU,MAAI,CAACnL,cAAc,GAAG,KAAK;YAC3BmL,MAAI,CAAChL,sBAAsB,GAAG,CAAC,CAAC;YAChCgL,MAAI,CAACC,cAAc,GAAG,CAAC,CAAC;YACxBD,MAAI,CAACzI,SAAS,CAAC;cAAA,OAAMyI,MAAI,CAACf,wBAAwB,CAAC,CAAC;YAAA,EAAC;UACzD,CAAC,CAAC;QACV,CAAC;QACDkB,gBAAgB,WAAhBA,gBAAgBA,CAACnT,OAAO,EAAE1E,KAAK,EAAE;UAAA,IAAA8X,MAAA;UAC7B,IAAI,IAAI,CAACpL,sBAAsB,KAAK1M,KAAK,EAAE;YACvC,IAAI,CAACmQ,SAAS,CAAC,CAAC;YAChB;UACJ;UAEA,IAAI,CAACA,SAAS,CAAC,KAAK,CAAC;UACrBvU,MAAM,CAACkU,aAAa,CAAC,IAAIgD,WAAW,CAAC,4BAA4B,EAAE;YAC/DC,MAAM,EAAE;cAAE2D,QAAQ,EAAE,IAAI,CAAC9J;YAAc;UAC3C,CAAC,CAAC,CAAC;UACH,IAAI,CAACF,sBAAsB,GAAG1M,KAAK;UACnC,IAAI,CAACiP,SAAS,CAAC;YAAA,OAAM6I,MAAI,CAACnB,wBAAwB,CAAC,CAAC;UAAA,EAAC;UAErD,IAAI,IAAI,CAAChK,aAAa,CAAC3M,KAAK,CAAC,EAAE;YAC3B,IAAI,CAAC+X,aAAa,CAAC,IAAI,CAACpL,aAAa,CAAC3M,KAAK,CAAC,CAAC;YAC7C;UACJ;UAEA,IAAI,CAAC0V,gBAAgB,CAAChR,OAAO,CAACnD,OAAO,EAAEvB,KAAK,CAAC;QACjD,CAAC;QACD4R,kBAAkB,WAAlBA,kBAAkBA,CAAA,EAAG;UAAA,IAAAoG,MAAA;UACjB,IAAI,IAAI,CAAC3L,WAAW,CAACtU,MAAM,KAAK,CAAC,EAAE;YAC/B,IAAI,CAAC,IAAI,CAACwU,cAAc,IAAI,IAAI,CAACD,cAAc,CAACvU,MAAM,KAAK,CAAC,EAAE;cAC1D,IAAI,CAACwU,cAAc,GAAG,KAAK;cAC3B,IAAI,CAACG,sBAAsB,GAAG,CAAC,CAAC;cAChC,IAAI,CAACuC,SAAS,CAAC;gBAAA,OAAM+I,MAAI,CAACrB,wBAAwB,CAAC,CAAC;cAAA,EAAC;YACzD;YACA;UACJ;UAEA,IAAMsB,WAAW,GAAG,IAAI,CAAC5L,WAAW,CAAC6L,MAAM,CAAC,UAACC,GAAG,EAAErD,KAAK;YAAA,OAAKqD,GAAG,GAAGrD,KAAK,CAAC/c,MAAM;UAAA,GAAE,CAAC,CAAC;UAClF,IAAMqgB,QAAQ,GAAG,IAAI3G,UAAU,CAACwG,WAAW,CAAC;UAC5C,IAAII,MAAM,GAAG,CAAC;UAAC,IAAAC,UAAA,GAAA1d,0BAAA,CACK,IAAI,CAACyR,WAAW;YAAAkM,MAAA;UAAA;YAApC,KAAAD,UAAA,CAAAvd,CAAA,MAAAwd,MAAA,GAAAD,UAAA,CAAA3hB,CAAA,IAAAwB,IAAA,GAAsC;cAAA,IAA3B2c,KAAK,GAAAyD,MAAA,CAAAngB,KAAA;cACZggB,QAAQ,CAACI,GAAG,CAAC1D,KAAK,EAAEuD,MAAM,CAAC;cAC3BA,MAAM,IAAIvD,KAAK,CAAC/c,MAAM;YAC1B;UAAC,SAAAyL,GAAA;YAAA8U,UAAA,CAAA/hB,CAAA,CAAAiN,GAAA;UAAA;YAAA8U,UAAA,CAAA/gB,CAAA;UAAA;UACD,IAAI,CAAC8U,WAAW,GAAG,EAAE;UAErB,IAAMoM,IAAI,GAAG,IAAIC,IAAI,CAAC,CAACN,QAAQ,CAAC,EAAE;YAAEjR,IAAI,EAAE;UAAY,CAAC,CAAC;UAExD,IAAI,IAAI,CAACwQ,cAAc,IAAI,CAAC,EAAE;YAC1B,IAAI,CAAChL,aAAa,CAAC,IAAI,CAACgL,cAAc,CAAC,GAAGc,IAAI;YAC9C,IAAI,CAACd,cAAc,GAAG,CAAC,CAAC;UAC5B;;UAEA;UACA,IAAI,IAAI,CAACpL,cAAc,IAAI,IAAI,CAACC,mBAAmB,EAAE;YACjD,IAAI,CAACF,cAAc,CAAC5Q,IAAI,CAAC+c,IAAI,CAAC;YAC9B;UACJ;UAEA,IAAI,CAACV,aAAa,CAACU,IAAI,CAAC;QAC5B,CAAC;QACDV,aAAa,WAAbA,aAAaA,CAACU,IAAI,EAAE;UAAA,IAAAE,OAAA;UAChB,IAAM1b,GAAG,GAAG2b,GAAG,CAACC,eAAe,CAACJ,IAAI,CAAC;UACrC,IAAMK,KAAK,GAAG,IAAIC,KAAK,CAAC9b,GAAG,CAAC;UAE5B,IAAI,CAACwP,eAAe,GAAGxP,GAAG;UAC1B,IAAI,CAACuP,mBAAmB,GAAGsM,KAAK;UAChC,IAAI,CAACvM,cAAc,GAAG,IAAI;UAE1BuM,KAAK,CAACE,gBAAgB,CAAC,OAAO,EAAE,YAAM;YAClCL,OAAI,CAACnM,mBAAmB,GAAG,IAAI;YAC/BmM,OAAI,CAAClM,eAAe,GAAG,IAAI;YAC3BmM,GAAG,CAACK,eAAe,CAAChc,GAAG,CAAC;YACxB0b,OAAI,CAACO,eAAe,CAAC,CAAC;UAC1B,CAAC,CAAC;UAEFJ,KAAK,CAACE,gBAAgB,CAAC,OAAO,EAAE,YAAM;YAClCL,OAAI,CAACnM,mBAAmB,GAAG,IAAI;YAC/BmM,OAAI,CAAClM,eAAe,GAAG,IAAI;YAC3BmM,GAAG,CAACK,eAAe,CAAChc,GAAG,CAAC;YACxB0b,OAAI,CAACO,eAAe,CAAC,CAAC;UAC1B,CAAC,CAAC;UAEFJ,KAAK,CAACK,IAAI,CAAC,CAAC,SAAM,CAAC,UAAA3V,GAAG,EAAI;YACtBiF,OAAO,CAACe,KAAK,CAAC,uBAAuB,EAAEhG,GAAG,CAAC;YAC3CmV,OAAI,CAACnM,mBAAmB,GAAG,IAAI;YAC/BmM,OAAI,CAAClM,eAAe,GAAG,IAAI;YAC3BmM,GAAG,CAACK,eAAe,CAAChc,GAAG,CAAC;YACxB0b,OAAI,CAACrM,cAAc,GAAG,EAAE;YACxBqM,OAAI,CAACpM,cAAc,GAAG,KAAK;YAC3BoM,OAAI,CAACjM,sBAAsB,GAAG,CAAC,CAAC;YAChCiM,OAAI,CAAC1J,SAAS,CAAC;cAAA,OAAM0J,OAAI,CAAChC,wBAAwB,CAAC,CAAC;YAAA,EAAC;UACzD,CAAC,CAAC;QACN,CAAC;QACDuC,eAAe,WAAfA,eAAeA,CAAA,EAAG;UAAA,IAAAE,OAAA;UACd,IAAI,IAAI,CAAC9M,cAAc,CAACvU,MAAM,GAAG,CAAC,EAAE;YAChC,IAAMshB,QAAQ,GAAG,IAAI,CAAC/M,cAAc,CAACgN,KAAK,CAAC,CAAC;YAC5C,IAAI,CAACvB,aAAa,CAACsB,QAAQ,CAAC;UAChC,CAAC,MAAM;YACH,IAAI,CAAC9M,cAAc,GAAG,KAAK;YAC3B,IAAI,CAACG,sBAAsB,GAAG,CAAC,CAAC;YAChC,IAAI,CAACuC,SAAS,CAAC;cAAA,OAAMmK,OAAI,CAACzC,wBAAwB,CAAC,CAAC;YAAA,EAAC;YACrD,IAAI,CAAC4C,4BAA4B,CAAC,CAAC;UACvC;QACJ,CAAC;QACDpJ,SAAS,WAATA,SAASA,CAAA,EAAG;UAAA,IAAAqJ,OAAA;UACR,IAAI,IAAI,CAAChN,mBAAmB,EAAE;YAC1B,IAAI,CAACA,mBAAmB,CAACiN,KAAK,CAAC,CAAC;YAChC,IAAI,CAACjN,mBAAmB,CAACkN,WAAW,GAAG,CAAC;YACxC,IAAI,CAAClN,mBAAmB,GAAG,IAAI;UACnC;UACA,IAAI,IAAI,CAACC,eAAe,EAAE;YACtBmM,GAAG,CAACK,eAAe,CAAC,IAAI,CAACxM,eAAe,CAAC;YACzC,IAAI,CAACA,eAAe,GAAG,IAAI;UAC/B;UACA,IAAI,CAACJ,WAAW,GAAG,EAAE;UACrB,IAAI,CAACC,cAAc,GAAG,EAAE;UACxB,IAAI,CAACC,cAAc,GAAG,KAAK;UAC3B,IAAI,CAACG,sBAAsB,GAAG,CAAC,CAAC;UAChC,IAAI,CAACuC,SAAS,CAAC;YAAA,OAAMuK,OAAI,CAAC7C,wBAAwB,CAAC,CAAC;UAAA,EAAC;QACzD,CAAC;QACDgD,sBAAsB,WAAtBA,sBAAsBA,CAAA,EAAG;UACrB,IAAI,IAAI,CAAC1M,kBAAkB,EAAE;YACzB,IAAI,CAAC2M,oBAAoB,CAAC,CAAC;UAC/B,CAAC,MAAM;YACH,IAAI,CAACC,qBAAqB,CAAC,CAAC;UAChC;QACJ,CAAC;QACDA,qBAAqB,WAArBA,qBAAqBA,CAAA,EAAG;UAAA,IAAAC,OAAA;UACpB,IAAI,CAAC,IAAI,CAAC/M,uBAAuB,IAAI,IAAI,CAACE,kBAAkB,IAAI,CAAC,IAAI,CAACiB,UAAU,EAAE;YAC9E;UACJ;UAEA,IAAI,CAACjB,kBAAkB,GAAG,IAAI;UAC9B,IAAI,CAAC8M,wBAAwB,CAAC,CAAC;UAC/B,IAAI,CAACzK,8BAA8B,GAAG,EAAE;UACxC,IAAI,CAACgB,6BAA6B,GAAG,IAAI;UACzC,IAAI,CAACb,2BAA2B,GAAG,IAAI;;UAEvC;UACA,IAAI,CAAC4C,kBAAkB,CAAC,oBAAoB,CAAC;UAE7C2H,SAAS,CAACC,YAAY,CAACC,YAAY,CAAC;YAAEpB,KAAK,EAAE;cAAEqB,gBAAgB,EAAE,IAAI;cAAEC,gBAAgB,EAAE,IAAI;cAAEC,eAAe,EAAE;YAAK;UAAE,CAAC,CAAC,CACpH9gB,IAAI,CAAC,UAAA8R,MAAM,EAAI;YACZ,IAAIiP,QAAQ,GAAGC,aAAa,CAACC,eAAe,CAAC,uBAAuB,CAAC,GAC/D,uBAAuB,GACvBD,aAAa,CAACC,eAAe,CAAC,wBAAwB,CAAC,GACnD,wBAAwB,GACxB,YAAY;YAEtBV,OAAI,CAAChO,aAAa,GAAG,IAAIyO,aAAa,CAAClP,MAAM,EAAE;cAC3CiP,QAAQ,EAAEA,QAAQ;cAClBG,kBAAkB,EAAE;YACxB,CAAC,CAAC;YAEFX,OAAI,CAACY,oBAAoB,GAAG,IAAIvM,OAAO,CAACwM,OAAO,CAAC,CAAC;YACjDb,OAAI,CAACc,mBAAmB,GAAGvP,MAAM;;YAEjC;YACA,IAAIwP,QAAQ,GAAGjf,MAAM,CAACkf,YAAY,IAAIlf,MAAM,CAACmf,kBAAkB;YAC/D,IAAIF,QAAQ,EAAE;cACVf,OAAI,CAACkB,qBAAqB,GAAG,IAAIH,QAAQ,CAAC,CAAC;cAC3Cf,OAAI,CAACmB,qBAAqB,GAAGnB,OAAI,CAACkB,qBAAqB,CAACE,cAAc,CAAC,CAAC;cACxEpB,OAAI,CAACmB,qBAAqB,CAACE,OAAO,GAAG,GAAG;cACxC,IAAIC,SAAS,GAAGtB,OAAI,CAACkB,qBAAqB,CAACK,uBAAuB,CAAChQ,MAAM,CAAC;cAC1E+P,SAAS,CAACE,OAAO,CAACxB,OAAI,CAACmB,qBAAqB,CAAC;YACjD;YAEA,IAAIM,YAAY,GAAGliB,OAAO,CAACC,OAAO,CAAC,CAAC;YACpC,IAAIkiB,QAAQ,GAAG1B,OAAI,CAACmB,qBAAqB;YACzC,IAAIQ,wBAAwB,GAAG,EAAE;YAEjC3B,OAAI,CAAChO,aAAa,CAACkN,gBAAgB,CAAC,eAAe,EAAE,UAACziB,CAAC,EAAK;cACxD,IAAIA,CAAC,CAAC6O,IAAI,IAAI7O,CAAC,CAAC6O,IAAI,CAACsW,IAAI,GAAG,CAAC,EAAE;gBAC3B;gBACA;gBACA,IAAI5B,OAAI,CAACvN,cAAc,IAAIiP,QAAQ,EAAE;kBACjC,IAAIG,QAAQ,GAAG,IAAIlK,UAAU,CAAC+J,QAAQ,CAACI,iBAAiB,CAAC;kBACzDJ,QAAQ,CAACK,oBAAoB,CAACF,QAAQ,CAAC;kBACvC,IAAIxD,GAAG,GAAG,CAAC;kBACX,KAAK,IAAI2D,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,QAAQ,CAAC5jB,MAAM,EAAE+jB,CAAC,EAAE,EAAE;oBAAE3D,GAAG,IAAIwD,QAAQ,CAACG,CAAC,CAAC;kBAAE;kBAChE,IAAIC,GAAG,GAAG5D,GAAG,GAAGwD,QAAQ,CAAC5jB,MAAM;kBAE/B,IAAIgkB,GAAG,IAAIN,wBAAwB,EAAE;oBACjC;oBACA3B,OAAI,CAAC3J,SAAS,CAAC,CAAC;kBACpB;gBACJ;;gBAEA;gBACA;gBACA;gBACAoL,YAAY,GAAGA,YAAY,CAAChiB,IAAI,cAAAC,iBAAA,cAAAb,YAAA,GAAAE,CAAA,CAAC,SAAAmjB,SAAA;kBAAA,IAAA5W,IAAA,EAAA6W,UAAA,EAAA3K,YAAA,EAAA4K,MAAA;kBAAA,OAAAvjB,YAAA,GAAAC,CAAA,WAAAujB,SAAA;oBAAA,kBAAAA,SAAA,CAAAxlB,CAAA;sBAAA;wBAAAwlB,SAAA,CAAAxlB,CAAA;wBAAA,OACZJ,CAAC,CAAC6O,IAAI,CAACgX,WAAW,CAAC,CAAC;sBAAA;wBAAjChX,IAAI,GAAA+W,SAAA,CAAAxkB,CAAA;wBACJskB,UAAU,GAAG,IAAIxK,UAAU,CAACrM,IAAI,CAAC;wBACjCkM,YAAY,GAAG2K,UAAU,CAAC/D,MAAM,CAAC,UAAUmE,GAAG,EAAEC,KAAI,EAAE;0BAAE,OAAOD,GAAG,GAAGE,MAAM,CAACC,YAAY,CAACF,KAAI,CAAC;wBAAE,CAAC,EAAE,EAAE,CAAC;wBACtGJ,MAAM,GAAGO,IAAI,CAACnL,YAAY,CAAC;wBAC/B,IAAI;0BACAwI,OAAI,CAACY,oBAAoB,CAAC1f,IAAI,CAACkhB,MAAM,CAAC;wBAC1C,CAAC,CAAC,OAAO1Y,GAAG,EAAE;0BACV;wBAAA;sBACH;wBAAA,OAAA2Y,SAAA,CAAAvkB,CAAA;oBAAA;kBAAA,GAAAokB,QAAA;gBAAA,CACJ,GAAC;cACN;YACJ,CAAC,CAAC;YAEFlC,OAAI,CAAChO,aAAa,CAACkN,gBAAgB,CAAC,MAAM,EAAE,YAAM;cAC9C3N,MAAM,CAACqR,SAAS,CAAC,CAAC,CAAC/d,OAAO,CAAC,UAAAge,KAAK;gBAAA,OAAIA,KAAK,CAACC,IAAI,CAAC,CAAC;cAAA,EAAC;cACjDrB,YAAY,CAAChiB,IAAI,CAAC,YAAM;gBACpB,IAAI;kBACAugB,OAAI,CAACY,oBAAoB,CAACpF,QAAQ,CAAC,CAAC;gBACxC,CAAC,CAAC,OAAO9R,GAAG,EAAE;kBACV;gBAAA;cAER,CAAC,CAAC;YACN,CAAC,CAAC;YAEF,IAAIqL,MAAM,GAAGiL,OAAI,CAAClF,SAAS,CAAC,CAAC;YAE7B,IAAIhP,QAAQ,GAAGoU,SAAS,CAACpU,QAAQ,IAAIrI,QAAQ,CAACsf,eAAe,CAACtX,IAAI,IAAI,OAAO;YAC7EuU,OAAI,CAAC5L,UAAU,CAAC4O,IAAI,CAAC,mBAAmB,EAAEjO,MAAM,EAAEiL,OAAI,CAACY,oBAAoB,EAAEJ,QAAQ,EAAE1U,QAAQ,CAAC;YAChGkU,OAAI,CAAChO,aAAa,CAAClF,KAAK,CAAC,GAAG,CAAC;YAC7BkT,OAAI,CAACjO,WAAW,GAAG,IAAI;UAC3B,CAAC,CAAC,SACI,CAAC,UAAArI,GAAG,EAAI;YACViF,OAAO,CAACe,KAAK,CAAC,2BAA2B,EAAEhG,GAAG,CAAC;YAC/CsW,OAAI,CAAC7M,kBAAkB,GAAG,KAAK;YAC/B6M,OAAI,CAACC,wBAAwB,CAAC,CAAC;UACnC,CAAC,CAAC;QACV,CAAC;QACDH,oBAAoB,WAApBA,oBAAoBA,CAAA,EAAG;UACnB,IAAI,CAAC,IAAI,CAAC3M,kBAAkB,EAAE;YAC1B;UACJ;UAEA,IAAI,CAACA,kBAAkB,GAAG,KAAK;UAC/B,IAAI,CAAC8M,wBAAwB,CAAC,CAAC;;UAE/B;UACA,IAAI,IAAI,CAAC7L,UAAU,EAAE;YACjB,IAAI,CAACA,UAAU,CAAC0J,MAAM,CAAC,kBAAkB,CAAC,SAAM,CAAC,YAAY,CAAE,CAAC,CAAC;UACrE;UAEA,IAAI,IAAI,CAAC/L,WAAW,IAAI,IAAI,CAACC,aAAa,EAAE;YACxC,IAAI,CAACA,aAAa,CAAC8Q,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC/Q,WAAW,GAAG,KAAK;UAC5B;UAEA,IAAI,CAACsE,SAAS,CAAC,CAAC;UAChB,IAAI,CAACb,8BAA8B,GAAG,EAAE;UACxC,IAAI,CAACG,2BAA2B,GAAG,IAAI;;UAEvC;UACA,IAAI,IAAI,CAACuL,qBAAqB,EAAE;YAC5B,IAAI,CAACA,qBAAqB,CAAC+B,KAAK,CAAC,CAAC,SAAM,CAAC,YAAY,CAAE,CAAC,CAAC;YACzD,IAAI,CAAC/B,qBAAqB,GAAG,IAAI;YACjC,IAAI,CAACC,qBAAqB,GAAG,IAAI;UACrC;;UAEA;UACA,IAAI,IAAI,CAAC3K,6BAA6B,EAAE;YACpC,IAAIvB,GAAG,GAAG,IAAI,CAACzD,QAAQ,CAAC,IAAI,CAACgF,6BAA6B,CAACtQ,KAAK,CAAC;YACjE,IAAI+O,GAAG,EAAE;cACLA,GAAG,CAAC7D,WAAW,GAAG,KAAK;YAC3B;YACA,IAAI,CAACoF,6BAA6B,GAAG,IAAI;UAC7C;;UAEA;UACA,KAAK,IAAIvZ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACuU,QAAQ,CAACvT,MAAM,EAAEhB,CAAC,EAAE,EAAE;YAC3C,IAAI,IAAI,CAACuU,QAAQ,CAACvU,CAAC,CAAC,CAACmU,WAAW,EAAE;cAC9B,IAAI,CAACI,QAAQ,CAACvU,CAAC,CAAC,CAACmU,WAAW,GAAG,KAAK;YACxC;UACJ;;UAEA;UACA,IAAI,CAACgH,mBAAmB,CAAC;YACrB/K,IAAI,EAAE,oBAAoB;YAC1B5F,OAAO,EAAE,qBAAqB;YAC9B6R,IAAI,EAAE,0BAA0B;YAChC4J,WAAW,EAAE,IAAI;YACjBC,aAAa,EAAE;UACnB,CAAC,CAAC;QACN,CAAC;QACDlD,wBAAwB,WAAxBA,wBAAwBA,CAAA,EAAG;UACvB,IAAI,CAAC,IAAI,CAAC/M,kBAAkB,EAAE;YAC1B;UACJ;UAEA,IAAI,IAAI,CAACC,kBAAkB,EAAE;YACzB,IAAI,CAACD,kBAAkB,CAAC+E,SAAS,CAACC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC;YAC9D,IAAI,CAAChF,kBAAkB,CAAC+E,SAAS,CAACmB,MAAM,CAAC,UAAU,EAAE,kBAAkB,EAAE,uBAAuB,CAAC;YACjG,IAAI,CAAClG,kBAAkB,CAAC7M,KAAK,GAAG,IAAI,CAAC6M,kBAAkB,CAACiJ,YAAY,CAAC,gBAAgB,CAAC,IAAI,kBAAkB;YAC5G,IAAIiH,OAAO,GAAG,IAAI,CAAClQ,kBAAkB,CAACiJ,YAAY,CAAC,eAAe,CAAC;YACnE,IAAIiH,OAAO,EAAE;cACT,IAAI,CAAClQ,kBAAkB,CAACkJ,eAAe,CAACxM,SAAS,CAACC,QAAQ,CAACuT,OAAO,EAAE;gBAAE/G,mBAAmB,EAAE;cAAK,CAAC,CAAC,CAAC;YACvG;UACJ,CAAC,MAAM;YACH,IAAI,CAACnJ,kBAAkB,CAAC+E,SAAS,CAACmB,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;YACjE,IAAI,CAAClG,kBAAkB,CAAC+E,SAAS,CAACmB,MAAM,CAAC,UAAU,EAAE,uBAAuB,CAAC;YAC7E,IAAI,CAAClG,kBAAkB,CAAC+E,SAAS,CAACC,GAAG,CAAC,kBAAkB,CAAC;YACzD,IAAI,CAAChF,kBAAkB,CAACmQ,IAAI,CAAC,CAAC;YAC9B,IAAI,CAACnQ,kBAAkB,CAAC7M,KAAK,GAAG,IAAI,CAAC6M,kBAAkB,CAACiJ,YAAY,CAAC,kBAAkB,CAAC,IAAI,oBAAoB;YAChH,IAAImH,SAAS,GAAG,IAAI,CAACpQ,kBAAkB,CAACiJ,YAAY,CAAC,iBAAiB,CAAC;YACvE,IAAImH,SAAS,EAAE;cACX,IAAI,CAACpQ,kBAAkB,CAACkJ,eAAe,CAACxM,SAAS,CAACC,QAAQ,CAACyT,SAAS,EAAE;gBAAEjH,mBAAmB,EAAE;cAAK,CAAC,CAAC,CAAC;YACzG;UACJ;QACJ,CAAC;QACDkH,0BAA0B,WAA1BA,0BAA0BA,CAAA,EAAG;UACzB;QAAA,CACH;QACD9D,4BAA4B,WAA5BA,4BAA4BA,CAAA,EAAG;UAC3B;UACA;QAAA,CACH;QACD/E,mBAAmB,WAAnBA,mBAAmBA,CAAA,EAAG;UAClB,IAAI,CAACxF,UAAU,CAAC;YACZtB,IAAI,EAAE,WAAW;YACjB3I,WAAW,EAAE0C,MAAM,CAAC/K;UACxB,CAAC,CAAC;QACN,CAAC;QACDoU,mBAAmB,WAAnBA,mBAAmBA,CAAA,EAAG;UAClB,IAAMwM,cAAc,GAAG,IAAI,CAAChS,QAAQ,CAACvT,MAAM;UAC3C,IAAI,CAACuT,QAAQ,GAAG,IAAI,CAACA,QAAQ,CAACzJ,MAAM,CAAC,UAAAkN,GAAG;YAAA,OAAIA,GAAG,CAACrB,IAAI,KAAK,WAAW;UAAA,EAAC;UACrE,IAAM6P,YAAY,GAAGD,cAAc,GAAG,IAAI,CAAChS,QAAQ,CAACvT,MAAM;UAC1D,OAAOwlB,YAAY;QACvB,CAAC;QACD3N,cAAc,WAAdA,cAAcA,CAAA,EAAG;UAAA,IAAA4N,OAAA;UACb,IAAI,CAAC,IAAI,CAACpS,UAAU,EAAE;YAClB;UACJ;UACAqS,UAAU,CAAC,YAAM;YACbD,OAAI,CAACzS,aAAa,CAAC2S,SAAS,GAAGF,OAAI,CAACzS,aAAa,CAAC4S,YAAY,GAAGH,OAAI,CAACzS,aAAa,CAAC6S,YAAY;UACpG,CAAC,EAAE,EAAE,CAAC;QACV,CAAC;QACDC,eAAe,WAAfA,eAAeA,CAAC1K,KAAK,EAAE;UACnB,IAAI,CAAC5H,MAAM,GAAG4H,KAAK,CAAC2K,MAAM,CAAC1lB,KAAK;QACpC,CAAC;QACDwc,SAAS,WAATA,SAASA,CAAA,EAAG;UACR,OAAO,IAAI,CAAC/J,YAAY,CAACoL,YAAY,CAAC,qBAAqB,CAAC,IACrD,IAAI,CAACpL,YAAY,CAACoL,YAAY,CAAC,cAAc,CAAC;QACzD,CAAC;QACD8H,uBAAuB,WAAvBA,uBAAuBA,CAAA,EAAG;UACtB,IAAItW,MAAM,CAACuW,4BAA4B,EAAE;YACrC,OAAOzgB,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAACuW,4BAA4B,CAAC;UACtE;UAEA,OAAOzgB,QAAQ,CAACS,aAAa,CAAC,wCAAwC,CAAC;QAC3E,CAAC;QACDmR,iBAAiB,WAAjBA,iBAAiBA,CAAC9R,IAAI,EAAE4gB,SAAS,EAAE;UAAA,IAAAC,OAAA;UAC/B,IAAMC,SAAS,GAAG,IAAI,CAACJ,uBAAuB,CAAC,CAAC;UAChD,IAAI,CAACI,SAAS,EAAE;YACZ;UACJ;UAEAA,SAAS,CAAC1gB,WAAW,GAAGJ,IAAI,IAAI,EAAE;UAClC8gB,SAAS,CAACF,SAAS,GAAG,0BAA0B,IAAIA,SAAS,IAAI,YAAY,CAAC;UAE9E,IAAI,IAAI,CAACrS,oBAAoB,EAAE;YAC3BwS,YAAY,CAAC,IAAI,CAACxS,oBAAoB,CAAC;YACvC,IAAI,CAACA,oBAAoB,GAAG,IAAI;UACpC;UAEA,IAAI,CAACvO,IAAI,EAAE;YACP;UACJ;UAEA,IAAI,CAACuO,oBAAoB,GAAG6R,UAAU,CAAC,YAAM;YACzCU,SAAS,CAAC1gB,WAAW,GAAG,EAAE;YAC1BygB,OAAI,CAACtS,oBAAoB,GAAG,IAAI;UACpC,CAAC,EAAE,IAAI,CAAC;QACZ,CAAC;QACDyS,wBAAwB,WAAxBA,wBAAwBA,CAAA,EAAG;UACvB,IAAI,IAAI,CAAC1S,mBAAmB,EAAE;YAC1ByS,YAAY,CAAC,IAAI,CAACzS,mBAAmB,CAAC;YACtC,IAAI,CAACA,mBAAmB,GAAG,IAAI;UACnC;QACJ,CAAC;QACD2S,aAAa,WAAbA,aAAaA,CAACC,KAAK,EAAE;UAAA,IAAAC,cAAA;UACjB,IAAMlb,KAAK,IAAAkb,cAAA,GAAGD,KAAK,CACdE,OAAO,CAAC,kDAAkD,CAAC,cAAAD,cAAA,uBADlDA,cAAA,CAERxgB,aAAa,CAAC,OAAO,CAAC;UAE5B,IAAI,CAACsF,KAAK,EAAE;YACR,OAAOib,KAAK,CAACG,OAAO,CAACC,OAAO,IAAI,YAAY;UAChD;UAEA,OAAO,CAACrb,KAAK,CAAC7F,WAAW,IAAI,EAAE,EAC1B+R,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CACpBrS,IAAI,CAAC,CAAC,IACJohB,KAAK,CAACG,OAAO,CAACC,OAAO,IACrB,YAAY;QACvB,CAAC;QACDC,4BAA4B,WAA5BA,4BAA4BA,CAACL,KAAK,EAAE;UAChC,IAAIM,QAAQ,GAAGN,KAAK,CAACO,kBAAkB;UACvC,IAAID,QAAQ,IAAIA,QAAQ,CAAC9M,SAAS,CAACgN,QAAQ,CAAC,kBAAkB,CAAC,EAAE;YAC7D,OAAOF,QAAQ;UACnB;UAEAA,QAAQ,GAAGthB,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;UACxCqhB,QAAQ,CAACZ,SAAS,GAAG,kBAAkB;UACvCM,KAAK,CAACS,qBAAqB,CAAC,UAAU,EAAEH,QAAQ,CAAC;UAEjD,OAAOA,QAAQ;QACnB,CAAC;QACDI,2BAA2B,WAA3BA,2BAA2BA,CAACV,KAAK,EAAE;UAC/BA,KAAK,CAACxM,SAAS,CAACmB,MAAM,CAAC,YAAY,CAAC;UACpCqL,KAAK,CAACW,eAAe,CAAC,cAAc,CAAC;UAErC,IAAML,QAAQ,GAAGN,KAAK,CAACO,kBAAkB;UACzC,IAAID,QAAQ,IAAIA,QAAQ,CAAC9M,SAAS,CAACgN,QAAQ,CAAC,kBAAkB,CAAC,EAAE;YAC7DF,QAAQ,CAACphB,WAAW,GAAG,EAAE;UAC7B;QACJ,CAAC;QACD0hB,yBAAyB,WAAzBA,yBAAyBA,CAACZ,KAAK,EAAE7Z,OAAO,EAAE;UACtC,IAAMma,QAAQ,GAAG,IAAI,CAACD,4BAA4B,CAACL,KAAK,CAAC;UACzDA,KAAK,CAACxM,SAAS,CAACC,GAAG,CAAC,YAAY,CAAC;UACjCuM,KAAK,CAACnH,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC;UAC1CyH,QAAQ,CAACphB,WAAW,GAAGiH,OAAO;QAClC,CAAC;QACD0a,2BAA2B,WAA3BA,2BAA2BA,CAACb,KAAK,EAAE;UAC/B,IAAI,CAACA,KAAK,IAAIA,KAAK,CAACc,QAAQ,IAAId,KAAK,CAACpX,IAAI,KAAK,QAAQ,EAAE;YACrD,OAAO,IAAI;UACf;UAEA,IAAM/O,KAAK,GAAG,CAACmmB,KAAK,CAACnmB,KAAK,IAAI,EAAE,EAAE+E,IAAI,CAAC,CAAC;UACxC,IAAI,CAAC/E,KAAK,EAAE;YACR,OAAO,IAAI;UACf;UAEA,IAAMknB,MAAM,GAAGtI,MAAM,CAAC5e,KAAK,CAAC;UAC5B,IAAMmnB,UAAU,GAAG,IAAI,CAACjB,aAAa,CAACC,KAAK,CAAC;UAE5C,IAAIvH,MAAM,CAACwI,KAAK,CAACF,MAAM,CAAC,EAAE;YACtB,UAAAnc,MAAA,CAAUoc,UAAU;UACxB;UAEA,IAAME,GAAG,GAAGlB,KAAK,CAACtI,YAAY,CAAC,KAAK,CAAC;UACrC,IAAIwJ,GAAG,KAAK,IAAI,IAAIH,MAAM,GAAGtI,MAAM,CAACyI,GAAG,CAAC,EAAE;YACtC,UAAAtc,MAAA,CAAUoc,UAAU,eAAApc,MAAA,CAAYsc,GAAG;UACvC;UAEA,IAAMC,GAAG,GAAGnB,KAAK,CAACtI,YAAY,CAAC,KAAK,CAAC;UACrC,IAAIyJ,GAAG,KAAK,IAAI,IAAIJ,MAAM,GAAGtI,MAAM,CAAC0I,GAAG,CAAC,EAAE;YACtC,UAAAvc,MAAA,CAAUoc,UAAU,eAAApc,MAAA,CAAYuc,GAAG;UACvC;UAEA,OAAO,IAAI;QACf,CAAC;QACDC,oBAAoB,WAApBA,oBAAoBA,CAACpB,KAAK,EAAE;UACxB,IAAM7Z,OAAO,GAAG,IAAI,CAAC0a,2BAA2B,CAACb,KAAK,CAAC;UACvD,IAAI,CAAC7Z,OAAO,EAAE;YACV,IAAI,CAACua,2BAA2B,CAACV,KAAK,CAAC;YACvC,OAAO,IAAI;UACf;UAEA,IAAI,CAACY,yBAAyB,CAACZ,KAAK,EAAE7Z,OAAO,CAAC;UAC9C,OAAO,KAAK;QAChB,CAAC;QACDkb,gBAAgB,WAAhBA,gBAAgBA,CAAA,EAAG;UAAA,IAAAC,OAAA;UACf,IAAIC,OAAO,GAAG,IAAI;UAElB,IAAI,CAACC,gBAAgB,CAAC,CAAC,CAACphB,OAAO,CAAC,UAAA4f,KAAK,EAAI;YACrCuB,OAAO,GAAGD,OAAI,CAACF,oBAAoB,CAACpB,KAAK,CAAC,IAAIuB,OAAO;UACzD,CAAC,CAAC;UAEF,OAAOA,OAAO;QAClB,CAAC;QACDE,iBAAiB,WAAjBA,iBAAiBA,CAAA,EAAG;UAChB,IAAI,CAAC,IAAI,CAACJ,gBAAgB,CAAC,CAAC,EAAE;YAC1B,IAAI,CAACvB,wBAAwB,CAAC,CAAC;YAC/B,IAAI,CAAC3S,aAAa,GAAG,KAAK;YAC1B,IAAI,CAACyD,iBAAiB,CAAC,YAAY,EAAE,aAAa,CAAC;YACnD;UACJ;UAEA,IAAI,CAACzD,aAAa,GAAG,IAAI;UACzB,IAAI,CAACyD,iBAAiB,CAAC,WAAW,EAAE,cAAc,CAAC;UACnD,IAAI,CAACoH,qBAAqB,CAAC,CAAC;QAChC,CAAC;QACDwJ,gBAAgB,WAAhBA,gBAAgBA,CAAA,EAAG;UACf,IAAME,cAAc,GAAG1iB,QAAQ,CAAC+Y,gBAAgB,CAAC,8BAA8B,CAAC;UAChF,IAAI2J,cAAc,CAACloB,MAAM,GAAG,CAAC,EAAE;YAC3B,OAAOkoB,cAAc;UACzB;UAEA,OAAO1iB,QAAQ,CAAC+Y,gBAAgB,CAC5B,uFAAuF,GACvF,wFAAwF,GACxF,wFACJ,CAAC;QACL,CAAC;QACD4J,sBAAsB,WAAtBA,sBAAsBA,CAACC,SAAS,EAAEC,gBAAgB,EAAE;UAChD,IAAMC,kBAAkB,GAAG9iB,QAAQ,CAAC+Y,gBAAgB,2CAAAnT,MAAA,CAA0Cgd,SAAS,qDAAAhd,MAAA,CAAgDgd,SAAS,gBAAY,CAAC;UAC7K,IAAIE,kBAAkB,CAACtoB,MAAM,GAAG,CAAC,EAAE;YAC/B,IAAMuoB,OAAM,GAAG,EAAE;YAEjBD,kBAAkB,CAAC1hB,OAAO,CAAC,UAAA4hB,QAAQ,EAAI;cACnC,IAAMnoB,KAAK,GAAGmoB,QAAQ,CAACtK,YAAY,CAAC,cAAc,CAAC,IAAIsK,QAAQ,CAACnoB,KAAK;cACrE,IAAIA,KAAK,EAAE;gBACPkoB,OAAM,CAAC5kB,IAAI,CAACtD,KAAK,CAAC;cACtB;YACJ,CAAC,CAAC;YAEF,OAAOkoB,OAAM;UACjB;UAEA,IAAI,CAACF,gBAAgB,EAAE;YACnB,OAAO,EAAE;UACb;UAEA,IAAME,MAAM,GAAG,EAAE;UACjB,IAAME,UAAU,GAAGjjB,QAAQ,CAAC+Y,gBAAgB,CAAC8J,gBAAgB,CAAC;UAE9DI,UAAU,CAAC7hB,OAAO,CAAC,UAAA4hB,QAAQ,EAAI;YAC3B,IAAME,QAAQ,GAAGF,QAAQ,CAAC/kB,IAAI,CAACgU,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC;YAChE,IAAMkR,WAAW,GAAGnjB,QAAQ,CAACS,aAAa,kCAAAmF,MAAA,CAA+Bsd,QAAQ,QAAI,CAAC;YAEtF,IAAIC,WAAW,IAAIA,WAAW,CAACtoB,KAAK,EAAE;cAClCkoB,MAAM,CAAC5kB,IAAI,CAACglB,WAAW,CAACtoB,KAAK,CAAC;YAClC;UACJ,CAAC,CAAC;UAEF,OAAOkoB,MAAM;QACjB,CAAC;QACDK,2BAA2B,WAA3BA,2BAA2BA,CAAA,EAAG;UAC1B,IAAMC,eAAe,GAAG,EAAE;UAE1BrjB,QAAQ,CAAC+Y,gBAAgB,CAAC,uBAAuB,CAAC,CAAC3X,OAAO,CAAC,UAAAkiB,IAAI,EAAI;YAC/D,IAAMC,eAAe,GAAGD,IAAI,CAAC7iB,aAAa,CAAC,2BAA2B,CAAC;YACvE,IAAM+iB,qBAAqB,GAAGF,IAAI,CAAC7iB,aAAa,CAAC,mCAAmC,CAAC;YACrF,IAAMgjB,UAAU,GAAGF,eAAe,GAAGA,eAAe,CAAC1oB,KAAK,GAAGyoB,IAAI,CAAC5K,YAAY,CAAC,kBAAkB,CAAC;YAElG,IAAI,CAAC+K,UAAU,EAAE;cACb;YACJ;YAEAJ,eAAe,CAACllB,IAAI,CAAC;cACjBslB,UAAU,EAAEA,UAAU;cACtBC,gBAAgB,EAAEF,qBAAqB,GAAG,CAACA,qBAAqB,CAAC3oB,KAAK,IAAI,EAAE,EAAE+E,IAAI,CAAC,CAAC,GAAG;YAC3F,CAAC,CAAC;UACN,CAAC,CAAC;UAEF,OAAOyjB,eAAe;QAC1B,CAAC;QACD1O,mBAAmB,WAAnBA,mBAAmBA,CAACD,YAAY,EAAE;UAC9B,IAAI,CAACA,YAAY,IAAI,CAACA,YAAY,CAAC9K,IAAI,EAAE;YACrC;UACJ;UACA,IAAI,CAAC+Z,wBAAwB,CAACjP,YAAY,CAAC9K,IAAI,CAAC;UAChD;UACA,IAAIN,GAAG,GAAG,IAAI,CAACsG,aAAa,CAACgU,SAAS,CAAC,UAAAxqB,CAAC;YAAA,OAAIA,CAAC,CAACwQ,IAAI,KAAK8K,YAAY,CAAC9K,IAAI;UAAA,EAAC;UACzE,IAAIN,GAAG,IAAI,CAAC,EAAE;YACV,IAAI,CAACsG,aAAa,CAACkD,MAAM,CAACxJ,GAAG,EAAE,CAAC,EAAEoL,YAAY,CAAC;UACnD,CAAC,MAAM;YACH,IAAI,CAAC9E,aAAa,CAACzR,IAAI,CAACuW,YAAY,CAAC;UACzC;UACA,IAAI,CAACmP,2BAA2B,CAACnP,YAAY,CAAC;UAC9C,IAAI,CAACrC,cAAc,CAAC,CAAC;QACzB,CAAC;QACDuC,kBAAkB,WAAlBA,kBAAkBA,CAACF,YAAY,EAAE;UAC7B,IAAI,CAACA,YAAY,IAAI,CAACA,YAAY,CAAC9K,IAAI,EAAE;YACrC;UACJ;UACA,IAAI,CAAC+Z,wBAAwB,CAACjP,YAAY,CAAC9K,IAAI,CAAC;UAChD,IAAIN,GAAG,GAAG,IAAI,CAACsG,aAAa,CAACgU,SAAS,CAAC,UAAAxqB,CAAC;YAAA,OAAIA,CAAC,CAACwQ,IAAI,KAAK8K,YAAY,CAAC9K,IAAI;UAAA,EAAC;UACzE,IAAIN,GAAG,IAAI,CAAC,EAAE;YACV,IAAI,CAACsG,aAAa,CAACkD,MAAM,CAACxJ,GAAG,EAAE,CAAC,EAAEoL,YAAY,CAAC;YAC/C,IAAI,CAACmP,2BAA2B,CAACnP,YAAY,CAAC;YAC9C,IAAI,CAACrC,cAAc,CAAC,CAAC;UACzB;QACJ,CAAC;QACDwR,2BAA2B,WAA3BA,2BAA2BA,CAACnP,YAAY,EAAE;UAAA,IAAAoP,OAAA;UACtC,IAAI,CAACpP,YAAY,IAAI,CAACA,YAAY,CAAC9K,IAAI,IAAI,CAAC8K,YAAY,CAACgL,aAAa,IAAIhL,YAAY,CAACgL,aAAa,IAAI,CAAC,EAAE;YACvG;UACJ;UACA,IAAI,CAAC7P,yBAAyB,CAAC6E,YAAY,CAAC9K,IAAI,CAAC,GAAGsW,UAAU,CAAC,YAAM;YACjE4D,OAAI,CAAChP,kBAAkB,CAACJ,YAAY,CAAC9K,IAAI,CAAC;UAC9C,CAAC,EAAE8K,YAAY,CAACgL,aAAa,CAAC;QAClC,CAAC;QACDiE,wBAAwB,WAAxBA,wBAAwBA,CAAC9O,gBAAgB,EAAE;UACvC,IAAIkP,OAAO,GAAG,IAAI,CAAClU,yBAAyB,CAACgF,gBAAgB,CAAC;UAC9D,IAAI,CAACkP,OAAO,EAAE;YACV;UACJ;UACAlD,YAAY,CAACkD,OAAO,CAAC;UACrB,OAAO,IAAI,CAAClU,yBAAyB,CAACgF,gBAAgB,CAAC;QAC3D,CAAC;QACDC,kBAAkB,WAAlBA,kBAAkBA,CAACD,gBAAgB,EAAE;UACjC,IAAI,CAAC8O,wBAAwB,CAAC9O,gBAAgB,CAAC;UAC/C,IAAI,CAACjF,aAAa,GAAG,IAAI,CAACA,aAAa,CAACtL,MAAM,CAAC,UAAAlL,CAAC;YAAA,OAAIA,CAAC,CAACwQ,IAAI,KAAKiL,gBAAgB;UAAA,EAAC;QACpF,CAAC;QACDmP,mBAAmB,WAAnBA,mBAAmBA,CAACnP,gBAAgB,EAAE;UAClC,IAAI,CAACC,kBAAkB,CAACD,gBAAgB,CAAC;QAC7C,CAAC;QACDoP,wBAAwB,WAAxBA,wBAAwBA,CAACpP,gBAAgB,EAAEqP,UAAU,EAAE;UACnD,IAAI,CAAC,IAAI,CAACvT,UAAU,EAAE;YAClB;UACJ;UACA,IAAIW,MAAM,GAAG,IAAI,CAAC+F,SAAS,CAAC,CAAC;UAC7B,IAAI,CAAC1G,UAAU,CAAC0J,MAAM,CAAC,0BAA0B,EAAE/I,MAAM,EAAEuD,gBAAgB,EAAEqP,UAAU,CAAC,SAC9E,CAAC,UAAAje,GAAG;YAAA,OAAIiF,OAAO,CAACe,KAAK,CAAC,uCAAuC,EAAEhG,GAAG,CAAC;UAAA,EAAC;QAClF,CAAC;QACDwR,SAAS,WAATA,SAASA,CAACnG,MAAM,EAAE;UACd,IAAI,CAAChE,YAAY,CAACuM,YAAY,CAAC,qBAAqB,EAAEvI,MAAM,IAAI,EAAE,CAAC;UACnE,IAAI,CAAChE,YAAY,CAACuM,YAAY,CAAC,cAAc,EAAEvI,MAAM,IAAI,EAAE,CAAC;QAChE,CAAC;QACD6S,gBAAgB,WAAhBA,gBAAgBA,CAAA,EAAG;UACf,IAAI,CAAC1M,SAAS,CAAC,EAAE,CAAC;UAClB,IAAI,CAAChK,oBAAoB,GAAG,KAAK;UACjC,IAAI,CAACM,QAAQ,GAAG,EAAE;UAClB,IAAI,CAACuG,eAAe,CAAC,CAAC;QAC1B,CAAC;QACD8P,aAAa,WAAbA,aAAaA,CAAA,EAAG;UAAA,IAAAC,OAAA;UACZ,IAAI,CAAC/W,YAAY,GAAGtN,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAAC+C,oBAAoB,CAAC;UACvE,IAAI,CAACM,aAAa,GAAGvN,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAACgD,yBAAyB,CAAC;UAC7E,IAAI,CAACM,aAAa,GAAGxN,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAAC8C,4BAA4B,CAAC;UAChF,IAAI,CAACrH,WAAW,GAAG3F,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAACoa,0BAA0B,CAAC;UAE5E,IAAMhT,MAAM,GAAG,IAAI,CAAC+F,SAAS,CAAC,CAAC;UAC/B,IAAI/F,MAAM,EAAE;YACR,IAAI,CAACiT,eAAe,CAACjT,MAAM,CAAC;UAChC;;UAEA;UACA,IAAI,CAAC9D,aAAa,CAACiO,gBAAgB,CAAC,QAAQ,EAAE,YAAM;YAChD,IAAI,CAAC4I,OAAI,CAACvW,MAAM,EAAE;cACd;YACJ;YACA,IAAM0W,SAAS,GAAG,EAAE;YACpB,IAAMC,QAAQ,GAAGJ,OAAI,CAAC7W,aAAa,CAAC4S,YAAY,GAAGiE,OAAI,CAAC7W,aAAa,CAAC6S,YAAY,GAAGgE,OAAI,CAAC7W,aAAa,CAAC2S,SAAS,IAAIqE,SAAS;YAC9HH,OAAI,CAACxW,UAAU,GAAG4W,QAAQ;UAC9B,CAAC,CAAC;UAEF,IAAI,CAACnX,YAAY,CAACmO,gBAAgB,CAAC,OAAO,EAAE,UAAA7F,KAAK,EAAI;YACjD,IAAIyO,OAAI,CAACvW,MAAM,IAAI,IAAI,EAAE;cACrB;YACJ;YAEA,IAAI8H,KAAK,CAAC/R,GAAG,KAAK,OAAO,IAAI,CAAC+R,KAAK,CAAC8O,QAAQ,EAAE;cAC1CL,OAAI,CAAC9W,aAAa,CAACoX,KAAK,CAAC,CAAC;YAC9B;UACJ,CAAC,CAAC;UAEF,IAAI,CAACrX,YAAY,CAACmO,gBAAgB,CAAC,OAAO,EAAE,UAACziB,CAAC,EAAK;YAC/CqrB,OAAI,CAAC/D,eAAe,CAACtnB,CAAC,CAAC;YAEvB,IAAIA,CAAC,CAACunB,MAAM,CAAC1lB,KAAK,CAAC+E,IAAI,CAAC,CAAC,EAAE;cACvBykB,OAAI,CAAC9W,aAAa,CAACoU,eAAe,CAAC,UAAU,CAAC;YAClD,CAAC,MAAM;cACH0C,OAAI,CAAC9W,aAAa,CAACsM,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;YACrD;UACJ,CAAC,CAAC;UAEF,IAAI,CAACvM,YAAY,CAACmO,gBAAgB,CAAC,OAAO,EAAE,UAACziB,CAAC,EAAK;YAC/C;YACAknB,UAAU,CAAC,YAAM;cACbmE,OAAI,CAACrW,MAAM,GAAGqW,OAAI,CAAC/W,YAAY,CAACzS,KAAK;cACrC,IAAIwpB,OAAI,CAAC/W,YAAY,CAACzS,KAAK,CAAC+E,IAAI,CAAC,CAAC,EAAE;gBAChCykB,OAAI,CAAC9W,aAAa,CAACoU,eAAe,CAAC,UAAU,CAAC;cAClD,CAAC,MAAM;gBACH0C,OAAI,CAAC9W,aAAa,CAACsM,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;cACrD;YACJ,CAAC,EAAE,CAAC,CAAC;UACT,CAAC,CAAC;UAEF,IAAI,CAACtM,aAAa,CAACkO,gBAAgB,CAAC,OAAO,EAAE,YAAM;YAC/C,IAAI4I,OAAI,CAACvW,MAAM,IAAI,IAAI,EAAE;cACrBuW,OAAI,CAACvW,MAAM,CAACiJ,OAAO,CAAC,CAAC;cACrBsN,OAAI,CAACvW,MAAM,GAAG,IAAI;cAElBuW,OAAI,CAACnM,iBAAiB,CAAC,CAAC;cACxBmM,OAAI,CAAC9Q,mBAAmB,CAAC,CAAC;;cAE1B;cACA,IAAI8Q,OAAI,CAACtW,QAAQ,CAACvT,MAAM,GAAG,CAAC,EAAE;gBAC1B,IAAMoqB,OAAO,GAAGP,OAAI,CAACtW,QAAQ,CAACsW,OAAI,CAACtW,QAAQ,CAACvT,MAAM,GAAG,CAAC,CAAC;gBACvD,IAAIoqB,OAAO,CAACzU,IAAI,KAAK,WAAW,IAAI,CAACyU,OAAO,CAAC5gB,OAAO,EAAE;kBAClDqgB,OAAI,CAACtW,QAAQ,CAAC8W,GAAG,CAAC,CAAC;gBACvB,CAAC,MAAM,IAAID,OAAO,CAACjX,WAAW,EAAE;kBAC5BiX,OAAO,CAACjX,WAAW,GAAG,KAAK;gBAC/B;cACJ;cAEA;YACJ;YAEA0W,OAAI,CAAC9N,WAAW,CAAC,CAAC;UACtB,CAAC,CAAC;UAEF,IAAMuO,oBAAoB,GAAG9kB,QAAQ,CAAC+kB,sBAAsB,CAAC,+BAA+B,CAAC;UAE7F,KAAK,IAAIvrB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGsrB,oBAAoB,CAACtqB,MAAM,EAAEhB,CAAC,EAAE,EAAE;YAClDsrB,oBAAoB,CAACtrB,CAAC,CAAC,CAACiiB,gBAAgB,CAAC,OAAO,EAAE,UAACziB,CAAC,EAAK;cACrDA,CAAC,CAACgsB,cAAc,CAAC,CAAC;cAElB,IAAI1T,MAAM,GAAGtY,CAAC,CAACunB,MAAM,CAAC7H,YAAY,CAAC,qBAAqB,CAAC;cAEzD,IAAI,CAACpH,MAAM,EAAE;gBACTpG,OAAO,CAACe,KAAK,CAAC,0FAA0F,CAAC;gBACzG;cACJ;cAEAoY,OAAI,CAACE,eAAe,CAACjT,MAAM,CAAC;YAChC,CAAC,CAAC;UACN;UAEA,IAAM2T,eAAe,GAAGtoB,KAAK,CAACE,OAAO,CAACqN,MAAM,CAAC6D,QAAQ,CAAC,GAAG7D,MAAM,CAAC6D,QAAQ,GAAG,EAAE;UAE7E,KAAK,IAAIvU,GAAC,GAAG,CAAC,EAAEA,GAAC,GAAGyrB,eAAe,CAACzqB,MAAM,EAAEhB,GAAC,EAAE,EAAE;YAC7C,IAAI,CAACiY,UAAU,CAACwT,eAAe,CAACzrB,GAAC,CAAC,CAAC;UACvC;;UAEA;UACA,IAAI,IAAI,CAACgU,aAAa,EAAE;YACpB,IAAI,CAACA,aAAa,CAACiO,gBAAgB,CAAC,OAAO,EAAE,UAACziB,CAAC,EAAK;cAChD,IAAIksB,GAAG,GAAGlsB,CAAC,CAACunB,MAAM,CAACW,OAAO,CAAC,mBAAmB,CAAC;cAC/C,IAAI,CAACgE,GAAG,EAAE;gBACN;cACJ;cAEA,IAAIC,KAAK,GAAGD,GAAG,CAAChE,OAAO,CAAC,gBAAgB,CAAC,IAAIgE,GAAG,CAAChE,OAAO,CAAC,KAAK,CAAC;cAC/D,IAAI,CAACiE,KAAK,EAAE;gBACR;cACJ;cAEA,IAAIC,MAAM,GAAGD,KAAK,CAAC1kB,aAAa,CAAC,MAAM,CAAC;cACxC,IAAI2kB,MAAM,EAAE;gBACR3I,SAAS,CAAC4I,SAAS,CAACC,SAAS,CAACF,MAAM,CAACllB,WAAW,CAAC;gBACjD,IAAIqlB,UAAU,GAAGrb,MAAM,CAACrL,cAAc,IAAI,SAAS;gBACnDqmB,GAAG,CAAC/kB,SAAS,GAAG,oCAAoC,GAAGolB,UAAU;gBACjErF,UAAU,CAAC,YAAM;kBACbgF,GAAG,CAAC/kB,SAAS,GAAG,oCAAoC;gBACxD,CAAC,EAAE,IAAI,CAAC;cACZ;YACJ,CAAC,CAAC;UACN;UAEAH,QAAQ,CAACyb,gBAAgB,CAAC,OAAO,EAAE,UAAA7F,KAAK,EAAI;YACxC,IAAIA,KAAK,CAAC2K,MAAM,CAAC/f,OAAO,CAAC,8BAA8B,CAAC,EAAE;cACtD6jB,OAAI,CAACjC,oBAAoB,CAACxM,KAAK,CAAC2K,MAAM,CAAC;cACvC8D,OAAI,CAAC5B,iBAAiB,CAAC,CAAC;YAC5B;UACJ,CAAC,CAAC;UAEFziB,QAAQ,CAACyb,gBAAgB,CAAC,QAAQ,EAAE,UAAA7F,KAAK,EAAI;YACzC,IAAIA,KAAK,CAAC2K,MAAM,CAAC/f,OAAO,CAAC,+IAA+I,CAAC,EAAE;cACvK,IAAIoV,KAAK,CAAC2K,MAAM,CAAC/f,OAAO,CAAC,8BAA8B,CAAC,EAAE;gBACtD6jB,OAAI,CAACjC,oBAAoB,CAACxM,KAAK,CAAC2K,MAAM,CAAC;cAC3C;cAEA8D,OAAI,CAAC5B,iBAAiB,CAAC,CAAC;cACxB;YACJ;YAEA,IAAI7M,KAAK,CAAC2K,MAAM,CAACW,OAAO,CAAC,8DAA8D,CAAC,EAAE;cACtFmD,OAAI,CAAC5B,iBAAiB,CAAC,CAAC;YAC5B;UACJ,CAAC,CAAC;UAEFziB,QAAQ,CAACyb,gBAAgB,CAAC,OAAO,EAAE,UAAA7F,KAAK,EAAI;YACxC,IAAI,CAACA,KAAK,CAAC2K,MAAM,CAACW,OAAO,CAAC,uDAAuD,CAAC,EAAE;cAChF;YACJ;YAEAhB,UAAU,CAAC,YAAM;cACbmE,OAAI,CAAC5B,iBAAiB,CAAC,CAAC;YAC5B,CAAC,EAAE,CAAC,CAAC;UACT,CAAC,CAAC;;UAEF;UACA,IAAMlO,eAAe,GAAGvU,QAAQ,CAACgL,cAAc,CAAC,iBAAiB,CAAC;UAClE,IAAIuJ,eAAe,EAAE;YACjBA,eAAe,CAACkH,gBAAgB,CAAC,OAAO,EAAE,YAAM;cAC5C,IAAMnK,MAAM,GAAGiD,eAAe,CAACmE,YAAY,CAAC,qBAAqB,CAAC;cAClE,IAAIpH,MAAM,EAAE;gBACR+S,OAAI,CAACmB,YAAY,CAAClU,MAAM,CAAC;cAC7B;YACJ,CAAC,CAAC;UACN;;UAEA;UACA,IAAI,IAAI,CAAC5C,mBAAmB,IAAIxE,MAAM,CAACub,wBAAwB,EAAE;YAC7D,IAAI,CAAChX,SAAS,GAAGzO,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAACub,wBAAwB,CAAC;YACxE,IAAI,IAAI,CAAChX,SAAS,EAAE;cAChB,IAAI,CAACA,SAAS,CAACiX,KAAK,CAACC,OAAO,GAAG,EAAE;cACjC,IAAI,CAAClX,SAAS,CAACgN,gBAAgB,CAAC,OAAO,EAAE,YAAM;gBAC3C4I,OAAI,CAACuB,eAAe,CAAC,CAAC;cAC1B,CAAC,CAAC;YACN;UACJ;;UAEA;UACA,IAAI,IAAI,CAACpW,uBAAuB,IAAItF,MAAM,CAAC2b,iCAAiC,EAAE;YAC1E,IAAI,CAACpW,kBAAkB,GAAGzP,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAAC2b,iCAAiC,CAAC;YAC1F,IAAI,IAAI,CAACpW,kBAAkB,EAAE;cACzB,IAAI,CAACA,kBAAkB,CAACgM,gBAAgB,CAAC,OAAO,EAAE,YAAM;gBACpD4I,OAAI,CAACjI,sBAAsB,CAAC,CAAC;cACjC,CAAC,CAAC;YACN;UACJ;;UAEA;UACA;UACA;UACA,IAAI/d,MAAM,CAACynB,cAAc,IAAI5b,MAAM,CAAC6b,6BAA6B,EAAE;YAC/D,IAAI,CAACpW,kBAAkB,GAAGtR,MAAM,CAACynB,cAAc,CAACE,MAAM,CAAC;cACnDrV,UAAU,EAAE,IAAI,CAACA,UAAU;cAC3BsV,eAAe,EAAE,SAAjBA,eAAeA,CAAA;gBAAA,OAAQnqB,OAAO,CAACC,OAAO,CAACsoB,OAAI,CAAC1T,UAAU,CAAC;cAAA;cACvDuV,SAAS,EAAE,SAAXA,SAASA,CAAGC,OAAO,EAAEC,KAAK,EAAE/d,QAAQ,EAAEge,SAAS,EAAEC,YAAY,EAAEC,iBAAiB,EAAK;gBACjFlC,OAAI,CAAC1T,UAAU,CAAC4O,IAAI,CAAC,2BAA2B,EAAE8E,OAAI,CAAChN,SAAS,CAAC,CAAC,EAAE8O,OAAO,EAAEC,KAAK,EAAE/d,QAAQ,EAAEge,SAAS,EAAEC,YAAY,EAAEC,iBAAiB,CAAC;cAC7I,CAAC;cACD;cACA;cACAC,aAAa,EAAEtc,MAAM,CAACuc,qBAAqB,KAAK,IAAI;cACpDC,eAAe,EAAE,SAAjBA,eAAeA,CAAGC,QAAQ,EAAEP,KAAK,EAAE/d,QAAQ,EAAEge,SAAS,EAAEC,YAAY,EAAEC,iBAAiB,EAAK;gBACxFlC,OAAI,CAAC1T,UAAU,CAAC4O,IAAI,CAAC,qBAAqB,EAAE8E,OAAI,CAAChN,SAAS,CAAC,CAAC,EAAEsP,QAAQ,EAAEP,KAAK,EAAE/d,QAAQ,EAAEge,SAAS,EAAEC,YAAY,EAAEC,iBAAiB,CAAC;cACxI,CAAC;cACDK,gBAAgB,EAAEjqB,KAAK,CAACE,OAAO,CAACqN,MAAM,CAAC2c,wBAAwB,CAAC,GAAG3c,MAAM,CAAC2c,wBAAwB,GAAGtd,SAAS;cAC9Gud,SAAS,EAAE5c,MAAM,CAAC6c,iBAAiB,IAAI,EAAE;cACzCC,YAAY,EAAE,SAAdA,YAAYA,CAAA,EAAQ;gBAChB,IAAIC,EAAE,GAAG/c,MAAM,CAACgd,kCAAkC,GAAGlnB,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAACgd,kCAAkC,CAAC,GAAG,IAAI;gBAC7H,OAAOD,EAAE,GAAGA,EAAE,CAACpsB,KAAK,GAAG,EAAE;cAC7B,CAAC;cACDssB,kBAAkB,EAAEjd,MAAM,CAACkd,0BAA0B,IAAI,EAAE;cAC3DC,eAAe,EAAEnd,MAAM,CAACmd,eAAe,KAAK,IAAI;cAChDC,SAAS,EAAE;gBACPC,cAAc,EAAErd,MAAM,CAAC6b,6BAA6B;gBACpD/E,KAAK,EAAE9W,MAAM,CAAC+C,oBAAoB;gBAClCua,UAAU,EAAEtd,MAAM,CAACgD,yBAAyB;gBAC5CuB,SAAS,EAAEvE,MAAM,CAACub,wBAAwB;gBAC1ChW,kBAAkB,EAAEvF,MAAM,CAAC2b,iCAAiC;gBAC5D4B,gBAAgB,EAAEvd,MAAM,CAACwd;cAC7B,CAAC;cACDC,UAAU,EAAE,SAAZA,UAAUA,CAAA,EAAQ;gBACdtD,OAAI,CAAC3U,kBAAkB,GAAG,IAAI;gBAC9B2U,OAAI,CAACnS,2BAA2B,GAAG,IAAI;gBACvCmS,OAAI,CAACtR,6BAA6B,GAAG,IAAI;cAC7C,CAAC;cACD6U,YAAY,EAAE,SAAdA,YAAYA,CAAA,EAAQ;gBAChBvD,OAAI,CAAC3U,kBAAkB,GAAG,KAAK;gBAC/B,IAAI2U,OAAI,CAACtR,6BAA6B,EAAE;kBACpC,IAAIzX,CAAC,GAAG+oB,OAAI,CAACtW,QAAQ,CAACsW,OAAI,CAACtR,6BAA6B,CAACtQ,KAAK,CAAC;kBAC/D,IAAInH,CAAC,EAAE;oBAAEA,CAAC,CAACqS,WAAW,GAAG,KAAK;kBAAE;kBAChC0W,OAAI,CAACtR,6BAA6B,GAAG,IAAI;gBAC7C;cACJ,CAAC;cACD8U,mBAAmB,EAAE,SAArBA,mBAAmBA,CAAA,EAAQ;gBACvB,IAAIxD,OAAI,CAAC/V,WAAW,EAAE;kBAAE+V,OAAI,CAACxS,aAAa,CAAC,CAAC;gBAAE;gBAC9C,IAAIwS,OAAI,CAAC3U,kBAAkB,KAAK,CAAC2U,OAAI,CAAC1U,kBAAkB,IAAI,CAAC0U,OAAI,CAAC1U,kBAAkB,CAACmY,QAAQ,CAAC,CAAC,CAAC,EAAE;kBAAEzD,OAAI,CAAChI,oBAAoB,CAAC,CAAC;gBAAE;cACrI,CAAC;cACD;cACA;cACA;cACA0L,iBAAiB,EAAE,SAAnBA,iBAAiBA,CAAGtV,MAAM,EAAK;gBAC3B,IAAI,CAACA,MAAM,EAAE;kBAAE;gBAAQ;gBACvB,IAAI9M,WAAW,GAAG;kBAAEwK,IAAI,EAAE,MAAM;kBAAEnM,OAAO,EAAE,EAAE;kBAAEoD,UAAU,EAAE,EAAE;kBAAE7D,UAAU,EAAE,CAAC,CAAC;kBAAE6O,SAAS,EAAE;gBAAK,CAAC;gBAChGlL,yBAAyB,CAACvB,WAAW,EAAEA,WAAW,CAACpC,UAAU,CAAC;gBAC9D8gB,OAAI,CAAC3R,qBAAqB,GAAG2R,OAAI,CAAC3R,qBAAqB,IAAI,CAAC,CAAC;gBAC7D2R,OAAI,CAAC3R,qBAAqB,CAACD,MAAM,CAAC,GAAG9M,WAAW;gBAChD0e,OAAI,CAACtW,QAAQ,CAAC5P,IAAI,CAACwH,WAAW,CAAC;gBAC/B0e,OAAI,CAAChS,cAAc,CAAC,CAAC;cACzB,CAAC;cACD2V,iBAAiB,EAAE,SAAnBA,iBAAiBA,CAAGvV,MAAM,EAAK;gBAC3B,IAAI,CAACA,MAAM,IAAI,CAAC4R,OAAI,CAAC3R,qBAAqB,EAAE;kBAAE;gBAAQ;gBACtD,IAAIuV,OAAO,GAAG5D,OAAI,CAAC3R,qBAAqB,CAACD,MAAM,CAAC;gBAChD,IAAI,CAACwV,OAAO,EAAE;kBAAE;gBAAQ;gBACxB,OAAO5D,OAAI,CAAC3R,qBAAqB,CAACD,MAAM,CAAC;gBACzC,IAAIO,EAAE,GAAGqR,OAAI,CAACtW,QAAQ,CAAC7Q,OAAO,CAAC+qB,OAAO,CAAC;gBACvC,IAAIjV,EAAE,IAAI,CAAC,EAAE;kBAAEqR,OAAI,CAACtW,QAAQ,CAAC+E,MAAM,CAACE,EAAE,EAAE,CAAC,CAAC;gBAAE;cAChD;YACJ,CAAC,CAAC;YAEF,IAAI,CAACkV,wBAAwB,CAAChe,MAAM,CAAC;UACzC;QACJ,CAAC;QACD;QACA;QACAge,wBAAwB,WAAxBA,wBAAwBA,CAAChe,MAAM,EAAE;UAC7B,IAAI,CAACA,MAAM,CAACgd,kCAAkC,IAAI,CAAChd,MAAM,CAACie,iBAAiB,EAAE;YACzE;UACJ;UAEA,IAAIC,WAAW,GAAGpoB,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAACgd,kCAAkC,CAAC;UACnF,IAAI,CAACkB,WAAW,EAAE;YACd;UACJ;UAEA,IAAIC,UAAU,GAAGne,MAAM,CAACoe,iCAAiC,GAAGtoB,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAACoe,iCAAiC,CAAC,GAAG,IAAI;UACnI,IAAIb,gBAAgB,GAAGvd,MAAM,CAACwd,+BAA+B,GAAG1nB,QAAQ,CAACS,aAAa,CAACyJ,MAAM,CAACwd,+BAA+B,CAAC,GAAG,IAAI;UACrI,IAAIa,OAAO,GAAG,CAACre,MAAM,CAACkd,0BAA0B,IAAI,EAAE,EAAE5gB,GAAG,CAAC,UAAUpN,CAAC,EAAE;YAAE,OAAO,CAACA,CAAC,IAAI,EAAE,EAAEiK,WAAW,CAAC,CAAC;UAAE,CAAC,CAAC;UAC7G,IAAImlB,YAAY,GAAGte,MAAM,CAAC6c,iBAAiB,IAAI,EAAE;UAEjD,SAAS0B,oBAAoBA,CAACxqB,IAAI,EAAE;YAChC,OAAOA,IAAI,IAAIsqB,OAAO,CAACrrB,OAAO,CAACe,IAAI,CAACoF,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;UAC7D;UAAC,SAEcqlB,UAAUA,CAAA;YAAA,OAAAC,WAAA,CAAAxsB,KAAA,OAAAD,SAAA;UAAA;UAAA,SAAAysB,YAAA;YAAAA,WAAA,GAAA1sB,iBAAA,cAAAb,YAAA,GAAAE,CAAA,CAAzB,SAAAstB,SAAA;cAAA,IAAAC,cAAA,EAAAC,QAAA,EAAAC,QAAA,EAAAC,MAAA,EAAAC,OAAA,EAAAC,UAAA,EAAAC,MAAA,EAAA/C,KAAA,EAAAxD,SAAA,EAAAwG,GAAA;cAAA,OAAAhuB,YAAA,GAAAC,CAAA,WAAAguB,SAAA;gBAAA,kBAAAA,SAAA,CAAApvB,CAAA,GAAAovB,SAAA,CAAAjwB,CAAA;kBAAA;oBACQyvB,cAAc,GAAGpB,gBAAgB,GAAGA,gBAAgB,CAAC5sB,KAAK,GAAG,EAAE;oBAC/DiuB,QAAQ,GAAGL,oBAAoB,CAACI,cAAc,CAAC;oBACnD,IAAIR,UAAU,EAAE;sBACZA,UAAU,CAAC7T,SAAS,CAACoF,MAAM,CAAC,QAAQ,EAAE,CAACkP,QAAQ,CAAC;oBACpD;oBAAC,IACIA,QAAQ;sBAAAO,SAAA,CAAAjwB,CAAA;sBAAA;oBAAA;oBAAA,OAAAiwB,SAAA,CAAAhvB,CAAA;kBAAA;oBAIb+tB,WAAW,CAACjoB,SAAS,GAAG,yCAAyC;oBAACkpB,SAAA,CAAApvB,CAAA;oBAAAovB,SAAA,CAAAjwB,CAAA;oBAAA,OAGvCkwB,KAAK,CAACpf,MAAM,CAACie,iBAAiB,GAAG,kBAAkB,GAAGoB,kBAAkB,CAACV,cAAc,CAAC,EAAE;sBAAEW,WAAW,EAAE;oBAAc,CAAC,CAAC;kBAAA;oBAA1IT,QAAQ,GAAAM,SAAA,CAAAjvB,CAAA;oBAAAivB,SAAA,CAAAjwB,CAAA;oBAAA,OACO2vB,QAAQ,CAAC/e,IAAI,CAAC,CAAC;kBAAA;oBAA9Bgf,MAAM,GAAAK,SAAA,CAAAjvB,CAAA;oBAAA,MACR,CAAC4uB,MAAM,IAAI,CAACrsB,KAAK,CAACE,OAAO,CAACmsB,MAAM,CAACS,MAAM,CAAC;sBAAAJ,SAAA,CAAAjwB,CAAA;sBAAA;oBAAA;oBAAA,OAAAiwB,SAAA,CAAAhvB,CAAA;kBAAA;oBAItC4uB,OAAO,GAAG,IAAI/a,GAAG,CAAC,CAAC;oBAAAgb,UAAA,GAAA7rB,0BAAA,CACL2rB,MAAM,CAACS,MAAM;oBAAA;sBAAjC,KAAAP,UAAA,CAAA1rB,CAAA,MAAA2rB,MAAA,GAAAD,UAAA,CAAA9vB,CAAA,IAAAwB,IAAA,GAAmC;wBAAxBwrB,KAAK,GAAA+C,MAAA,CAAAtuB,KAAA;wBACN+nB,SAAS,GAAGwD,KAAK,CAACsD,MAAM,IAAI,QAAQ;wBAC1C,IAAI,CAACT,OAAO,CAACU,GAAG,CAAC/G,SAAS,CAAC,EAAE;0BACzBqG,OAAO,CAAChO,GAAG,CAAC2H,SAAS,EAAE,EAAE,CAAC;wBAC9B;wBACAqG,OAAO,CAACW,GAAG,CAAChH,SAAS,CAAC,CAACzkB,IAAI,CAACioB,KAAK,CAAC;sBACtC;oBAAC,SAAAngB,GAAA;sBAAAijB,UAAA,CAAAlwB,CAAA,CAAAiN,GAAA;oBAAA;sBAAAijB,UAAA,CAAAlvB,CAAA;oBAAA;oBAED2C,KAAK,CAACC,IAAI,CAACqsB,OAAO,CAACvR,IAAI,CAAC,CAAC,CAAC,CAAC7S,IAAI,CAAC,UAACxK,CAAC,EAAE6K,CAAC;sBAAA,OAAK7K,CAAC,CAACwvB,aAAa,CAAC3kB,CAAC,CAAC;oBAAA,EAAC,CAAC9D,OAAO,CAAC,UAAUwhB,SAAS,EAAE;sBACvF,IAAMkH,QAAQ,GAAG9pB,QAAQ,CAACC,aAAa,CAAC,UAAU,CAAC;sBACnD6pB,QAAQ,CAAC/jB,KAAK,GAAG6c,SAAS;sBAC1BqG,OAAO,CAACW,GAAG,CAAChH,SAAS,CAAC,CAACxhB,OAAO,CAAC,UAAUglB,KAAK,EAAE;wBAC5C,IAAM2D,MAAM,GAAG/pB,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC;wBAC/C8pB,MAAM,CAAClvB,KAAK,GAAGurB,KAAK,CAACzS,EAAE;wBACvBoW,MAAM,CAAC7pB,WAAW,GAAGkmB,KAAK,CAACnoB,IAAI;wBAC/B8rB,MAAM,CAACC,QAAQ,GAAG5D,KAAK,CAACzS,EAAE,KAAK6U,YAAY;wBAC3CsB,QAAQ,CAACG,WAAW,CAACF,MAAM,CAAC;sBAChC,CAAC,CAAC;sBACF3B,WAAW,CAAC6B,WAAW,CAACH,QAAQ,CAAC;oBACrC,CAAC,CAAC;oBAACT,SAAA,CAAAjwB,CAAA;oBAAA;kBAAA;oBAAAiwB,SAAA,CAAApvB,CAAA;oBAAAmvB,GAAA,GAAAC,SAAA,CAAAjvB,CAAA;kBAAA;oBAAA,OAAAivB,SAAA,CAAAhvB,CAAA;gBAAA;cAAA,GAAAuuB,QAAA;YAAA,CAIV;YAAA,OAAAD,WAAA,CAAAxsB,KAAA,OAAAD,SAAA;UAAA;UAED,IAAIurB,gBAAgB,EAAE;YAClBA,gBAAgB,CAAChM,gBAAgB,CAAC,QAAQ,EAAEiN,UAAU,CAAC;UAC3D;UACAA,UAAU,CAAC,CAAC;QAChB,CAAC;QACDnE,eAAe,WAAfA,eAAeA,CAACjT,MAAM,EAAE;UACpB,IAAI,CAACX,UAAU,CAAC0J,MAAM,CAAC,iBAAiB,EAAE/I,MAAM,CAAC,SAAM,CAAC,UAAArL,GAAG;YAAA,OAAIiF,OAAO,CAACe,KAAK,CAAChG,GAAG,CAAC;UAAA,EAAC;QACtF,CAAC;QACDiP,wBAAwB,WAAxBA,wBAAwBA,CAAA,EAAG;UACvB,IAAM5D,MAAM,GAAG,IAAI,CAAC+F,SAAS,CAAC,CAAC;UAC/B,IAAI/F,MAAM,EAAE;YACR,IAAI,CAACiT,eAAe,CAACjT,MAAM,CAAC;UAChC;QACJ,CAAC;QACDkU,YAAY,WAAZA,YAAYA,CAAClU,MAAM,EAAE;UACjB,IAAM4Y,IAAI,GAAG,IAAI;UACjB,IAAMC,qBAAqB,GAAG,SAAxBA,qBAAqBA,CAAA,EAAS;YAChC;YACA,IAAID,IAAI,CAACva,kBAAkB,IAAIua,IAAI,CAACva,kBAAkB,CAACmY,QAAQ,CAAC,CAAC,EAAE;cAC/DoC,IAAI,CAACva,kBAAkB,CAAC0P,IAAI,CAAC,CAAC;YAClC;;YAEA;YACA,IAAI6K,IAAI,CAACpc,MAAM,EAAE;cACboc,IAAI,CAACpc,MAAM,CAACiJ,OAAO,CAAC,CAAC;cACrBmT,IAAI,CAACpc,MAAM,GAAG,IAAI;cAClBoc,IAAI,CAAC3W,mBAAmB,CAAC,CAAC;cAC1B2W,IAAI,CAAChS,iBAAiB,CAAC,CAAC;YAC5B;YAEAgS,IAAI,CAACvZ,UAAU,CAAC0J,MAAM,CAAC,cAAc,EAAE/I,MAAM,CAAC,SACpC,CAAC,UAAArL,GAAG;cAAA,OAAIiF,OAAO,CAACe,KAAK,CAAC,yBAAyB,EAAEhG,GAAG,CAAC;YAAA,EAAC;UACpE,CAAC;UAED,IAAI,OAAOmkB,aAAa,KAAK,UAAU,EAAE;YACrCA,aAAa,CAAC;cACVxnB,KAAK,EAAEsH,MAAM,CAAC7K,iBAAiB;cAC/B8H,OAAO,EAAE+C,MAAM,CAAC5K,mBAAmB;cACnC+qB,MAAM,EAAEngB,MAAM,CAAC3K,kBAAkB;cACjC+qB,UAAU,EAAEpgB,MAAM,CAAC1K,sBAAsB;cACzC+qB,QAAQ,EAAE,SAAVA,QAAQA,CAAYC,SAAS,EAAE;gBAC3B,IAAIA,SAAS,EAAE;kBACXL,qBAAqB,CAAC,CAAC;gBAC3B;cACJ;YACJ,CAAC,CAAC;YAEF;UACJ;UAEA,IAAI9rB,MAAM,CAACosB,OAAO,CAACvgB,MAAM,CAAC5K,mBAAmB,IAAI,qBAAqB,CAAC,EAAE;YACrE6qB,qBAAqB,CAAC,CAAC;UAC3B;QACJ,CAAC;QACDnR,qBAAqB,WAArBA,qBAAqBA,CAAA,EAAG;UAAA,IAAA0R,OAAA;UACpB;UACA,IAAI,CAAC5J,wBAAwB,CAAC,CAAC;;UAE/B;UACA,IAAI,IAAI,CAAChT,MAAM,EAAE;YACb;UACJ;;UAEA;UACA,IAAI,CAACM,mBAAmB,GAAG8R,UAAU,CAAC,YAAM;YACxC,IAAIwK,OAAI,CAACvc,aAAa,EAAE;cACpBuc,OAAI,CAACC,YAAY,CAAC,CAAC;cACnBD,OAAI,CAACvc,aAAa,GAAG,KAAK;YAC9B;YACAuc,OAAI,CAACtc,mBAAmB,GAAG,IAAI;UACnC,CAAC,EAAE,GAAG,CAAC;QACX,CAAC;QACDwc,oBAAoB,WAApBA,oBAAoBA,CAAA,EAAG;UACnB,OAAO,IAAI,CAACjI,sBAAsB,CAC9B,WAAW,EACX,sFACJ,CAAC;QACL,CAAC;QACDkI,2BAA2B,WAA3BA,2BAA2BA,CAAA,EAAG;UAC1B,OAAO,IAAI,CAAClI,sBAAsB,CAC9B,kBAAkB,EAClB,4FACJ,CAAC;QACL,CAAC;QACDmI,2BAA2B,WAA3BA,2BAA2BA,CAAA,EAAG;UAC1B,OAAO,IAAI,CAACnI,sBAAsB,CAAC,kBAAkB,CAAC;QAC1D,CAAC;QACDoI,qBAAqB,WAArBA,qBAAqBA,CAAA,EAAG;UACpB,OAAO,IAAI,CAACpI,sBAAsB,CAC9B,YAAY,EACZ,uFACJ,CAAC;QACL,CAAC;QACDgI,YAAY,WAAZA,YAAYA,CAAA,EAAG;UAAA,IAAAK,OAAA;UACX,IAAM1Z,MAAM,GAAG,IAAI,CAAC+F,SAAS,CAAC,CAAC;UAC/B,IAAI,CAAC/F,MAAM,EAAE;YACT,OAAOxV,OAAO,CAACC,OAAO,CAAC,CAAC;UAC5B;UAEA,IAAI,CAAC,IAAI,CAACsmB,gBAAgB,CAAC,CAAC,EAAE;YAC1B,IAAI,CAACzQ,iBAAiB,CAAC,YAAY,EAAE,aAAa,CAAC;YACnD,OAAO9V,OAAO,CAACC,OAAO,CAAC,CAAC;UAC5B;UAEA,IAAMkvB,QAAQ,GAAG,CAAC,CAAC;;UAEnB;UACA;UACA;UACA,IAAMC,MAAM,GAAG,IAAI,CAAC1I,gBAAgB,CAAC,CAAC;UAEtC0I,MAAM,CAAC9pB,OAAO,CAAC,UAAA4f,KAAK,EAAI;YACpB,IAAMnd,GAAG,GAAGmd,KAAK,CAACG,OAAO,CAACC,OAAO,IACzB,CAACJ,KAAK,CAAC/iB,IAAI,IAAI,EAAE,EAAEgU,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,QAAQ,EAAE,UAAAkZ,KAAK;cAAA,OAAIA,KAAK,CAAC9nB,WAAW,CAAC,CAAC;YAAA,EAAE;YAE3G,IAAI,CAACQ,GAAG,EAAE;cACN;YACJ;YAEA,IAAImd,KAAK,CAACpX,IAAI,KAAK,UAAU,EAAE;cAC3BqhB,QAAQ,CAACpnB,GAAG,CAAC,GAAGmd,KAAK,CAACoK,OAAO;YACjC,CAAC,MAAM,IAAIpK,KAAK,CAACpX,IAAI,KAAK,QAAQ,EAAE;cAChCqhB,QAAQ,CAACpnB,GAAG,CAAC,GAAGmd,KAAK,CAACnmB,KAAK,GAAGwwB,UAAU,CAACrK,KAAK,CAACnmB,KAAK,CAAC,GAAG,IAAI;YAChE,CAAC,MAAM;cACHowB,QAAQ,CAACpnB,GAAG,CAAC,GAAGmd,KAAK,CAACnmB,KAAK,IAAI,IAAI;YACvC;UACJ,CAAC,CAAC;;UAEF;UACAowB,QAAQ,CAACK,SAAS,GAAG,IAAI,CAACV,oBAAoB,CAAC,CAAC;UAChDK,QAAQ,CAACM,gBAAgB,GAAG,IAAI,CAACV,2BAA2B,CAAC,CAAC;UAC9DI,QAAQ,CAACO,gBAAgB,GAAG,IAAI,CAACV,2BAA2B,CAAC,CAAC;UAC9DG,QAAQ,CAACQ,UAAU,GAAG,IAAI,CAACV,qBAAqB,CAAC,CAAC;UAElD,IAAM1H,eAAe,GAAG,IAAI,CAACD,2BAA2B,CAAC,CAAC;UAC1D,IAAIC,eAAe,CAAC7oB,MAAM,GAAG,CAAC,EAAE;YAC5BywB,QAAQ,CAAC5H,eAAe,GAAGA,eAAe;YAC1C4H,QAAQ,CAACS,iBAAiB,GAAGrI,eAAe,CAAC7c,GAAG,CAAC,UAAAmlB,QAAQ;cAAA,OAAIA,QAAQ,CAAClI,UAAU;YAAA,EAAC;UACrF;UAEA,OAAO,IAAI,CAAC9S,UAAU,CAAC0J,MAAM,CAAC,cAAc,EAAE/I,MAAM,EAAE2Z,QAAQ,CAAC,SACrD,CAAC,UAAAhlB,GAAG,EAAI;YACViF,OAAO,CAACe,KAAK,CAAC,wBAAwB,EAAEhG,GAAG,CAAC;YAC5C+kB,OAAI,CAACpZ,iBAAiB,CAAC,aAAa,EAAE,aAAa,CAAC;UACxD,CAAC,CAAC;QACV,CAAC;QACDgF,gBAAgB,WAAhBA,gBAAgBA,CAAA,EAAG;UACf,IAAI,IAAI,CAACxI,mBAAmB,EAAE;YAC1ByS,YAAY,CAAC,IAAI,CAACzS,mBAAmB,CAAC;YACtC,IAAI,CAACA,mBAAmB,GAAG,IAAI;UACnC;UAEA,IAAI,IAAI,CAACD,aAAa,EAAE;YACpB,IAAI,CAACA,aAAa,GAAG,KAAK;YAC1B,OAAO,IAAI,CAACwc,YAAY,CAAC,CAAC;UAC9B;UAEA,OAAO7uB,OAAO,CAACC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACDsV,qBAAqB,WAArBA,qBAAqBA,CAACC,MAAM,EAAEsa,KAAK,EAAE;UACjC,IAAI,IAAI,CAACne,oBAAoB,IAAI,CAACme,KAAK,EAAE;YACrC;UACJ;UACA,IAAI,CAACtW,SAAS,CAAC,IAAIC,WAAW,CAAC,6BAA6B,EAAE;YAAEC,MAAM,EAAE;cAAElE,MAAM,EAAEA;YAAO;UAAE,CAAC,CAAC,CAAC;UAC9F,IAAI,CAACmG,SAAS,CAACnG,MAAM,CAAC;UACtB,IAAI,CAAC7D,oBAAoB,GAAG,IAAI;QACpC,CAAC;QACDoe,uBAAuB,WAAvBA,uBAAuBA,CAAA,EAAG;UACtB,IAAI,IAAI,CAAC9b,kBAAkB,EAAE;YACzB1R,MAAM,CAACwiB,YAAY,CAAC,IAAI,CAAC9Q,kBAAkB,CAAC;YAC5C,IAAI,CAACA,kBAAkB,GAAG,IAAI;UAClC;UAEA,IAAI,IAAI,CAACC,gBAAgB,EAAE;YACvB,IAAI,CAACiK,kBAAkB,CAAC,IAAI,CAACjK,gBAAgB,EAAE,KAAK,CAAC;YACrD,IAAI,CAACA,gBAAgB,GAAG,IAAI;UAChC;UAEA,IAAI,CAACF,kBAAkB,GAAG,CAAC,CAAC;QAChC,CAAC;QACDgc,YAAY,WAAZA,YAAYA,CAAC3kB,OAAO,EAAE1E,KAAK,EAAEmT,KAAK,EAAE;UAAA,IAAAmW,MAAA;YAAAC,oBAAA;YAAAC,aAAA;YAAAC,qBAAA;YAAAC,OAAA;UAChC,IAAMrsB,IAAI,GAAGqH,OAAO,IAAI/I,OAAA,CAAO+I,OAAO,MAAK,QAAQ,IAAA4kB,MAAA,IAAAC,oBAAA,GAC7C7kB,OAAO,CAACP,WAAW,cAAAolB,oBAAA,cAAAA,oBAAA,GAAI7kB,OAAO,CAACnD,OAAO,cAAA+nB,MAAA,cAAAA,MAAA,GAAI,EAAE,GAC5C5kB,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI,EAAE;UACnB,IAAMoS,MAAM,GAAG,CAAA3D,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEwW,aAAa,MAAIxW,KAAK,aAALA,KAAK,gBAAAqW,aAAA,GAALrW,KAAK,CAAE2K,MAAM,cAAA0L,aAAA,gBAAAC,qBAAA,GAAbD,aAAA,CAAe/K,OAAO,cAAAgL,qBAAA,uBAAtBA,qBAAA,CAAAvxB,IAAA,CAAAsxB,aAAA,EAAyB,2BAA2B,CAAC,KAAI,IAAI;UAEpGxP,SAAS,CAAC4I,SAAS,CAACC,SAAS,CAACxlB,IAAI,CAAC,CAC9B9D,IAAI,CAAC,YAAM;YACRmwB,OAAI,CAACN,uBAAuB,CAAC,CAAC;YAC9BM,OAAI,CAACrc,kBAAkB,GAAG,OAAOrN,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAG,CAAC,CAAC;YAChE0pB,OAAI,CAACnc,gBAAgB,GAAGuJ,MAAM;YAE9B,IAAIA,MAAM,EAAE;cACR4S,OAAI,CAAClS,kBAAkB,CAACV,MAAM,EAAE,IAAI,CAAC;YACzC,CAAC,MAAM;cACH4S,OAAI,CAACza,SAAS,CAAC;gBAAA,OAAMya,OAAI,CAACrS,iBAAiB,CAAC,CAAC;cAAA,EAAC;YAClD;YAEAqS,OAAI,CAACpc,kBAAkB,GAAG1R,MAAM,CAAC6hB,UAAU,CAAC,YAAM;cAC9CiM,OAAI,CAACN,uBAAuB,CAAC,CAAC;cAC9BM,OAAI,CAACza,SAAS,CAAC;gBAAA,OAAMya,OAAI,CAACrS,iBAAiB,CAAC,CAAC;cAAA,EAAC;YAClD,CAAC,EAAEL,MAAM,CAACvP,MAAM,CAAClL,gBAAgB,CAAC,IAAI,IAAI,CAAC;UAC/C,CAAC,CAAC,SACI,CAAC,UAAAiH,GAAG;YAAA,OAAIiF,OAAO,CAACe,KAAK,CAAC,0BAA0B,EAAEhG,GAAG,CAAC;UAAA,EAAC;QACrE,CAAC;QACDomB,cAAc,WAAdA,cAAcA,CAAA,EAAG;UAAA,IAAAC,OAAA;UACb,IAAI,IAAI,CAAChe,WAAW,IAAI,CAAC,IAAI,CAACqC,UAAU,EAAE;YACtC;UACJ;UAEA8L,SAAS,CAACC,YAAY,CAACC,YAAY,CAAC;YAAEpB,KAAK,EAAE;cAAEqB,gBAAgB,EAAE,IAAI;cAAEC,gBAAgB,EAAE,IAAI;cAAEC,eAAe,EAAE;YAAK;UAAE,CAAC,CAAC,CACpH9gB,IAAI,CAAC,UAAA8R,MAAM,EAAI;YACZ,IAAIiP,QAAQ,GAAGC,aAAa,CAACC,eAAe,CAAC,uBAAuB,CAAC,GAC/D,uBAAuB,GACvBD,aAAa,CAACC,eAAe,CAAC,wBAAwB,CAAC,GACnD,wBAAwB,GACxB,YAAY;YAEtBqP,OAAI,CAAC/d,aAAa,GAAG,IAAIyO,aAAa,CAAClP,MAAM,EAAE;cAC3CiP,QAAQ,EAAEA,QAAQ;cAClBG,kBAAkB,EAAE;YACxB,CAAC,CAAC;YAEFoP,OAAI,CAAC9d,kBAAkB,GAAG8d,OAAI,CAACte,MAAM;YACrCse,OAAI,CAACha,eAAe,GAAG,KAAK;YAE5B,IAAI6T,OAAO,GAAG,IAAIvV,OAAO,CAACwM,OAAO,CAAC,CAAC;YACnC,IAAI9L,MAAM,GAAGgb,OAAI,CAACjV,SAAS,CAAC,CAAC;YAC7B,IAAI2G,YAAY,GAAGliB,OAAO,CAACC,OAAO,CAAC,CAAC;YAEpCuwB,OAAI,CAAC/d,aAAa,CAACkN,gBAAgB,CAAC,eAAe,EAAE,UAACziB,CAAC,EAAK;cACxD,IAAIA,CAAC,CAAC6O,IAAI,IAAI7O,CAAC,CAAC6O,IAAI,CAACsW,IAAI,GAAG,CAAC,EAAE;gBAC3BH,YAAY,GAAGA,YAAY,CAAChiB,IAAI,cAAAC,iBAAA,cAAAb,YAAA,GAAAE,CAAA,CAAC,SAAAixB,SAAA;kBAAA,IAAA1kB,IAAA,EAAA6W,UAAA,EAAA3K,YAAA,EAAA4K,MAAA;kBAAA,OAAAvjB,YAAA,GAAAC,CAAA,WAAAmxB,SAAA;oBAAA,kBAAAA,SAAA,CAAApzB,CAAA;sBAAA;wBAAAozB,SAAA,CAAApzB,CAAA;wBAAA,OACZJ,CAAC,CAAC6O,IAAI,CAACgX,WAAW,CAAC,CAAC;sBAAA;wBAAjChX,IAAI,GAAA2kB,SAAA,CAAApyB,CAAA;wBACJskB,UAAU,GAAG,IAAIxK,UAAU,CAACrM,IAAI,CAAC;wBACjCkM,YAAY,GAAG2K,UAAU,CAAC/D,MAAM,CAAC,UAAUmE,GAAG,EAAEC,MAAI,EAAE;0BAAE,OAAOD,GAAG,GAAGE,MAAM,CAACC,YAAY,CAACF,MAAI,CAAC;wBAAE,CAAC,EAAE,EAAE,CAAC;wBACtGJ,MAAM,GAAGO,IAAI,CAACnL,YAAY,CAAC;wBAC/BoS,OAAO,CAAC1oB,IAAI,CAACkhB,MAAM,CAAC;sBAAC;wBAAA,OAAA6N,SAAA,CAAAnyB,CAAA;oBAAA;kBAAA,GAAAkyB,QAAA;gBAAA,CACxB,GAAC;cACN;YACJ,CAAC,CAAC;YAEFD,OAAI,CAAC/d,aAAa,CAACkN,gBAAgB,CAAC,MAAM,EAAE,YAAM;cAC9C3N,MAAM,CAACqR,SAAS,CAAC,CAAC,CAAC/d,OAAO,CAAC,UAAAge,KAAK;gBAAA,OAAIA,KAAK,CAACC,IAAI,CAAC,CAAC;cAAA,EAAC;cACjDrB,YAAY,CAAChiB,IAAI,CAAC;gBAAA,OAAMmqB,OAAO,CAACpO,QAAQ,CAAC,CAAC;cAAA,EAAC;YAC/C,CAAC,CAAC;YAEF,IAAI1P,QAAQ,GAAGoU,SAAS,CAACpU,QAAQ,IAAIrI,QAAQ,CAACsf,eAAe,CAACtX,IAAI,IAAI,OAAO;YAC7EskB,OAAI,CAAC3b,UAAU,CAAC4O,IAAI,CAAC,iBAAiB,EAAEjO,MAAM,EAAE6U,OAAO,EAAEpJ,QAAQ,EAAE1U,QAAQ,CAAC;YAC5EikB,OAAI,CAAC/d,aAAa,CAAClF,KAAK,CAAC,GAAG,CAAC;YAC7BijB,OAAI,CAAChe,WAAW,GAAG,IAAI;YACvBge,OAAI,CAACG,eAAe,CAAC,CAAC;UAC1B,CAAC,CAAC,SACI,CAAC,UAAAxmB,GAAG,EAAI;YACViF,OAAO,CAACe,KAAK,CAAC,2BAA2B,EAAEhG,GAAG,CAAC;UACnD,CAAC,CAAC;QACV,CAAC;QACD4L,aAAa,WAAbA,aAAaA,CAAA,EAAG;UACZ,IAAI,CAAC,IAAI,CAACvD,WAAW,IAAI,CAAC,IAAI,CAACC,aAAa,EAAE;YAC1C;UACJ;UAEA,IAAI,CAACA,aAAa,CAAC8Q,IAAI,CAAC,CAAC;UACzB,IAAI,CAAC/Q,WAAW,GAAG,KAAK;UACxB,IAAI,CAACme,eAAe,CAAC,CAAC;QAC1B,CAAC;QACD7G,eAAe,WAAfA,eAAeA,CAAA,EAAG;UACd,IAAI,IAAI,CAACtX,WAAW,EAAE;YAClB,IAAI,CAACuD,aAAa,CAAC,CAAC;UACxB,CAAC,MAAM;YACH,IAAI,CAACwa,cAAc,CAAC,CAAC;UACzB;QACJ,CAAC;QACDI,eAAe,WAAfA,eAAeA,CAAA,EAAG;UACd,IAAI,CAAC,IAAI,CAAChe,SAAS,EAAE;YACjB;UACJ;UAEA,IAAI,IAAI,CAACH,WAAW,EAAE;YAClB,IAAI,CAACG,SAAS,CAAC+F,SAAS,CAACC,GAAG,CAAC,eAAe,CAAC;YAC7C,IAAI,CAAChG,SAAS,CAACtO,SAAS,GAAG,kCAAkC;UACjE,CAAC,MAAM;YACH,IAAI,CAACsO,SAAS,CAAC+F,SAAS,CAACmB,MAAM,CAAC,eAAe,CAAC;YAChD,IAAI,CAAClH,SAAS,CAACtO,SAAS,GAAG,wCAAwC;UACvE;QACJ;MACJ,CAAC;MACDusB,KAAK,EAAE;QACH1d,cAAc,WAAdA,cAAcA,CAAA,EAAG;UACb;UACA;QAAA,CACH;QACDU,kBAAkB,WAAlBA,kBAAkBA,CAACid,MAAM,EAAE;UACvB,IAAI,IAAI,CAACle,SAAS,EAAE;YAChB,IAAI,CAACA,SAAS,CAACiX,KAAK,CAACC,OAAO,GAAGgH,MAAM,GAAG,MAAM,GAAI,IAAI,CAACje,mBAAmB,GAAG,EAAE,GAAG,MAAO;UAC7F;UAEA,IAAI,IAAI,CAACnB,aAAa,EAAE;YACpB,IAAI,CAACA,aAAa,CAACmY,KAAK,CAACC,OAAO,GAAGgH,MAAM,GAAG,MAAM,GAAG,EAAE;UAC3D;UAEA,IAAI,IAAI,CAACrf,YAAY,EAAE;YACnB,IAAI,CAACA,YAAY,CAACwU,QAAQ,GAAG6K,MAAM;YACnC,IAAIA,MAAM,EAAE;cACR,IAAI,CAACrf,YAAY,CAAC3H,WAAW,GAAG,EAAE;YACtC;UACJ;QACJ,CAAC;QACDmK,kBAAkB,WAAlBA,kBAAkBA,CAAA,EAAG;UAAA,IAAA8c,OAAA;UACjB,IAAI,CAAClb,SAAS,CAAC;YAAA,OAAMkb,OAAI,CAAC9S,iBAAiB,CAAC,CAAC;UAAA,EAAC;QAClD;MACJ,CAAC;MACD+S,OAAO,WAAPA,OAAOA,CAAA,EAAG;QAAA,IAAAC,OAAA;QACN7wB,iBAAA,cAAAb,YAAA,GAAAE,CAAA,CAAC,SAAAyxB,SAAA;UAAA,OAAA3xB,YAAA,GAAAC,CAAA,WAAA2xB,SAAA;YAAA,kBAAAA,SAAA,CAAA5zB,CAAA;cAAA;gBAAA4zB,SAAA,CAAA5zB,CAAA;gBAAA,OACS0zB,OAAI,CAACxc,eAAe,CAAC,CAAC;cAAA;gBAC5Bwc,OAAI,CAAC1I,aAAa,CAAC,CAAC;gBAEpB0I,OAAI,CAACpb,SAAS,CAAC,YAAM;kBACjBob,OAAI,CAAChT,iBAAiB,CAAC,CAAC;kBACxBpZ,uBAAuB,CAACosB,OAAI,CAACG,GAAG,CAAC;kBACjCH,OAAI,CAACI,mBAAmB,GAAGlsB,uBAAuB,CAAC8rB,OAAI,CAACG,GAAG,CAAC;gBAChE,CAAC,CAAC;cAAC;gBAAA,OAAAD,SAAA,CAAA3yB,CAAA;YAAA;UAAA,GAAA0yB,QAAA;QAAA,CACN,GAAE,CAAC;QAEJ1uB,MAAM,CAACod,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAACpL,kBAAkB,CAAC;QAChEhS,MAAM,CAACod,gBAAgB,CAAC,4BAA4B,EAAE,IAAI,CAACxC,qBAAqB,CAAC;MACrF,CAAC;MACDkU,aAAa,WAAbA,aAAaA,CAAA,EAAG;QACZ9uB,MAAM,CAAC+uB,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC/c,kBAAkB,CAAC;QACnEhS,MAAM,CAAC+uB,mBAAmB,CAAC,4BAA4B,EAAE,IAAI,CAACnU,qBAAqB,CAAC;QAEpF,IAAI,IAAI,CAACiU,mBAAmB,EAAE;UAC1B,IAAI,CAACA,mBAAmB,CAACG,UAAU,CAAC,CAAC;UACrC,IAAI,CAACH,mBAAmB,GAAG,IAAI;QACnC;QAEA,IAAI,CAACrB,uBAAuB,CAAC,CAAC;QAC9B,IAAI,CAACjZ,SAAS,CAAC,KAAK,CAAC;QAErB,IAAI,IAAI,CAAC9E,MAAM,EAAE;UACb,IAAI,CAACA,MAAM,CAACiJ,OAAO,CAAC,CAAC;UACrB,IAAI,CAACjJ,MAAM,GAAG,IAAI;QACtB;QACA,IAAI,IAAI,CAAC6C,UAAU,EAAE;UACjB,IAAI,CAACA,UAAU,CAAC0O,IAAI,CAAC,CAAC;QAC1B;MACJ,CAAC;MACDsM,QAAQ,EAAEzhB,MAAM,CAAChL;IACrB,CAAC,CAAC,CAACouB,KAAK,CAACpjB,MAAM,CAAC6C,kBAAkB,CAAC;IAEnC,OAAOI,GAAG;EACd,CAAC;EAED,IAAMogB,sBAAsB,GAAG,gCAAgC;EAE/D,SAASC,kBAAkBA,CAACC,OAAO,EAAEC,aAAa,EAAEC,WAAW,EAAE;IAC7D,IAAMC,QAAQ,GAAGH,OAAO,CAAC/U,YAAY,CAACgV,aAAa,CAAC;IACpD,IAAI,CAACE,QAAQ,EAAE;MACX,OAAO,IAAI;IACf;IAEA,IAAI;MACA,OAAOjiB,IAAI,CAACC,KAAK,CAACgiB,QAAQ,CAAC;IAC/B,CAAC,CAAC,OAAO3hB,KAAK,EAAE;MACZf,OAAO,CAACe,KAAK,CAAC,kBAAkB,GAAG0hB,WAAW,GAAG,QAAQ,EAAE1hB,KAAK,CAAC;MACjE,OAAO,IAAI;IACf;EACJ;EAEA,SAAS4hB,qBAAqBA,CAACJ,OAAO,EAAE;IACpC,IAAI,CAACA,OAAO,IAAIA,OAAO,CAACtM,OAAO,CAAC2M,0BAA0B,KAAK,MAAM,EAAE;MACnE,OAAOL,OAAO,GAAGA,OAAO,CAACM,oBAAoB,IAAI,IAAI,GAAG,IAAI;IAChE;IAEA,IAAM7jB,MAAM,GAAGsjB,kBAAkB,CAACC,OAAO,EAAE,8BAA8B,EAAE,yBAAyB,CAAC;IACrG,IAAI,CAACvjB,MAAM,EAAE;MACT,OAAO,IAAI;IACf;IAEA,IAAMiD,GAAG,GAAGP,UAAU,CAAC1C,MAAM,CAAC;IAC9B,IAAI,CAACiD,GAAG,EAAE;MACN,OAAO,IAAI;IACf;IAEAsgB,OAAO,CAACtM,OAAO,CAAC2M,0BAA0B,GAAG,MAAM;IACnDL,OAAO,CAACM,oBAAoB,GAAG5gB,GAAG;IAElC,OAAOA,GAAG;EACd;EAEA,SAAS6gB,yBAAyBA,CAAC3tB,IAAI,EAAE;IACrC,IAAI,CAACA,IAAI,IAAI,OAAOA,IAAI,CAAC0Y,gBAAgB,KAAK,UAAU,EAAE;MACtD;IACJ;IAEA,IAAI,OAAO1Y,IAAI,CAACG,OAAO,KAAK,UAAU,IAAIH,IAAI,CAACG,OAAO,CAAC+sB,sBAAsB,CAAC,EAAE;MAC5EM,qBAAqB,CAACxtB,IAAI,CAAC;IAC/B;IAEAA,IAAI,CAAC0Y,gBAAgB,CAACwU,sBAAsB,CAAC,CAACnsB,OAAO,CAACysB,qBAAqB,CAAC;EAChF;EAEA,SAASI,uBAAuBA,CAAA,EAAG;IAC/BD,yBAAyB,CAAChuB,QAAQ,CAAC;IAEnC,IAAI,OAAOiB,gBAAgB,KAAK,WAAW,EAAE;MACzC;IACJ;IAEA,IAAMC,QAAQ,GAAG,IAAID,gBAAgB,CAAC,UAAAE,SAAS,EAAI;MAC/CA,SAAS,CAACC,OAAO,CAAC,UAAAC,QAAQ,EAAI;QAC1BA,QAAQ,CAACC,UAAU,CAACF,OAAO,CAAC,UAAAL,IAAI,EAAI;UAChC,IAAIA,IAAI,IAAIA,IAAI,CAACT,QAAQ,KAAK,CAAC,EAAE;YAC7B0tB,yBAAyB,CAACjtB,IAAI,CAAC;UACnC;QACJ,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC;IAEFG,QAAQ,CAACK,OAAO,CAACvB,QAAQ,CAACkuB,IAAI,EAAE;MAC5B1sB,SAAS,EAAE,IAAI;MACfC,OAAO,EAAE;IACb,CAAC,CAAC;EACN;EAEA,IAAIzB,QAAQ,CAACmuB,UAAU,KAAK,SAAS,EAAE;IACnCnuB,QAAQ,CAACyb,gBAAgB,CAAC,kBAAkB,EAAEwS,uBAAuB,EAAE;MAAEG,IAAI,EAAE;IAAK,CAAC,CAAC;EAC1F,CAAC,MAAM;IACHH,uBAAuB,CAAC,CAAC;EAC7B;EAEA,OAAO;IACHrhB,UAAU,EAAEA,UAAU;IACtBihB,qBAAqB,EAAEA;EAC3B,CAAC;AACL,CAAC,CAAC,CAAC;AAEHxvB,MAAM,CAACgwB,8BAA8B,GAAG,YAAY;EAChD,IAAMC,eAAe,GAAG,uCAAuC;EAE/D,SAASC,qBAAqBA,CAACvuB,QAAQ,EAAE;IACrC,IAAI,CAACA,QAAQ,IAAI5B,OAAA,CAAO4B,QAAQ,MAAK,QAAQ,EAAE;MAC3C,OAAO,IAAI;IACf;IAEA,OAAO;MACHwuB,UAAU,EAAExuB,QAAQ,CAACwuB,UAAU,IAAIxuB,QAAQ,CAACyuB,UAAU,IAAI,EAAE;MAC5DC,QAAQ,EAAE1uB,QAAQ,CAAC0uB,QAAQ,IAAI1uB,QAAQ,CAAC2uB,QAAQ,IAAI,EAAE;MACtDC,QAAQ,EAAE5uB,QAAQ,CAAC4uB,QAAQ,IAAI5uB,QAAQ,CAAC6uB,QAAQ,IAAI;IACxD,CAAC;EACL;EAEA,SAASC,cAAcA,CAAC7a,KAAK,EAAE;IAC3B,IAAI,CAACA,KAAK,IAAIA,KAAK,GAAG,IAAI,EAAE;MACxB,OAAO,CAACA,KAAK,IAAI,CAAC,IAAI,IAAI;IAC9B;IAEA,IAAIA,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE;MACrB,OAAO,CAACA,KAAK,GAAG,IAAI,EAAE8a,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;IAC5C;IAEA,OAAO,CAAC9a,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE8a,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;EACrD;EAEA,SAASC,cAAcA,CAACN,QAAQ,EAAEE,QAAQ,EAAE;IACxC,OAAQ,CAACF,QAAQ,IAAI,EAAE,EAAE9uB,IAAI,CAAC,CAAC,CAACyD,WAAW,CAAC,CAAC,GAAI,IAAI,IAAIurB,QAAQ,IAAI,CAAC,CAAC;EAC3E;EAEA,SAASK,eAAeA,CAACC,IAAI,EAAEC,SAAS,EAAE;IACtC,OAAOA,SAAS,CAACxF,GAAG,CAACqF,cAAc,CAACE,IAAI,CAACjxB,IAAI,EAAEixB,IAAI,CAAC/Q,IAAI,CAAC,CAAC;EAC9D;EAEA,SAASiR,mBAAmBA,CAACC,SAAS,EAAE;IACpC,IAAI,CAACA,SAAS,EAAE;MACZ,OAAO,EAAE;IACb;IAEA,OAAO1yB,KAAK,CAACC,IAAI,CAACyyB,SAAS,CAACtW,gBAAgB,CAAC,yBAAyB,CAAC,CAAC,CACnEvS,GAAG,CAAC,UAAAinB,OAAO;MAAA,OAAIc,qBAAqB,CAAC;QAClCC,UAAU,EAAEf,OAAO,CAACtM,OAAO,CAACmO,cAAc;QAC1CZ,QAAQ,EAAEjB,OAAO,CAACtM,OAAO,CAACoO,gBAAgB;QAC1CX,QAAQ,EAAEnV,MAAM,CAACgU,OAAO,CAACtM,OAAO,CAACqO,gBAAgB,IAAI,CAAC;MAC1D,CAAC,CAAC;IAAA,EAAC,CACFlrB,MAAM,CAAC,UAAAtE,QAAQ;MAAA,OAAIA,QAAQ,IAAIA,QAAQ,CAACwuB,UAAU;IAAA,EAAC;EAC5D;EAEA,SAAS5hB,UAAUA,CAAC1C,MAAM,EAAE;IACxB,IAAI,CAACA,MAAM,IAAI,CAACA,MAAM,CAACoH,MAAM,EAAE;MAC3B;IACJ;IAEA,IAAMme,SAAS,GAAGzvB,QAAQ,CAACgL,cAAc,CAAC,iBAAiB,CAAC;IAC5D,IAAM0kB,aAAa,GAAG1vB,QAAQ,CAACgL,cAAc,CAAC,qBAAqB,CAAC;IACpE,IAAM2kB,MAAM,GAAG3vB,QAAQ,CAACgL,cAAc,CAAC,wBAAwB,CAAC;IAChE,IAAM4kB,iBAAiB,GAAG5vB,QAAQ,CAACgL,cAAc,CAAC,0BAA0B,CAAC;IAC7E,IAAM6kB,WAAW,GAAG7vB,QAAQ,CAACgL,cAAc,CAAC,8BAA8B,CAAC;IAC3E,IAAM8kB,WAAW,GAAG9vB,QAAQ,CAACgL,cAAc,CAAC,uBAAuB,CAAC;IAEpE,IAAI,CAACykB,SAAS,IAAI,CAACC,aAAa,IAAI,CAACC,MAAM,IAAI,CAACC,iBAAiB,IAAI,CAACC,WAAW,IAAI,CAACC,WAAW,EAAE;MAC/F;IACJ;IAEA,IAAMC,aAAa,GAAGN,SAAS,CAACnB,eAAe,CAAC;IAChD,IAAIyB,aAAa,IAAI,OAAOA,aAAa,CAAChZ,OAAO,KAAK,UAAU,EAAE;MAC9DgZ,aAAa,CAAChZ,OAAO,CAAC,CAAC;IAC3B;IAEA,IAAIiZ,oBAAoB,GAAG,CAACrzB,KAAK,CAACE,OAAO,CAACqN,MAAM,CAAC+lB,iBAAiB,CAAC,GAAG/lB,MAAM,CAAC+lB,iBAAiB,GAAG,EAAE,EAC9FzpB,GAAG,CAAC+nB,qBAAqB,CAAC,CAC1BjqB,MAAM,CAAC,UAAAtE,QAAQ;MAAA,OAAIA,QAAQ,IAAIA,QAAQ,CAACwuB,UAAU;IAAA,EAAC;IAExD,IAAIwB,oBAAoB,CAACx1B,MAAM,KAAK,CAAC,EAAE;MACnCw1B,oBAAoB,GAAGZ,mBAAmB,CAACM,aAAa,CAAC;IAC7D;IAEA,IAAIQ,WAAW,GAAG,EAAE;IACpB,IAAIC,oBAAoB,GAAG,KAAK;IAEhC,SAASC,iBAAiBA,CAACC,OAAO,EAAE3P,SAAS,EAAE5gB,IAAI,EAAE;MACjD,IAAM2tB,OAAO,GAAGztB,QAAQ,CAACC,aAAa,CAACowB,OAAO,CAAC;MAC/C,IAAI3P,SAAS,EAAE;QACX+M,OAAO,CAAC/M,SAAS,GAAGA,SAAS;MACjC;MAEA+M,OAAO,CAACvtB,WAAW,GAAGJ,IAAI;MAC1B,OAAO2tB,OAAO;IAClB;IAEA,SAAS6C,eAAeA,CAAA,EAAG;MACvBZ,aAAa,CAACvvB,SAAS,GAAG,EAAE;MAE5B,IAAI6vB,oBAAoB,CAACx1B,MAAM,KAAK,CAAC,EAAE;QACnCk1B,aAAa,CAACzF,WAAW,CAACmG,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,EAAE,4BAA4B,CAAC,CAAC;QACrG;MACJ;MAEAJ,oBAAoB,CAAC5uB,OAAO,CAAC,UAAAmvB,YAAY,EAAI;QACzC,IAAMC,GAAG,GAAGnyB,MAAM,CAAC2B,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;QAChDuwB,GAAG,CAAC9P,SAAS,GAAG,4GAA4G;QAC5H8P,GAAG,CAACrP,OAAO,CAACmO,cAAc,GAAGiB,YAAY,CAAC/B,UAAU;QACpDgC,GAAG,CAACrP,OAAO,CAACoO,gBAAgB,GAAGgB,YAAY,CAAC7B,QAAQ;QACpD8B,GAAG,CAACrP,OAAO,CAACqO,gBAAgB,GAAGe,YAAY,CAAC3B,QAAQ;QAEpD,IAAM6B,OAAO,GAAGpyB,MAAM,CAAC2B,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;QACpDwwB,OAAO,CAAC/P,SAAS,GAAG,cAAc;QAElC,IAAMziB,IAAI,GAAGmyB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,EAAEG,YAAY,CAAC7B,QAAQ,IAAI,UAAU,CAAC;QAC/F,IAAM7Y,IAAI,GAAGxX,MAAM,CAAC2B,QAAQ,CAACC,aAAa,CAAC,GAAG,CAAC;QAC/C4V,IAAI,CAAC6K,SAAS,GAAG,6BAA6B;QAC9CziB,IAAI,CAACyyB,OAAO,CAAC7a,IAAI,CAAC;QAElB,IAAMsI,IAAI,GAAGiS,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,EAAEtB,cAAc,CAACyB,YAAY,CAAC3B,QAAQ,CAAC,CAAC;QAEhG6B,OAAO,CAACxG,WAAW,CAAChsB,IAAI,CAAC;QACzBwyB,OAAO,CAACxG,WAAW,CAAC9L,IAAI,CAAC;QAEzB,IAAMwS,YAAY,GAAGP,iBAAiB,CAAC,QAAQ,EAAE,wDAAwD,EAAE,SAAS,CAAC;QACrHO,YAAY,CAAC/mB,IAAI,GAAG,QAAQ;QAC5B+mB,YAAY,CAACxP,OAAO,CAACqN,UAAU,GAAG+B,YAAY,CAAC/B,UAAU;QACzD,IAAMoC,UAAU,GAAGvyB,MAAM,CAAC2B,QAAQ,CAACC,aAAa,CAAC,GAAG,CAAC;QACrD2wB,UAAU,CAAClQ,SAAS,GAAG,mBAAmB;QAC1CiQ,YAAY,CAACD,OAAO,CAACE,UAAU,CAAC;QAChCD,YAAY,CAAClV,gBAAgB,CAAC,OAAO,EAAE;UAAA,OAAMoV,cAAc,CAACN,YAAY,CAAC/B,UAAU,CAAC;QAAA,EAAC;QAErFgC,GAAG,CAACvG,WAAW,CAACwG,OAAO,CAAC;QACxBD,GAAG,CAACvG,WAAW,CAAC0G,YAAY,CAAC;QAC7BjB,aAAa,CAACzF,WAAW,CAACuG,GAAG,CAAC;MAClC,CAAC,CAAC;IACN;IAEA,SAASM,gBAAgBA,CAAC3pB,OAAO,EAAE2O,QAAQ,EAAE;MACzC,IAAI,CAAC3O,OAAO,EAAE;QACVwoB,MAAM,CAACzvB,WAAW,GAAG,EAAE;QACvByvB,MAAM,CAACjP,SAAS,GAAG,mBAAmB;QACtC;MACJ;MAEAiP,MAAM,CAACzvB,WAAW,GAAGiH,OAAO;MAC5BwoB,MAAM,CAACjP,SAAS,GAAG,aAAa,IAAI5K,QAAQ,IAAI,YAAY,CAAC;IACjE;IAEA,SAASib,kBAAkBA,CAACC,QAAQ,EAAE7pB,OAAO,EAAE2O,QAAQ,EAAE;MACrD,IAAIkb,QAAQ,KAAK,IAAI,IAAIA,QAAQ,KAAKznB,SAAS,EAAE;QAC7CqmB,iBAAiB,CAAClP,SAAS,GAAG,sBAAsB;QACpDkP,iBAAiB,CAAC/V,YAAY,CAAC,eAAe,EAAE,GAAG,CAAC;QACpDgW,WAAW,CAACnP,SAAS,GAAG,yDAAyD;QACjFmP,WAAW,CAACnK,KAAK,CAACuL,KAAK,GAAG,IAAI;QAC9BpB,WAAW,CAAC3vB,WAAW,GAAG,IAAI;QAC9B;MACJ;MAEA,IAAMgxB,eAAe,GAAG5hB,IAAI,CAAC6S,GAAG,CAAC,CAAC,EAAE7S,IAAI,CAAC4S,GAAG,CAAC,GAAG,EAAE5S,IAAI,CAAC6hB,KAAK,CAACH,QAAQ,CAAC,CAAC,CAAC;MACxEpB,iBAAiB,CAAClP,SAAS,GAAG,eAAe;MAC7CkP,iBAAiB,CAAC/V,YAAY,CAAC,eAAe,EAAEqX,eAAe,CAACpzB,QAAQ,CAAC,CAAC,CAAC;MAC3E+xB,WAAW,CAACnP,SAAS,GAAG,eAAe,IAAI5K,QAAQ,IAAI,4CAA4C,CAAC;MACpG+Z,WAAW,CAACnK,KAAK,CAACuL,KAAK,GAAGC,eAAe,GAAG,GAAG;MAC/CrB,WAAW,CAAC3vB,WAAW,GAAGiH,OAAO,IAAK+pB,eAAe,GAAG,GAAI;IAChE;IAEA,SAASE,0BAA0BA,CAACC,KAAK,EAAE;MACvC,QAAQA,KAAK;QACT,KAAK,UAAU;UACX,OAAO;YAAEtrB,KAAK,EAAE,UAAU;YAAEurB,UAAU,EAAE,iBAAiB;YAAEC,aAAa,EAAE;UAAa,CAAC;QAC5F,KAAK,QAAQ;UACT,OAAO;YAAExrB,KAAK,EAAE,QAAQ;YAAEurB,UAAU,EAAE,gBAAgB;YAAEC,aAAa,EAAE;UAAY,CAAC;QACxF,KAAK,WAAW;UACZ,OAAO;YAAExrB,KAAK,EAAE,WAAW;YAAEurB,UAAU,EAAE,iBAAiB;YAAEC,aAAa,EAAE;UAAwD,CAAC;QACxI;UACI,OAAO;YAAExrB,KAAK,EAAE,QAAQ;YAAEurB,UAAU,EAAE,mBAAmB;YAAEC,aAAa,EAAE;UAA0D,CAAC;MAC7I;IACJ;IAEA,SAASC,mBAAmBA,CAACC,IAAI,EAAE;MAC/B,IAAIA,IAAI,CAAC9B,MAAM,KAAK,QAAQ,IAAI8B,IAAI,CAACxlB,KAAK,EAAE;QACxC,OAAOwlB,IAAI,CAACxlB,KAAK;MACrB;MAEA,IAAIwlB,IAAI,CAAC9B,MAAM,KAAK,UAAU,EAAE;QAC5B,OAAO,gCAAgC;MAC3C;MAEA,IAAI8B,IAAI,CAAC9B,MAAM,KAAK,WAAW,EAAE;QAC7B,OAAO8B,IAAI,CAACT,QAAQ,GAAG,YAAY;MACvC;MAEA,OAAO,sBAAsB;IACjC;IAEA,SAASU,iBAAiBA,CAAA,EAAG;MACzB5B,WAAW,CAAC3vB,SAAS,GAAG,EAAE;MAE1B+vB,WAAW,CAAC9uB,OAAO,CAAC,UAAAqwB,IAAI,EAAI;QACxB,IAAME,YAAY,GAAGP,0BAA0B,CAACK,IAAI,CAAC9B,MAAM,CAAC;QAC5D,IAAMrM,IAAI,GAAGtjB,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;QAC1CqjB,IAAI,CAAC5C,SAAS,GAAG,mCAAmC;QAEpD,IAAMkR,MAAM,GAAG5xB,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;QAC5C2xB,MAAM,CAAClR,SAAS,GAAG,wDAAwD;QAE3E,IAAMmR,WAAW,GAAG7xB,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;QACjD4xB,WAAW,CAACnR,SAAS,GAAG,qBAAqB;QAC7CmR,WAAW,CAAC5H,WAAW,CAACmG,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,EAAEqB,IAAI,CAAC/C,QAAQ,CAAC,CAAC;QACrFmD,WAAW,CAAC5H,WAAW,CAACmG,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,EAAEtB,cAAc,CAAC2C,IAAI,CAAC7C,QAAQ,CAAC,CAAC,CAAC;QAEpG,IAAMkD,KAAK,GAAG1B,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAGuB,YAAY,CAACL,UAAU,EAAEK,YAAY,CAAC5rB,KAAK,CAAC;QAE/F6rB,MAAM,CAAC3H,WAAW,CAAC4H,WAAW,CAAC;QAC/BD,MAAM,CAAC3H,WAAW,CAAC6H,KAAK,CAAC;QAEzB,IAAMd,QAAQ,GAAGhxB,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;QAC9C+wB,QAAQ,CAACtQ,SAAS,GAAG,eAAe;QACpCsQ,QAAQ,CAACnX,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC;QAC5CmX,QAAQ,CAACnX,YAAY,CAAC,eAAe,EAAE,GAAG,CAAC;QAC3CmX,QAAQ,CAACnX,YAAY,CAAC,eAAe,EAAE,KAAK,CAAC;QAC7CmX,QAAQ,CAACnX,YAAY,CAAC,eAAe,EAAE4X,IAAI,CAACT,QAAQ,CAAClzB,QAAQ,CAAC,CAAC,CAAC;QAEhE,IAAMi0B,aAAa,GAAG/xB,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;QACnD8xB,aAAa,CAACrR,SAAS,GAAG,eAAe,GAAGiR,YAAY,CAACJ,aAAa;QACtEQ,aAAa,CAACrM,KAAK,CAACuL,KAAK,GAAGQ,IAAI,CAACT,QAAQ,GAAG,GAAG;QAC/Ce,aAAa,CAAC7xB,WAAW,GAAGuxB,IAAI,CAACT,QAAQ,GAAG,GAAG;QAC/CA,QAAQ,CAAC/G,WAAW,CAAC8H,aAAa,CAAC;QAEnC,IAAM5qB,OAAO,GAAGipB,iBAAiB,CAAC,KAAK,EAAEqB,IAAI,CAAC9B,MAAM,KAAK,QAAQ,GAAG,wBAAwB,GAAG,uBAAuB,EAAE6B,mBAAmB,CAACC,IAAI,CAAC,CAAC;QAElJnO,IAAI,CAAC2G,WAAW,CAAC2H,MAAM,CAAC;QACxBtO,IAAI,CAAC2G,WAAW,CAAC+G,QAAQ,CAAC;QAC1B1N,IAAI,CAAC2G,WAAW,CAAC9iB,OAAO,CAAC;QACzB2oB,WAAW,CAAC7F,WAAW,CAAC3G,IAAI,CAAC;MACjC,CAAC,CAAC;IACN;IAEA,SAAS0O,gBAAgBA,CAAC9C,IAAI,EAAEzsB,KAAK,EAAE;MACnC,OAAO;QACHkR,EAAE,EAAEub,IAAI,CAACjxB,IAAI,GAAG,IAAI,GAAGixB,IAAI,CAAC/Q,IAAI,GAAG,IAAI,GAAG+Q,IAAI,CAAC+C,YAAY,GAAG,IAAI,GAAGxvB,KAAK,GAAG,IAAI,GAAGyvB,IAAI,CAACC,GAAG,CAAC,CAAC;QAC9FzD,QAAQ,EAAEQ,IAAI,CAACjxB,IAAI;QACnB2wB,QAAQ,EAAEM,IAAI,CAAC/Q,IAAI;QACnBwR,MAAM,EAAE,QAAQ;QAChBqB,QAAQ,EAAE,CAAC;QACX/kB,KAAK,EAAE;MACX,CAAC;IACL;IAEA,SAASmmB,gBAAgBA,CAAC9gB,MAAM,EAAE+gB,OAAO,EAAE;MACvCnC,WAAW,GAAGA,WAAW,CAAC1pB,GAAG,CAAC,UAAAirB,IAAI;QAAA,OAAIA,IAAI,CAAC9d,EAAE,KAAKrC,MAAM,GAAGzX,MAAM,CAAC2I,MAAM,CAAC,CAAC,CAAC,EAAEivB,IAAI,EAAEY,OAAO,CAAC,GAAGZ,IAAI;MAAA,EAAC;MACnGC,iBAAiB,CAAC,CAAC;IACvB;IAEA,SAASY,iBAAiBA,CAACC,SAAS,EAAE;MAClCrC,WAAW,GAAGA,WAAW,CAAC5rB,MAAM,CAAC,UAAAmtB,IAAI;QAAA,OAAI,CAACc,SAAS,CAACd,IAAI,CAAC;MAAA,EAAC;MAC1DC,iBAAiB,CAAC,CAAC;IACvB;IAEA,SAASc,oBAAoBA,CAACtD,IAAI,EAAEuD,cAAc,EAAEC,SAAS,EAAEC,UAAU,EAAE;MACvE,OAAO,IAAI72B,OAAO,CAAC,UAACC,OAAO,EAAE62B,MAAM,EAAK;QACpC,IAAMC,QAAQ,GAAG,IAAIC,QAAQ,CAAC,CAAC;QAC/BD,QAAQ,CAACE,MAAM,CAAC,mBAAmB,EAAE7oB,MAAM,CAACoH,MAAM,CAAC;QACnDuhB,QAAQ,CAACE,MAAM,CAAC,OAAO,EAAE7D,IAAI,CAAC;QAE9B,IAAM8D,GAAG,GAAG,IAAIC,cAAc,CAAC,CAAC;QAChCD,GAAG,CAACE,IAAI,CAAC,MAAM,EAAEhpB,MAAM,CAACipB,iBAAiB,EAAE,IAAI,CAAC;QAEhDH,GAAG,CAACI,MAAM,CAAC3X,gBAAgB,CAAC,UAAU,EAAE,UAAA7F,KAAK,EAAI;UAC7C,IAAI,CAACA,KAAK,CAACyd,gBAAgB,EAAE;YACzB;UACJ;UAEA,IAAMC,YAAY,GAAGhkB,IAAI,CAAC6hB,KAAK,CAAEvb,KAAK,CAAC2d,MAAM,GAAG3d,KAAK,CAAC4d,KAAK,GAAI,GAAG,CAAC;UACnEpB,gBAAgB,CAACK,cAAc,EAAE;YAC7B9C,MAAM,EAAE,WAAW;YACnBqB,QAAQ,EAAEsC;UACd,CAAC,CAAC;UAEF,IAAMG,eAAe,GAAI,CAACf,SAAS,GAAI9c,KAAK,CAAC2d,MAAM,GAAG3d,KAAK,CAAC4d,KAAM,IAAIb,UAAU,GAAI,GAAG;UACvF5B,kBAAkB,CAAC0C,eAAe,EAAE,YAAY,IAAIf,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,GAAGC,UAAU,EAAE,4CAA4C,CAAC;QAC3I,CAAC,CAAC;QAEFK,GAAG,CAACvX,gBAAgB,CAAC,MAAM,EAAE,YAAM;UAC/B,IAAIuX,GAAG,CAACrD,MAAM,IAAI,GAAG,IAAIqD,GAAG,CAACrD,MAAM,GAAG,GAAG,EAAE;YACvC,IAAI;cACA5zB,OAAO,CAAC4P,IAAI,CAACC,KAAK,CAAConB,GAAG,CAACU,YAAY,CAAC,CAAC;YACzC,CAAC,CAAC,OAAOznB,KAAK,EAAE;cACZ2mB,MAAM,CAAC,IAAIe,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAChE;YAEA;UACJ;UAEAf,MAAM,CAAC,IAAIe,KAAK,CAAC,CAACX,GAAG,CAACU,YAAY,IAAI,gBAAgB,EAAE9zB,IAAI,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC;QAEFozB,GAAG,CAACvX,gBAAgB,CAAC,OAAO,EAAE,YAAM;UAChCmX,MAAM,CAAC,IAAIe,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACnF,CAAC,CAAC;QAEFX,GAAG,CAACzT,IAAI,CAACsT,QAAQ,CAAC;MACtB,CAAC,CAAC;IACN;IAAC,SAEce,eAAeA,CAAAC,EAAA;MAAA,OAAAC,gBAAA,CAAA33B,KAAA,OAAAD,SAAA;IAAA;IAAA,SAAA43B,iBAAA;MAAAA,gBAAA,GAAA73B,iBAAA,cAAAb,YAAA,GAAAE,CAAA,CAA9B,SAAAy4B,SAA+BC,KAAK;QAAA,IAAAC,aAAA,EAAAC,cAAA,EAAAC,iBAAA,EAAAC,YAAA,EAAAC,aAAA,EAAAC,aAAA,EAAA96B,CAAA,EAAA01B,IAAA,EAAAqF,WAAA,EAAAvL,MAAA,EAAAwL,QAAA,EAAAC,MAAA,EAAAC,oBAAA,EAAAC,aAAA,EAAAC,YAAA,EAAAC,GAAA,EAAAC,GAAA;QAAA,OAAA15B,YAAA,GAAAC,CAAA,WAAA05B,SAAA;UAAA,kBAAAA,SAAA,CAAA96B,CAAA,GAAA86B,SAAA,CAAA37B,CAAA;YAAA;cAAA,MAC5B,CAAC8Q,MAAM,CAACipB,iBAAiB,IAAI,CAACa,KAAK,IAAIA,KAAK,CAACx5B,MAAM,KAAK,CAAC;gBAAAu6B,SAAA,CAAA37B,CAAA;gBAAA;cAAA;cAAA,OAAA27B,SAAA,CAAA16B,CAAA;YAAA;cAAA,KAIzD81B,oBAAoB;gBAAA4E,SAAA,CAAA37B,CAAA;gBAAA;cAAA;cACpB03B,gBAAgB,CAAC,2CAA2C,EAAE,cAAc,CAAC;cAAC,OAAAiE,SAAA,CAAA16B,CAAA;YAAA;cAIlF81B,oBAAoB,GAAG,IAAI;cAErB8D,aAAa,GAAG,EAAE;cAClBC,cAAc,GAAG,EAAE;cACnBC,iBAAiB,GAAG,IAAIa,GAAG,CAAChF,oBAAoB,CAACxpB,GAAG,CAAC,UAAAxG,QAAQ;gBAAA,OAAIgvB,cAAc,CAAChvB,QAAQ,CAAC0uB,QAAQ,EAAE1uB,QAAQ,CAAC4uB,QAAQ,CAAC;cAAA,EAAC,CAAC;cAE7HjyB,KAAK,CAACC,IAAI,CAACo3B,KAAK,CAAC,CAAC5yB,OAAO,CAAC,UAAA8tB,IAAI,EAAI;gBAC9B,IAAID,eAAe,CAACC,IAAI,EAAEiF,iBAAiB,CAAC,EAAE;kBAC1CD,cAAc,CAAC/1B,IAAI,CAAC+wB,IAAI,CAAC;kBACzB;gBACJ;gBAEAiF,iBAAiB,CAAC1f,GAAG,CAACua,cAAc,CAACE,IAAI,CAACjxB,IAAI,EAAEixB,IAAI,CAAC/Q,IAAI,CAAC,CAAC;gBAC3D8V,aAAa,CAAC91B,IAAI,CAAC+wB,IAAI,CAAC;cAC5B,CAAC,CAAC;cAEF,IAAIgF,cAAc,CAAC15B,MAAM,GAAG,CAAC,EAAE;gBAC3B01B,WAAW,GAAGA,WAAW,CAACtqB,MAAM,CAACsuB,cAAc,CAAC1tB,GAAG,CAAC,UAAC0oB,IAAI,EAAEzsB,KAAK;kBAAA,OAAK5I,MAAM,CAAC2I,MAAM,CAACwvB,gBAAgB,CAAC9C,IAAI,EAAEzsB,KAAK,CAAC,EAAE;oBAC9GktB,MAAM,EAAE,QAAQ;oBAChBqB,QAAQ,EAAE,GAAG;oBACb/kB,KAAK,EAAE;kBACX,CAAC,CAAC;gBAAA,EAAC,CAAC;gBACJylB,iBAAiB,CAAC,CAAC;cACvB;cAAC,MAEGuC,aAAa,CAACz5B,MAAM,KAAK,CAAC;gBAAAu6B,SAAA,CAAA37B,CAAA;gBAAA;cAAA;cAC1B+2B,oBAAoB,GAAG,KAAK;cAC5BW,gBAAgB,CAACoD,cAAc,CAAC1tB,GAAG,CAAC,UAAA0oB,IAAI;gBAAA,OAAIA,IAAI,CAACjxB,IAAI,GAAG,sCAAsC;cAAA,EAAC,CAACg3B,IAAI,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;cAC5HlE,kBAAkB,CAAC,IAAI,CAAC;cAAC,OAAAgE,SAAA,CAAA16B,CAAA;YAAA;cAIvB+5B,YAAY,GAAGH,aAAa,CAACztB,GAAG,CAACwrB,gBAAgB,CAAC;cACxD9B,WAAW,GAAGA,WAAW,CAACtqB,MAAM,CAACwuB,YAAY,CAAC;cAC9C1C,iBAAiB,CAAC,CAAC;cACnBX,kBAAkB,CAAC,CAAC,EAAE,qBAAqB,EAAE,4CAA4C,CAAC;cAC1FtB,SAAS,CAAC3N,QAAQ,GAAG,IAAI;cAACiT,SAAA,CAAA96B,CAAA;cAGlBo6B,aAAa,GAAG,CAAC;cACfC,aAAa,GAAGJ,cAAc,CAAC1tB,GAAG,CAAC,UAAA0oB,IAAI;gBAAA,OAAIA,IAAI,CAACjxB,IAAI,GAAG,sCAAsC;cAAA,EAAC;cAE3FzE,CAAC,GAAG,CAAC;YAAA;cAAA,MAAEA,CAAC,GAAGy6B,aAAa,CAACz5B,MAAM;gBAAAu6B,SAAA,CAAA37B,CAAA;gBAAA;cAAA;cAC9B81B,IAAI,GAAG+E,aAAa,CAACz6B,CAAC,CAAC;cACvB+6B,WAAW,GAAGH,YAAY,CAAC56B,CAAC,CAAC;cAEnC44B,gBAAgB,CAACmC,WAAW,CAAC5gB,EAAE,EAAE;gBAC7Bgc,MAAM,EAAE,WAAW;gBACnBqB,QAAQ,EAAE,CAAC;gBACX/kB,KAAK,EAAE;cACX,CAAC,CAAC;cAEF6kB,gBAAgB,CAAC,YAAY,IAAIt3B,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAGy6B,aAAa,CAACz5B,MAAM,GAAG,iBAAiB,EAAE,cAAc,CAAC;cAACu6B,SAAA,CAAA96B,CAAA;cAAA86B,SAAA,CAAA37B,CAAA;cAAA,OAGpFo5B,oBAAoB,CAACtD,IAAI,EAAEqF,WAAW,CAAC5gB,EAAE,EAAEna,CAAC,EAAEy6B,aAAa,CAACz5B,MAAM,CAAC;YAAA;cAAlFwuB,MAAM,GAAA+L,SAAA,CAAA36B,CAAA;cACNo6B,QAAQ,GAAG,CAAC73B,KAAK,CAACE,OAAO,CAACmsB,MAAM,CAACwL,QAAQ,CAAC,GAAGxL,MAAM,CAACwL,QAAQ,GAAG,EAAE,EAClEhuB,GAAG,CAAC+nB,qBAAqB,CAAC,CAC1BjqB,MAAM,CAAC,UAAAtE,QAAQ;gBAAA,OAAIA,QAAQ,IAAIA,QAAQ,CAACwuB,UAAU;cAAA,EAAC;cAClDiG,MAAM,GAAG93B,KAAK,CAACE,OAAO,CAACmsB,MAAM,CAACyL,MAAM,CAAC,GAAGzL,MAAM,CAACyL,MAAM,GAAG,EAAE;cAEhE,IAAID,QAAQ,CAACh6B,MAAM,GAAG,CAAC,EAAE;gBACrB65B,aAAa,IAAIG,QAAQ,CAACh6B,MAAM;gBAChCw1B,oBAAoB,GAAGA,oBAAoB,CAACpqB,MAAM,CAAC4uB,QAAQ,CAAC;gBAC5DpC,gBAAgB,CAACmC,WAAW,CAAC5gB,EAAE,EAAE;kBAC7Bgc,MAAM,EAAE,UAAU;kBAClBqB,QAAQ,EAAE,GAAG;kBACb/kB,KAAK,EAAE;gBACX,CAAC,CAAC;cACN,CAAC,MAAM;gBACGyoB,oBAAoB,GAAGD,MAAM,CAACj6B,MAAM,GAAG,CAAC,GACxCi6B,MAAM,CAACjuB,GAAG,CAAC,UAAA0uB,KAAK;kBAAA,OAAIA,KAAK,CAACxG,QAAQ,GAAG,IAAI,GAAGwG,KAAK,CAACjpB,KAAK;gBAAA,EAAC,CAACgpB,IAAI,CAAC,KAAK,CAAC,GACpE,wDAAwD;gBAC9D,IAAIR,MAAM,CAACj6B,MAAM,KAAK,CAAC,EAAE;kBACrB85B,aAAa,CAACn2B,IAAI,CAACu2B,oBAAoB,CAAC;gBAC5C;gBACAtC,gBAAgB,CAACmC,WAAW,CAAC5gB,EAAE,EAAE;kBAC7Bgc,MAAM,EAAE,QAAQ;kBAChBqB,QAAQ,EAAE,GAAG;kBACb/kB,KAAK,EAAEyoB;gBACX,CAAC,CAAC;cACN;cAEA,IAAID,MAAM,CAACj6B,MAAM,GAAG,CAAC,EAAE;gBACbm6B,aAAa,GAAGF,MAAM,CAACjuB,GAAG,CAAC,UAAA0uB,KAAK;kBAAA,OAAIA,KAAK,CAACxG,QAAQ,GAAG,IAAI,GAAGwG,KAAK,CAACjpB,KAAK;gBAAA,EAAC,CAACgpB,IAAI,CAAC,KAAK,CAAC;gBAC1FX,aAAa,CAACn2B,IAAI,CAACw2B,aAAa,CAAC;gBACjCvC,gBAAgB,CAACmC,WAAW,CAAC5gB,EAAE,EAAE;kBAC7Bgc,MAAM,EAAE,QAAQ;kBAChBqB,QAAQ,EAAE,GAAG;kBACb/kB,KAAK,EAAE0oB;gBACX,CAAC,CAAC;cACN;cAACI,SAAA,CAAA37B,CAAA;cAAA;YAAA;cAAA27B,SAAA,CAAA96B,CAAA;cAAA46B,GAAA,GAAAE,SAAA,CAAA36B,CAAA;cAEKw6B,YAAY,GAAGC,GAAA,IAASA,GAAA,CAAM1tB,OAAO,GACrC0tB,GAAA,CAAM1tB,OAAO,GACb,kCAAkC;cACxC+D,OAAO,CAACe,KAAK,CAAC,gBAAgB,EAAA4oB,GAAO,CAAC;cACtCP,aAAa,CAACn2B,IAAI,CAAC+wB,IAAI,CAACjxB,IAAI,GAAG,IAAI,GAAG22B,YAAY,CAAC;cACnDxC,gBAAgB,CAACmC,WAAW,CAAC5gB,EAAE,EAAE;gBAC7Bgc,MAAM,EAAE,QAAQ;gBAChBqB,QAAQ,EAAEuD,WAAW,CAACvD,QAAQ,IAAI,CAAC;gBACnC/kB,KAAK,EAAE2oB;cACX,CAAC,CAAC;YAAC;cA5D+Bp7B,CAAC,EAAE;cAAAu7B,SAAA,CAAA37B,CAAA;cAAA;YAAA;cAgE7Ck3B,eAAe,CAAC,CAAC;cAAC,MAEdgE,aAAa,CAAC95B,MAAM,GAAG,CAAC;gBAAAu6B,SAAA,CAAA37B,CAAA;gBAAA;cAAA;cACxBk5B,iBAAiB,CAAC,UAAAb,IAAI;gBAAA,OAAIA,IAAI,CAAC9B,MAAM,KAAK,UAAU;cAAA,EAAC;cACrDmB,gBAAgB,CACZ,CAACuD,aAAa,GAAG,CAAC,GAAI,WAAW,GAAGA,aAAa,GAAG,gBAAgB,GAAI,EAAE,IAAIC,aAAa,CAACW,IAAI,CAAC,KAAK,CAAC,EACvGZ,aAAa,GAAG,CAAC,GAAG,cAAc,GAAG,aAAa,CAAC;cACvDtD,kBAAkB,CAAC,IAAI,CAAC;cAAC,OAAAgE,SAAA,CAAA16B,CAAA;YAAA;cAI7Bi4B,iBAAiB,CAAC;gBAAA,OAAM,IAAI;cAAA,EAAC;cAC7BxB,gBAAgB,CAAC,WAAW,GAAGuD,aAAa,GAAG,eAAe,EAAE,cAAc,CAAC;cAC/EtD,kBAAkB,CAAC,IAAI,CAAC;cAACgE,SAAA,CAAA37B,CAAA;cAAA;YAAA;cAAA27B,SAAA,CAAA96B,CAAA;cAAA66B,GAAA,GAAAC,SAAA,CAAA36B,CAAA;cAEzB8Q,OAAO,CAACe,KAAK,CAAC,gBAAgB,EAAA6oB,GAAO,CAAC;cACtChE,gBAAgB,CAAC,kCAAkC,EAAE,aAAa,CAAC;cACnEC,kBAAkB,CAAC,IAAI,CAAC;YAAC;cAAAgE,SAAA,CAAA96B,CAAA;cAEzBk2B,oBAAoB,GAAG,KAAK;cAC5BV,SAAS,CAAC3N,QAAQ,GAAG,KAAK;cAC1B2N,SAAS,CAAC50B,KAAK,GAAG,EAAE;cAAC,OAAAk6B,SAAA,CAAA/6B,CAAA;YAAA;cAAA,OAAA+6B,SAAA,CAAA16B,CAAA;UAAA;QAAA,GAAA05B,QAAA;MAAA,CAE5B;MAAA,OAAAD,gBAAA,CAAA33B,KAAA,OAAAD,SAAA;IAAA;IAAA,SAEc20B,cAAcA,CAAAsE,GAAA;MAAA,OAAAC,eAAA,CAAAj5B,KAAA,OAAAD,SAAA;IAAA;IAAA,SAAAk5B,gBAAA;MAAAA,eAAA,GAAAn5B,iBAAA,cAAAb,YAAA,GAAAE,CAAA,CAA7B,SAAA+5B,SAA8B7G,UAAU;QAAA,IAAAzF,QAAA,EAAAC,MAAA,EAAAsM,eAAA,EAAAC,GAAA,EAAAC,GAAA;QAAA,OAAAp6B,YAAA,GAAAC,CAAA,WAAAo6B,SAAA;UAAA,kBAAAA,SAAA,CAAAx7B,CAAA,GAAAw7B,SAAA,CAAAr8B,CAAA;YAAA;cAAA,MAChC,CAAC8Q,MAAM,CAACwrB,iBAAiB,IAAI,CAAClH,UAAU,IAAI,CAACnwB,MAAM,CAACosB,OAAO,CAAC,uBAAuB,CAAC;gBAAAgL,SAAA,CAAAr8B,CAAA;gBAAA;cAAA;cAAA,OAAAq8B,SAAA,CAAAp7B,CAAA;YAAA;cAAAo7B,SAAA,CAAAx7B,CAAA;cAAAw7B,SAAA,CAAAr8B,CAAA;cAAA,OAK7DkwB,KAAK,CAACpf,MAAM,CAACwrB,iBAAiB,EAAE;gBACnDC,MAAM,EAAE,MAAM;gBACdC,OAAO,EAAE;kBACL,cAAc,EAAE;gBACpB,CAAC;gBACD1H,IAAI,EAAEviB,IAAI,CAACkqB,SAAS,CAAC;kBACjBvkB,MAAM,EAAEpH,MAAM,CAACoH,MAAM;kBACrBkd,UAAU,EAAEA;gBAChB,CAAC;cACL,CAAC,CAAC;YAAA;cATIzF,QAAQ,GAAA0M,SAAA,CAAAr7B,CAAA;cAAA,IAWT2uB,QAAQ,CAAC+M,EAAE;gBAAAL,SAAA,CAAAr8B,CAAA;gBAAA;cAAA;cAAAm8B,GAAA,GACZrqB,OAAO;cAAAuqB,SAAA,CAAAr8B,CAAA;cAAA,OAA2C2vB,QAAQ,CAACjpB,IAAI,CAAC,CAAC;YAAA;cAAAy1B,GAAA,CAAzDtpB,KAAK,CAAAtR,IAAA,CAAA46B,GAAA,EAAC,4BAA4B,EAAAE,SAAA,CAAAr7B,CAAA;cAC1C02B,gBAAgB,CAAC,4BAA4B,EAAE,aAAa,CAAC;cAAC,OAAA2E,SAAA,CAAAp7B,CAAA;YAAA;cAAAo7B,SAAA,CAAAr8B,CAAA;cAAA,OAI7C2vB,QAAQ,CAAC/e,IAAI,CAAC,CAAC;YAAA;cAA9Bgf,MAAM,GAAAyM,SAAA,CAAAr7B,CAAA;cACNk7B,eAAe,GAAG,CAAC34B,KAAK,CAACE,OAAO,CAACmsB,MAAM,CAAC+M,SAAS,CAAC,GAAG/M,MAAM,CAAC+M,SAAS,GAAG,EAAE,EAC3EvvB,GAAG,CAAC+nB,qBAAqB,CAAC,CAC1BjqB,MAAM,CAAC,UAAAtE,QAAQ;gBAAA,OAAIA,QAAQ,IAAIA,QAAQ,CAACwuB,UAAU;cAAA,EAAC;cAExDwB,oBAAoB,GAAGsF,eAAe,CAAC96B,MAAM,GAAG,CAAC,GAC3C86B,eAAe,GACftF,oBAAoB,CAAC1rB,MAAM,CAAC,UAAAtE,QAAQ;gBAAA,OAAIA,QAAQ,CAACwuB,UAAU,KAAKA,UAAU;cAAA,EAAC;cACjF8B,eAAe,CAAC,CAAC;cACjBQ,gBAAgB,CAAC,mBAAmB,EAAE,cAAc,CAAC;cAAC2E,SAAA,CAAAr8B,CAAA;cAAA;YAAA;cAAAq8B,SAAA,CAAAx7B,CAAA;cAAAu7B,GAAA,GAAAC,SAAA,CAAAr7B,CAAA;cAEtD8Q,OAAO,CAACe,KAAK,CAAC,gBAAgB,EAAAupB,GAAO,CAAC;cACtC1E,gBAAgB,CAAC,4BAA4B,EAAE,aAAa,CAAC;YAAC;cAAA,OAAA2E,SAAA,CAAAp7B,CAAA;UAAA;QAAA,GAAAg7B,QAAA;MAAA,CAErE;MAAA,OAAAD,eAAA,CAAAj5B,KAAA,OAAAD,SAAA;IAAA;IAED,IAAM85B,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAGpgB,KAAK,EAAI;MAC/B,IAAMqgB,aAAa,GAAGrgB,KAAK,CAAC2K,MAAM,CAACyT,KAAK,GAAGr3B,KAAK,CAACC,IAAI,CAACgZ,KAAK,CAAC2K,MAAM,CAACyT,KAAK,CAAC,GAAG,EAAE;MAC9EJ,eAAe,CAACqC,aAAa,CAAC;IAClC,CAAC;IAEDxG,SAAS,CAAChU,gBAAgB,CAAC,QAAQ,EAAEua,iBAAiB,CAAC;IACvDvG,SAAS,CAACnB,eAAe,CAAC,GAAG;MACzBvX,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ;QACX0Y,SAAS,CAACrC,mBAAmB,CAAC,QAAQ,EAAE4I,iBAAiB,CAAC;MAC9D;IACJ,CAAC;IAED1F,eAAe,CAAC,CAAC;IACjBoB,iBAAiB,CAAC,CAAC;IACnBZ,gBAAgB,CAAC,IAAI,CAAC;IACtBC,kBAAkB,CAAC,IAAI,CAAC;IAExB,OAAOtB,SAAS,CAACnB,eAAe,CAAC;EACrC;EAEA,SAASd,kBAAkBA,CAACC,OAAO,EAAEC,aAAa,EAAEC,WAAW,EAAE;IAC7D,IAAMC,QAAQ,GAAGH,OAAO,CAAC/U,YAAY,CAACgV,aAAa,CAAC;IACpD,IAAI,CAACE,QAAQ,EAAE;MACX,OAAO,IAAI;IACf;IAEA,IAAI;MACA,OAAOjiB,IAAI,CAACC,KAAK,CAACgiB,QAAQ,CAAC;IAC/B,CAAC,CAAC,OAAO3hB,KAAK,EAAE;MACZf,OAAO,CAACe,KAAK,CAAC,kBAAkB,GAAG0hB,WAAW,GAAG,QAAQ,EAAE1hB,KAAK,CAAC;MACjE,OAAO,IAAI;IACf;EACJ;EAEA,SAAS4hB,qBAAqBA,CAACJ,OAAO,EAAE;IACpC,IAAI,CAACA,OAAO,IAAIA,OAAO,CAACtM,OAAO,CAAC+U,yCAAyC,KAAK,MAAM,EAAE;MAClF,OAAOzI,OAAO,GAAGA,OAAO,CAACa,eAAe,CAAC,IAAI,IAAI,GAAG,IAAI;IAC5D;IAEA,IAAMpkB,MAAM,GAAGsjB,kBAAkB,CAACC,OAAO,EAAE,+CAA+C,EAAE,0CAA0C,CAAC;IACvI,IAAI,CAACvjB,MAAM,EAAE;MACT,OAAO,IAAI;IACf;IAEA,IAAMmnB,KAAK,GAAGzkB,UAAU,CAAC1C,MAAM,CAAC;IAChC,IAAI,CAACmnB,KAAK,EAAE;MACR,OAAO,IAAI;IACf;IAEA5D,OAAO,CAACtM,OAAO,CAAC+U,yCAAyC,GAAG,MAAM;IAElE,OAAO7E,KAAK;EAChB;EAEA,SAASrD,yBAAyBA,CAAC3tB,IAAI,EAAE;IACrC,IAAI,CAACA,IAAI,IAAI,OAAOA,IAAI,CAAC0Y,gBAAgB,KAAK,UAAU,EAAE;MACtD;IACJ;IAEA,IAAI,OAAO1Y,IAAI,CAACG,OAAO,KAAK,UAAU,IAAIH,IAAI,CAACG,OAAO,CAAC,iDAAiD,CAAC,EAAE;MACvGqtB,qBAAqB,CAACxtB,IAAI,CAAC;IAC/B;IAEAA,IAAI,CAAC0Y,gBAAgB,CAAC,iDAAiD,CAAC,CAAC3X,OAAO,CAACysB,qBAAqB,CAAC;EAC3G;EAEA,SAASI,uBAAuBA,CAAA,EAAG;IAC/BD,yBAAyB,CAAChuB,QAAQ,CAAC;IAEnC,IAAI,OAAOiB,gBAAgB,KAAK,WAAW,EAAE;MACzC;IACJ;IAEA,IAAMC,QAAQ,GAAG,IAAID,gBAAgB,CAAC,UAAAE,SAAS,EAAI;MAC/CA,SAAS,CAACC,OAAO,CAAC,UAAAC,QAAQ,EAAI;QAC1BA,QAAQ,CAACC,UAAU,CAACF,OAAO,CAAC,UAAAL,IAAI,EAAI;UAChC,IAAIA,IAAI,IAAIA,IAAI,CAACT,QAAQ,KAAK,CAAC,EAAE;YAC7B0tB,yBAAyB,CAACjtB,IAAI,CAAC;UACnC;QACJ,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC;IAEFG,QAAQ,CAACK,OAAO,CAACvB,QAAQ,CAACkuB,IAAI,EAAE;MAC5B1sB,SAAS,EAAE,IAAI;MACfC,OAAO,EAAE;IACb,CAAC,CAAC;EACN;EAEA,IAAIzB,QAAQ,CAACmuB,UAAU,KAAK,SAAS,EAAE;IACnCnuB,QAAQ,CAACyb,gBAAgB,CAAC,kBAAkB,EAAEwS,uBAAuB,EAAE;MAAEG,IAAI,EAAE;IAAK,CAAC,CAAC;EAC1F,CAAC,MAAM;IACHH,uBAAuB,CAAC,CAAC;EAC7B;EAEA,OAAO;IACHrhB,UAAU,EAAEA,UAAU;IACtBihB,qBAAqB,EAAEA;EAC3B,CAAC;AACL,CAAC,CAAC,CAAC;;AAEH;AACA7tB,QAAQ,CAACyb,gBAAgB,CAAC,OAAO,EAAE,UAAUziB,CAAC,EAAE;EAC5C,IAAMksB,GAAG,GAAGlsB,CAAC,CAACunB,MAAM,CAACW,OAAO,CAAC,qBAAqB,CAAC;EACnD,IAAI,CAACgE,GAAG,EAAE;IACN;EACJ;EACA,IAAMjc,OAAO,GAAGic,GAAG,CAACxM,YAAY,CAAC,eAAe,CAAC;EACjD,IAAM3N,MAAM,GAAG9B,OAAO,GAAGjJ,QAAQ,CAACgL,cAAc,CAAC/B,OAAO,CAAC,GAAG,IAAI;EAChE,IAAI,CAAC8B,MAAM,EAAE;IACTG,OAAO,CAACe,KAAK,CAAC,yBAAyB,EAAEhD,OAAO,CAAC;IACjD;EACJ;EACA,IAAMnG,IAAI,GAAG9C,QAAQ,CAACC,aAAa,CAAC,GAAG,CAAC;EACxC6C,IAAI,CAACqzB,QAAQ,GAAG,QAAQ,GAAGltB,OAAO,GAAG,MAAM;EAC3CnG,IAAI,CAACgF,IAAI,GAAGiD,MAAM,CAACqrB,SAAS,CAAC,WAAW,CAAC;EACzCtzB,IAAI,CAAC6hB,KAAK,CAAC,CAAC;AAChB,CAAC,CAAC;;AAEF;AACA3kB,QAAQ,CAACyb,gBAAgB,CAAC,OAAO,EAAE,UAAUziB,CAAC,EAAE;EAC5C,IAAM8J,IAAI,GAAG9J,CAAC,CAACunB,MAAM,CAACW,OAAO,CAAC,oBAAoB,CAAC;EACnD,IAAI,CAACpe,IAAI,EAAE;IACP;EACJ;EAEA,IAAMusB,SAAS,GAAGvsB,IAAI,CAACoe,OAAO,CAAC,4BAA4B,CAAC;EAC5D,IAAMmV,GAAG,GAAGhH,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAE5uB,aAAa,CAAC,KAAK,CAAC;EAC3C,IAAI,CAAC41B,GAAG,EAAE;IACN;EACJ;EAEA,IAAM3tB,GAAG,GAAG2tB,GAAG,CAAC3tB,GAAG;EACnB,IAAI,CAACA,GAAG,IAAI,CAACA,GAAG,CAAC4tB,UAAU,CAAC,OAAO,CAAC,EAAE;IAClC,OAAO,CAAC;EACZ;EAEAt9B,CAAC,CAACgsB,cAAc,CAAC,CAAC;EAElBsE,KAAK,CAAC5gB,GAAG,CAAC,CACL1M,IAAI,CAAC,UAAUu6B,GAAG,EAAE;IAAE,OAAOA,GAAG,CAACrb,IAAI,CAAC,CAAC;EAAE,CAAC,CAAC,CAC3Clf,IAAI,CAAC,UAAUkf,IAAI,EAAE;IAClB,IAAMxb,GAAG,GAAG2b,GAAG,CAACC,eAAe,CAACJ,IAAI,CAAC;IACrC,IAAM7gB,CAAC,GAAG2F,QAAQ,CAACC,aAAa,CAAC,GAAG,CAAC;IACrC5F,CAAC,CAACyN,IAAI,GAAGpI,GAAG;IACZrF,CAAC,CAAC87B,QAAQ,GAAGrzB,IAAI,CAAC4V,YAAY,CAAC,UAAU,CAAC,IAAI,qBAAqB;IACnE1Y,QAAQ,CAACkuB,IAAI,CAACjE,WAAW,CAAC5vB,CAAC,CAAC;IAC5BA,CAAC,CAACsqB,KAAK,CAAC,CAAC;IACT3kB,QAAQ,CAACkuB,IAAI,CAACsI,WAAW,CAACn8B,CAAC,CAAC;IAC5B6lB,UAAU,CAAC,YAAY;MAAE7E,GAAG,CAACK,eAAe,CAAChc,GAAG,CAAC;IAAE,CAAC,EAAE,GAAG,CAAC;EAC9D,CAAC,CAAC,SACI,CAAC,UAAUuG,GAAG,EAAE;IAAEiF,OAAO,CAACe,KAAK,CAAC,2BAA2B,EAAEhG,GAAG,CAAC;EAAE,CAAC,CAAC;AACnF,CAAC,CAAC","file":"chat-interaction.js","sourcesContent":["window.chatInteractionManager = function () {\n\n // Defaults (can be overridden by instanceConfig)\n var defaultConfig = {\n // UI defaults for generated media\n generatedImageAltText: 'Generated Image',\n generatedImageMaxWidth: 400,\n downloadImageTitle: 'Download image',\n downloadChartTitle: 'Download chart as image',\n downloadChartButtonText: 'Download',\n codeCopiedText: 'Copied!',\n copyTitle: 'Click here to copy response to clipboard.',\n copiedTitle: 'Response copied to clipboard.',\n copyResetDelayMs: 2000,\n assistantLabel: 'Assistant',\n\n messageTemplate: `\n
\n
\n
\n
You
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n
    \n
  1. \n {{ citation.label }}\n {{ citation.label }}\n
  2. \n
\n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n `,\n indicatorTemplate: `\n
\n \n Assistant\n
\n `,\n // Localizable strings\n untitledText: 'Untitled',\n clearHistoryTitle: 'Clear History',\n clearHistoryMessage: 'Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.',\n clearHistoryOkText: 'Yes',\n clearHistoryCancelText: 'Cancel'\n };\n\n // Sanitize URLs to prevent javascript: protocol injection.\n function sanitizeUrl(url) {\n if (!url) return '';\n var trimmed = url.trim();\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\n return '';\n }\n return url;\n }\n\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\n function escapeHtmlEntities(text) {\n var span = document.createElement('span');\n span.textContent = text;\n return span.innerHTML;\n }\n\n function containsFontAwesomePlaceholders(root) {\n if (!root || root.nodeType !== 1) {\n return false;\n }\n\n var selector = 'i[class*=\"fa-\"],i.fa,i.fas,i.far,i.fab';\n if (typeof root.matches === 'function' && root.matches(selector)) {\n return true;\n }\n\n return typeof root.querySelector === 'function' && !!root.querySelector(selector);\n }\n\n function refreshFontAwesomeIcons(root) {\n var fontAwesome = window.FontAwesome;\n if (!containsFontAwesomePlaceholders(root) || !fontAwesome || !fontAwesome.dom || typeof fontAwesome.dom.i2svg !== 'function') {\n return;\n }\n\n fontAwesome.dom.i2svg({ node: root });\n }\n\n function observeFontAwesomeIcons(root) {\n if (!root || typeof MutationObserver === 'undefined') {\n return null;\n }\n\n var observer = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n mutation.addedNodes.forEach(function (node) {\n refreshFontAwesomeIcons(node);\n });\n });\n });\n\n observer.observe(root, {\n childList: true,\n subtree: true\n });\n\n return observer;\n }\n\n function normalizeReference(reference) {\n if (!reference || typeof reference !== 'object') {\n return null;\n }\n\n const normalized = Object.assign({}, reference);\n normalized.index = normalized.index ?? normalized.Index ?? 0;\n normalized.text = normalized.text ?? normalized.Text ?? null;\n normalized.title = normalized.title ?? normalized.Title ?? null;\n normalized.link = sanitizeUrl(normalized.link ?? normalized.Link ?? null);\n normalized.referenceType = normalized.referenceType ?? normalized.ReferenceType ?? null;\n normalized.isGenerated = (normalized.isGenerated ?? normalized.IsGenerated) === true;\n\n return normalized;\n }\n\n function isDownloadCitationReference(reference) {\n if (!reference || typeof reference !== 'object') {\n return false;\n }\n\n if (typeof reference.referenceType === 'string' && reference.referenceType.toLowerCase() === 'document') {\n return true;\n }\n\n if (typeof reference.link === 'string' && /\\/ai\\/documents\\/.+\\/download(?:$|\\?)/i.test(reference.link)) {\n return true;\n }\n\n return false;\n }\n\n function normalizeReferences(references) {\n if (!references || typeof references !== 'object') {\n return {};\n }\n\n const normalized = {};\n\n for (const [key, value] of Object.entries(references)) {\n normalized[key] = normalizeReference(value) ?? {};\n }\n\n return normalized;\n }\n\n function getCitationLabel(reference, key) {\n return reference.title || reference.text || key;\n }\n\n function buildCitationDisplay(content, references) {\n let processedContent = (content || '').trim();\n const messageReferences = normalizeReferences(references);\n const referenceEntries = Object.entries(messageReferences);\n\n if (!referenceEntries.length) {\n return { content: processedContent, citations: [] };\n }\n\n const citedRefs = referenceEntries.filter(([key]) => processedContent.includes(key));\n const generatedRefs = referenceEntries.filter(([key, value]) => value.isGenerated && !processedContent.includes(key));\n\n if (!citedRefs.length && !generatedRefs.length) {\n return { content: processedContent, citations: [] };\n }\n\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n generatedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n const citations = [];\n let displayIndex = 1;\n\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${displayIndex}_${value.index || displayIndex}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n citations.push({\n referenceKey: key,\n displayIndex: displayIndex,\n label: getCitationLabel(value, key),\n link: value.link || null,\n isDownload: isDownloadCitationReference(value),\n placeholder: placeholder,\n });\n\n displayIndex++;\n }\n\n for (const citation of citations) {\n processedContent = processedContent.replaceAll(citation.placeholder, `${citation.displayIndex}`);\n }\n\n processedContent = processedContent.replaceAll('', ',');\n\n // Generated files (such as exported tabular data) are always offered as a download even when\n // the model does not cite them inline, so the user never loses access to the produced file.\n for (const [key, value] of generatedRefs) {\n citations.push({\n referenceKey: key,\n displayIndex: displayIndex,\n label: getCitationLabel(value, key),\n link: value.link || null,\n isDownload: true,\n placeholder: null,\n });\n\n displayIndex++;\n }\n\n return {\n content: processedContent,\n citations: citations.map(({ placeholder, ...citation }) => citation),\n };\n }\n\n function buildCopyContent(content, citations) {\n let copyContent = (content || '').trim();\n\n if (!copyContent || !Array.isArray(citations) || citations.length === 0) {\n return copyContent;\n }\n\n for (const citation of citations) {\n copyContent = copyContent.replaceAll(citation.referenceKey, `[${citation.displayIndex}]`);\n }\n\n copyContent += '\\n\\nReferences:\\n';\n\n for (const citation of citations) {\n copyContent += `${citation.displayIndex}. ${citation.label}`;\n\n if (citation.link) {\n copyContent += ` - ${citation.link}`;\n }\n\n copyContent += '\\n';\n }\n\n return copyContent.trimEnd();\n }\n\n function updateMessagePresentation(message, references) {\n const messageReferences = normalizeReferences(references ?? message.references);\n const rawContent = typeof message.rawContent === 'string'\n ? message.rawContent\n : typeof message.content === 'string'\n ? message.content\n : '';\n const citationDisplay = buildCitationDisplay(rawContent, messageReferences);\n\n message.rawContent = rawContent;\n message.content = rawContent;\n message.displayContent = citationDisplay.content;\n message.references = messageReferences;\n message.citationReferences = citationDisplay.citations;\n message.copyContent = buildCopyContent(rawContent, citationDisplay.citations);\n message.htmlContent = parseMarkdownContent(citationDisplay.content, message);\n\n return message;\n }\n\n const renderer = new marked.Renderer();\n\n // Modify the link rendering to open in a new tab\n renderer.link = function (data) {\n var href = sanitizeUrl(data.href);\n if (!href) return data.text || '';\n return `${data.text}`;\n };\n\n // Custom code block renderer with highlight.js integration and copy button.\n renderer.code = function (data) {\n var code = data.text || '';\n var lang = (data.lang || '').trim();\n var highlighted = code;\n\n if (typeof hljs !== 'undefined') {\n if (lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(code, { language: lang }).value;\n } catch (_) { }\n } else {\n try {\n highlighted = hljs.highlightAuto(code).value;\n } catch (_) { }\n }\n } else {\n highlighted = escapeHtmlEntities(code);\n }\n\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\n return `
${langDisplay}
${highlighted}
`;\n };\n\n // Custom image renderer for generated images with thumbnail styling and download button.\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\n renderer.image = function (data) {\n const src = sanitizeUrl(data.href);\n if (!src) return '';\n const alt = data.text || defaultConfig.generatedImageAltText;\n const maxWidth = defaultConfig.generatedImageMaxWidth;\n return `
\n \"${alt}\"\n
\n \n \n \n
\n
`;\n };\n\n // Chart counter for unique IDs\n let chartCounter = 0;\n\n // Collector for charts discovered during marked parsing.\n let _pendingCharts = [];\n\n // Global chart config map shared with ai-chat.js\n window.__chartConfigs = window.__chartConfigs || {};\n\n function createChartHtml(chartId) {\n return `
`\n + ``\n + `
`\n + `
`\n + ``\n + `
`;\n }\n\n // Register [chart:{...json...}] as a native marked block extension so the\n // markdown parser handles chart markers inline with surrounding text.\n marked.use({\n extensions: [{\n name: 'chart',\n level: 'block',\n start(src) {\n const idx = src.indexOf('[chart:');\n return idx >= 0 ? idx : undefined;\n },\n tokenizer(src) {\n const extracted = tryExtractChartMarker(src);\n if (!extracted || extracted.startIndex !== 0) {\n return undefined;\n }\n\n const chartId = `chat_chart_${++chartCounter}`;\n\n return {\n type: 'chart',\n raw: src.substring(0, extracted.endIndex),\n chartId: chartId,\n json: extracted.json,\n };\n },\n renderer(token) {\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\n window.__chartConfigs[token.chartId] = token.json;\n return createChartHtml(token.chartId);\n }\n }]\n });\n\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\n function tryExtractChartMarker(text) {\n const token = '[chart:';\n const start = text.indexOf(token);\n if (start < 0) {\n return null;\n }\n\n // Find JSON object boundary by balancing braces\n const jsonStart = start + token.length;\n let i = jsonStart;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\n i++;\n }\n\n if (i >= text.length || text[i] !== '{') {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n\n if (inString) {\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\') {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) {\n const jsonEnd = i;\n // Expect closing bracket after JSON\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\n if (closeBracketIndex < 0) {\n return null;\n }\n\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\n return {\n startIndex: start,\n endIndex: closeBracketIndex + 1,\n json: json\n };\n }\n }\n }\n\n return null;\n }\n\n function renderChartsInMessage(message) {\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\n return;\n }\n\n // Copy and clear pending charts immediately to prevent duplicate renders.\n const charts = [...message._pendingCharts];\n message._pendingCharts = [];\n\n // Defer to requestAnimationFrame so the browser has fully laid out the\n // canvas elements before Chart.js reads their dimensions.\n requestAnimationFrame(() => {\n for (const c of charts) {\n const canvas = document.getElementById(c.chartId);\n if (!canvas) {\n continue;\n }\n\n if (typeof Chart === 'undefined') {\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n continue;\n }\n\n // When the canvas is inside a hidden container (e.g., display:none),\n // it has zero dimensions. Keep the config for later rendering.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[c.chartId] = c.config;\n continue;\n }\n\n try {\n // Destroy existing chart instance if re-rendering\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n } catch (e) {\n console.error('Error creating chart:', e);\n }\n }\n });\n }\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n function compactObject(source) {\n if (!source || typeof source !== 'object') {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(source).filter(([, value]) => value !== undefined)\n );\n }\n\n const initialize = (instanceConfig) => {\n const config = Object.assign({}, defaultConfig, compactObject(instanceConfig));\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isInteractionStarted: false,\n isPlaceholderVisible: true,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n prompt: '',\n initialFieldValues: new Map(),\n settingsDirty: false,\n saveSettingsTimeout: null,\n saveIndicatorTimeout: null,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n currentAudioUrl: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2),\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n // Realtime (speech-to-speech) controller from the shared CoreAIRealtime module.\n realtimeController: null,\n notifications: [],\n notificationDismissTimers: {},\n copyTitle: config.copyTitle,\n copiedTitle: config.copiedTitle,\n copiedMessageIndex: -1,\n copyResetTimeoutId: null,\n activeCopyButton: null,\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadInteraction\", (data) => {\n this.initializeInteraction(data.itemId, true);\n this.messages = [];// Update the title field if it exists\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && data.title) {\n titleInput.value = data.title;\n }\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n });\n\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\n // Update the history list item if it exists\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\n if (historyItem) {\n historyItem.textContent = title || config.untitledText;\n }\n\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && title) {\n titleInput.value = title;\n }\n\n this.showSaveIndicator('Saved', 'text-success');\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n this.showSaveIndicator('Save failed', 'text-danger');\n\n if (this.isRecording) {\n this.stopRecording();\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, turnId, text) => {\n // Realtime: a placeholder for this turn was already inserted in the right position when\n // the utterance was captured (see onUserTurnPending), so just fill in its text.\n if (turnId && this._realtimePendingTurns && this._realtimePendingTurns[turnId]) {\n var pending = this._realtimePendingTurns[turnId];\n delete this._realtimePendingTurns[turnId];\n this.stopAudio();\n if (text) {\n pending.content = text;\n pending.rawContent = text;\n pending.isPartial = false;\n updateMessagePresentation(pending, pending.references);\n } else {\n var emptyIndex = this.messages.indexOf(pending);\n if (emptyIndex >= 0) { this.messages.splice(emptyIndex, 1); }\n }\n\n return;\n }\n\n if (text) {\n this.stopAudio();\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else if (this._conversationAssistantMessage) {\n // Realtime: the user's transcript lags the assistant's reply for the SAME turn (the\n // model answers the audio before speech-to-text finishes). Insert the user message\n // just before the streaming assistant message so the order stays You -> Assistant,\n // and keep that message streaming — ending it here split one reply into two bubbles.\n var at = this._conversationAssistantMessage.index;\n var userMsg = { role: 'user', content: text, rawContent: text, references: {} };\n updateMessagePresentation(userMsg, userMsg.references);\n this.messages.splice(at, 0, userMsg);\n this._conversationAssistantMessage.index = at + 1;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, references, appearance) => {\n // A new response id means a new turn — finalize the previous assistant message so two replies\n // never merge into one bubble (also covers barge-in, which starts a fresh response).\n if (this._conversationAssistantMessage && this._conversationAssistantResponseId && responseId && this._conversationAssistantResponseId !== responseId) {\n var prev = this.messages[this._conversationAssistantMessage.index];\n if (prev) { prev.isStreaming = false; }\n this._conversationAssistantMessage = null;\n }\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n appearance: this.normalizeAssistantAppearance(appearance),\n references: {},\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n this._conversationAssistantResponseId = responseId;\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.rawContent = this._conversationAssistantMessage.content;\n msg.references = normalizeReferences(Object.assign({}, msg.references || {}, references || {}));\n updateMessagePresentation(msg, msg.references);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId, references) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n msg.references = normalizeReferences(Object.assign({}, msg.references || {}, references || {}));\n updateMessagePresentation(msg, msg.references);\n }\n this._conversationAssistantMessage = null;\n this._conversationAssistantResponseId = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n // Realtime PCM streams straight to the low-latency player; other formats (TTS) are buffered.\n if (contentType === 'audio/pcm' && this.realtimeController) {\n this.realtimeController.receivePcm(bytes);\n } else {\n this.audioChunks.push(bytes);\n }\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"HistoryCleared\", (itemId) => {\n // Clear messages and show placeholder\n this.messages = [];\n this.showPlaceholder();\n\n // Hide the clear history button since there's no history now\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.add('d-none');\n }\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n this.reloadCurrentInteraction();\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n if (message.content) {\n message.rawContent = message.rawContent ?? message.content;\n updateMessagePresentation(message, message.references);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n async sendMessage() {\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // Flush any pending settings save before sending a message\n // to prevent concurrent hub calls that can cause database deadlocks.\n await this.flushPendingSave();\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n // Show the clear history button since we now have prompts\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.remove('d-none');\n }\n\n this.streamMessage(trimmedPrompt);\n this.inputElement.value = '';\n this.prompt = '';\n },\n streamMessage(trimmedPrompt) {\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n var messageIndex = this.messages.length;\n var currentItemId = this.getItemId();\n\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n if (chunk.sessionId && !currentItemId) {\n this.setItemId(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n messageIndex = this.messages.length;\n let newMessage = {\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n };\n\n this.messages.push(newMessage);\n message = newMessage;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = normalizeReference(value) ?? {};\n }\n }\n\n if (chunk.content) {\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n content += chunk.content;\n }\n\n message.rawContent = content;\n updateMessagePresentation(message, references);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n return {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n },\n processReferences(references, messageIndex) {\n references = normalizeReferences(references);\n\n if (Object.keys(references).length) {\n let message = this.messages[messageIndex];\n message.rawContent = message.rawContent ?? message.content ?? '';\n updateMessagePresentation(message, references);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Save any settings that were deferred during streaming.\n if (this.settingsDirty) {\n this.debouncedSaveSettings();\n }\n },\n handleExternalTtsStop(e) {\n if (e?.detail?.sourceId === this.ttsInstanceId) {\n return;\n }\n\n this.stopAudio(false);\n },\n updateTtsPlaybackButtons() {\n if (!this.chatContainer) {\n return;\n }\n\n var buttons = this.chatContainer.querySelectorAll('[data-tts-message-index]');\n\n buttons.forEach(button => {\n var buttonIndex = Number(button.getAttribute('data-tts-message-index'));\n var isPlaying = buttonIndex === this.ttsPlayingMessageIndex;\n var iconHtml = isPlaying\n ? ''\n : '';\n\n button.classList.toggle('tts-playing', isPlaying);\n button.setAttribute('title', isPlaying ? 'Pause audio' : 'Read aloud');\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n });\n },\n updateCopyButtons() {\n if (!this.chatContainer) {\n return;\n }\n\n var buttons = this.chatContainer.querySelectorAll('[data-copy-message-index]');\n\n buttons.forEach(button => {\n var buttonIndex = Number(button.getAttribute('data-copy-message-index'));\n var isCopied = buttonIndex === this.copiedMessageIndex;\n var iconHtml = isCopied\n ? ''\n : '';\n\n button.classList.toggle('text-success', isCopied);\n button.classList.toggle('text-secondary', !isCopied);\n button.setAttribute('title', isCopied ? this.copiedTitle : this.copyTitle);\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n });\n },\n setCopyButtonState(button, isCopied) {\n if (!button) {\n return;\n }\n\n var iconHtml = isCopied\n ? ''\n : '';\n\n button.classList.toggle('text-success', isCopied);\n button.classList.toggle('text-secondary', !isCopied);\n button.setAttribute('title', isCopied ? this.copiedTitle : this.copyTitle);\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio(false);\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\n detail: { sourceId: this.ttsInstanceId }\n }));\n this.ttsPlayingMessageIndex = index;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is currently playing, queue this blob for later.\n if (this.isPlayingAudio && this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioUrl = url;\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n const nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n if (this.currentAudioUrl) {\n URL.revokeObjectURL(this.currentAudioUrl);\n this.currentAudioUrl = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var itemId = this.getItemId();\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, continuation is handled\n // by the persistent stream.\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getItemId() {\n return this.inputElement.getAttribute('data-interaction-id')\n || this.inputElement.getAttribute('data-item-id');\n },\n getSaveIndicatorElement() {\n if (config.saveIndicatorElementSelector) {\n return document.querySelector(config.saveIndicatorElementSelector);\n }\n\n return document.querySelector('[data-chat-interaction-save-indicator]');\n },\n showSaveIndicator(text, className) {\n const indicator = this.getSaveIndicatorElement();\n if (!indicator) {\n return;\n }\n\n indicator.textContent = text || '';\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\n\n if (this.saveIndicatorTimeout) {\n clearTimeout(this.saveIndicatorTimeout);\n this.saveIndicatorTimeout = null;\n }\n\n if (!text) {\n return;\n }\n\n this.saveIndicatorTimeout = setTimeout(() => {\n indicator.textContent = '';\n this.saveIndicatorTimeout = null;\n }, 3000);\n },\n clearPendingSettingsSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n },\n getFieldLabel(input) {\n const label = input\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\n ?.querySelector('label');\n\n if (!label) {\n return input.dataset.setting || 'This field';\n }\n\n return (label.textContent || '')\n .replace(/\\s+/g, ' ')\n .trim()\n || input.dataset.setting\n || 'This field';\n },\n getValidationFeedbackElement(input) {\n let feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n return feedback;\n }\n\n feedback = document.createElement('div');\n feedback.className = 'invalid-feedback';\n input.insertAdjacentElement('afterend', feedback);\n\n return feedback;\n },\n clearSettingValidationError(input) {\n input.classList.remove('is-invalid');\n input.removeAttribute('aria-invalid');\n\n const feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n feedback.textContent = '';\n }\n },\n setSettingValidationError(input, message) {\n const feedback = this.getValidationFeedbackElement(input);\n input.classList.add('is-invalid');\n input.setAttribute('aria-invalid', 'true');\n feedback.textContent = message;\n },\n getSettingValidationMessage(input) {\n if (!input || input.disabled || input.type !== 'number') {\n return null;\n }\n\n const value = (input.value || '').trim();\n if (!value) {\n return null;\n }\n\n const number = Number(value);\n const fieldLabel = this.getFieldLabel(input);\n\n if (Number.isNaN(number)) {\n return `${fieldLabel} must be a valid number.`;\n }\n\n const min = input.getAttribute('min');\n if (min !== null && number < Number(min)) {\n return `${fieldLabel} must be ${min} or greater.`;\n }\n\n const max = input.getAttribute('max');\n if (max !== null && number > Number(max)) {\n return `${fieldLabel} must be ${max} or less.`;\n }\n\n return null;\n },\n validateSettingInput(input) {\n const message = this.getSettingValidationMessage(input);\n if (!message) {\n this.clearSettingValidationError(input);\n return true;\n }\n\n this.setSettingValidationError(input, message);\n return false;\n },\n validateSettings() {\n let isValid = true;\n\n this.getSettingInputs().forEach(input => {\n isValid = this.validateSettingInput(input) && isValid;\n });\n\n return isValid;\n },\n queueSettingsSave() {\n if (!this.validateSettings()) {\n this.clearPendingSettingsSave();\n this.settingsDirty = false;\n this.showSaveIndicator('Fix errors', 'text-danger');\n return;\n }\n\n this.settingsDirty = true;\n this.showSaveIndicator('Saving...', 'text-warning');\n this.debouncedSaveSettings();\n },\n getSettingInputs() {\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\n if (explicitInputs.length > 0) {\n return explicitInputs;\n }\n\n return document.querySelectorAll(\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\n );\n },\n getSelectedGroupValues(groupName, fallbackSelector) {\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked, .capability-checkbox[data-group=\"${groupName}\"]:checked`);\n if (explicitSelections.length > 0) {\n const values = [];\n\n explicitSelections.forEach(checkbox => {\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\n if (value) {\n values.push(value);\n }\n });\n\n return values;\n }\n\n if (!fallbackSelector) {\n return [];\n }\n\n const values = [];\n const checkboxes = document.querySelectorAll(fallbackSelector);\n\n checkboxes.forEach(checkbox => {\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\n\n if (hiddenInput && hiddenInput.value) {\n values.push(hiddenInput.value);\n }\n });\n\n return values;\n },\n getPromptTemplateSelections() {\n const promptTemplates = [];\n\n document.querySelectorAll('.prompt-template-card').forEach(card => {\n const templateIdInput = card.querySelector('.prompt-template-id-input');\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\n\n if (!templateId) {\n return;\n }\n\n promptTemplates.push({\n templateId: templateId,\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\n });\n });\n\n return promptTemplates;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n // Replace existing notification with same type, or add new one.\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var itemId = this.getItemId();\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\n .catch(err => console.error('Failed to handle notification action:', err));\n },\n setItemId(itemId) {\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\n this.inputElement.setAttribute('data-item-id', itemId || '');\n },\n resetInteraction() {\n this.setItemId('');\n this.isInteractionStarted = false;\n this.messages = [];\n this.showPlaceholder();\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keyup', event => {\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.inputElement.addEventListener('paste', (e) => {\n // Use setTimeout to allow the paste to complete before checking the value\n setTimeout(() => {\n this.prompt = this.inputElement.value;\n if (this.inputElement.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n }, 0);\n });\n\n this.buttonElement.addEventListener('click', () => {\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\n\n for (var i = 0; i < chatInteractionItems.length; i++) {\n chatInteractionItems[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var itemId = e.target.getAttribute('data-interaction-id');\n\n if (!itemId) {\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\n return;\n }\n\n this.loadInteraction(itemId);\n });\n }\n\n const initialMessages = Array.isArray(config.messages) ? config.messages : [];\n\n for (let i = 0; i < initialMessages.length; i++) {\n this.addMessage(initialMessages[i]);\n }\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n document.addEventListener('input', event => {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('change', event => {\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .capability-checkbox[data-group], .group-toggle, .ci-agent-global-toggle')) {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n }\n\n this.queueSettingsSave();\n return;\n }\n\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('click', event => {\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\n return;\n }\n\n setTimeout(() => {\n this.queueSettingsSave();\n }, 0);\n });\n\n // Add event listener for clear history button\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.addEventListener('click', () => {\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\n if (itemId) {\n this.clearHistory(itemId);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n\n // Initialize realtime (speech-to-speech) mode via the shared CoreAIRealtime module. The\n // module owns the mic capture, playback, echo guard, push-to-talk and audio settings; the\n // callbacks below plug it into this app's connection and conversation-transcript display.\n if (window.CoreAIRealtime && config.realtimeButtonElementSelector) {\n this.realtimeController = window.CoreAIRealtime.attach({\n connection: this.connection,\n ensureConnected: () => Promise.resolve(this.connection),\n sendStart: (subject, voice, language, silenceMs, vadThreshold, allowInterruption) => {\n this.connection.send('StartRealtimeConversation', this.getItemId(), subject, voice, language, silenceMs, vadThreshold, allowInterruption);\n },\n // Prefer WebRTC (server-relay) when the server advertises it; the shared module falls back\n // to the WebSocket sendStart above if the peer cannot connect.\n webRtcEnabled: config.realtimeWebRtcEnabled === true,\n sendStartWebRtc: (offerSdp, voice, language, silenceMs, vadThreshold, allowInterruption) => {\n this.connection.send('StartRealtimeWebRtc', this.getItemId(), offerSdp, voice, language, silenceMs, vadThreshold, allowInterruption);\n },\n webRtcIceServers: Array.isArray(config.realtimeWebRtcIceServers) ? config.realtimeWebRtcIceServers : undefined,\n voiceName: config.realtimeVoiceName || '',\n getVoiceName: () => {\n var el = config.realtimeVoiceSelectElementSelector ? document.querySelector(config.realtimeVoiceSelectElementSelector) : null;\n return el ? el.value : '';\n },\n capableDeployments: config.realtimeCapableDeployments || [],\n realtimeEnabled: config.realtimeEnabled === true,\n selectors: {\n realtimeButton: config.realtimeButtonElementSelector,\n input: config.inputElementSelector,\n sendButton: config.sendButtonElementSelector,\n micButton: config.micButtonElementSelector,\n conversationButton: config.conversationButtonElementSelector,\n deploymentSelect: config.deploymentSelectElementSelector\n },\n onActivate: () => {\n this.isConversationMode = true;\n this._conversationPartialMessage = null;\n this._conversationAssistantMessage = null;\n },\n onDeactivate: () => {\n this.isConversationMode = false;\n if (this._conversationAssistantMessage) {\n var m = this.messages[this._conversationAssistantMessage.index];\n if (m) { m.isStreaming = false; }\n this._conversationAssistantMessage = null;\n }\n },\n onEnterRealtimeMode: () => {\n if (this.isRecording) { this.stopRecording(); }\n if (this.isConversationMode && (!this.realtimeController || !this.realtimeController.isActive())) { this.stopConversationMode(); }\n },\n // The utterance has been captured but not transcribed yet. Showing a placeholder now\n // puts the prompt above the reply it produces: transcription lags the spoken answer, so\n // a bubble added only when the text arrives lands underneath its own reply.\n onUserTurnPending: (turnId) => {\n if (!turnId) { return; }\n var placeholder = { role: 'user', content: '', rawContent: '', references: {}, isPartial: true };\n updateMessagePresentation(placeholder, placeholder.references);\n this._realtimePendingTurns = this._realtimePendingTurns || {};\n this._realtimePendingTurns[turnId] = placeholder;\n this.messages.push(placeholder);\n this.scrollToBottom();\n },\n onUserTurnDropped: (turnId) => {\n if (!turnId || !this._realtimePendingTurns) { return; }\n var dropped = this._realtimePendingTurns[turnId];\n if (!dropped) { return; }\n delete this._realtimePendingTurns[turnId];\n var at = this.messages.indexOf(dropped);\n if (at >= 0) { this.messages.splice(at, 1); }\n }\n });\n\n this.setupRealtimeVoicePicker(config);\n }\n },\n // Populates the per-interaction realtime voice picker from the selected realtime deployment's\n // voices (via the realtime-voices endpoint), and shows it only for realtime-capable deployments.\n setupRealtimeVoicePicker(config) {\n if (!config.realtimeVoiceSelectElementSelector || !config.realtimeVoicesUrl) {\n return;\n }\n\n var voiceSelect = document.querySelector(config.realtimeVoiceSelectElementSelector);\n if (!voiceSelect) {\n return;\n }\n\n var voiceGroup = config.realtimeVoiceGroupElementSelector ? document.querySelector(config.realtimeVoiceGroupElementSelector) : null;\n var deploymentSelect = config.deploymentSelectElementSelector ? document.querySelector(config.deploymentSelectElementSelector) : null;\n var capable = (config.realtimeCapableDeployments || []).map(function (n) { return (n || '').toLowerCase(); });\n var savedVoiceId = config.realtimeVoiceName || '';\n\n function isRealtimeDeployment(name) {\n return name && capable.indexOf(name.toLowerCase()) !== -1;\n }\n\n async function loadVoices() {\n var deploymentName = deploymentSelect ? deploymentSelect.value : '';\n var realtime = isRealtimeDeployment(deploymentName);\n if (voiceGroup) {\n voiceGroup.classList.toggle('d-none', !realtime);\n }\n if (!realtime) {\n return;\n }\n\n voiceSelect.innerHTML = '';\n\n try {\n const response = await fetch(config.realtimeVoicesUrl + '?deploymentName=' + encodeURIComponent(deploymentName), { credentials: 'same-origin' });\n const result = await response.json();\n if (!result || !Array.isArray(result.voices)) {\n return;\n }\n\n const grouped = new Map();\n for (const voice of result.voices) {\n const groupName = voice.gender || 'Voices';\n if (!grouped.has(groupName)) {\n grouped.set(groupName, []);\n }\n grouped.get(groupName).push(voice);\n }\n\n Array.from(grouped.keys()).sort((a, b) => a.localeCompare(b)).forEach(function (groupName) {\n const optgroup = document.createElement('optgroup');\n optgroup.label = groupName;\n grouped.get(groupName).forEach(function (voice) {\n const option = document.createElement('option');\n option.value = voice.id;\n option.textContent = voice.name;\n option.selected = voice.id === savedVoiceId;\n optgroup.appendChild(option);\n });\n voiceSelect.appendChild(optgroup);\n });\n } catch (err) {\n /* ignore voice load failures */\n }\n }\n\n if (deploymentSelect) {\n deploymentSelect.addEventListener('change', loadVoices);\n }\n loadVoices();\n },\n loadInteraction(itemId) {\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\n },\n reloadCurrentInteraction() {\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n },\n clearHistory(itemId) {\n const self = this;\n const clearHistoryConfirmed = () => {\n // Force-stop any live realtime voice session before clearing history.\n if (self.realtimeController && self.realtimeController.isActive()) {\n self.realtimeController.stop();\n }\n\n // Cancel any active stream before clearing history.\n if (self.stream) {\n self.stream.dispose();\n self.stream = null;\n self.hideTypingIndicator();\n self.streamingFinished();\n }\n\n self.connection.invoke(\"ClearHistory\", itemId)\n .catch(err => console.error('Error clearing history:', err));\n };\n\n if (typeof confirmDialog === 'function') {\n confirmDialog({\n title: config.clearHistoryTitle,\n message: config.clearHistoryMessage,\n okText: config.clearHistoryOkText,\n cancelText: config.clearHistoryCancelText,\n callback: function (confirmed) {\n if (confirmed) {\n clearHistoryConfirmed();\n }\n }\n });\n\n return;\n }\n\n if (window.confirm(config.clearHistoryMessage || 'Clear all messages?')) {\n clearHistoryConfirmed();\n }\n },\n debouncedSaveSettings() {\n // Clear any existing timeout to reset the debounce timer\n this.clearPendingSettingsSave();\n\n // Don't save while streaming — it will be saved when streaming completes.\n if (this.stream) {\n return;\n }\n\n // Set a new timeout to save after 850ms of no changes\n this.saveSettingsTimeout = setTimeout(() => {\n if (this.settingsDirty) {\n this.saveSettings();\n this.settingsDirty = false;\n }\n this.saveSettingsTimeout = null;\n }, 850);\n },\n getSelectedToolNames() {\n return this.getSelectedGroupValues(\n 'toolNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\n );\n },\n getSelectedMcpConnectionIds() {\n return this.getSelectedGroupValues(\n 'mcpConnectionIds',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\n );\n },\n getSelectedA2AConnectionIds() {\n return this.getSelectedGroupValues('a2aConnectionIds');\n },\n getSelectedAgentNames() {\n return this.getSelectedGroupValues(\n 'agentNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\n );\n },\n saveSettings() {\n const itemId = this.getItemId();\n if (!itemId) {\n return Promise.resolve();\n }\n\n if (!this.validateSettings()) {\n this.showSaveIndicator('Fix errors', 'text-danger');\n return Promise.resolve();\n }\n\n const settings = {};\n\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\n // This avoids coupling the JS to specific field names — new fields added by\n // any module are automatically included.\n const inputs = this.getSettingInputs();\n\n inputs.forEach(input => {\n const key = input.dataset.setting\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\n\n if (!key) {\n return;\n }\n\n if (input.type === 'checkbox') {\n settings[key] = input.checked;\n } else if (input.type === 'number') {\n settings[key] = input.value ? parseFloat(input.value) : null;\n } else {\n settings[key] = input.value || null;\n }\n });\n\n // Add tool, MCP connection, and agent collections (special handling).\n settings.toolNames = this.getSelectedToolNames();\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\n settings.agentNames = this.getSelectedAgentNames();\n\n const promptTemplates = this.getPromptTemplateSelections();\n if (promptTemplates.length > 0) {\n settings.promptTemplates = promptTemplates;\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\n }\n\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\n .catch(err => {\n console.error('Error saving settings:', err);\n this.showSaveIndicator('Save failed', 'text-danger');\n });\n },\n flushPendingSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n\n if (this.settingsDirty) {\n this.settingsDirty = false;\n return this.saveSettings();\n }\n\n return Promise.resolve();\n },\n initializeInteraction(itemId, force) {\n if (this.isInteractionStarted && !force) {\n return;\n }\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\n this.setItemId(itemId);\n this.isInteractionStarted = true;\n },\n clearCopiedMessageState() {\n if (this.copyResetTimeoutId) {\n window.clearTimeout(this.copyResetTimeoutId);\n this.copyResetTimeoutId = null;\n }\n\n if (this.activeCopyButton) {\n this.setCopyButtonState(this.activeCopyButton, false);\n this.activeCopyButton = null;\n }\n\n this.copiedMessageIndex = -1;\n },\n copyResponse(message, index, event) {\n const text = message && typeof message === 'object'\n ? message.copyContent ?? message.content ?? ''\n : message ?? '';\n const button = event?.currentTarget || event?.target?.closest?.('[data-copy-message-index]') || null;\n\n navigator.clipboard.writeText(text)\n .then(() => {\n this.clearCopiedMessageState();\n this.copiedMessageIndex = typeof index === 'number' ? index : -1;\n this.activeCopyButton = button;\n\n if (button) {\n this.setCopyButtonState(button, true);\n } else {\n this.$nextTick(() => this.updateCopyButtons());\n }\n\n this.copyResetTimeoutId = window.setTimeout(() => {\n this.clearCopiedMessageState();\n this.$nextTick(() => this.updateCopyButtons());\n }, Number(config.copyResetDelayMs) || 2000);\n })\n .catch(err => console.error('Failed to copy response:', err));\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var itemId = this.getItemId();\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n }\n },\n watch: {\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n },\n copiedMessageIndex() {\n this.$nextTick(() => this.updateCopyButtons());\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n\n this.$nextTick(() => {\n this.updateCopyButtons();\n refreshFontAwesomeIcons(this.$el);\n this.fontAwesomeObserver = observeFontAwesomeIcons(this.$el);\n });\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n\n if (this.fontAwesomeObserver) {\n this.fontAwesomeObserver.disconnect();\n this.fontAwesomeObserver = null;\n }\n\n this.clearCopiedMessageState();\n this.stopAudio(false);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n const autoInitializeSelector = '[data-chat-interaction-config]';\n\n function parseJsonAttribute(element, attributeName, description) {\n const rawValue = element.getAttribute(attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n } catch (error) {\n console.error('Failed to parse ' + description + ' JSON.', error);\n return null;\n }\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.chatInteractionInitialized === 'true') {\n return element ? element.__chatInteractionApp || null : null;\n }\n\n const config = parseJsonAttribute(element, 'data-chat-interaction-config', 'chat interaction config');\n if (!config) {\n return null;\n }\n\n const app = initialize(config);\n if (!app) {\n return null;\n }\n\n element.dataset.chatInteractionInitialized = 'true';\n element.__chatInteractionApp = app;\n\n return app;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches(autoInitializeSelector)) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll(autoInitializeSelector).forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n\n return {\n initialize: initialize,\n initializeFromElement: initializeFromElement,\n };\n}();\n\nwindow.chatInteractionDocumentManager = function () {\n const managerStateKey = '__chatInteractionDocumentManagerState';\n\n function normalizeDocumentInfo(document) {\n if (!document || typeof document !== 'object') {\n return null;\n }\n\n return {\n documentId: document.documentId || document.DocumentId || '',\n fileName: document.fileName || document.FileName || '',\n fileSize: document.fileSize || document.FileSize || 0\n };\n }\n\n function formatFileSize(bytes) {\n if (!bytes || bytes < 1024) {\n return (bytes || 0) + ' B';\n }\n\n if (bytes < 1024 * 1024) {\n return (bytes / 1024).toFixed(1) + ' KB';\n }\n\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n }\n\n function getDocumentKey(fileName, fileSize) {\n return ((fileName || '').trim().toLowerCase()) + '::' + (fileSize || 0);\n }\n\n function isDuplicateFile(file, knownKeys) {\n return knownKeys.has(getDocumentKey(file.name, file.size));\n }\n\n function getDocumentsFromDom(container) {\n if (!container) {\n return [];\n }\n\n return Array.from(container.querySelectorAll('[data-chat-document-id]'))\n .map(element => normalizeDocumentInfo({\n documentId: element.dataset.chatDocumentId,\n fileName: element.dataset.chatDocumentName,\n fileSize: Number(element.dataset.chatDocumentSize || 0)\n }))\n .filter(document => document && document.documentId);\n }\n\n function initialize(config) {\n if (!config || !config.itemId) {\n return;\n }\n\n const fileInput = document.getElementById('chat-doc-upload');\n const documentsList = document.getElementById('chat-documents-list');\n const status = document.getElementById('chat-doc-upload-status');\n const progressContainer = document.getElementById('chat-doc-upload-progress');\n const progressBar = document.getElementById('chat-doc-upload-progress-bar');\n const uploadQueue = document.getElementById('chat-doc-upload-queue');\n\n if (!fileInput || !documentsList || !status || !progressContainer || !progressBar || !uploadQueue) {\n return;\n }\n\n const previousState = fileInput[managerStateKey];\n if (previousState && typeof previousState.dispose === 'function') {\n previousState.dispose();\n }\n\n let interactionDocuments = (Array.isArray(config.existingDocuments) ? config.existingDocuments : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n\n if (interactionDocuments.length === 0) {\n interactionDocuments = getDocumentsFromDom(documentsList);\n }\n\n let uploadItems = [];\n let isUploadingDocuments = false;\n\n function createTextElement(tagName, className, text) {\n const element = document.createElement(tagName);\n if (className) {\n element.className = className;\n }\n\n element.textContent = text;\n return element;\n }\n\n function renderDocuments() {\n documentsList.innerHTML = '';\n\n if (interactionDocuments.length === 0) {\n documentsList.appendChild(createTextElement('div', 'text-muted small', 'No documents uploaded yet.'));\n return;\n }\n\n interactionDocuments.forEach(documentInfo => {\n const row = window.document.createElement('div');\n row.className = 'd-flex justify-content-between align-items-start gap-2 border rounded px-2 py-2 bg-white chat-document-row';\n row.dataset.chatDocumentId = documentInfo.documentId;\n row.dataset.chatDocumentName = documentInfo.fileName;\n row.dataset.chatDocumentSize = documentInfo.fileSize;\n\n const details = window.document.createElement('div');\n details.className = 'me-2 min-w-0';\n\n const name = createTextElement('div', 'fw-semibold small', documentInfo.fileName || 'Document');\n const icon = window.document.createElement('i');\n icon.className = 'fa-solid fa-file-lines me-1';\n name.prepend(icon);\n\n const size = createTextElement('div', 'text-muted small', formatFileSize(documentInfo.fileSize));\n\n details.appendChild(name);\n details.appendChild(size);\n\n const removeButton = createTextElement('button', 'btn btn-sm btn-outline-danger remove-chat-document-btn', ' Remove');\n removeButton.type = 'button';\n removeButton.dataset.documentId = documentInfo.documentId;\n const removeIcon = window.document.createElement('i');\n removeIcon.className = 'fa-solid fa-trash';\n removeButton.prepend(removeIcon);\n removeButton.addEventListener('click', () => removeDocument(documentInfo.documentId));\n\n row.appendChild(details);\n row.appendChild(removeButton);\n documentsList.appendChild(row);\n });\n }\n\n function showUploadStatus(message, cssClass) {\n if (!message) {\n status.textContent = '';\n status.className = 'small mt-2 d-none';\n return;\n }\n\n status.textContent = message;\n status.className = 'small mt-2 ' + (cssClass || 'text-muted');\n }\n\n function showUploadProgress(progress, message, cssClass) {\n if (progress === null || progress === undefined) {\n progressContainer.className = 'progress mt-2 d-none';\n progressContainer.setAttribute('aria-valuenow', '0');\n progressBar.className = 'progress-bar progress-bar-striped progress-bar-animated';\n progressBar.style.width = '0%';\n progressBar.textContent = '0%';\n return;\n }\n\n const roundedProgress = Math.max(0, Math.min(100, Math.round(progress)));\n progressContainer.className = 'progress mt-2';\n progressContainer.setAttribute('aria-valuenow', roundedProgress.toString());\n progressBar.className = 'progress-bar ' + (cssClass || 'progress-bar-striped progress-bar-animated');\n progressBar.style.width = roundedProgress + '%';\n progressBar.textContent = message || (roundedProgress + '%');\n }\n\n function getUploadStatePresentation(state) {\n switch (state) {\n case 'uploaded':\n return { label: 'Uploaded', badgeClass: 'text-bg-success', progressClass: 'bg-success' };\n case 'failed':\n return { label: 'Failed', badgeClass: 'text-bg-danger', progressClass: 'bg-danger' };\n case 'uploading':\n return { label: 'Uploading', badgeClass: 'text-bg-warning', progressClass: 'bg-warning progress-bar-striped progress-bar-animated' };\n default:\n return { label: 'Queued', badgeClass: 'text-bg-secondary', progressClass: 'bg-secondary progress-bar-striped progress-bar-animated' };\n }\n }\n\n function formatUploadMessage(item) {\n if (item.status === 'failed' && item.error) {\n return item.error;\n }\n\n if (item.status === 'uploaded') {\n return 'Upload completed successfully.';\n }\n\n if (item.status === 'uploading') {\n return item.progress + '% uploaded';\n }\n\n return 'Waiting to upload...';\n }\n\n function renderUploadQueue() {\n uploadQueue.innerHTML = '';\n\n uploadItems.forEach(item => {\n const presentation = getUploadStatePresentation(item.status);\n const card = document.createElement('div');\n card.className = 'border rounded px-2 py-2 bg-white';\n\n const header = document.createElement('div');\n header.className = 'd-flex justify-content-between align-items-start gap-2';\n\n const fileDetails = document.createElement('div');\n fileDetails.className = 'flex-grow-1 min-w-0';\n fileDetails.appendChild(createTextElement('div', 'fw-semibold small', item.fileName));\n fileDetails.appendChild(createTextElement('div', 'text-muted small', formatFileSize(item.fileSize)));\n\n const badge = createTextElement('span', 'badge ' + presentation.badgeClass, presentation.label);\n\n header.appendChild(fileDetails);\n header.appendChild(badge);\n\n const progress = document.createElement('div');\n progress.className = 'progress mt-2';\n progress.setAttribute('role', 'progressbar');\n progress.setAttribute('aria-valuemin', '0');\n progress.setAttribute('aria-valuemax', '100');\n progress.setAttribute('aria-valuenow', item.progress.toString());\n\n const progressState = document.createElement('div');\n progressState.className = 'progress-bar ' + presentation.progressClass;\n progressState.style.width = item.progress + '%';\n progressState.textContent = item.progress + '%';\n progress.appendChild(progressState);\n\n const message = createTextElement('div', item.status === 'failed' ? 'small text-danger mt-2' : 'small text-muted mt-2', formatUploadMessage(item));\n\n card.appendChild(header);\n card.appendChild(progress);\n card.appendChild(message);\n uploadQueue.appendChild(card);\n });\n }\n\n function createUploadItem(file, index) {\n return {\n id: file.name + '::' + file.size + '::' + file.lastModified + '::' + index + '::' + Date.now(),\n fileName: file.name,\n fileSize: file.size,\n status: 'queued',\n progress: 0,\n error: null\n };\n }\n\n function updateUploadItem(itemId, updates) {\n uploadItems = uploadItems.map(item => item.id === itemId ? Object.assign({}, item, updates) : item);\n renderUploadQueue();\n }\n\n function removeUploadItems(predicate) {\n uploadItems = uploadItems.filter(item => !predicate(item));\n renderUploadQueue();\n }\n\n function uploadSingleDocument(file, itemIdToUpdate, fileIndex, totalFiles) {\n return new Promise((resolve, reject) => {\n const formData = new FormData();\n formData.append('chatInteractionId', config.itemId);\n formData.append('files', file);\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', config.uploadDocumentUrl, true);\n\n xhr.upload.addEventListener('progress', event => {\n if (!event.lengthComputable) {\n return;\n }\n\n const fileProgress = Math.round((event.loaded / event.total) * 100);\n updateUploadItem(itemIdToUpdate, {\n status: 'uploading',\n progress: fileProgress\n });\n\n const overallProgress = ((fileIndex + (event.loaded / event.total)) / totalFiles) * 100;\n showUploadProgress(overallProgress, 'Uploading ' + (fileIndex + 1) + ' of ' + totalFiles, 'progress-bar-striped progress-bar-animated');\n });\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve(JSON.parse(xhr.responseText));\n } catch (error) {\n reject(new Error('Upload failed: invalid server response.'));\n }\n\n return;\n }\n\n reject(new Error((xhr.responseText || 'Upload failed.').trim()));\n });\n\n xhr.addEventListener('error', () => {\n reject(new Error('Upload failed. Please check your connection and try again.'));\n });\n\n xhr.send(formData);\n });\n }\n\n async function uploadDocuments(files) {\n if (!config.uploadDocumentUrl || !files || files.length === 0) {\n return;\n }\n\n if (isUploadingDocuments) {\n showUploadStatus('A document upload is already in progress.', 'text-warning');\n return;\n }\n\n isUploadingDocuments = true;\n\n const filesToUpload = [];\n const duplicateItems = [];\n const knownDocumentKeys = new Set(interactionDocuments.map(document => getDocumentKey(document.fileName, document.fileSize)));\n\n Array.from(files).forEach(file => {\n if (isDuplicateFile(file, knownDocumentKeys)) {\n duplicateItems.push(file);\n return;\n }\n\n knownDocumentKeys.add(getDocumentKey(file.name, file.size));\n filesToUpload.push(file);\n });\n\n if (duplicateItems.length > 0) {\n uploadItems = uploadItems.concat(duplicateItems.map((file, index) => Object.assign(createUploadItem(file, index), {\n status: 'failed',\n progress: 100,\n error: 'This document is already attached.'\n })));\n renderUploadQueue();\n }\n\n if (filesToUpload.length === 0) {\n isUploadingDocuments = false;\n showUploadStatus(duplicateItems.map(file => file.name + ': This document is already attached.').join(' | '), 'text-warning');\n showUploadProgress(null);\n return;\n }\n\n const pendingItems = filesToUpload.map(createUploadItem);\n uploadItems = uploadItems.concat(pendingItems);\n renderUploadQueue();\n showUploadProgress(0, 'Preparing upload...', 'progress-bar-striped progress-bar-animated');\n fileInput.disabled = true;\n\n try {\n let uploadedCount = 0;\n const failedUploads = duplicateItems.map(file => file.name + ': This document is already attached.');\n\n for (let i = 0; i < filesToUpload.length; i++) {\n const file = filesToUpload[i];\n const pendingItem = pendingItems[i];\n\n updateUploadItem(pendingItem.id, {\n status: 'uploading',\n progress: 0,\n error: null\n });\n\n showUploadStatus('Uploading ' + (i + 1) + ' of ' + filesToUpload.length + ' document(s)...', 'text-warning');\n\n try {\n const result = await uploadSingleDocument(file, pendingItem.id, i, filesToUpload.length);\n const uploaded = (Array.isArray(result.uploaded) ? result.uploaded : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n const failed = Array.isArray(result.failed) ? result.failed : [];\n\n if (uploaded.length > 0) {\n uploadedCount += uploaded.length;\n interactionDocuments = interactionDocuments.concat(uploaded);\n updateUploadItem(pendingItem.id, {\n status: 'uploaded',\n progress: 100,\n error: null\n });\n } else {\n const missingUploadMessage = failed.length > 0\n ? failed.map(entry => entry.fileName + ': ' + entry.error).join(' | ')\n : 'The server did not confirm that the file was uploaded.';\n if (failed.length === 0) {\n failedUploads.push(missingUploadMessage);\n }\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: 100,\n error: missingUploadMessage\n });\n }\n\n if (failed.length > 0) {\n const failedMessage = failed.map(entry => entry.fileName + ': ' + entry.error).join(' | ');\n failedUploads.push(failedMessage);\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: 100,\n error: failedMessage\n });\n }\n } catch (error) {\n const errorMessage = error && error.message\n ? error.message\n : 'Upload failed. Please try again.';\n console.error('Upload failed:', error);\n failedUploads.push(file.name + ': ' + errorMessage);\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: pendingItem.progress || 0,\n error: errorMessage\n });\n }\n }\n\n renderDocuments();\n\n if (failedUploads.length > 0) {\n removeUploadItems(item => item.status === 'uploaded');\n showUploadStatus(\n (uploadedCount > 0 ? ('Uploaded ' + uploadedCount + ' document(s). ') : '') + failedUploads.join(' | '),\n uploadedCount > 0 ? 'text-warning' : 'text-danger');\n showUploadProgress(null);\n return;\n }\n\n removeUploadItems(() => true);\n showUploadStatus('Uploaded ' + uploadedCount + ' document(s).', 'text-success');\n showUploadProgress(null);\n } catch (error) {\n console.error('Upload failed:', error);\n showUploadStatus('Upload failed. Please try again.', 'text-danger');\n showUploadProgress(null);\n } finally {\n isUploadingDocuments = false;\n fileInput.disabled = false;\n fileInput.value = '';\n }\n }\n\n async function removeDocument(documentId) {\n if (!config.removeDocumentUrl || !documentId || !window.confirm('Remove this document?')) {\n return;\n }\n\n try {\n const response = await fetch(config.removeDocumentUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n itemId: config.itemId,\n documentId: documentId\n })\n });\n\n if (!response.ok) {\n console.error('Failed to remove document:', await response.text());\n showUploadStatus('Failed to remove document.', 'text-danger');\n return;\n }\n\n const result = await response.json();\n const serverDocuments = (Array.isArray(result.documents) ? result.documents : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n\n interactionDocuments = serverDocuments.length > 0\n ? serverDocuments\n : interactionDocuments.filter(document => document.documentId !== documentId);\n renderDocuments();\n showUploadStatus('Document removed.', 'text-success');\n } catch (error) {\n console.error('Remove failed:', error);\n showUploadStatus('Failed to remove document.', 'text-danger');\n }\n }\n\n const onFileInputChange = event => {\n const selectedFiles = event.target.files ? Array.from(event.target.files) : [];\n uploadDocuments(selectedFiles);\n };\n\n fileInput.addEventListener('change', onFileInputChange);\n fileInput[managerStateKey] = {\n dispose: () => {\n fileInput.removeEventListener('change', onFileInputChange);\n }\n };\n\n renderDocuments();\n renderUploadQueue();\n showUploadStatus(null);\n showUploadProgress(null);\n\n return fileInput[managerStateKey];\n }\n\n function parseJsonAttribute(element, attributeName, description) {\n const rawValue = element.getAttribute(attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n } catch (error) {\n console.error('Failed to parse ' + description + ' JSON.', error);\n return null;\n }\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.chatInteractionDocumentManagerInitialized === 'true') {\n return element ? element[managerStateKey] || null : null;\n }\n\n const config = parseJsonAttribute(element, 'data-chat-interaction-document-manager-config', 'chat interaction document manager config');\n if (!config) {\n return null;\n }\n\n const state = initialize(config);\n if (!state) {\n return null;\n }\n\n element.dataset.chatInteractionDocumentManagerInitialized = 'true';\n\n return state;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches('[data-chat-interaction-document-manager-config]')) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll('[data-chat-interaction-document-manager-config]').forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n\n return {\n initialize: initialize,\n initializeFromElement: initializeFromElement,\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} +{"version":3,"sources":["chat-interaction.js"],"names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","Array","from","isArray","_arrayLikeToArray","_objectWithoutProperties","_objectWithoutPropertiesLoose","getOwnPropertySymbols","indexOf","propertyIsEnumerable","hasOwnProperty","_createForOfIteratorHelper","_n","F","s","next","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","push","_typeof","window","chatInteractionManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","codeCopiedText","copyTitle","copiedTitle","copyResetDelayMs","assistantLabel","messageTemplate","indicatorTemplate","untitledText","clearHistoryTitle","clearHistoryMessage","clearHistoryOkText","clearHistoryCancelText","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","containsFontAwesomePlaceholders","root","nodeType","selector","matches","querySelector","refreshFontAwesomeIcons","fontAwesome","FontAwesome","dom","i2svg","node","observeFontAwesomeIcons","MutationObserver","observer","mutations","forEach","mutation","addedNodes","observe","childList","subtree","normalizeReference","reference","_ref","_normalized$index","_ref2","_normalized$text","_ref3","_normalized$title","_ref4","_normalized$link","_ref5","_normalized$reference","_normalized$isGenerat","normalized","assign","index","Index","Text","title","Title","link","Link","referenceType","ReferenceType","isGenerated","IsGenerated","isDownloadCitationReference","toLowerCase","normalizeReferences","references","_i","_Object$entries","entries","_normalizeReference","_Object$entries$_i","key","getCitationLabel","buildCitationDisplay","content","processedContent","messageReferences","referenceEntries","citations","citedRefs","filter","_ref6","_ref7","includes","generatedRefs","_ref8","_ref9","sort","_ref0","_ref1","_ref10","_ref11","b","_ref12","_ref13","_ref14","_ref15","displayIndex","_iterator","_step","_step$value","placeholder","concat","replaceAll","referenceKey","label","isDownload","err","_i2","_citations","citation","_iterator2","_step2","_step2$value","map","_ref16","_excluded","buildCopyContent","copyContent","_iterator3","_step3","_iterator4","_step4","trimEnd","updateMessagePresentation","message","rawContent","citationDisplay","displayContent","citationReferences","htmlContent","parseMarkdownContent","renderer","marked","Renderer","data","href","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","__chartConfigs","createChartHtml","chartId","use","extensions","level","start","idx","undefined","tokenizer","extracted","tryExtractChartMarker","startIndex","type","raw","substring","endIndex","json","token","config","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","renderChartsInMessage","charts","requestAnimationFrame","_iterator5","_step5","canvas","getElementById","Chart","console","warn","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","compactObject","source","fromEntries","_ref17","_ref18","initialize","instanceConfig","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","isInteractionStarted","isPlaceholderVisible","isStreaming","isNavigatingAway","autoScroll","stream","messages","prompt","initialFieldValues","Map","settingsDirty","saveSettingsTimeout","saveIndicatorTimeout","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","Math","random","conversationModeEnabled","conversationButton","isConversationMode","realtimeController","notifications","notificationDismissTimers","copiedMessageIndex","copyResetTimeoutId","activeCopyButton","computed","lastAssistantIndex","role","methods","handleBeforeUnload","startConnection","_this","_callee","_t","_context","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","initializeInteraction","itemId","titleInput","msg","addMessage","$nextTick","historyItem","showSaveIndicator","stopRecording","isFinal","_conversationPartialTranscript","escaped","replace","_conversationPartialMessage","hidePlaceholder","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","turnId","_realtimePendingTurns","pending","stopAudio","emptyIndex","splice","_conversationAssistantMessage","at","userMsg","messageId","responseId","appearance","_conversationAssistantResponseId","prev","hideTypingIndicator","j","msgIndex","newMessage","id","normalizeAssistantAppearance","base64Audio","contentType","binaryString","atob","bytes","Uint8Array","charCodeAt","receivePcm","playCollectedAudio","showPlaceholder","clearHistoryBtn","classList","add","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentInteraction","onclose","addMessageInternal","_this2","fireEvent","CustomEvent","detail","_this3","_message$rawContent","remove","event","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","isIndicator","sendMessage","_this4","_callee2","trimmedPrompt","_context2","flushPendingSave","streamMessage","_this5","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentItemId","getItemId","subscribe","chunk","sessionId","setItemId","keys","_i3","_Object$entries2","_normalizeReference2","_Object$entries2$_i","complete","_this5$stream","processReferences","streamingFinished","synthesizeSpeech","_this5$stream2","getServiceDownMessage","_this6","_ref19","_message$rawContent2","stopIcon","getAttribute","replaceChildren","RETURN_DOM_FRAGMENT","startIcon","icons","querySelectorAll","debouncedSaveSettings","handleExternalTtsStop","_e$detail","sourceId","updateTtsPlaybackButtons","_this7","buttons","button","buttonIndex","Number","isPlaying","iconHtml","toggle","setAttribute","updateCopyButtons","_this8","isCopied","setCopyButtonState","cacheIndex","_this9","_ttsCacheIndex","invoke","toggleMessageTts","_this0","playAudioBlob","_this1","totalLength","reduce","sum","combined","offset","_iterator6","_step6","set","blob","Blob","_this10","URL","createObjectURL","audio","Audio","addEventListener","revokeObjectURL","playNextInQueue","play","_this11","nextBlob","shift","conversationModeOnAudioEnded","_this12","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this13","updateConversationButton","navigator","mediaDevices","getUserMedia","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","_conversationSubject","Subject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","micSource","createMediaStreamSource","connect","pendingChunk","analyser","interruptVolumeThreshold","size","freqData","frequencyBinCount","getByteFrequencyData","k","avg","_callee3","uint8Array","base64","_context3","arrayBuffer","str","byte","String","fromCharCode","btoa","getTracks","track","stop","documentElement","send","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","originalLength","removedCount","_this14","setTimeout","scrollTop","scrollHeight","clientHeight","handleUserInput","target","getSaveIndicatorElement","saveIndicatorElementSelector","className","_this15","indicator","clearTimeout","clearPendingSettingsSave","getFieldLabel","input","_input$closest","closest","dataset","setting","getValidationFeedbackElement","feedback","nextElementSibling","contains","insertAdjacentElement","clearSettingValidationError","removeAttribute","setSettingValidationError","getSettingValidationMessage","disabled","number","fieldLabel","isNaN","min","max","validateSettingInput","validateSettings","_this16","isValid","getSettingInputs","queueSettingsSave","explicitInputs","getSelectedGroupValues","groupName","fallbackSelector","explicitSelections","values","checkbox","checkboxes","baseName","hiddenInput","getPromptTemplateSelections","promptTemplates","card","templateIdInput","promptParametersInput","templateId","promptParameters","clearNotificationDismiss","findIndex","scheduleNotificationDismiss","_this17","timerId","dismissNotification","handleNotificationAction","actionName","resetInteraction","initializeApp","_this18","placeholderElementSelector","loadInteraction","threshold","atBottom","shiftKey","click","lastMsg","pop","chatInteractionItems","getElementsByClassName","preventDefault","initialMessages","btn","block","codeEl","clipboard","writeText","copiedText","clearHistory","micButtonElementSelector","style","display","toggleRecording","conversationButtonElementSelector","CoreAIRealtime","realtimeButtonElementSelector","attach","ensureConnected","sendStart","subject","voice","silenceMs","vadThreshold","allowInterruption","webRtcEnabled","realtimeWebRtcEnabled","sendStartWebRtc","offerSdp","webRtcIceServers","realtimeWebRtcIceServers","voiceName","realtimeVoiceName","getVoiceName","el","realtimeVoiceSelectElementSelector","capableDeployments","realtimeCapableDeployments","realtimeEnabled","selectors","realtimeButton","sendButton","deploymentSelect","deploymentSelectElementSelector","onActivate","onDeactivate","onEnterRealtimeMode","isActive","onUserTurnPending","onUserTurnDropped","dropped","setupRealtimeVoicePicker","realtimeVoicesUrl","voiceSelect","voiceGroup","realtimeVoiceGroupElementSelector","capable","savedVoiceId","isRealtimeDeployment","loadVoices","_loadVoices","_callee4","deploymentName","realtime","response","result","grouped","_iterator7","_step7","_t2","_context4","fetch","encodeURIComponent","credentials","voices","gender","has","get","localeCompare","optgroup","option","selected","appendChild","self","clearHistoryConfirmed","confirmDialog","okText","cancelText","callback","confirmed","confirm","_this19","saveSettings","getSelectedToolNames","getSelectedMcpConnectionIds","getSelectedA2AConnectionIds","getSelectedAgentNames","_this20","settings","inputs","match","checked","parseFloat","toolNames","mcpConnectionIds","a2aConnectionIds","agentNames","promptTemplateIds","template","force","clearCopiedMessageState","copyResponse","_ref21","_message$copyContent","_event$target","_event$target$closest","_this21","currentTarget","startRecording","_this22","_callee5","_context5","updateMicButton","watch","active","_this23","mounted","_this24","_callee6","_context6","$el","fontAwesomeObserver","beforeUnmount","removeEventListener","disconnect","mount","autoInitializeSelector","parseJsonAttribute","element","attributeName","description","rawValue","initializeFromElement","chatInteractionInitialized","__chatInteractionApp","scanForAutoInitialization","startAutoInitialization","body","readyState","once","chatInteractionDocumentManager","managerStateKey","normalizeDocumentInfo","documentId","DocumentId","fileName","FileName","fileSize","FileSize","formatFileSize","toFixed","getDocumentKey","isDuplicateFile","file","knownKeys","getDocumentsFromDom","container","chatDocumentId","chatDocumentName","chatDocumentSize","fileInput","documentsList","status","progressContainer","progressBar","uploadQueue","previousState","interactionDocuments","existingDocuments","uploadItems","isUploadingDocuments","createTextElement","tagName","renderDocuments","documentInfo","row","actions","downloadBaseUrl","downloadDocumentBaseUrl","downloadLink","downloadIcon","removeButton","removeIcon","removeDocument","details","prepend","showUploadStatus","showUploadProgress","progress","width","roundedProgress","round","getUploadStatePresentation","state","badgeClass","progressClass","formatUploadMessage","item","renderUploadQueue","presentation","header","fileDetails","badge","progressState","createUploadItem","lastModified","Date","now","updateUploadItem","updates","removeUploadItems","predicate","uploadSingleDocument","itemIdToUpdate","fileIndex","totalFiles","reject","formData","FormData","append","xhr","XMLHttpRequest","open","uploadDocumentUrl","upload","lengthComputable","fileProgress","loaded","total","overallProgress","responseText","Error","uploadDocuments","_x","_uploadDocuments","_callee7","files","filesToUpload","duplicateItems","knownDocumentKeys","pendingItems","uploadedCount","failedUploads","pendingItem","uploaded","failed","missingUploadMessage","failedMessage","errorMessage","_t3","_t4","_context7","Set","join","entry","_x2","_removeDocument","_callee8","serverDocuments","_t5","_t6","_context8","removeDocumentUrl","method","headers","stringify","ok","documents","onFileInputChange","selectedFiles","chatInteractionDocumentManagerInitialized","download","toDataURL","img","startsWith","res","removeChild"],"mappings":"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","file":"chat-interaction.js","sourcesContent":["window.chatInteractionManager = function () {\n\n // Defaults (can be overridden by instanceConfig)\n var defaultConfig = {\n // UI defaults for generated media\n generatedImageAltText: 'Generated Image',\n generatedImageMaxWidth: 400,\n downloadImageTitle: 'Download image',\n downloadChartTitle: 'Download chart as image',\n downloadChartButtonText: 'Download',\n codeCopiedText: 'Copied!',\n copyTitle: 'Click here to copy response to clipboard.',\n copiedTitle: 'Response copied to clipboard.',\n copyResetDelayMs: 2000,\n assistantLabel: 'Assistant',\n\n messageTemplate: `\n
\n \n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n `,\n indicatorTemplate: `\n
\n \n Assistant\n
\n `,\n // Localizable strings\n untitledText: 'Untitled',\n clearHistoryTitle: 'Clear History',\n clearHistoryMessage: 'Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.',\n clearHistoryOkText: 'Yes',\n clearHistoryCancelText: 'Cancel'\n };\n\n // Sanitize URLs to prevent javascript: protocol injection.\n function sanitizeUrl(url) {\n if (!url) return '';\n var trimmed = url.trim();\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\n return '';\n }\n return url;\n }\n\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\n function escapeHtmlEntities(text) {\n var span = document.createElement('span');\n span.textContent = text;\n return span.innerHTML;\n }\n\n function containsFontAwesomePlaceholders(root) {\n if (!root || root.nodeType !== 1) {\n return false;\n }\n\n var selector = 'i[class*=\"fa-\"],i.fa,i.fas,i.far,i.fab';\n if (typeof root.matches === 'function' && root.matches(selector)) {\n return true;\n }\n\n return typeof root.querySelector === 'function' && !!root.querySelector(selector);\n }\n\n function refreshFontAwesomeIcons(root) {\n var fontAwesome = window.FontAwesome;\n if (!containsFontAwesomePlaceholders(root) || !fontAwesome || !fontAwesome.dom || typeof fontAwesome.dom.i2svg !== 'function') {\n return;\n }\n\n fontAwesome.dom.i2svg({ node: root });\n }\n\n function observeFontAwesomeIcons(root) {\n if (!root || typeof MutationObserver === 'undefined') {\n return null;\n }\n\n var observer = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n mutation.addedNodes.forEach(function (node) {\n refreshFontAwesomeIcons(node);\n });\n });\n });\n\n observer.observe(root, {\n childList: true,\n subtree: true\n });\n\n return observer;\n }\n\n function normalizeReference(reference) {\n if (!reference || typeof reference !== 'object') {\n return null;\n }\n\n const normalized = Object.assign({}, reference);\n normalized.index = normalized.index ?? normalized.Index ?? 0;\n normalized.text = normalized.text ?? normalized.Text ?? null;\n normalized.title = normalized.title ?? normalized.Title ?? null;\n normalized.link = sanitizeUrl(normalized.link ?? normalized.Link ?? null);\n normalized.referenceType = normalized.referenceType ?? normalized.ReferenceType ?? null;\n normalized.isGenerated = (normalized.isGenerated ?? normalized.IsGenerated) === true;\n\n return normalized;\n }\n\n function isDownloadCitationReference(reference) {\n if (!reference || typeof reference !== 'object') {\n return false;\n }\n\n if (typeof reference.referenceType === 'string' && reference.referenceType.toLowerCase() === 'document') {\n return true;\n }\n\n if (typeof reference.link === 'string' && /\\/ai\\/documents\\/.+\\/download(?:$|\\?)/i.test(reference.link)) {\n return true;\n }\n\n return false;\n }\n\n function normalizeReferences(references) {\n if (!references || typeof references !== 'object') {\n return {};\n }\n\n const normalized = {};\n\n for (const [key, value] of Object.entries(references)) {\n normalized[key] = normalizeReference(value) ?? {};\n }\n\n return normalized;\n }\n\n function getCitationLabel(reference, key) {\n return reference.title || reference.text || key;\n }\n\n function buildCitationDisplay(content, references) {\n let processedContent = (content || '').trim();\n const messageReferences = normalizeReferences(references);\n const referenceEntries = Object.entries(messageReferences);\n\n if (!referenceEntries.length) {\n return { content: processedContent, citations: [] };\n }\n\n const citedRefs = referenceEntries.filter(([key]) => processedContent.includes(key));\n const generatedRefs = referenceEntries.filter(([key, value]) => value.isGenerated && !processedContent.includes(key));\n\n if (!citedRefs.length && !generatedRefs.length) {\n return { content: processedContent, citations: [] };\n }\n\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n generatedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n const citations = [];\n let displayIndex = 1;\n\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${displayIndex}_${value.index || displayIndex}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n citations.push({\n referenceKey: key,\n displayIndex: displayIndex,\n label: getCitationLabel(value, key),\n link: value.link || null,\n isDownload: isDownloadCitationReference(value),\n placeholder: placeholder,\n });\n\n displayIndex++;\n }\n\n for (const citation of citations) {\n processedContent = processedContent.replaceAll(citation.placeholder, `${citation.displayIndex}`);\n }\n\n processedContent = processedContent.replaceAll('
', ',');\n\n // Generated files (such as exported tabular data) are always offered as a download even when\n // the model does not cite them inline, so the user never loses access to the produced file.\n for (const [key, value] of generatedRefs) {\n citations.push({\n referenceKey: key,\n displayIndex: displayIndex,\n label: getCitationLabel(value, key),\n link: value.link || null,\n isDownload: true,\n placeholder: null,\n });\n\n displayIndex++;\n }\n\n return {\n content: processedContent,\n citations: citations.map(({ placeholder, ...citation }) => citation),\n };\n }\n\n function buildCopyContent(content, citations) {\n let copyContent = (content || '').trim();\n\n if (!copyContent || !Array.isArray(citations) || citations.length === 0) {\n return copyContent;\n }\n\n for (const citation of citations) {\n copyContent = copyContent.replaceAll(citation.referenceKey, `[${citation.displayIndex}]`);\n }\n\n copyContent += '\\n\\nReferences:\\n';\n\n for (const citation of citations) {\n copyContent += `${citation.displayIndex}. ${citation.label}`;\n\n if (citation.link) {\n copyContent += ` - ${citation.link}`;\n }\n\n copyContent += '\\n';\n }\n\n return copyContent.trimEnd();\n }\n\n function updateMessagePresentation(message, references) {\n const messageReferences = normalizeReferences(references ?? message.references);\n const rawContent = typeof message.rawContent === 'string'\n ? message.rawContent\n : typeof message.content === 'string'\n ? message.content\n : '';\n const citationDisplay = buildCitationDisplay(rawContent, messageReferences);\n\n message.rawContent = rawContent;\n message.content = rawContent;\n message.displayContent = citationDisplay.content;\n message.references = messageReferences;\n message.citationReferences = citationDisplay.citations;\n message.copyContent = buildCopyContent(rawContent, citationDisplay.citations);\n message.htmlContent = parseMarkdownContent(citationDisplay.content, message);\n\n return message;\n }\n\n const renderer = new marked.Renderer();\n\n // Modify the link rendering to open in a new tab\n renderer.link = function (data) {\n var href = sanitizeUrl(data.href);\n if (!href) return data.text || '';\n return `${data.text}`;\n };\n\n // Custom code block renderer with highlight.js integration and copy button.\n renderer.code = function (data) {\n var code = data.text || '';\n var lang = (data.lang || '').trim();\n var highlighted = code;\n\n if (typeof hljs !== 'undefined') {\n if (lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(code, { language: lang }).value;\n } catch (_) { }\n } else {\n try {\n highlighted = hljs.highlightAuto(code).value;\n } catch (_) { }\n }\n } else {\n highlighted = escapeHtmlEntities(code);\n }\n\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\n return `
${langDisplay}
${highlighted}
`;\n };\n\n // Custom image renderer for generated images with thumbnail styling and download button.\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\n renderer.image = function (data) {\n const src = sanitizeUrl(data.href);\n if (!src) return '';\n const alt = data.text || defaultConfig.generatedImageAltText;\n const maxWidth = defaultConfig.generatedImageMaxWidth;\n return `
\n \"${alt}\"\n
\n \n \n \n
\n
`;\n };\n\n // Chart counter for unique IDs\n let chartCounter = 0;\n\n // Collector for charts discovered during marked parsing.\n let _pendingCharts = [];\n\n // Global chart config map shared with ai-chat.js\n window.__chartConfigs = window.__chartConfigs || {};\n\n function createChartHtml(chartId) {\n return `
`\n + ``\n + `
`\n + `
`\n + ``\n + `
`;\n }\n\n // Register [chart:{...json...}] as a native marked block extension so the\n // markdown parser handles chart markers inline with surrounding text.\n marked.use({\n extensions: [{\n name: 'chart',\n level: 'block',\n start(src) {\n const idx = src.indexOf('[chart:');\n return idx >= 0 ? idx : undefined;\n },\n tokenizer(src) {\n const extracted = tryExtractChartMarker(src);\n if (!extracted || extracted.startIndex !== 0) {\n return undefined;\n }\n\n const chartId = `chat_chart_${++chartCounter}`;\n\n return {\n type: 'chart',\n raw: src.substring(0, extracted.endIndex),\n chartId: chartId,\n json: extracted.json,\n };\n },\n renderer(token) {\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\n window.__chartConfigs[token.chartId] = token.json;\n return createChartHtml(token.chartId);\n }\n }]\n });\n\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\n function tryExtractChartMarker(text) {\n const token = '[chart:';\n const start = text.indexOf(token);\n if (start < 0) {\n return null;\n }\n\n // Find JSON object boundary by balancing braces\n const jsonStart = start + token.length;\n let i = jsonStart;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\n i++;\n }\n\n if (i >= text.length || text[i] !== '{') {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n\n if (inString) {\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\') {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) {\n const jsonEnd = i;\n // Expect closing bracket after JSON\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\n if (closeBracketIndex < 0) {\n return null;\n }\n\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\n return {\n startIndex: start,\n endIndex: closeBracketIndex + 1,\n json: json\n };\n }\n }\n }\n\n return null;\n }\n\n function renderChartsInMessage(message) {\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\n return;\n }\n\n // Copy and clear pending charts immediately to prevent duplicate renders.\n const charts = [...message._pendingCharts];\n message._pendingCharts = [];\n\n // Defer to requestAnimationFrame so the browser has fully laid out the\n // canvas elements before Chart.js reads their dimensions.\n requestAnimationFrame(() => {\n for (const c of charts) {\n const canvas = document.getElementById(c.chartId);\n if (!canvas) {\n continue;\n }\n\n if (typeof Chart === 'undefined') {\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n continue;\n }\n\n // When the canvas is inside a hidden container (e.g., display:none),\n // it has zero dimensions. Keep the config for later rendering.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[c.chartId] = c.config;\n continue;\n }\n\n try {\n // Destroy existing chart instance if re-rendering\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n } catch (e) {\n console.error('Error creating chart:', e);\n }\n }\n });\n }\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n function compactObject(source) {\n if (!source || typeof source !== 'object') {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(source).filter(([, value]) => value !== undefined)\n );\n }\n\n const initialize = (instanceConfig) => {\n const config = Object.assign({}, defaultConfig, compactObject(instanceConfig));\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isInteractionStarted: false,\n isPlaceholderVisible: true,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n prompt: '',\n initialFieldValues: new Map(),\n settingsDirty: false,\n saveSettingsTimeout: null,\n saveIndicatorTimeout: null,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n currentAudioUrl: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2),\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n // Realtime (speech-to-speech) controller from the shared CoreAIRealtime module.\n realtimeController: null,\n notifications: [],\n notificationDismissTimers: {},\n copyTitle: config.copyTitle,\n copiedTitle: config.copiedTitle,\n copiedMessageIndex: -1,\n copyResetTimeoutId: null,\n activeCopyButton: null,\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadInteraction\", (data) => {\n this.initializeInteraction(data.itemId, true);\n this.messages = [];// Update the title field if it exists\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && data.title) {\n titleInput.value = data.title;\n }\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n });\n\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\n // Update the history list item if it exists\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\n if (historyItem) {\n historyItem.textContent = title || config.untitledText;\n }\n\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && title) {\n titleInput.value = title;\n }\n\n this.showSaveIndicator('Saved', 'text-success');\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n this.showSaveIndicator('Save failed', 'text-danger');\n\n if (this.isRecording) {\n this.stopRecording();\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, turnId, text) => {\n // Realtime: a placeholder for this turn was already inserted in the right position when\n // the utterance was captured (see onUserTurnPending), so just fill in its text.\n if (turnId && this._realtimePendingTurns && this._realtimePendingTurns[turnId]) {\n var pending = this._realtimePendingTurns[turnId];\n delete this._realtimePendingTurns[turnId];\n this.stopAudio();\n if (text) {\n pending.content = text;\n pending.rawContent = text;\n pending.isPartial = false;\n updateMessagePresentation(pending, pending.references);\n } else {\n var emptyIndex = this.messages.indexOf(pending);\n if (emptyIndex >= 0) { this.messages.splice(emptyIndex, 1); }\n }\n\n return;\n }\n\n if (text) {\n this.stopAudio();\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else if (this._conversationAssistantMessage) {\n // Realtime: the user's transcript lags the assistant's reply for the SAME turn (the\n // model answers the audio before speech-to-text finishes). Insert the user message\n // just before the streaming assistant message so the order stays You -> Assistant,\n // and keep that message streaming — ending it here split one reply into two bubbles.\n var at = this._conversationAssistantMessage.index;\n var userMsg = { role: 'user', content: text, rawContent: text, references: {} };\n updateMessagePresentation(userMsg, userMsg.references);\n this.messages.splice(at, 0, userMsg);\n this._conversationAssistantMessage.index = at + 1;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, references, appearance) => {\n // A new response id means a new turn — finalize the previous assistant message so two replies\n // never merge into one bubble (also covers barge-in, which starts a fresh response).\n if (this._conversationAssistantMessage && this._conversationAssistantResponseId && responseId && this._conversationAssistantResponseId !== responseId) {\n var prev = this.messages[this._conversationAssistantMessage.index];\n if (prev) { prev.isStreaming = false; }\n this._conversationAssistantMessage = null;\n }\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n appearance: this.normalizeAssistantAppearance(appearance),\n references: {},\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n this._conversationAssistantResponseId = responseId;\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.rawContent = this._conversationAssistantMessage.content;\n msg.references = normalizeReferences(Object.assign({}, msg.references || {}, references || {}));\n updateMessagePresentation(msg, msg.references);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId, references) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n msg.references = normalizeReferences(Object.assign({}, msg.references || {}, references || {}));\n updateMessagePresentation(msg, msg.references);\n }\n this._conversationAssistantMessage = null;\n this._conversationAssistantResponseId = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n // Realtime PCM streams straight to the low-latency player; other formats (TTS) are buffered.\n if (contentType === 'audio/pcm' && this.realtimeController) {\n this.realtimeController.receivePcm(bytes);\n } else {\n this.audioChunks.push(bytes);\n }\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"HistoryCleared\", (itemId) => {\n // Clear messages and show placeholder\n this.messages = [];\n this.showPlaceholder();\n\n // Hide the clear history button since there's no history now\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.add('d-none');\n }\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n this.reloadCurrentInteraction();\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n if (message.content) {\n message.rawContent = message.rawContent ?? message.content;\n updateMessagePresentation(message, message.references);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n async sendMessage() {\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // Flush any pending settings save before sending a message\n // to prevent concurrent hub calls that can cause database deadlocks.\n await this.flushPendingSave();\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n // Show the clear history button since we now have prompts\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.remove('d-none');\n }\n\n this.streamMessage(trimmedPrompt);\n this.inputElement.value = '';\n this.prompt = '';\n },\n streamMessage(trimmedPrompt) {\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n var messageIndex = this.messages.length;\n var currentItemId = this.getItemId();\n\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n if (chunk.sessionId && !currentItemId) {\n this.setItemId(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n messageIndex = this.messages.length;\n let newMessage = {\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n };\n\n this.messages.push(newMessage);\n message = newMessage;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = normalizeReference(value) ?? {};\n }\n }\n\n if (chunk.content) {\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n content += chunk.content;\n }\n\n message.rawContent = content;\n updateMessagePresentation(message, references);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n return {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n },\n processReferences(references, messageIndex) {\n references = normalizeReferences(references);\n\n if (Object.keys(references).length) {\n let message = this.messages[messageIndex];\n message.rawContent = message.rawContent ?? message.content ?? '';\n updateMessagePresentation(message, references);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Save any settings that were deferred during streaming.\n if (this.settingsDirty) {\n this.debouncedSaveSettings();\n }\n },\n handleExternalTtsStop(e) {\n if (e?.detail?.sourceId === this.ttsInstanceId) {\n return;\n }\n\n this.stopAudio(false);\n },\n updateTtsPlaybackButtons() {\n if (!this.chatContainer) {\n return;\n }\n\n var buttons = this.chatContainer.querySelectorAll('[data-tts-message-index]');\n\n buttons.forEach(button => {\n var buttonIndex = Number(button.getAttribute('data-tts-message-index'));\n var isPlaying = buttonIndex === this.ttsPlayingMessageIndex;\n var iconHtml = isPlaying\n ? ''\n : '';\n\n button.classList.toggle('tts-playing', isPlaying);\n button.setAttribute('title', isPlaying ? 'Pause audio' : 'Read aloud');\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n });\n },\n updateCopyButtons() {\n if (!this.chatContainer) {\n return;\n }\n\n var buttons = this.chatContainer.querySelectorAll('[data-copy-message-index]');\n\n buttons.forEach(button => {\n var buttonIndex = Number(button.getAttribute('data-copy-message-index'));\n var isCopied = buttonIndex === this.copiedMessageIndex;\n var iconHtml = isCopied\n ? ''\n : '';\n\n button.classList.toggle('text-success', isCopied);\n button.classList.toggle('text-secondary', !isCopied);\n button.setAttribute('title', isCopied ? this.copiedTitle : this.copyTitle);\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n });\n },\n setCopyButtonState(button, isCopied) {\n if (!button) {\n return;\n }\n\n var iconHtml = isCopied\n ? ''\n : '';\n\n button.classList.toggle('text-success', isCopied);\n button.classList.toggle('text-secondary', !isCopied);\n button.setAttribute('title', isCopied ? this.copiedTitle : this.copyTitle);\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio(false);\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\n detail: { sourceId: this.ttsInstanceId }\n }));\n this.ttsPlayingMessageIndex = index;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is currently playing, queue this blob for later.\n if (this.isPlayingAudio && this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioUrl = url;\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n const nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n if (this.currentAudioUrl) {\n URL.revokeObjectURL(this.currentAudioUrl);\n this.currentAudioUrl = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var itemId = this.getItemId();\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, continuation is handled\n // by the persistent stream.\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getItemId() {\n return this.inputElement.getAttribute('data-interaction-id')\n || this.inputElement.getAttribute('data-item-id');\n },\n getSaveIndicatorElement() {\n if (config.saveIndicatorElementSelector) {\n return document.querySelector(config.saveIndicatorElementSelector);\n }\n\n return document.querySelector('[data-chat-interaction-save-indicator]');\n },\n showSaveIndicator(text, className) {\n const indicator = this.getSaveIndicatorElement();\n if (!indicator) {\n return;\n }\n\n indicator.textContent = text || '';\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\n\n if (this.saveIndicatorTimeout) {\n clearTimeout(this.saveIndicatorTimeout);\n this.saveIndicatorTimeout = null;\n }\n\n if (!text) {\n return;\n }\n\n this.saveIndicatorTimeout = setTimeout(() => {\n indicator.textContent = '';\n this.saveIndicatorTimeout = null;\n }, 3000);\n },\n clearPendingSettingsSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n },\n getFieldLabel(input) {\n const label = input\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\n ?.querySelector('label');\n\n if (!label) {\n return input.dataset.setting || 'This field';\n }\n\n return (label.textContent || '')\n .replace(/\\s+/g, ' ')\n .trim()\n || input.dataset.setting\n || 'This field';\n },\n getValidationFeedbackElement(input) {\n let feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n return feedback;\n }\n\n feedback = document.createElement('div');\n feedback.className = 'invalid-feedback';\n input.insertAdjacentElement('afterend', feedback);\n\n return feedback;\n },\n clearSettingValidationError(input) {\n input.classList.remove('is-invalid');\n input.removeAttribute('aria-invalid');\n\n const feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n feedback.textContent = '';\n }\n },\n setSettingValidationError(input, message) {\n const feedback = this.getValidationFeedbackElement(input);\n input.classList.add('is-invalid');\n input.setAttribute('aria-invalid', 'true');\n feedback.textContent = message;\n },\n getSettingValidationMessage(input) {\n if (!input || input.disabled || input.type !== 'number') {\n return null;\n }\n\n const value = (input.value || '').trim();\n if (!value) {\n return null;\n }\n\n const number = Number(value);\n const fieldLabel = this.getFieldLabel(input);\n\n if (Number.isNaN(number)) {\n return `${fieldLabel} must be a valid number.`;\n }\n\n const min = input.getAttribute('min');\n if (min !== null && number < Number(min)) {\n return `${fieldLabel} must be ${min} or greater.`;\n }\n\n const max = input.getAttribute('max');\n if (max !== null && number > Number(max)) {\n return `${fieldLabel} must be ${max} or less.`;\n }\n\n return null;\n },\n validateSettingInput(input) {\n const message = this.getSettingValidationMessage(input);\n if (!message) {\n this.clearSettingValidationError(input);\n return true;\n }\n\n this.setSettingValidationError(input, message);\n return false;\n },\n validateSettings() {\n let isValid = true;\n\n this.getSettingInputs().forEach(input => {\n isValid = this.validateSettingInput(input) && isValid;\n });\n\n return isValid;\n },\n queueSettingsSave() {\n if (!this.validateSettings()) {\n this.clearPendingSettingsSave();\n this.settingsDirty = false;\n this.showSaveIndicator('Fix errors', 'text-danger');\n return;\n }\n\n this.settingsDirty = true;\n this.showSaveIndicator('Saving...', 'text-warning');\n this.debouncedSaveSettings();\n },\n getSettingInputs() {\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\n if (explicitInputs.length > 0) {\n return explicitInputs;\n }\n\n return document.querySelectorAll(\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\n );\n },\n getSelectedGroupValues(groupName, fallbackSelector) {\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked, .capability-checkbox[data-group=\"${groupName}\"]:checked`);\n if (explicitSelections.length > 0) {\n const values = [];\n\n explicitSelections.forEach(checkbox => {\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\n if (value) {\n values.push(value);\n }\n });\n\n return values;\n }\n\n if (!fallbackSelector) {\n return [];\n }\n\n const values = [];\n const checkboxes = document.querySelectorAll(fallbackSelector);\n\n checkboxes.forEach(checkbox => {\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\n\n if (hiddenInput && hiddenInput.value) {\n values.push(hiddenInput.value);\n }\n });\n\n return values;\n },\n getPromptTemplateSelections() {\n const promptTemplates = [];\n\n document.querySelectorAll('.prompt-template-card').forEach(card => {\n const templateIdInput = card.querySelector('.prompt-template-id-input');\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\n\n if (!templateId) {\n return;\n }\n\n promptTemplates.push({\n templateId: templateId,\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\n });\n });\n\n return promptTemplates;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n // Replace existing notification with same type, or add new one.\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var itemId = this.getItemId();\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\n .catch(err => console.error('Failed to handle notification action:', err));\n },\n setItemId(itemId) {\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\n this.inputElement.setAttribute('data-item-id', itemId || '');\n },\n resetInteraction() {\n this.setItemId('');\n this.isInteractionStarted = false;\n this.messages = [];\n this.showPlaceholder();\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keyup', event => {\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.inputElement.addEventListener('paste', (e) => {\n // Use setTimeout to allow the paste to complete before checking the value\n setTimeout(() => {\n this.prompt = this.inputElement.value;\n if (this.inputElement.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n }, 0);\n });\n\n this.buttonElement.addEventListener('click', () => {\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\n\n for (var i = 0; i < chatInteractionItems.length; i++) {\n chatInteractionItems[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var itemId = e.target.getAttribute('data-interaction-id');\n\n if (!itemId) {\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\n return;\n }\n\n this.loadInteraction(itemId);\n });\n }\n\n const initialMessages = Array.isArray(config.messages) ? config.messages : [];\n\n for (let i = 0; i < initialMessages.length; i++) {\n this.addMessage(initialMessages[i]);\n }\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n document.addEventListener('input', event => {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('change', event => {\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .capability-checkbox[data-group], .group-toggle, .ci-agent-global-toggle')) {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n }\n\n this.queueSettingsSave();\n return;\n }\n\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('click', event => {\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\n return;\n }\n\n setTimeout(() => {\n this.queueSettingsSave();\n }, 0);\n });\n\n // Add event listener for clear history button\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.addEventListener('click', () => {\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\n if (itemId) {\n this.clearHistory(itemId);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n\n // Initialize realtime (speech-to-speech) mode via the shared CoreAIRealtime module. The\n // module owns the mic capture, playback, echo guard, push-to-talk and audio settings; the\n // callbacks below plug it into this app's connection and conversation-transcript display.\n if (window.CoreAIRealtime && config.realtimeButtonElementSelector) {\n this.realtimeController = window.CoreAIRealtime.attach({\n connection: this.connection,\n ensureConnected: () => Promise.resolve(this.connection),\n sendStart: (subject, voice, language, silenceMs, vadThreshold, allowInterruption) => {\n this.connection.send('StartRealtimeConversation', this.getItemId(), subject, voice, language, silenceMs, vadThreshold, allowInterruption);\n },\n // Prefer WebRTC (server-relay) when the server advertises it; the shared module falls back\n // to the WebSocket sendStart above if the peer cannot connect.\n webRtcEnabled: config.realtimeWebRtcEnabled === true,\n sendStartWebRtc: (offerSdp, voice, language, silenceMs, vadThreshold, allowInterruption) => {\n this.connection.send('StartRealtimeWebRtc', this.getItemId(), offerSdp, voice, language, silenceMs, vadThreshold, allowInterruption);\n },\n webRtcIceServers: Array.isArray(config.realtimeWebRtcIceServers) ? config.realtimeWebRtcIceServers : undefined,\n voiceName: config.realtimeVoiceName || '',\n getVoiceName: () => {\n var el = config.realtimeVoiceSelectElementSelector ? document.querySelector(config.realtimeVoiceSelectElementSelector) : null;\n return el ? el.value : '';\n },\n capableDeployments: config.realtimeCapableDeployments || [],\n realtimeEnabled: config.realtimeEnabled === true,\n selectors: {\n realtimeButton: config.realtimeButtonElementSelector,\n input: config.inputElementSelector,\n sendButton: config.sendButtonElementSelector,\n micButton: config.micButtonElementSelector,\n conversationButton: config.conversationButtonElementSelector,\n deploymentSelect: config.deploymentSelectElementSelector\n },\n onActivate: () => {\n this.isConversationMode = true;\n this._conversationPartialMessage = null;\n this._conversationAssistantMessage = null;\n },\n onDeactivate: () => {\n this.isConversationMode = false;\n if (this._conversationAssistantMessage) {\n var m = this.messages[this._conversationAssistantMessage.index];\n if (m) { m.isStreaming = false; }\n this._conversationAssistantMessage = null;\n }\n },\n onEnterRealtimeMode: () => {\n if (this.isRecording) { this.stopRecording(); }\n if (this.isConversationMode && (!this.realtimeController || !this.realtimeController.isActive())) { this.stopConversationMode(); }\n },\n // The utterance has been captured but not transcribed yet. Showing a placeholder now\n // puts the prompt above the reply it produces: transcription lags the spoken answer, so\n // a bubble added only when the text arrives lands underneath its own reply.\n onUserTurnPending: (turnId) => {\n if (!turnId) { return; }\n var placeholder = { role: 'user', content: '', rawContent: '', references: {}, isPartial: true };\n updateMessagePresentation(placeholder, placeholder.references);\n this._realtimePendingTurns = this._realtimePendingTurns || {};\n this._realtimePendingTurns[turnId] = placeholder;\n this.messages.push(placeholder);\n this.scrollToBottom();\n },\n onUserTurnDropped: (turnId) => {\n if (!turnId || !this._realtimePendingTurns) { return; }\n var dropped = this._realtimePendingTurns[turnId];\n if (!dropped) { return; }\n delete this._realtimePendingTurns[turnId];\n var at = this.messages.indexOf(dropped);\n if (at >= 0) { this.messages.splice(at, 1); }\n }\n });\n\n this.setupRealtimeVoicePicker(config);\n }\n },\n // Populates the per-interaction realtime voice picker from the selected realtime deployment's\n // voices (via the realtime-voices endpoint), and shows it only for realtime-capable deployments.\n setupRealtimeVoicePicker(config) {\n if (!config.realtimeVoiceSelectElementSelector || !config.realtimeVoicesUrl) {\n return;\n }\n\n var voiceSelect = document.querySelector(config.realtimeVoiceSelectElementSelector);\n if (!voiceSelect) {\n return;\n }\n\n var voiceGroup = config.realtimeVoiceGroupElementSelector ? document.querySelector(config.realtimeVoiceGroupElementSelector) : null;\n var deploymentSelect = config.deploymentSelectElementSelector ? document.querySelector(config.deploymentSelectElementSelector) : null;\n var capable = (config.realtimeCapableDeployments || []).map(function (n) { return (n || '').toLowerCase(); });\n var savedVoiceId = config.realtimeVoiceName || '';\n\n function isRealtimeDeployment(name) {\n return name && capable.indexOf(name.toLowerCase()) !== -1;\n }\n\n async function loadVoices() {\n var deploymentName = deploymentSelect ? deploymentSelect.value : '';\n var realtime = isRealtimeDeployment(deploymentName);\n if (voiceGroup) {\n voiceGroup.classList.toggle('d-none', !realtime);\n }\n if (!realtime) {\n return;\n }\n\n voiceSelect.innerHTML = '';\n\n try {\n const response = await fetch(config.realtimeVoicesUrl + '?deploymentName=' + encodeURIComponent(deploymentName), { credentials: 'same-origin' });\n const result = await response.json();\n if (!result || !Array.isArray(result.voices)) {\n return;\n }\n\n const grouped = new Map();\n for (const voice of result.voices) {\n const groupName = voice.gender || 'Voices';\n if (!grouped.has(groupName)) {\n grouped.set(groupName, []);\n }\n grouped.get(groupName).push(voice);\n }\n\n Array.from(grouped.keys()).sort((a, b) => a.localeCompare(b)).forEach(function (groupName) {\n const optgroup = document.createElement('optgroup');\n optgroup.label = groupName;\n grouped.get(groupName).forEach(function (voice) {\n const option = document.createElement('option');\n option.value = voice.id;\n option.textContent = voice.name;\n option.selected = voice.id === savedVoiceId;\n optgroup.appendChild(option);\n });\n voiceSelect.appendChild(optgroup);\n });\n } catch (err) {\n /* ignore voice load failures */\n }\n }\n\n if (deploymentSelect) {\n deploymentSelect.addEventListener('change', loadVoices);\n }\n loadVoices();\n },\n loadInteraction(itemId) {\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\n },\n reloadCurrentInteraction() {\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n },\n clearHistory(itemId) {\n const self = this;\n const clearHistoryConfirmed = () => {\n // Force-stop any live realtime voice session before clearing history.\n if (self.realtimeController && self.realtimeController.isActive()) {\n self.realtimeController.stop();\n }\n\n // Cancel any active stream before clearing history.\n if (self.stream) {\n self.stream.dispose();\n self.stream = null;\n self.hideTypingIndicator();\n self.streamingFinished();\n }\n\n self.connection.invoke(\"ClearHistory\", itemId)\n .catch(err => console.error('Error clearing history:', err));\n };\n\n if (typeof confirmDialog === 'function') {\n confirmDialog({\n title: config.clearHistoryTitle,\n message: config.clearHistoryMessage,\n okText: config.clearHistoryOkText,\n cancelText: config.clearHistoryCancelText,\n callback: function (confirmed) {\n if (confirmed) {\n clearHistoryConfirmed();\n }\n }\n });\n\n return;\n }\n\n if (window.confirm(config.clearHistoryMessage || 'Clear all messages?')) {\n clearHistoryConfirmed();\n }\n },\n debouncedSaveSettings() {\n // Clear any existing timeout to reset the debounce timer\n this.clearPendingSettingsSave();\n\n // Don't save while streaming — it will be saved when streaming completes.\n if (this.stream) {\n return;\n }\n\n // Set a new timeout to save after 850ms of no changes\n this.saveSettingsTimeout = setTimeout(() => {\n if (this.settingsDirty) {\n this.saveSettings();\n this.settingsDirty = false;\n }\n this.saveSettingsTimeout = null;\n }, 850);\n },\n getSelectedToolNames() {\n return this.getSelectedGroupValues(\n 'toolNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\n );\n },\n getSelectedMcpConnectionIds() {\n return this.getSelectedGroupValues(\n 'mcpConnectionIds',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\n );\n },\n getSelectedA2AConnectionIds() {\n return this.getSelectedGroupValues('a2aConnectionIds');\n },\n getSelectedAgentNames() {\n return this.getSelectedGroupValues(\n 'agentNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\n );\n },\n saveSettings() {\n const itemId = this.getItemId();\n if (!itemId) {\n return Promise.resolve();\n }\n\n if (!this.validateSettings()) {\n this.showSaveIndicator('Fix errors', 'text-danger');\n return Promise.resolve();\n }\n\n const settings = {};\n\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\n // This avoids coupling the JS to specific field names — new fields added by\n // any module are automatically included.\n const inputs = this.getSettingInputs();\n\n inputs.forEach(input => {\n const key = input.dataset.setting\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\n\n if (!key) {\n return;\n }\n\n if (input.type === 'checkbox') {\n settings[key] = input.checked;\n } else if (input.type === 'number') {\n settings[key] = input.value ? parseFloat(input.value) : null;\n } else {\n settings[key] = input.value || null;\n }\n });\n\n // Add tool, MCP connection, and agent collections (special handling).\n settings.toolNames = this.getSelectedToolNames();\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\n settings.agentNames = this.getSelectedAgentNames();\n\n const promptTemplates = this.getPromptTemplateSelections();\n if (promptTemplates.length > 0) {\n settings.promptTemplates = promptTemplates;\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\n }\n\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\n .catch(err => {\n console.error('Error saving settings:', err);\n this.showSaveIndicator('Save failed', 'text-danger');\n });\n },\n flushPendingSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n\n if (this.settingsDirty) {\n this.settingsDirty = false;\n return this.saveSettings();\n }\n\n return Promise.resolve();\n },\n initializeInteraction(itemId, force) {\n if (this.isInteractionStarted && !force) {\n return;\n }\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\n this.setItemId(itemId);\n this.isInteractionStarted = true;\n },\n clearCopiedMessageState() {\n if (this.copyResetTimeoutId) {\n window.clearTimeout(this.copyResetTimeoutId);\n this.copyResetTimeoutId = null;\n }\n\n if (this.activeCopyButton) {\n this.setCopyButtonState(this.activeCopyButton, false);\n this.activeCopyButton = null;\n }\n\n this.copiedMessageIndex = -1;\n },\n copyResponse(message, index, event) {\n const text = message && typeof message === 'object'\n ? message.copyContent ?? message.content ?? ''\n : message ?? '';\n const button = event?.currentTarget || event?.target?.closest?.('[data-copy-message-index]') || null;\n\n navigator.clipboard.writeText(text)\n .then(() => {\n this.clearCopiedMessageState();\n this.copiedMessageIndex = typeof index === 'number' ? index : -1;\n this.activeCopyButton = button;\n\n if (button) {\n this.setCopyButtonState(button, true);\n } else {\n this.$nextTick(() => this.updateCopyButtons());\n }\n\n this.copyResetTimeoutId = window.setTimeout(() => {\n this.clearCopiedMessageState();\n this.$nextTick(() => this.updateCopyButtons());\n }, Number(config.copyResetDelayMs) || 2000);\n })\n .catch(err => console.error('Failed to copy response:', err));\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var itemId = this.getItemId();\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n }\n },\n watch: {\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n },\n copiedMessageIndex() {\n this.$nextTick(() => this.updateCopyButtons());\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n\n this.$nextTick(() => {\n this.updateCopyButtons();\n refreshFontAwesomeIcons(this.$el);\n this.fontAwesomeObserver = observeFontAwesomeIcons(this.$el);\n });\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n\n if (this.fontAwesomeObserver) {\n this.fontAwesomeObserver.disconnect();\n this.fontAwesomeObserver = null;\n }\n\n this.clearCopiedMessageState();\n this.stopAudio(false);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n const autoInitializeSelector = '[data-chat-interaction-config]';\n\n function parseJsonAttribute(element, attributeName, description) {\n const rawValue = element.getAttribute(attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n } catch (error) {\n console.error('Failed to parse ' + description + ' JSON.', error);\n return null;\n }\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.chatInteractionInitialized === 'true') {\n return element ? element.__chatInteractionApp || null : null;\n }\n\n const config = parseJsonAttribute(element, 'data-chat-interaction-config', 'chat interaction config');\n if (!config) {\n return null;\n }\n\n const app = initialize(config);\n if (!app) {\n return null;\n }\n\n element.dataset.chatInteractionInitialized = 'true';\n element.__chatInteractionApp = app;\n\n return app;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches(autoInitializeSelector)) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll(autoInitializeSelector).forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n\n return {\n initialize: initialize,\n initializeFromElement: initializeFromElement,\n };\n}();\n\nwindow.chatInteractionDocumentManager = function () {\n const managerStateKey = '__chatInteractionDocumentManagerState';\n\n function normalizeDocumentInfo(document) {\n if (!document || typeof document !== 'object') {\n return null;\n }\n\n return {\n documentId: document.documentId || document.DocumentId || '',\n fileName: document.fileName || document.FileName || '',\n fileSize: document.fileSize || document.FileSize || 0\n };\n }\n\n function formatFileSize(bytes) {\n if (!bytes || bytes < 1024) {\n return (bytes || 0) + ' B';\n }\n\n if (bytes < 1024 * 1024) {\n return (bytes / 1024).toFixed(1) + ' KB';\n }\n\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n }\n\n function getDocumentKey(fileName, fileSize) {\n return ((fileName || '').trim().toLowerCase()) + '::' + (fileSize || 0);\n }\n\n function isDuplicateFile(file, knownKeys) {\n return knownKeys.has(getDocumentKey(file.name, file.size));\n }\n\n function getDocumentsFromDom(container) {\n if (!container) {\n return [];\n }\n\n return Array.from(container.querySelectorAll('[data-chat-document-id]'))\n .map(element => normalizeDocumentInfo({\n documentId: element.dataset.chatDocumentId,\n fileName: element.dataset.chatDocumentName,\n fileSize: Number(element.dataset.chatDocumentSize || 0)\n }))\n .filter(document => document && document.documentId);\n }\n\n function initialize(config) {\n if (!config || !config.itemId) {\n return;\n }\n\n const fileInput = document.getElementById('chat-doc-upload');\n const documentsList = document.getElementById('chat-documents-list');\n const status = document.getElementById('chat-doc-upload-status');\n const progressContainer = document.getElementById('chat-doc-upload-progress');\n const progressBar = document.getElementById('chat-doc-upload-progress-bar');\n const uploadQueue = document.getElementById('chat-doc-upload-queue');\n\n if (!fileInput || !documentsList || !status || !progressContainer || !progressBar || !uploadQueue) {\n return;\n }\n\n const previousState = fileInput[managerStateKey];\n if (previousState && typeof previousState.dispose === 'function') {\n previousState.dispose();\n }\n\n let interactionDocuments = (Array.isArray(config.existingDocuments) ? config.existingDocuments : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n\n if (interactionDocuments.length === 0) {\n interactionDocuments = getDocumentsFromDom(documentsList);\n }\n\n let uploadItems = [];\n let isUploadingDocuments = false;\n\n function createTextElement(tagName, className, text) {\n const element = document.createElement(tagName);\n if (className) {\n element.className = className;\n }\n\n element.textContent = text;\n return element;\n }\n\n function renderDocuments() {\n documentsList.innerHTML = '';\n\n if (interactionDocuments.length === 0) {\n documentsList.appendChild(createTextElement('div', 'text-muted small', 'No documents uploaded yet.'));\n return;\n }\n\n interactionDocuments.forEach(documentInfo => {\n const row = window.document.createElement('div');\n row.className = 'd-flex align-items-center gap-2 border rounded px-2 py-2 bg-white chat-document-row';\n row.dataset.chatDocumentId = documentInfo.documentId;\n row.dataset.chatDocumentName = documentInfo.fileName;\n row.dataset.chatDocumentSize = documentInfo.fileSize;\n\n const actions = window.document.createElement('div');\n actions.className = 'd-flex gap-1';\n\n const downloadBaseUrl = config.downloadDocumentBaseUrl || '/ai/documents/';\n const downloadLink = createTextElement('a', 'btn btn-sm btn-outline-secondary', '');\n downloadLink.title = 'Download';\n downloadLink.href = downloadBaseUrl + encodeURIComponent(documentInfo.documentId) + '/download';\n const downloadIcon = window.document.createElement('i');\n downloadIcon.className = 'fa-solid fa-download';\n downloadLink.appendChild(downloadIcon);\n\n const removeButton = createTextElement('button', 'btn btn-sm btn-outline-danger remove-chat-document-btn', '');\n removeButton.type = 'button';\n removeButton.title = 'Remove';\n removeButton.dataset.documentId = documentInfo.documentId;\n const removeIcon = window.document.createElement('i');\n removeIcon.className = 'fa-solid fa-trash';\n removeButton.appendChild(removeIcon);\n removeButton.addEventListener('click', () => removeDocument(documentInfo.documentId));\n\n actions.appendChild(downloadLink);\n actions.appendChild(removeButton);\n\n const details = window.document.createElement('div');\n details.className = 'min-w-0';\n\n const name = createTextElement('div', 'fw-semibold small text-truncate', documentInfo.fileName || 'Document');\n const icon = window.document.createElement('i');\n icon.className = 'fa-solid fa-file-lines me-1';\n name.prepend(icon);\n\n const size = createTextElement('div', 'text-muted small', formatFileSize(documentInfo.fileSize));\n\n details.appendChild(name);\n details.appendChild(size);\n\n row.appendChild(actions);\n row.appendChild(details);\n documentsList.appendChild(row);\n });\n }\n\n function showUploadStatus(message, cssClass) {\n if (!message) {\n status.textContent = '';\n status.className = 'small mt-2 d-none';\n return;\n }\n\n status.textContent = message;\n status.className = 'small mt-2 ' + (cssClass || 'text-muted');\n }\n\n function showUploadProgress(progress, message, cssClass) {\n if (progress === null || progress === undefined) {\n progressContainer.className = 'progress mt-2 d-none';\n progressContainer.setAttribute('aria-valuenow', '0');\n progressBar.className = 'progress-bar progress-bar-striped progress-bar-animated';\n progressBar.style.width = '0%';\n progressBar.textContent = '0%';\n return;\n }\n\n const roundedProgress = Math.max(0, Math.min(100, Math.round(progress)));\n progressContainer.className = 'progress mt-2';\n progressContainer.setAttribute('aria-valuenow', roundedProgress.toString());\n progressBar.className = 'progress-bar ' + (cssClass || 'progress-bar-striped progress-bar-animated');\n progressBar.style.width = roundedProgress + '%';\n progressBar.textContent = message || (roundedProgress + '%');\n }\n\n function getUploadStatePresentation(state) {\n switch (state) {\n case 'uploaded':\n return { label: 'Uploaded', badgeClass: 'text-bg-success', progressClass: 'bg-success' };\n case 'failed':\n return { label: 'Failed', badgeClass: 'text-bg-danger', progressClass: 'bg-danger' };\n case 'uploading':\n return { label: 'Uploading', badgeClass: 'text-bg-warning', progressClass: 'bg-warning progress-bar-striped progress-bar-animated' };\n default:\n return { label: 'Queued', badgeClass: 'text-bg-secondary', progressClass: 'bg-secondary progress-bar-striped progress-bar-animated' };\n }\n }\n\n function formatUploadMessage(item) {\n if (item.status === 'failed' && item.error) {\n return item.error;\n }\n\n if (item.status === 'uploaded') {\n return 'Upload completed successfully.';\n }\n\n if (item.status === 'uploading') {\n return item.progress + '% uploaded';\n }\n\n return 'Waiting to upload...';\n }\n\n function renderUploadQueue() {\n uploadQueue.innerHTML = '';\n\n uploadItems.forEach(item => {\n const presentation = getUploadStatePresentation(item.status);\n const card = document.createElement('div');\n card.className = 'border rounded px-2 py-2 bg-white';\n\n const header = document.createElement('div');\n header.className = 'd-flex justify-content-between align-items-start gap-2';\n\n const fileDetails = document.createElement('div');\n fileDetails.className = 'flex-grow-1 min-w-0';\n fileDetails.appendChild(createTextElement('div', 'fw-semibold small', item.fileName));\n fileDetails.appendChild(createTextElement('div', 'text-muted small', formatFileSize(item.fileSize)));\n\n const badge = createTextElement('span', 'badge ' + presentation.badgeClass, presentation.label);\n\n header.appendChild(fileDetails);\n header.appendChild(badge);\n\n const progress = document.createElement('div');\n progress.className = 'progress mt-2';\n progress.setAttribute('role', 'progressbar');\n progress.setAttribute('aria-valuemin', '0');\n progress.setAttribute('aria-valuemax', '100');\n progress.setAttribute('aria-valuenow', item.progress.toString());\n\n const progressState = document.createElement('div');\n progressState.className = 'progress-bar ' + presentation.progressClass;\n progressState.style.width = item.progress + '%';\n progressState.textContent = item.progress + '%';\n progress.appendChild(progressState);\n\n const message = createTextElement('div', item.status === 'failed' ? 'small text-danger mt-2' : 'small text-muted mt-2', formatUploadMessage(item));\n\n card.appendChild(header);\n card.appendChild(progress);\n card.appendChild(message);\n uploadQueue.appendChild(card);\n });\n }\n\n function createUploadItem(file, index) {\n return {\n id: file.name + '::' + file.size + '::' + file.lastModified + '::' + index + '::' + Date.now(),\n fileName: file.name,\n fileSize: file.size,\n status: 'queued',\n progress: 0,\n error: null\n };\n }\n\n function updateUploadItem(itemId, updates) {\n uploadItems = uploadItems.map(item => item.id === itemId ? Object.assign({}, item, updates) : item);\n renderUploadQueue();\n }\n\n function removeUploadItems(predicate) {\n uploadItems = uploadItems.filter(item => !predicate(item));\n renderUploadQueue();\n }\n\n function uploadSingleDocument(file, itemIdToUpdate, fileIndex, totalFiles) {\n return new Promise((resolve, reject) => {\n const formData = new FormData();\n formData.append('chatInteractionId', config.itemId);\n formData.append('files', file);\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', config.uploadDocumentUrl, true);\n\n xhr.upload.addEventListener('progress', event => {\n if (!event.lengthComputable) {\n return;\n }\n\n const fileProgress = Math.round((event.loaded / event.total) * 100);\n updateUploadItem(itemIdToUpdate, {\n status: 'uploading',\n progress: fileProgress\n });\n\n const overallProgress = ((fileIndex + (event.loaded / event.total)) / totalFiles) * 100;\n showUploadProgress(overallProgress, 'Uploading ' + (fileIndex + 1) + ' of ' + totalFiles, 'progress-bar-striped progress-bar-animated');\n });\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve(JSON.parse(xhr.responseText));\n } catch (error) {\n reject(new Error('Upload failed: invalid server response.'));\n }\n\n return;\n }\n\n reject(new Error((xhr.responseText || 'Upload failed.').trim()));\n });\n\n xhr.addEventListener('error', () => {\n reject(new Error('Upload failed. Please check your connection and try again.'));\n });\n\n xhr.send(formData);\n });\n }\n\n async function uploadDocuments(files) {\n if (!config.uploadDocumentUrl || !files || files.length === 0) {\n return;\n }\n\n if (isUploadingDocuments) {\n showUploadStatus('A document upload is already in progress.', 'text-warning');\n return;\n }\n\n isUploadingDocuments = true;\n\n const filesToUpload = [];\n const duplicateItems = [];\n const knownDocumentKeys = new Set(interactionDocuments.map(document => getDocumentKey(document.fileName, document.fileSize)));\n\n Array.from(files).forEach(file => {\n if (isDuplicateFile(file, knownDocumentKeys)) {\n duplicateItems.push(file);\n return;\n }\n\n knownDocumentKeys.add(getDocumentKey(file.name, file.size));\n filesToUpload.push(file);\n });\n\n if (duplicateItems.length > 0) {\n uploadItems = uploadItems.concat(duplicateItems.map((file, index) => Object.assign(createUploadItem(file, index), {\n status: 'failed',\n progress: 100,\n error: 'This document is already attached.'\n })));\n renderUploadQueue();\n }\n\n if (filesToUpload.length === 0) {\n isUploadingDocuments = false;\n showUploadStatus(duplicateItems.map(file => file.name + ': This document is already attached.').join(' | '), 'text-warning');\n showUploadProgress(null);\n return;\n }\n\n const pendingItems = filesToUpload.map(createUploadItem);\n uploadItems = uploadItems.concat(pendingItems);\n renderUploadQueue();\n showUploadProgress(0, 'Preparing upload...', 'progress-bar-striped progress-bar-animated');\n fileInput.disabled = true;\n\n try {\n let uploadedCount = 0;\n const failedUploads = duplicateItems.map(file => file.name + ': This document is already attached.');\n\n for (let i = 0; i < filesToUpload.length; i++) {\n const file = filesToUpload[i];\n const pendingItem = pendingItems[i];\n\n updateUploadItem(pendingItem.id, {\n status: 'uploading',\n progress: 0,\n error: null\n });\n\n showUploadStatus('Uploading ' + (i + 1) + ' of ' + filesToUpload.length + ' document(s)...', 'text-warning');\n\n try {\n const result = await uploadSingleDocument(file, pendingItem.id, i, filesToUpload.length);\n const uploaded = (Array.isArray(result.uploaded) ? result.uploaded : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n const failed = Array.isArray(result.failed) ? result.failed : [];\n\n if (uploaded.length > 0) {\n uploadedCount += uploaded.length;\n interactionDocuments = interactionDocuments.concat(uploaded);\n updateUploadItem(pendingItem.id, {\n status: 'uploaded',\n progress: 100,\n error: null\n });\n } else {\n const missingUploadMessage = failed.length > 0\n ? failed.map(entry => entry.fileName + ': ' + entry.error).join(' | ')\n : 'The server did not confirm that the file was uploaded.';\n if (failed.length === 0) {\n failedUploads.push(missingUploadMessage);\n }\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: 100,\n error: missingUploadMessage\n });\n }\n\n if (failed.length > 0) {\n const failedMessage = failed.map(entry => entry.fileName + ': ' + entry.error).join(' | ');\n failedUploads.push(failedMessage);\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: 100,\n error: failedMessage\n });\n }\n } catch (error) {\n const errorMessage = error && error.message\n ? error.message\n : 'Upload failed. Please try again.';\n console.error('Upload failed:', error);\n failedUploads.push(file.name + ': ' + errorMessage);\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: pendingItem.progress || 0,\n error: errorMessage\n });\n }\n }\n\n renderDocuments();\n\n if (failedUploads.length > 0) {\n removeUploadItems(item => item.status === 'uploaded');\n showUploadStatus(\n (uploadedCount > 0 ? ('Uploaded ' + uploadedCount + ' document(s). ') : '') + failedUploads.join(' | '),\n uploadedCount > 0 ? 'text-warning' : 'text-danger');\n showUploadProgress(null);\n return;\n }\n\n removeUploadItems(() => true);\n showUploadStatus('Uploaded ' + uploadedCount + ' document(s).', 'text-success');\n showUploadProgress(null);\n } catch (error) {\n console.error('Upload failed:', error);\n showUploadStatus('Upload failed. Please try again.', 'text-danger');\n showUploadProgress(null);\n } finally {\n isUploadingDocuments = false;\n fileInput.disabled = false;\n fileInput.value = '';\n }\n }\n\n async function removeDocument(documentId) {\n if (!config.removeDocumentUrl || !documentId || !window.confirm('Remove this document?')) {\n return;\n }\n\n try {\n const response = await fetch(config.removeDocumentUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n itemId: config.itemId,\n documentId: documentId\n })\n });\n\n if (!response.ok) {\n console.error('Failed to remove document:', await response.text());\n showUploadStatus('Failed to remove document.', 'text-danger');\n return;\n }\n\n const result = await response.json();\n const serverDocuments = (Array.isArray(result.documents) ? result.documents : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n\n interactionDocuments = serverDocuments.length > 0\n ? serverDocuments\n : interactionDocuments.filter(document => document.documentId !== documentId);\n renderDocuments();\n showUploadStatus('Document removed.', 'text-success');\n } catch (error) {\n console.error('Remove failed:', error);\n showUploadStatus('Failed to remove document.', 'text-danger');\n }\n }\n\n const onFileInputChange = event => {\n const selectedFiles = event.target.files ? Array.from(event.target.files) : [];\n uploadDocuments(selectedFiles);\n };\n\n fileInput.addEventListener('change', onFileInputChange);\n fileInput[managerStateKey] = {\n dispose: () => {\n fileInput.removeEventListener('change', onFileInputChange);\n }\n };\n\n renderDocuments();\n renderUploadQueue();\n showUploadStatus(null);\n showUploadProgress(null);\n\n return fileInput[managerStateKey];\n }\n\n function parseJsonAttribute(element, attributeName, description) {\n const rawValue = element.getAttribute(attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n } catch (error) {\n console.error('Failed to parse ' + description + ' JSON.', error);\n return null;\n }\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.chatInteractionDocumentManagerInitialized === 'true') {\n return element ? element[managerStateKey] || null : null;\n }\n\n const config = parseJsonAttribute(element, 'data-chat-interaction-document-manager-config', 'chat interaction document manager config');\n if (!config) {\n return null;\n }\n\n const state = initialize(config);\n if (!state) {\n return null;\n }\n\n element.dataset.chatInteractionDocumentManagerInitialized = 'true';\n\n return state;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches('[data-chat-interaction-document-manager-config]')) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll('[data-chat-interaction-document-manager-config]').forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n\n return {\n initialize: initialize,\n initializeFromElement: initializeFromElement,\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js index 1cbdf178..0306b386 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js @@ -1,2 +1,2 @@ -var _excluded=["placeholder"];function _regenerator(){/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */var e,t,n="function"==typeof Symbol?Symbol:{},i=n.iterator||"@@iterator",a=n.toStringTag||"@@toStringTag";function o(n,i,a,o){var c=i&&i.prototype instanceof s?i:s,l=Object.create(c.prototype);return _regeneratorDefine2(l,"_invoke",function(n,i,a){var o,s,c,l=0,u=a||[],d=!1,m={p:0,n:0,v:e,a:f,f:f.bind(e,4),d:function(t,n){return o=t,s=0,c=e,m.n=n,r}};function f(n,i){for(s=n,c=i,t=0;!d&&l&&!a&&t3?(a=h===i)&&(c=o[(s=o[4])?5:(s=3,3)],o[4]=o[5]=e):o[0]<=f&&((a=n<2&&fi||i>h)&&(o[4]=n,o[5]=i,m.n=h,s=0))}if(a||n>1)return r;throw d=!0,i}return function(a,u,h){if(l>1)throw TypeError("Generator is already running");for(d&&1===u&&f(u,h),s=u,c=h;(t=s<2?e:c)||!d;){o||(s?s<3?(s>1&&(m.n=-1),f(s,c)):m.n=c:m.v=c);try{if(l=2,o){if(s||(a="next"),t=o[a]){if(!(t=t.call(o,c)))throw TypeError("iterator result is not an object");if(!t.done)return t;c=t.value,s<2&&(s=0)}else 1===s&&(t=o.return)&&t.call(o),s<2&&(c=TypeError("The iterator does not provide a '"+a+"' method"),s=1);o=e}else if((t=(d=m.n<0)?c:n.call(i,m))!==r)break}catch(t){o=e,s=1,c=t}finally{l=1}}return{value:t,done:d}}}(n,a,o),!0),l}var r={};function s(){}function c(){}function l(){}t=Object.getPrototypeOf;var u=[][i]?t(t([][i]())):(_regeneratorDefine2(t={},i,function(){return this}),t),d=l.prototype=s.prototype=Object.create(u);function m(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,_regeneratorDefine2(e,a,"GeneratorFunction")),e.prototype=Object.create(d),e}return c.prototype=l,_regeneratorDefine2(d,"constructor",l),_regeneratorDefine2(l,"constructor",c),c.displayName="GeneratorFunction",_regeneratorDefine2(l,a,"GeneratorFunction"),_regeneratorDefine2(d),_regeneratorDefine2(d,a,"Generator"),_regeneratorDefine2(d,i,function(){return this}),_regeneratorDefine2(d,"toString",function(){return"[object Generator]"}),(_regenerator=function(){return{w:o,m:m}})()}function _regeneratorDefine2(e,t,n,i){var a=Object.defineProperty;try{a({},"",{})}catch(e){a=0}_regeneratorDefine2=function(e,t,n,i){function o(t,n){_regeneratorDefine2(e,t,function(e){return this._invoke(t,n,e)})}t?a?a(e,t,{value:n,enumerable:!i,configurable:!i,writable:!i}):e[t]=n:(o("next",0),o("throw",1),o("return",2))},_regeneratorDefine2(e,t,n,i)}function asyncGeneratorStep(e,t,n,i,a,o,r){try{var s=e[o](r),c=s.value}catch(e){return void n(e)}s.done?t(c):Promise.resolve(c).then(i,a)}function _asyncToGenerator(e){return function(){var t=this,n=arguments;return new Promise(function(i,a){var o=e.apply(t,n);function r(e){asyncGeneratorStep(o,i,a,r,s,"next",e)}function s(e){asyncGeneratorStep(o,i,a,r,s,"throw",e)}r(void 0)})}}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _objectWithoutProperties(e,t){if(null==e)return{};var n,i,a=_objectWithoutPropertiesLoose(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,r=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return r=e.done,e},e:function(e){s=!0,o=e},f:function(){try{r||null==n.return||n.return()}finally{if(s)throw o}}}}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=Array(t);n\n \n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n \n ',indicatorTemplate:'\n
\n \n Assistant\n
\n ',untitledText:"Untitled",clearHistoryTitle:"Clear History",clearHistoryMessage:"Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.",clearHistoryOkText:"Yes",clearHistoryCancelText:"Cancel"};function t(e){if(!e)return"";var t=e.trim();return/^javascript:/i.test(t)||/^vbscript:/i.test(t)||/^data:text\/html/i.test(t)?"":e}function n(e){var t=document.createElement("span");return t.textContent=e,t.innerHTML}function i(e){var t=window.FontAwesome;(function(e){if(!e||1!==e.nodeType)return!1;var t='i[class*="fa-"],i.fa,i.fas,i.far,i.fab';return!("function"!=typeof e.matches||!e.matches(t))||"function"==typeof e.querySelector&&!!e.querySelector(t)})(e)&&t&&t.dom&&"function"==typeof t.dom.i2svg&&t.dom.i2svg({node:e})}function a(e){if(!e||"undefined"==typeof MutationObserver)return null;var t=new MutationObserver(function(e){e.forEach(function(e){e.addedNodes.forEach(function(e){i(e)})})});return t.observe(e,{childList:!0,subtree:!0}),t}function o(e){var n,i,a,o,r,s,c,l,u,d,m;if(!e||"object"!==_typeof(e))return null;var f=Object.assign({},e);return f.index=null!==(n=null!==(i=f.index)&&void 0!==i?i:f.Index)&&void 0!==n?n:0,f.text=null!==(a=null!==(o=f.text)&&void 0!==o?o:f.Text)&&void 0!==a?a:null,f.title=null!==(r=null!==(s=f.title)&&void 0!==s?s:f.Title)&&void 0!==r?r:null,f.link=t(null!==(c=null!==(l=f.link)&&void 0!==l?l:f.Link)&&void 0!==c?c:null),f.referenceType=null!==(u=null!==(d=f.referenceType)&&void 0!==d?d:f.ReferenceType)&&void 0!==u?u:null,f.isGenerated=!0===(null!==(m=f.isGenerated)&&void 0!==m?m:f.IsGenerated),f}function r(e){return!(!e||"object"!==_typeof(e))&&("string"==typeof e.referenceType&&"document"===e.referenceType.toLowerCase()||!("string"!=typeof e.link||!/\/ai\/documents\/.+\/download(?:$|\?)/i.test(e.link)))}function s(e){if(!e||"object"!==_typeof(e))return{};for(var t={},n=0,i=Object.entries(e);n".concat(S.displayIndex,"
"))}n=n.replaceAll("",",");var A,C=_createForOfIteratorHelper(l);try{for(C.s();!(A=C.n()).done;){var I=_slicedToArray(A.value,2),T=I[0],x=I[1];d.push({referenceKey:T,displayIndex:m,label:c(x,T),link:x.link||null,isDownload:!0,placeholder:null}),m++}}catch(e){C.e(e)}finally{C.f()}return{content:n,citations:d.map(function(e){return e.placeholder,_objectWithoutProperties(e,_excluded)})}}(i,n);return e.rawContent=i,e.content=i,e.displayContent=a.content,e.references=n,e.citationReferences=a.citations,e.copyContent=function(e,t){var n=(e||"").trim();if(!n||!Array.isArray(t)||0===t.length)return n;var i,a=_createForOfIteratorHelper(t);try{for(a.s();!(i=a.n()).done;){var o=i.value;n=n.replaceAll(o.referenceKey,"[".concat(o.displayIndex,"]"))}}catch(e){a.e(e)}finally{a.f()}n+="\n\nReferences:\n";var r,s=_createForOfIteratorHelper(t);try{for(s.s();!(r=s.n()).done;){var c=r.value;n+="".concat(c.displayIndex,". ").concat(c.label),c.link&&(n+=" - ".concat(c.link)),n+="\n"}}catch(e){s.e(e)}finally{s.f()}return n.trimEnd()}(i,a.citations),e.htmlContent=h(a.content,e),e}var u=new marked.Renderer;u.link=function(e){var n=t(e.href);return n?'').concat(e.text,""):e.text||""},u.code=function(e){var t=e.text||"",i=(e.lang||"").trim(),a=t;if("undefined"!=typeof hljs)if(i&&hljs.getLanguage(i))try{a=hljs.highlight(t,{language:i}).value}catch(e){}else try{a=hljs.highlightAuto(t).value}catch(e){}else a=n(t);var o=i?n(i):"code";return'
'.concat(o,'
').concat(a,"
")},u.image=function(n){var i=t(n.href);if(!i)return"";var a=n.text||e.generatedImageAltText,o=e.generatedImageMaxWidth;return'
\n ').concat(a,'\n
\n \n \n \n
\n
')};var d=0,m=[];function f(e){if(e&&e._pendingCharts&&e._pendingCharts.length){var t=_toConsumableArray(e._pendingCharts);e._pendingCharts=[],requestAnimationFrame(function(){var e,n=_createForOfIteratorHelper(t);try{for(n.s();!(e=n.n()).done;){var i=e.value,a=document.getElementById(i.chartId);if(a)if("undefined"!=typeof Chart)if(null!==a.offsetParent)try{var o,r,s;a._chartInstance&&a._chartInstance.destroy();var c="string"==typeof i.config?JSON.parse(i.config):i.config;null!==(o=c.options)&&void 0!==o||(c.options={}),c.options.responsive=!0,c.options.maintainAspectRatio=!0,null!==(s=(r=c.options).aspectRatio)&&void 0!==s||(r.aspectRatio=4/3),a._chartInstance=new Chart(a,c)}catch(e){console.error("Error creating chart:",e)}else window.__chartConfigs[i.chartId]=i.config;else console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n continue;\n }\n\n // When the canvas is inside a hidden container (e.g., display:none),\n // it has zero dimensions. Keep the config for later rendering.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[c.chartId] = c.config;\n continue;\n }\n\n try {\n // Destroy existing chart instance if re-rendering\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n } catch (e) {\n console.error('Error creating chart:', e);\n }\n }\n });\n }\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n function compactObject(source) {\n if (!source || typeof source !== 'object') {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(source).filter(([, value]) => value !== undefined)\n );\n }\n\n const initialize = (instanceConfig) => {\n const config = Object.assign({}, defaultConfig, compactObject(instanceConfig));\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isInteractionStarted: false,\n isPlaceholderVisible: true,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n prompt: '',\n initialFieldValues: new Map(),\n settingsDirty: false,\n saveSettingsTimeout: null,\n saveIndicatorTimeout: null,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n currentAudioUrl: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2),\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n // Realtime (speech-to-speech) controller from the shared CoreAIRealtime module.\n realtimeController: null,\n notifications: [],\n notificationDismissTimers: {},\n copyTitle: config.copyTitle,\n copiedTitle: config.copiedTitle,\n copiedMessageIndex: -1,\n copyResetTimeoutId: null,\n activeCopyButton: null,\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadInteraction\", (data) => {\n this.initializeInteraction(data.itemId, true);\n this.messages = [];// Update the title field if it exists\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && data.title) {\n titleInput.value = data.title;\n }\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n });\n\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\n // Update the history list item if it exists\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\n if (historyItem) {\n historyItem.textContent = title || config.untitledText;\n }\n\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && title) {\n titleInput.value = title;\n }\n\n this.showSaveIndicator('Saved', 'text-success');\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n this.showSaveIndicator('Save failed', 'text-danger');\n\n if (this.isRecording) {\n this.stopRecording();\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, turnId, text) => {\n // Realtime: a placeholder for this turn was already inserted in the right position when\n // the utterance was captured (see onUserTurnPending), so just fill in its text.\n if (turnId && this._realtimePendingTurns && this._realtimePendingTurns[turnId]) {\n var pending = this._realtimePendingTurns[turnId];\n delete this._realtimePendingTurns[turnId];\n this.stopAudio();\n if (text) {\n pending.content = text;\n pending.rawContent = text;\n pending.isPartial = false;\n updateMessagePresentation(pending, pending.references);\n } else {\n var emptyIndex = this.messages.indexOf(pending);\n if (emptyIndex >= 0) { this.messages.splice(emptyIndex, 1); }\n }\n\n return;\n }\n\n if (text) {\n this.stopAudio();\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else if (this._conversationAssistantMessage) {\n // Realtime: the user's transcript lags the assistant's reply for the SAME turn (the\n // model answers the audio before speech-to-text finishes). Insert the user message\n // just before the streaming assistant message so the order stays You -> Assistant,\n // and keep that message streaming — ending it here split one reply into two bubbles.\n var at = this._conversationAssistantMessage.index;\n var userMsg = { role: 'user', content: text, rawContent: text, references: {} };\n updateMessagePresentation(userMsg, userMsg.references);\n this.messages.splice(at, 0, userMsg);\n this._conversationAssistantMessage.index = at + 1;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, references, appearance) => {\n // A new response id means a new turn — finalize the previous assistant message so two replies\n // never merge into one bubble (also covers barge-in, which starts a fresh response).\n if (this._conversationAssistantMessage && this._conversationAssistantResponseId && responseId && this._conversationAssistantResponseId !== responseId) {\n var prev = this.messages[this._conversationAssistantMessage.index];\n if (prev) { prev.isStreaming = false; }\n this._conversationAssistantMessage = null;\n }\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n appearance: this.normalizeAssistantAppearance(appearance),\n references: {},\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n this._conversationAssistantResponseId = responseId;\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.rawContent = this._conversationAssistantMessage.content;\n msg.references = normalizeReferences(Object.assign({}, msg.references || {}, references || {}));\n updateMessagePresentation(msg, msg.references);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId, references) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n msg.references = normalizeReferences(Object.assign({}, msg.references || {}, references || {}));\n updateMessagePresentation(msg, msg.references);\n }\n this._conversationAssistantMessage = null;\n this._conversationAssistantResponseId = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n // Realtime PCM streams straight to the low-latency player; other formats (TTS) are buffered.\n if (contentType === 'audio/pcm' && this.realtimeController) {\n this.realtimeController.receivePcm(bytes);\n } else {\n this.audioChunks.push(bytes);\n }\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"HistoryCleared\", (itemId) => {\n // Clear messages and show placeholder\n this.messages = [];\n this.showPlaceholder();\n\n // Hide the clear history button since there's no history now\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.add('d-none');\n }\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n this.reloadCurrentInteraction();\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n if (message.content) {\n message.rawContent = message.rawContent ?? message.content;\n updateMessagePresentation(message, message.references);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n async sendMessage() {\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // Flush any pending settings save before sending a message\n // to prevent concurrent hub calls that can cause database deadlocks.\n await this.flushPendingSave();\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n // Show the clear history button since we now have prompts\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.remove('d-none');\n }\n\n this.streamMessage(trimmedPrompt);\n this.inputElement.value = '';\n this.prompt = '';\n },\n streamMessage(trimmedPrompt) {\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n var messageIndex = this.messages.length;\n var currentItemId = this.getItemId();\n\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n if (chunk.sessionId && !currentItemId) {\n this.setItemId(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n messageIndex = this.messages.length;\n let newMessage = {\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n };\n\n this.messages.push(newMessage);\n message = newMessage;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = normalizeReference(value) ?? {};\n }\n }\n\n if (chunk.content) {\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n content += chunk.content;\n }\n\n message.rawContent = content;\n updateMessagePresentation(message, references);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n return {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n },\n processReferences(references, messageIndex) {\n references = normalizeReferences(references);\n\n if (Object.keys(references).length) {\n let message = this.messages[messageIndex];\n message.rawContent = message.rawContent ?? message.content ?? '';\n updateMessagePresentation(message, references);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Save any settings that were deferred during streaming.\n if (this.settingsDirty) {\n this.debouncedSaveSettings();\n }\n },\n handleExternalTtsStop(e) {\n if (e?.detail?.sourceId === this.ttsInstanceId) {\n return;\n }\n\n this.stopAudio(false);\n },\n updateTtsPlaybackButtons() {\n if (!this.chatContainer) {\n return;\n }\n\n var buttons = this.chatContainer.querySelectorAll('[data-tts-message-index]');\n\n buttons.forEach(button => {\n var buttonIndex = Number(button.getAttribute('data-tts-message-index'));\n var isPlaying = buttonIndex === this.ttsPlayingMessageIndex;\n var iconHtml = isPlaying\n ? ''\n : '';\n\n button.classList.toggle('tts-playing', isPlaying);\n button.setAttribute('title', isPlaying ? 'Pause audio' : 'Read aloud');\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n });\n },\n updateCopyButtons() {\n if (!this.chatContainer) {\n return;\n }\n\n var buttons = this.chatContainer.querySelectorAll('[data-copy-message-index]');\n\n buttons.forEach(button => {\n var buttonIndex = Number(button.getAttribute('data-copy-message-index'));\n var isCopied = buttonIndex === this.copiedMessageIndex;\n var iconHtml = isCopied\n ? ''\n : '';\n\n button.classList.toggle('text-success', isCopied);\n button.classList.toggle('text-secondary', !isCopied);\n button.setAttribute('title', isCopied ? this.copiedTitle : this.copyTitle);\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n });\n },\n setCopyButtonState(button, isCopied) {\n if (!button) {\n return;\n }\n\n var iconHtml = isCopied\n ? ''\n : '';\n\n button.classList.toggle('text-success', isCopied);\n button.classList.toggle('text-secondary', !isCopied);\n button.setAttribute('title', isCopied ? this.copiedTitle : this.copyTitle);\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio(false);\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\n detail: { sourceId: this.ttsInstanceId }\n }));\n this.ttsPlayingMessageIndex = index;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is currently playing, queue this blob for later.\n if (this.isPlayingAudio && this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioUrl = url;\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n const nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n if (this.currentAudioUrl) {\n URL.revokeObjectURL(this.currentAudioUrl);\n this.currentAudioUrl = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var itemId = this.getItemId();\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, continuation is handled\n // by the persistent stream.\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getItemId() {\n return this.inputElement.getAttribute('data-interaction-id')\n || this.inputElement.getAttribute('data-item-id');\n },\n getSaveIndicatorElement() {\n if (config.saveIndicatorElementSelector) {\n return document.querySelector(config.saveIndicatorElementSelector);\n }\n\n return document.querySelector('[data-chat-interaction-save-indicator]');\n },\n showSaveIndicator(text, className) {\n const indicator = this.getSaveIndicatorElement();\n if (!indicator) {\n return;\n }\n\n indicator.textContent = text || '';\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\n\n if (this.saveIndicatorTimeout) {\n clearTimeout(this.saveIndicatorTimeout);\n this.saveIndicatorTimeout = null;\n }\n\n if (!text) {\n return;\n }\n\n this.saveIndicatorTimeout = setTimeout(() => {\n indicator.textContent = '';\n this.saveIndicatorTimeout = null;\n }, 3000);\n },\n clearPendingSettingsSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n },\n getFieldLabel(input) {\n const label = input\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\n ?.querySelector('label');\n\n if (!label) {\n return input.dataset.setting || 'This field';\n }\n\n return (label.textContent || '')\n .replace(/\\s+/g, ' ')\n .trim()\n || input.dataset.setting\n || 'This field';\n },\n getValidationFeedbackElement(input) {\n let feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n return feedback;\n }\n\n feedback = document.createElement('div');\n feedback.className = 'invalid-feedback';\n input.insertAdjacentElement('afterend', feedback);\n\n return feedback;\n },\n clearSettingValidationError(input) {\n input.classList.remove('is-invalid');\n input.removeAttribute('aria-invalid');\n\n const feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n feedback.textContent = '';\n }\n },\n setSettingValidationError(input, message) {\n const feedback = this.getValidationFeedbackElement(input);\n input.classList.add('is-invalid');\n input.setAttribute('aria-invalid', 'true');\n feedback.textContent = message;\n },\n getSettingValidationMessage(input) {\n if (!input || input.disabled || input.type !== 'number') {\n return null;\n }\n\n const value = (input.value || '').trim();\n if (!value) {\n return null;\n }\n\n const number = Number(value);\n const fieldLabel = this.getFieldLabel(input);\n\n if (Number.isNaN(number)) {\n return `${fieldLabel} must be a valid number.`;\n }\n\n const min = input.getAttribute('min');\n if (min !== null && number < Number(min)) {\n return `${fieldLabel} must be ${min} or greater.`;\n }\n\n const max = input.getAttribute('max');\n if (max !== null && number > Number(max)) {\n return `${fieldLabel} must be ${max} or less.`;\n }\n\n return null;\n },\n validateSettingInput(input) {\n const message = this.getSettingValidationMessage(input);\n if (!message) {\n this.clearSettingValidationError(input);\n return true;\n }\n\n this.setSettingValidationError(input, message);\n return false;\n },\n validateSettings() {\n let isValid = true;\n\n this.getSettingInputs().forEach(input => {\n isValid = this.validateSettingInput(input) && isValid;\n });\n\n return isValid;\n },\n queueSettingsSave() {\n if (!this.validateSettings()) {\n this.clearPendingSettingsSave();\n this.settingsDirty = false;\n this.showSaveIndicator('Fix errors', 'text-danger');\n return;\n }\n\n this.settingsDirty = true;\n this.showSaveIndicator('Saving...', 'text-warning');\n this.debouncedSaveSettings();\n },\n getSettingInputs() {\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\n if (explicitInputs.length > 0) {\n return explicitInputs;\n }\n\n return document.querySelectorAll(\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\n );\n },\n getSelectedGroupValues(groupName, fallbackSelector) {\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked, .capability-checkbox[data-group=\"${groupName}\"]:checked`);\n if (explicitSelections.length > 0) {\n const values = [];\n\n explicitSelections.forEach(checkbox => {\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\n if (value) {\n values.push(value);\n }\n });\n\n return values;\n }\n\n if (!fallbackSelector) {\n return [];\n }\n\n const values = [];\n const checkboxes = document.querySelectorAll(fallbackSelector);\n\n checkboxes.forEach(checkbox => {\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\n\n if (hiddenInput && hiddenInput.value) {\n values.push(hiddenInput.value);\n }\n });\n\n return values;\n },\n getPromptTemplateSelections() {\n const promptTemplates = [];\n\n document.querySelectorAll('.prompt-template-card').forEach(card => {\n const templateIdInput = card.querySelector('.prompt-template-id-input');\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\n\n if (!templateId) {\n return;\n }\n\n promptTemplates.push({\n templateId: templateId,\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\n });\n });\n\n return promptTemplates;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n // Replace existing notification with same type, or add new one.\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var itemId = this.getItemId();\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\n .catch(err => console.error('Failed to handle notification action:', err));\n },\n setItemId(itemId) {\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\n this.inputElement.setAttribute('data-item-id', itemId || '');\n },\n resetInteraction() {\n this.setItemId('');\n this.isInteractionStarted = false;\n this.messages = [];\n this.showPlaceholder();\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keyup', event => {\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.inputElement.addEventListener('paste', (e) => {\n // Use setTimeout to allow the paste to complete before checking the value\n setTimeout(() => {\n this.prompt = this.inputElement.value;\n if (this.inputElement.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n }, 0);\n });\n\n this.buttonElement.addEventListener('click', () => {\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\n\n for (var i = 0; i < chatInteractionItems.length; i++) {\n chatInteractionItems[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var itemId = e.target.getAttribute('data-interaction-id');\n\n if (!itemId) {\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\n return;\n }\n\n this.loadInteraction(itemId);\n });\n }\n\n const initialMessages = Array.isArray(config.messages) ? config.messages : [];\n\n for (let i = 0; i < initialMessages.length; i++) {\n this.addMessage(initialMessages[i]);\n }\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n document.addEventListener('input', event => {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('change', event => {\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .capability-checkbox[data-group], .group-toggle, .ci-agent-global-toggle')) {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n }\n\n this.queueSettingsSave();\n return;\n }\n\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('click', event => {\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\n return;\n }\n\n setTimeout(() => {\n this.queueSettingsSave();\n }, 0);\n });\n\n // Add event listener for clear history button\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.addEventListener('click', () => {\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\n if (itemId) {\n this.clearHistory(itemId);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n\n // Initialize realtime (speech-to-speech) mode via the shared CoreAIRealtime module. The\n // module owns the mic capture, playback, echo guard, push-to-talk and audio settings; the\n // callbacks below plug it into this app's connection and conversation-transcript display.\n if (window.CoreAIRealtime && config.realtimeButtonElementSelector) {\n this.realtimeController = window.CoreAIRealtime.attach({\n connection: this.connection,\n ensureConnected: () => Promise.resolve(this.connection),\n sendStart: (subject, voice, language, silenceMs, vadThreshold, allowInterruption) => {\n this.connection.send('StartRealtimeConversation', this.getItemId(), subject, voice, language, silenceMs, vadThreshold, allowInterruption);\n },\n // Prefer WebRTC (server-relay) when the server advertises it; the shared module falls back\n // to the WebSocket sendStart above if the peer cannot connect.\n webRtcEnabled: config.realtimeWebRtcEnabled === true,\n sendStartWebRtc: (offerSdp, voice, language, silenceMs, vadThreshold, allowInterruption) => {\n this.connection.send('StartRealtimeWebRtc', this.getItemId(), offerSdp, voice, language, silenceMs, vadThreshold, allowInterruption);\n },\n webRtcIceServers: Array.isArray(config.realtimeWebRtcIceServers) ? config.realtimeWebRtcIceServers : undefined,\n voiceName: config.realtimeVoiceName || '',\n getVoiceName: () => {\n var el = config.realtimeVoiceSelectElementSelector ? document.querySelector(config.realtimeVoiceSelectElementSelector) : null;\n return el ? el.value : '';\n },\n capableDeployments: config.realtimeCapableDeployments || [],\n realtimeEnabled: config.realtimeEnabled === true,\n selectors: {\n realtimeButton: config.realtimeButtonElementSelector,\n input: config.inputElementSelector,\n sendButton: config.sendButtonElementSelector,\n micButton: config.micButtonElementSelector,\n conversationButton: config.conversationButtonElementSelector,\n deploymentSelect: config.deploymentSelectElementSelector\n },\n onActivate: () => {\n this.isConversationMode = true;\n this._conversationPartialMessage = null;\n this._conversationAssistantMessage = null;\n },\n onDeactivate: () => {\n this.isConversationMode = false;\n if (this._conversationAssistantMessage) {\n var m = this.messages[this._conversationAssistantMessage.index];\n if (m) { m.isStreaming = false; }\n this._conversationAssistantMessage = null;\n }\n },\n onEnterRealtimeMode: () => {\n if (this.isRecording) { this.stopRecording(); }\n if (this.isConversationMode && (!this.realtimeController || !this.realtimeController.isActive())) { this.stopConversationMode(); }\n },\n // The utterance has been captured but not transcribed yet. Showing a placeholder now\n // puts the prompt above the reply it produces: transcription lags the spoken answer, so\n // a bubble added only when the text arrives lands underneath its own reply.\n onUserTurnPending: (turnId) => {\n if (!turnId) { return; }\n var placeholder = { role: 'user', content: '', rawContent: '', references: {}, isPartial: true };\n updateMessagePresentation(placeholder, placeholder.references);\n this._realtimePendingTurns = this._realtimePendingTurns || {};\n this._realtimePendingTurns[turnId] = placeholder;\n this.messages.push(placeholder);\n this.scrollToBottom();\n },\n onUserTurnDropped: (turnId) => {\n if (!turnId || !this._realtimePendingTurns) { return; }\n var dropped = this._realtimePendingTurns[turnId];\n if (!dropped) { return; }\n delete this._realtimePendingTurns[turnId];\n var at = this.messages.indexOf(dropped);\n if (at >= 0) { this.messages.splice(at, 1); }\n }\n });\n\n this.setupRealtimeVoicePicker(config);\n }\n },\n // Populates the per-interaction realtime voice picker from the selected realtime deployment's\n // voices (via the realtime-voices endpoint), and shows it only for realtime-capable deployments.\n setupRealtimeVoicePicker(config) {\n if (!config.realtimeVoiceSelectElementSelector || !config.realtimeVoicesUrl) {\n return;\n }\n\n var voiceSelect = document.querySelector(config.realtimeVoiceSelectElementSelector);\n if (!voiceSelect) {\n return;\n }\n\n var voiceGroup = config.realtimeVoiceGroupElementSelector ? document.querySelector(config.realtimeVoiceGroupElementSelector) : null;\n var deploymentSelect = config.deploymentSelectElementSelector ? document.querySelector(config.deploymentSelectElementSelector) : null;\n var capable = (config.realtimeCapableDeployments || []).map(function (n) { return (n || '').toLowerCase(); });\n var savedVoiceId = config.realtimeVoiceName || '';\n\n function isRealtimeDeployment(name) {\n return name && capable.indexOf(name.toLowerCase()) !== -1;\n }\n\n async function loadVoices() {\n var deploymentName = deploymentSelect ? deploymentSelect.value : '';\n var realtime = isRealtimeDeployment(deploymentName);\n if (voiceGroup) {\n voiceGroup.classList.toggle('d-none', !realtime);\n }\n if (!realtime) {\n return;\n }\n\n voiceSelect.innerHTML = '';\n\n try {\n const response = await fetch(config.realtimeVoicesUrl + '?deploymentName=' + encodeURIComponent(deploymentName), { credentials: 'same-origin' });\n const result = await response.json();\n if (!result || !Array.isArray(result.voices)) {\n return;\n }\n\n const grouped = new Map();\n for (const voice of result.voices) {\n const groupName = voice.gender || 'Voices';\n if (!grouped.has(groupName)) {\n grouped.set(groupName, []);\n }\n grouped.get(groupName).push(voice);\n }\n\n Array.from(grouped.keys()).sort((a, b) => a.localeCompare(b)).forEach(function (groupName) {\n const optgroup = document.createElement('optgroup');\n optgroup.label = groupName;\n grouped.get(groupName).forEach(function (voice) {\n const option = document.createElement('option');\n option.value = voice.id;\n option.textContent = voice.name;\n option.selected = voice.id === savedVoiceId;\n optgroup.appendChild(option);\n });\n voiceSelect.appendChild(optgroup);\n });\n } catch (err) {\n /* ignore voice load failures */\n }\n }\n\n if (deploymentSelect) {\n deploymentSelect.addEventListener('change', loadVoices);\n }\n loadVoices();\n },\n loadInteraction(itemId) {\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\n },\n reloadCurrentInteraction() {\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n },\n clearHistory(itemId) {\n const self = this;\n const clearHistoryConfirmed = () => {\n // Force-stop any live realtime voice session before clearing history.\n if (self.realtimeController && self.realtimeController.isActive()) {\n self.realtimeController.stop();\n }\n\n // Cancel any active stream before clearing history.\n if (self.stream) {\n self.stream.dispose();\n self.stream = null;\n self.hideTypingIndicator();\n self.streamingFinished();\n }\n\n self.connection.invoke(\"ClearHistory\", itemId)\n .catch(err => console.error('Error clearing history:', err));\n };\n\n if (typeof confirmDialog === 'function') {\n confirmDialog({\n title: config.clearHistoryTitle,\n message: config.clearHistoryMessage,\n okText: config.clearHistoryOkText,\n cancelText: config.clearHistoryCancelText,\n callback: function (confirmed) {\n if (confirmed) {\n clearHistoryConfirmed();\n }\n }\n });\n\n return;\n }\n\n if (window.confirm(config.clearHistoryMessage || 'Clear all messages?')) {\n clearHistoryConfirmed();\n }\n },\n debouncedSaveSettings() {\n // Clear any existing timeout to reset the debounce timer\n this.clearPendingSettingsSave();\n\n // Don't save while streaming — it will be saved when streaming completes.\n if (this.stream) {\n return;\n }\n\n // Set a new timeout to save after 850ms of no changes\n this.saveSettingsTimeout = setTimeout(() => {\n if (this.settingsDirty) {\n this.saveSettings();\n this.settingsDirty = false;\n }\n this.saveSettingsTimeout = null;\n }, 850);\n },\n getSelectedToolNames() {\n return this.getSelectedGroupValues(\n 'toolNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\n );\n },\n getSelectedMcpConnectionIds() {\n return this.getSelectedGroupValues(\n 'mcpConnectionIds',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\n );\n },\n getSelectedA2AConnectionIds() {\n return this.getSelectedGroupValues('a2aConnectionIds');\n },\n getSelectedAgentNames() {\n return this.getSelectedGroupValues(\n 'agentNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\n );\n },\n saveSettings() {\n const itemId = this.getItemId();\n if (!itemId) {\n return Promise.resolve();\n }\n\n if (!this.validateSettings()) {\n this.showSaveIndicator('Fix errors', 'text-danger');\n return Promise.resolve();\n }\n\n const settings = {};\n\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\n // This avoids coupling the JS to specific field names — new fields added by\n // any module are automatically included.\n const inputs = this.getSettingInputs();\n\n inputs.forEach(input => {\n const key = input.dataset.setting\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\n\n if (!key) {\n return;\n }\n\n if (input.type === 'checkbox') {\n settings[key] = input.checked;\n } else if (input.type === 'number') {\n settings[key] = input.value ? parseFloat(input.value) : null;\n } else {\n settings[key] = input.value || null;\n }\n });\n\n // Add tool, MCP connection, and agent collections (special handling).\n settings.toolNames = this.getSelectedToolNames();\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\n settings.agentNames = this.getSelectedAgentNames();\n\n const promptTemplates = this.getPromptTemplateSelections();\n if (promptTemplates.length > 0) {\n settings.promptTemplates = promptTemplates;\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\n }\n\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\n .catch(err => {\n console.error('Error saving settings:', err);\n this.showSaveIndicator('Save failed', 'text-danger');\n });\n },\n flushPendingSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n\n if (this.settingsDirty) {\n this.settingsDirty = false;\n return this.saveSettings();\n }\n\n return Promise.resolve();\n },\n initializeInteraction(itemId, force) {\n if (this.isInteractionStarted && !force) {\n return;\n }\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\n this.setItemId(itemId);\n this.isInteractionStarted = true;\n },\n clearCopiedMessageState() {\n if (this.copyResetTimeoutId) {\n window.clearTimeout(this.copyResetTimeoutId);\n this.copyResetTimeoutId = null;\n }\n\n if (this.activeCopyButton) {\n this.setCopyButtonState(this.activeCopyButton, false);\n this.activeCopyButton = null;\n }\n\n this.copiedMessageIndex = -1;\n },\n copyResponse(message, index, event) {\n const text = message && typeof message === 'object'\n ? message.copyContent ?? message.content ?? ''\n : message ?? '';\n const button = event?.currentTarget || event?.target?.closest?.('[data-copy-message-index]') || null;\n\n navigator.clipboard.writeText(text)\n .then(() => {\n this.clearCopiedMessageState();\n this.copiedMessageIndex = typeof index === 'number' ? index : -1;\n this.activeCopyButton = button;\n\n if (button) {\n this.setCopyButtonState(button, true);\n } else {\n this.$nextTick(() => this.updateCopyButtons());\n }\n\n this.copyResetTimeoutId = window.setTimeout(() => {\n this.clearCopiedMessageState();\n this.$nextTick(() => this.updateCopyButtons());\n }, Number(config.copyResetDelayMs) || 2000);\n })\n .catch(err => console.error('Failed to copy response:', err));\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var itemId = this.getItemId();\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n }\n },\n watch: {\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n },\n copiedMessageIndex() {\n this.$nextTick(() => this.updateCopyButtons());\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n\n this.$nextTick(() => {\n this.updateCopyButtons();\n refreshFontAwesomeIcons(this.$el);\n this.fontAwesomeObserver = observeFontAwesomeIcons(this.$el);\n });\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n\n if (this.fontAwesomeObserver) {\n this.fontAwesomeObserver.disconnect();\n this.fontAwesomeObserver = null;\n }\n\n this.clearCopiedMessageState();\n this.stopAudio(false);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n const autoInitializeSelector = '[data-chat-interaction-config]';\n\n function parseJsonAttribute(element, attributeName, description) {\n const rawValue = element.getAttribute(attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n } catch (error) {\n console.error('Failed to parse ' + description + ' JSON.', error);\n return null;\n }\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.chatInteractionInitialized === 'true') {\n return element ? element.__chatInteractionApp || null : null;\n }\n\n const config = parseJsonAttribute(element, 'data-chat-interaction-config', 'chat interaction config');\n if (!config) {\n return null;\n }\n\n const app = initialize(config);\n if (!app) {\n return null;\n }\n\n element.dataset.chatInteractionInitialized = 'true';\n element.__chatInteractionApp = app;\n\n return app;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches(autoInitializeSelector)) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll(autoInitializeSelector).forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n\n return {\n initialize: initialize,\n initializeFromElement: initializeFromElement,\n };\n}();\n\nwindow.chatInteractionDocumentManager = function () {\n const managerStateKey = '__chatInteractionDocumentManagerState';\n\n function normalizeDocumentInfo(document) {\n if (!document || typeof document !== 'object') {\n return null;\n }\n\n return {\n documentId: document.documentId || document.DocumentId || '',\n fileName: document.fileName || document.FileName || '',\n fileSize: document.fileSize || document.FileSize || 0\n };\n }\n\n function formatFileSize(bytes) {\n if (!bytes || bytes < 1024) {\n return (bytes || 0) + ' B';\n }\n\n if (bytes < 1024 * 1024) {\n return (bytes / 1024).toFixed(1) + ' KB';\n }\n\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n }\n\n function getDocumentKey(fileName, fileSize) {\n return ((fileName || '').trim().toLowerCase()) + '::' + (fileSize || 0);\n }\n\n function isDuplicateFile(file, knownKeys) {\n return knownKeys.has(getDocumentKey(file.name, file.size));\n }\n\n function getDocumentsFromDom(container) {\n if (!container) {\n return [];\n }\n\n return Array.from(container.querySelectorAll('[data-chat-document-id]'))\n .map(element => normalizeDocumentInfo({\n documentId: element.dataset.chatDocumentId,\n fileName: element.dataset.chatDocumentName,\n fileSize: Number(element.dataset.chatDocumentSize || 0)\n }))\n .filter(document => document && document.documentId);\n }\n\n function initialize(config) {\n if (!config || !config.itemId) {\n return;\n }\n\n const fileInput = document.getElementById('chat-doc-upload');\n const documentsList = document.getElementById('chat-documents-list');\n const status = document.getElementById('chat-doc-upload-status');\n const progressContainer = document.getElementById('chat-doc-upload-progress');\n const progressBar = document.getElementById('chat-doc-upload-progress-bar');\n const uploadQueue = document.getElementById('chat-doc-upload-queue');\n\n if (!fileInput || !documentsList || !status || !progressContainer || !progressBar || !uploadQueue) {\n return;\n }\n\n const previousState = fileInput[managerStateKey];\n if (previousState && typeof previousState.dispose === 'function') {\n previousState.dispose();\n }\n\n let interactionDocuments = (Array.isArray(config.existingDocuments) ? config.existingDocuments : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n\n if (interactionDocuments.length === 0) {\n interactionDocuments = getDocumentsFromDom(documentsList);\n }\n\n let uploadItems = [];\n let isUploadingDocuments = false;\n\n function createTextElement(tagName, className, text) {\n const element = document.createElement(tagName);\n if (className) {\n element.className = className;\n }\n\n element.textContent = text;\n return element;\n }\n\n function renderDocuments() {\n documentsList.innerHTML = '';\n\n if (interactionDocuments.length === 0) {\n documentsList.appendChild(createTextElement('div', 'text-muted small', 'No documents uploaded yet.'));\n return;\n }\n\n interactionDocuments.forEach(documentInfo => {\n const row = window.document.createElement('div');\n row.className = 'd-flex justify-content-between align-items-start gap-2 border rounded px-2 py-2 bg-white chat-document-row';\n row.dataset.chatDocumentId = documentInfo.documentId;\n row.dataset.chatDocumentName = documentInfo.fileName;\n row.dataset.chatDocumentSize = documentInfo.fileSize;\n\n const details = window.document.createElement('div');\n details.className = 'me-2 min-w-0';\n\n const name = createTextElement('div', 'fw-semibold small', documentInfo.fileName || 'Document');\n const icon = window.document.createElement('i');\n icon.className = 'fa-solid fa-file-lines me-1';\n name.prepend(icon);\n\n const size = createTextElement('div', 'text-muted small', formatFileSize(documentInfo.fileSize));\n\n details.appendChild(name);\n details.appendChild(size);\n\n const removeButton = createTextElement('button', 'btn btn-sm btn-outline-danger remove-chat-document-btn', ' Remove');\n removeButton.type = 'button';\n removeButton.dataset.documentId = documentInfo.documentId;\n const removeIcon = window.document.createElement('i');\n removeIcon.className = 'fa-solid fa-trash';\n removeButton.prepend(removeIcon);\n removeButton.addEventListener('click', () => removeDocument(documentInfo.documentId));\n\n row.appendChild(details);\n row.appendChild(removeButton);\n documentsList.appendChild(row);\n });\n }\n\n function showUploadStatus(message, cssClass) {\n if (!message) {\n status.textContent = '';\n status.className = 'small mt-2 d-none';\n return;\n }\n\n status.textContent = message;\n status.className = 'small mt-2 ' + (cssClass || 'text-muted');\n }\n\n function showUploadProgress(progress, message, cssClass) {\n if (progress === null || progress === undefined) {\n progressContainer.className = 'progress mt-2 d-none';\n progressContainer.setAttribute('aria-valuenow', '0');\n progressBar.className = 'progress-bar progress-bar-striped progress-bar-animated';\n progressBar.style.width = '0%';\n progressBar.textContent = '0%';\n return;\n }\n\n const roundedProgress = Math.max(0, Math.min(100, Math.round(progress)));\n progressContainer.className = 'progress mt-2';\n progressContainer.setAttribute('aria-valuenow', roundedProgress.toString());\n progressBar.className = 'progress-bar ' + (cssClass || 'progress-bar-striped progress-bar-animated');\n progressBar.style.width = roundedProgress + '%';\n progressBar.textContent = message || (roundedProgress + '%');\n }\n\n function getUploadStatePresentation(state) {\n switch (state) {\n case 'uploaded':\n return { label: 'Uploaded', badgeClass: 'text-bg-success', progressClass: 'bg-success' };\n case 'failed':\n return { label: 'Failed', badgeClass: 'text-bg-danger', progressClass: 'bg-danger' };\n case 'uploading':\n return { label: 'Uploading', badgeClass: 'text-bg-warning', progressClass: 'bg-warning progress-bar-striped progress-bar-animated' };\n default:\n return { label: 'Queued', badgeClass: 'text-bg-secondary', progressClass: 'bg-secondary progress-bar-striped progress-bar-animated' };\n }\n }\n\n function formatUploadMessage(item) {\n if (item.status === 'failed' && item.error) {\n return item.error;\n }\n\n if (item.status === 'uploaded') {\n return 'Upload completed successfully.';\n }\n\n if (item.status === 'uploading') {\n return item.progress + '% uploaded';\n }\n\n return 'Waiting to upload...';\n }\n\n function renderUploadQueue() {\n uploadQueue.innerHTML = '';\n\n uploadItems.forEach(item => {\n const presentation = getUploadStatePresentation(item.status);\n const card = document.createElement('div');\n card.className = 'border rounded px-2 py-2 bg-white';\n\n const header = document.createElement('div');\n header.className = 'd-flex justify-content-between align-items-start gap-2';\n\n const fileDetails = document.createElement('div');\n fileDetails.className = 'flex-grow-1 min-w-0';\n fileDetails.appendChild(createTextElement('div', 'fw-semibold small', item.fileName));\n fileDetails.appendChild(createTextElement('div', 'text-muted small', formatFileSize(item.fileSize)));\n\n const badge = createTextElement('span', 'badge ' + presentation.badgeClass, presentation.label);\n\n header.appendChild(fileDetails);\n header.appendChild(badge);\n\n const progress = document.createElement('div');\n progress.className = 'progress mt-2';\n progress.setAttribute('role', 'progressbar');\n progress.setAttribute('aria-valuemin', '0');\n progress.setAttribute('aria-valuemax', '100');\n progress.setAttribute('aria-valuenow', item.progress.toString());\n\n const progressState = document.createElement('div');\n progressState.className = 'progress-bar ' + presentation.progressClass;\n progressState.style.width = item.progress + '%';\n progressState.textContent = item.progress + '%';\n progress.appendChild(progressState);\n\n const message = createTextElement('div', item.status === 'failed' ? 'small text-danger mt-2' : 'small text-muted mt-2', formatUploadMessage(item));\n\n card.appendChild(header);\n card.appendChild(progress);\n card.appendChild(message);\n uploadQueue.appendChild(card);\n });\n }\n\n function createUploadItem(file, index) {\n return {\n id: file.name + '::' + file.size + '::' + file.lastModified + '::' + index + '::' + Date.now(),\n fileName: file.name,\n fileSize: file.size,\n status: 'queued',\n progress: 0,\n error: null\n };\n }\n\n function updateUploadItem(itemId, updates) {\n uploadItems = uploadItems.map(item => item.id === itemId ? Object.assign({}, item, updates) : item);\n renderUploadQueue();\n }\n\n function removeUploadItems(predicate) {\n uploadItems = uploadItems.filter(item => !predicate(item));\n renderUploadQueue();\n }\n\n function uploadSingleDocument(file, itemIdToUpdate, fileIndex, totalFiles) {\n return new Promise((resolve, reject) => {\n const formData = new FormData();\n formData.append('chatInteractionId', config.itemId);\n formData.append('files', file);\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', config.uploadDocumentUrl, true);\n\n xhr.upload.addEventListener('progress', event => {\n if (!event.lengthComputable) {\n return;\n }\n\n const fileProgress = Math.round((event.loaded / event.total) * 100);\n updateUploadItem(itemIdToUpdate, {\n status: 'uploading',\n progress: fileProgress\n });\n\n const overallProgress = ((fileIndex + (event.loaded / event.total)) / totalFiles) * 100;\n showUploadProgress(overallProgress, 'Uploading ' + (fileIndex + 1) + ' of ' + totalFiles, 'progress-bar-striped progress-bar-animated');\n });\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve(JSON.parse(xhr.responseText));\n } catch (error) {\n reject(new Error('Upload failed: invalid server response.'));\n }\n\n return;\n }\n\n reject(new Error((xhr.responseText || 'Upload failed.').trim()));\n });\n\n xhr.addEventListener('error', () => {\n reject(new Error('Upload failed. Please check your connection and try again.'));\n });\n\n xhr.send(formData);\n });\n }\n\n async function uploadDocuments(files) {\n if (!config.uploadDocumentUrl || !files || files.length === 0) {\n return;\n }\n\n if (isUploadingDocuments) {\n showUploadStatus('A document upload is already in progress.', 'text-warning');\n return;\n }\n\n isUploadingDocuments = true;\n\n const filesToUpload = [];\n const duplicateItems = [];\n const knownDocumentKeys = new Set(interactionDocuments.map(document => getDocumentKey(document.fileName, document.fileSize)));\n\n Array.from(files).forEach(file => {\n if (isDuplicateFile(file, knownDocumentKeys)) {\n duplicateItems.push(file);\n return;\n }\n\n knownDocumentKeys.add(getDocumentKey(file.name, file.size));\n filesToUpload.push(file);\n });\n\n if (duplicateItems.length > 0) {\n uploadItems = uploadItems.concat(duplicateItems.map((file, index) => Object.assign(createUploadItem(file, index), {\n status: 'failed',\n progress: 100,\n error: 'This document is already attached.'\n })));\n renderUploadQueue();\n }\n\n if (filesToUpload.length === 0) {\n isUploadingDocuments = false;\n showUploadStatus(duplicateItems.map(file => file.name + ': This document is already attached.').join(' | '), 'text-warning');\n showUploadProgress(null);\n return;\n }\n\n const pendingItems = filesToUpload.map(createUploadItem);\n uploadItems = uploadItems.concat(pendingItems);\n renderUploadQueue();\n showUploadProgress(0, 'Preparing upload...', 'progress-bar-striped progress-bar-animated');\n fileInput.disabled = true;\n\n try {\n let uploadedCount = 0;\n const failedUploads = duplicateItems.map(file => file.name + ': This document is already attached.');\n\n for (let i = 0; i < filesToUpload.length; i++) {\n const file = filesToUpload[i];\n const pendingItem = pendingItems[i];\n\n updateUploadItem(pendingItem.id, {\n status: 'uploading',\n progress: 0,\n error: null\n });\n\n showUploadStatus('Uploading ' + (i + 1) + ' of ' + filesToUpload.length + ' document(s)...', 'text-warning');\n\n try {\n const result = await uploadSingleDocument(file, pendingItem.id, i, filesToUpload.length);\n const uploaded = (Array.isArray(result.uploaded) ? result.uploaded : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n const failed = Array.isArray(result.failed) ? result.failed : [];\n\n if (uploaded.length > 0) {\n uploadedCount += uploaded.length;\n interactionDocuments = interactionDocuments.concat(uploaded);\n updateUploadItem(pendingItem.id, {\n status: 'uploaded',\n progress: 100,\n error: null\n });\n } else {\n const missingUploadMessage = failed.length > 0\n ? failed.map(entry => entry.fileName + ': ' + entry.error).join(' | ')\n : 'The server did not confirm that the file was uploaded.';\n if (failed.length === 0) {\n failedUploads.push(missingUploadMessage);\n }\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: 100,\n error: missingUploadMessage\n });\n }\n\n if (failed.length > 0) {\n const failedMessage = failed.map(entry => entry.fileName + ': ' + entry.error).join(' | ');\n failedUploads.push(failedMessage);\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: 100,\n error: failedMessage\n });\n }\n } catch (error) {\n const errorMessage = error && error.message\n ? error.message\n : 'Upload failed. Please try again.';\n console.error('Upload failed:', error);\n failedUploads.push(file.name + ': ' + errorMessage);\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: pendingItem.progress || 0,\n error: errorMessage\n });\n }\n }\n\n renderDocuments();\n\n if (failedUploads.length > 0) {\n removeUploadItems(item => item.status === 'uploaded');\n showUploadStatus(\n (uploadedCount > 0 ? ('Uploaded ' + uploadedCount + ' document(s). ') : '') + failedUploads.join(' | '),\n uploadedCount > 0 ? 'text-warning' : 'text-danger');\n showUploadProgress(null);\n return;\n }\n\n removeUploadItems(() => true);\n showUploadStatus('Uploaded ' + uploadedCount + ' document(s).', 'text-success');\n showUploadProgress(null);\n } catch (error) {\n console.error('Upload failed:', error);\n showUploadStatus('Upload failed. Please try again.', 'text-danger');\n showUploadProgress(null);\n } finally {\n isUploadingDocuments = false;\n fileInput.disabled = false;\n fileInput.value = '';\n }\n }\n\n async function removeDocument(documentId) {\n if (!config.removeDocumentUrl || !documentId || !window.confirm('Remove this document?')) {\n return;\n }\n\n try {\n const response = await fetch(config.removeDocumentUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n itemId: config.itemId,\n documentId: documentId\n })\n });\n\n if (!response.ok) {\n console.error('Failed to remove document:', await response.text());\n showUploadStatus('Failed to remove document.', 'text-danger');\n return;\n }\n\n const result = await response.json();\n const serverDocuments = (Array.isArray(result.documents) ? result.documents : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n\n interactionDocuments = serverDocuments.length > 0\n ? serverDocuments\n : interactionDocuments.filter(document => document.documentId !== documentId);\n renderDocuments();\n showUploadStatus('Document removed.', 'text-success');\n } catch (error) {\n console.error('Remove failed:', error);\n showUploadStatus('Failed to remove document.', 'text-danger');\n }\n }\n\n const onFileInputChange = event => {\n const selectedFiles = event.target.files ? Array.from(event.target.files) : [];\n uploadDocuments(selectedFiles);\n };\n\n fileInput.addEventListener('change', onFileInputChange);\n fileInput[managerStateKey] = {\n dispose: () => {\n fileInput.removeEventListener('change', onFileInputChange);\n }\n };\n\n renderDocuments();\n renderUploadQueue();\n showUploadStatus(null);\n showUploadProgress(null);\n\n return fileInput[managerStateKey];\n }\n\n function parseJsonAttribute(element, attributeName, description) {\n const rawValue = element.getAttribute(attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n } catch (error) {\n console.error('Failed to parse ' + description + ' JSON.', error);\n return null;\n }\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.chatInteractionDocumentManagerInitialized === 'true') {\n return element ? element[managerStateKey] || null : null;\n }\n\n const config = parseJsonAttribute(element, 'data-chat-interaction-document-manager-config', 'chat interaction document manager config');\n if (!config) {\n return null;\n }\n\n const state = initialize(config);\n if (!state) {\n return null;\n }\n\n element.dataset.chatInteractionDocumentManagerInitialized = 'true';\n\n return state;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches('[data-chat-interaction-document-manager-config]')) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll('[data-chat-interaction-document-manager-config]').forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n\n return {\n initialize: initialize,\n initializeFromElement: initializeFromElement,\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} +{"version":3,"sources":["chat-interaction.js"],"names":["_excluded","_regenerator","e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","this","setPrototypeOf","__proto__","displayName","w","m","defineProperty","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","Array","from","isArray","_arrayLikeToArray","_objectWithoutProperties","_objectWithoutPropertiesLoose","getOwnPropertySymbols","indexOf","propertyIsEnumerable","hasOwnProperty","_createForOfIteratorHelper","_n","F","s","next","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","push","_typeof","window","chatInteractionManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","codeCopiedText","copyTitle","copiedTitle","copyResetDelayMs","assistantLabel","messageTemplate","indicatorTemplate","untitledText","clearHistoryTitle","clearHistoryMessage","clearHistoryOkText","clearHistoryCancelText","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","refreshFontAwesomeIcons","root","fontAwesome","FontAwesome","nodeType","selector","matches","querySelector","containsFontAwesomePlaceholders","dom","i2svg","node","observeFontAwesomeIcons","MutationObserver","observer","mutations","forEach","mutation","addedNodes","observe","childList","subtree","normalizeReference","reference","_ref","_normalized$index","_ref2","_normalized$text","_ref3","_normalized$title","_ref4","_normalized$link","_ref5","_normalized$reference","_normalized$isGenerat","normalized","assign","index","Index","Text","title","Title","link","Link","referenceType","ReferenceType","isGenerated","IsGenerated","isDownloadCitationReference","toLowerCase","normalizeReferences","references","_i","_Object$entries","entries","_normalizeReference","_Object$entries$_i","key","getCitationLabel","updateMessagePresentation","message","messageReferences","rawContent","content","citationDisplay","processedContent","referenceEntries","citations","citedRefs","filter","_ref6","includes","generatedRefs","_ref8","_ref9","sort","_ref0","_ref1","b","_ref12","_ref13","_step","displayIndex","_iterator","_step$value","placeholder","concat","replaceAll","referenceKey","label","isDownload","err","_i2","_citations","citation","_step2","_iterator2","_step2$value","map","_ref16","buildCitationDisplay","displayContent","citationReferences","copyContent","_step3","_iterator3","_step4","_iterator4","trimEnd","buildCopyContent","htmlContent","parseMarkdownContent","renderer","marked","Renderer","data","href","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","renderChartsInMessage","charts","requestAnimationFrame","_step5","_iterator5","canvas","getElementById","chartId","Chart","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","config","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","console","error","__chartConfigs","warn","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","use","extensions","level","start","idx","undefined","tokenizer","extracted","token","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","startIndex","endIndex","json","substring","tryExtractChartMarker","type","raw","initialize","instanceConfig","source","fromEntries","_ref17","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","isInteractionStarted","isPlaceholderVisible","isStreaming","isNavigatingAway","autoScroll","stream","messages","prompt","initialFieldValues","Map","settingsDirty","saveSettingsTimeout","saveIndicatorTimeout","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","Math","random","conversationModeEnabled","conversationButton","isConversationMode","realtimeController","notifications","notificationDismissTimers","copiedMessageIndex","copyResetTimeoutId","activeCopyButton","computed","lastAssistantIndex","role","methods","handleBeforeUnload","startConnection","_this","_callee","_t","_context","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","initializeInteraction","itemId","titleInput","msg","addMessage","$nextTick","historyItem","showSaveIndicator","stopRecording","isFinal","_conversationPartialTranscript","replace","_conversationPartialMessage","hidePlaceholder","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","turnId","_realtimePendingTurns","pending","stopAudio","emptyIndex","splice","escaped","_conversationAssistantMessage","at","userMsg","messageId","responseId","appearance","_conversationAssistantResponseId","prev","hideTypingIndicator","j","msgIndex","newMessage","id","normalizeAssistantAppearance","base64Audio","contentType","binaryString","atob","bytes","Uint8Array","charCodeAt","receivePcm","playCollectedAudio","showPlaceholder","clearHistoryBtn","classList","add","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentInteraction","onclose","addMessageInternal","_this2","fireEvent","CustomEvent","detail","_message$rawContent","_this3","remove","event","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","isIndicator","sendMessage","_this4","_callee2","trimmedPrompt","_context2","flushPendingSave","streamMessage","_this5","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentItemId","getItemId","subscribe","chunk","sessionId","setItemId","keys","_i3","_Object$entries2","_normalizeReference2","_Object$entries2$_i","complete","_this5$stream","processReferences","streamingFinished","synthesizeSpeech","_this5$stream2","getServiceDownMessage","_this6","_ref19","_message$rawContent2","stopIcon","getAttribute","replaceChildren","RETURN_DOM_FRAGMENT","startIcon","icons","querySelectorAll","debouncedSaveSettings","handleExternalTtsStop","_e$detail","sourceId","updateTtsPlaybackButtons","_this7","button","isPlaying","Number","iconHtml","toggle","setAttribute","updateCopyButtons","_this8","isCopied","setCopyButtonState","cacheIndex","_this9","_ttsCacheIndex","invoke","toggleMessageTts","_this0","playAudioBlob","_this1","_step6","totalLength","reduce","sum","combined","offset","_iterator6","set","blob","Blob","_this10","URL","createObjectURL","audio","Audio","addEventListener","revokeObjectURL","playNextInQueue","play","_this11","nextBlob","shift","conversationModeOnAudioEnded","_this12","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this13","updateConversationButton","navigator","mediaDevices","getUserMedia","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","_conversationSubject","Subject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","createMediaStreamSource","connect","pendingChunk","analyser","size","freqData","frequencyBinCount","getByteFrequencyData","k","_callee3","uint8Array","base64","_context3","arrayBuffer","str","byte","String","fromCharCode","btoa","getTracks","track","stop","documentElement","send","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","originalLength","_this14","setTimeout","scrollTop","scrollHeight","clientHeight","handleUserInput","target","getSaveIndicatorElement","saveIndicatorElementSelector","className","_this15","indicator","clearTimeout","clearPendingSettingsSave","getFieldLabel","input","_input$closest","closest","dataset","setting","getValidationFeedbackElement","feedback","nextElementSibling","contains","insertAdjacentElement","clearSettingValidationError","removeAttribute","setSettingValidationError","getSettingValidationMessage","disabled","number","fieldLabel","isNaN","min","max","validateSettingInput","validateSettings","_this16","isValid","getSettingInputs","queueSettingsSave","explicitInputs","getSelectedGroupValues","groupName","fallbackSelector","explicitSelections","values","checkbox","baseName","hiddenInput","getPromptTemplateSelections","promptTemplates","card","templateIdInput","promptParametersInput","templateId","promptParameters","clearNotificationDismiss","findIndex","scheduleNotificationDismiss","_this17","timerId","dismissNotification","handleNotificationAction","actionName","resetInteraction","initializeApp","_this18","placeholderElementSelector","loadInteraction","atBottom","shiftKey","click","lastMsg","pop","chatInteractionItems","getElementsByClassName","preventDefault","initialMessages","btn","block","codeEl","clipboard","writeText","copiedText","clearHistory","micButtonElementSelector","style","display","toggleRecording","conversationButtonElementSelector","CoreAIRealtime","realtimeButtonElementSelector","attach","ensureConnected","sendStart","subject","voice","silenceMs","vadThreshold","allowInterruption","webRtcEnabled","realtimeWebRtcEnabled","sendStartWebRtc","offerSdp","webRtcIceServers","realtimeWebRtcIceServers","voiceName","realtimeVoiceName","getVoiceName","el","realtimeVoiceSelectElementSelector","capableDeployments","realtimeCapableDeployments","realtimeEnabled","selectors","realtimeButton","sendButton","deploymentSelect","deploymentSelectElementSelector","onActivate","onDeactivate","onEnterRealtimeMode","isActive","onUserTurnPending","onUserTurnDropped","dropped","setupRealtimeVoicePicker","realtimeVoicesUrl","voiceSelect","voiceGroup","realtimeVoiceGroupElementSelector","capable","savedVoiceId","loadVoices","isRealtimeDeployment","_loadVoices","_callee4","deploymentName","realtime","response","result","grouped","_iterator7","_step7","_context4","fetch","encodeURIComponent","credentials","voices","gender","has","get","localeCompare","optgroup","option","selected","appendChild","self","clearHistoryConfirmed","confirmDialog","confirm","okText","cancelText","callback","confirmed","_this19","saveSettings","getSelectedToolNames","getSelectedMcpConnectionIds","getSelectedA2AConnectionIds","getSelectedAgentNames","_this20","settings","match","checked","parseFloat","toolNames","mcpConnectionIds","a2aConnectionIds","agentNames","promptTemplateIds","template","force","clearCopiedMessageState","copyResponse","_ref21","_message$copyContent","_event$target","_event$target$closest","_this21","currentTarget","startRecording","_this22","_callee5","_context5","updateMicButton","watch","active","_this23","mounted","_this24","_callee6","_context6","$el","fontAwesomeObserver","beforeUnmount","removeEventListener","disconnect","mount","autoInitializeSelector","initializeFromElement","element","chatInteractionInitialized","__chatInteractionApp","attributeName","description","rawValue","parseJsonAttribute","scanForAutoInitialization","startAutoInitialization","body","readyState","once","chatInteractionDocumentManager","managerStateKey","normalizeDocumentInfo","documentId","DocumentId","fileName","FileName","fileSize","FileSize","formatFileSize","toFixed","getDocumentKey","isDuplicateFile","file","knownKeys","fileInput","documentsList","status","progressContainer","progressBar","uploadQueue","previousState","container","interactionDocuments","existingDocuments","chatDocumentId","chatDocumentName","chatDocumentSize","uploadItems","isUploadingDocuments","onFileInputChange","_x","_uploadDocuments","uploadDocuments","files","renderDocuments","renderUploadQueue","showUploadStatus","showUploadProgress","createTextElement","tagName","documentInfo","row","actions","downloadBaseUrl","downloadDocumentBaseUrl","downloadLink","downloadIcon","removeButton","removeIcon","_x2","_removeDocument","removeDocument","details","prepend","progress","width","roundedProgress","round","item","presentation","state","badgeClass","progressClass","getUploadStatePresentation","header","fileDetails","badge","progressState","formatUploadMessage","createUploadItem","lastModified","Date","now","updateUploadItem","updates","removeUploadItems","predicate","uploadSingleDocument","itemIdToUpdate","fileIndex","totalFiles","reject","formData","FormData","append","xhr","XMLHttpRequest","open","uploadDocumentUrl","upload","lengthComputable","fileProgress","loaded","total","responseText","Error","_callee7","filesToUpload","duplicateItems","knownDocumentKeys","pendingItems","uploadedCount","failedUploads","pendingItem","uploaded","failed","missingUploadMessage","failedMessage","errorMessage","_t3","_t4","_context7","Set","join","entry","_callee8","serverDocuments","_t5","_t6","_context8","removeDocumentUrl","method","headers","stringify","ok","documents","chatInteractionDocumentManagerInitialized","download","toDataURL","img","startsWith","res","removeChild"],"mappings":"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","file":"chat-interaction.min.js","sourcesContent":["window.chatInteractionManager = function () {\n\n // Defaults (can be overridden by instanceConfig)\n var defaultConfig = {\n // UI defaults for generated media\n generatedImageAltText: 'Generated Image',\n generatedImageMaxWidth: 400,\n downloadImageTitle: 'Download image',\n downloadChartTitle: 'Download chart as image',\n downloadChartButtonText: 'Download',\n codeCopiedText: 'Copied!',\n copyTitle: 'Click here to copy response to clipboard.',\n copiedTitle: 'Response copied to clipboard.',\n copyResetDelayMs: 2000,\n assistantLabel: 'Assistant',\n\n messageTemplate: `\n
\n \n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n `,\n indicatorTemplate: `\n
\n \n Assistant\n
\n `,\n // Localizable strings\n untitledText: 'Untitled',\n clearHistoryTitle: 'Clear History',\n clearHistoryMessage: 'Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.',\n clearHistoryOkText: 'Yes',\n clearHistoryCancelText: 'Cancel'\n };\n\n // Sanitize URLs to prevent javascript: protocol injection.\n function sanitizeUrl(url) {\n if (!url) return '';\n var trimmed = url.trim();\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\n return '';\n }\n return url;\n }\n\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\n function escapeHtmlEntities(text) {\n var span = document.createElement('span');\n span.textContent = text;\n return span.innerHTML;\n }\n\n function containsFontAwesomePlaceholders(root) {\n if (!root || root.nodeType !== 1) {\n return false;\n }\n\n var selector = 'i[class*=\"fa-\"],i.fa,i.fas,i.far,i.fab';\n if (typeof root.matches === 'function' && root.matches(selector)) {\n return true;\n }\n\n return typeof root.querySelector === 'function' && !!root.querySelector(selector);\n }\n\n function refreshFontAwesomeIcons(root) {\n var fontAwesome = window.FontAwesome;\n if (!containsFontAwesomePlaceholders(root) || !fontAwesome || !fontAwesome.dom || typeof fontAwesome.dom.i2svg !== 'function') {\n return;\n }\n\n fontAwesome.dom.i2svg({ node: root });\n }\n\n function observeFontAwesomeIcons(root) {\n if (!root || typeof MutationObserver === 'undefined') {\n return null;\n }\n\n var observer = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n mutation.addedNodes.forEach(function (node) {\n refreshFontAwesomeIcons(node);\n });\n });\n });\n\n observer.observe(root, {\n childList: true,\n subtree: true\n });\n\n return observer;\n }\n\n function normalizeReference(reference) {\n if (!reference || typeof reference !== 'object') {\n return null;\n }\n\n const normalized = Object.assign({}, reference);\n normalized.index = normalized.index ?? normalized.Index ?? 0;\n normalized.text = normalized.text ?? normalized.Text ?? null;\n normalized.title = normalized.title ?? normalized.Title ?? null;\n normalized.link = sanitizeUrl(normalized.link ?? normalized.Link ?? null);\n normalized.referenceType = normalized.referenceType ?? normalized.ReferenceType ?? null;\n normalized.isGenerated = (normalized.isGenerated ?? normalized.IsGenerated) === true;\n\n return normalized;\n }\n\n function isDownloadCitationReference(reference) {\n if (!reference || typeof reference !== 'object') {\n return false;\n }\n\n if (typeof reference.referenceType === 'string' && reference.referenceType.toLowerCase() === 'document') {\n return true;\n }\n\n if (typeof reference.link === 'string' && /\\/ai\\/documents\\/.+\\/download(?:$|\\?)/i.test(reference.link)) {\n return true;\n }\n\n return false;\n }\n\n function normalizeReferences(references) {\n if (!references || typeof references !== 'object') {\n return {};\n }\n\n const normalized = {};\n\n for (const [key, value] of Object.entries(references)) {\n normalized[key] = normalizeReference(value) ?? {};\n }\n\n return normalized;\n }\n\n function getCitationLabel(reference, key) {\n return reference.title || reference.text || key;\n }\n\n function buildCitationDisplay(content, references) {\n let processedContent = (content || '').trim();\n const messageReferences = normalizeReferences(references);\n const referenceEntries = Object.entries(messageReferences);\n\n if (!referenceEntries.length) {\n return { content: processedContent, citations: [] };\n }\n\n const citedRefs = referenceEntries.filter(([key]) => processedContent.includes(key));\n const generatedRefs = referenceEntries.filter(([key, value]) => value.isGenerated && !processedContent.includes(key));\n\n if (!citedRefs.length && !generatedRefs.length) {\n return { content: processedContent, citations: [] };\n }\n\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n generatedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n const citations = [];\n let displayIndex = 1;\n\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${displayIndex}_${value.index || displayIndex}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n citations.push({\n referenceKey: key,\n displayIndex: displayIndex,\n label: getCitationLabel(value, key),\n link: value.link || null,\n isDownload: isDownloadCitationReference(value),\n placeholder: placeholder,\n });\n\n displayIndex++;\n }\n\n for (const citation of citations) {\n processedContent = processedContent.replaceAll(citation.placeholder, `${citation.displayIndex}`);\n }\n\n processedContent = processedContent.replaceAll('
', ',');\n\n // Generated files (such as exported tabular data) are always offered as a download even when\n // the model does not cite them inline, so the user never loses access to the produced file.\n for (const [key, value] of generatedRefs) {\n citations.push({\n referenceKey: key,\n displayIndex: displayIndex,\n label: getCitationLabel(value, key),\n link: value.link || null,\n isDownload: true,\n placeholder: null,\n });\n\n displayIndex++;\n }\n\n return {\n content: processedContent,\n citations: citations.map(({ placeholder, ...citation }) => citation),\n };\n }\n\n function buildCopyContent(content, citations) {\n let copyContent = (content || '').trim();\n\n if (!copyContent || !Array.isArray(citations) || citations.length === 0) {\n return copyContent;\n }\n\n for (const citation of citations) {\n copyContent = copyContent.replaceAll(citation.referenceKey, `[${citation.displayIndex}]`);\n }\n\n copyContent += '\\n\\nReferences:\\n';\n\n for (const citation of citations) {\n copyContent += `${citation.displayIndex}. ${citation.label}`;\n\n if (citation.link) {\n copyContent += ` - ${citation.link}`;\n }\n\n copyContent += '\\n';\n }\n\n return copyContent.trimEnd();\n }\n\n function updateMessagePresentation(message, references) {\n const messageReferences = normalizeReferences(references ?? message.references);\n const rawContent = typeof message.rawContent === 'string'\n ? message.rawContent\n : typeof message.content === 'string'\n ? message.content\n : '';\n const citationDisplay = buildCitationDisplay(rawContent, messageReferences);\n\n message.rawContent = rawContent;\n message.content = rawContent;\n message.displayContent = citationDisplay.content;\n message.references = messageReferences;\n message.citationReferences = citationDisplay.citations;\n message.copyContent = buildCopyContent(rawContent, citationDisplay.citations);\n message.htmlContent = parseMarkdownContent(citationDisplay.content, message);\n\n return message;\n }\n\n const renderer = new marked.Renderer();\n\n // Modify the link rendering to open in a new tab\n renderer.link = function (data) {\n var href = sanitizeUrl(data.href);\n if (!href) return data.text || '';\n return `${data.text}`;\n };\n\n // Custom code block renderer with highlight.js integration and copy button.\n renderer.code = function (data) {\n var code = data.text || '';\n var lang = (data.lang || '').trim();\n var highlighted = code;\n\n if (typeof hljs !== 'undefined') {\n if (lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(code, { language: lang }).value;\n } catch (_) { }\n } else {\n try {\n highlighted = hljs.highlightAuto(code).value;\n } catch (_) { }\n }\n } else {\n highlighted = escapeHtmlEntities(code);\n }\n\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\n return `
${langDisplay}
${highlighted}
`;\n };\n\n // Custom image renderer for generated images with thumbnail styling and download button.\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\n renderer.image = function (data) {\n const src = sanitizeUrl(data.href);\n if (!src) return '';\n const alt = data.text || defaultConfig.generatedImageAltText;\n const maxWidth = defaultConfig.generatedImageMaxWidth;\n return `
\n \"${alt}\"\n
\n \n \n \n
\n
`;\n };\n\n // Chart counter for unique IDs\n let chartCounter = 0;\n\n // Collector for charts discovered during marked parsing.\n let _pendingCharts = [];\n\n // Global chart config map shared with ai-chat.js\n window.__chartConfigs = window.__chartConfigs || {};\n\n function createChartHtml(chartId) {\n return `
`\n + ``\n + `
`\n + `
`\n + ``\n + `
`;\n }\n\n // Register [chart:{...json...}] as a native marked block extension so the\n // markdown parser handles chart markers inline with surrounding text.\n marked.use({\n extensions: [{\n name: 'chart',\n level: 'block',\n start(src) {\n const idx = src.indexOf('[chart:');\n return idx >= 0 ? idx : undefined;\n },\n tokenizer(src) {\n const extracted = tryExtractChartMarker(src);\n if (!extracted || extracted.startIndex !== 0) {\n return undefined;\n }\n\n const chartId = `chat_chart_${++chartCounter}`;\n\n return {\n type: 'chart',\n raw: src.substring(0, extracted.endIndex),\n chartId: chartId,\n json: extracted.json,\n };\n },\n renderer(token) {\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\n window.__chartConfigs[token.chartId] = token.json;\n return createChartHtml(token.chartId);\n }\n }]\n });\n\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\n function tryExtractChartMarker(text) {\n const token = '[chart:';\n const start = text.indexOf(token);\n if (start < 0) {\n return null;\n }\n\n // Find JSON object boundary by balancing braces\n const jsonStart = start + token.length;\n let i = jsonStart;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\n i++;\n }\n\n if (i >= text.length || text[i] !== '{') {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n\n if (inString) {\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\') {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) {\n const jsonEnd = i;\n // Expect closing bracket after JSON\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\n if (closeBracketIndex < 0) {\n return null;\n }\n\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\n return {\n startIndex: start,\n endIndex: closeBracketIndex + 1,\n json: json\n };\n }\n }\n }\n\n return null;\n }\n\n function renderChartsInMessage(message) {\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\n return;\n }\n\n // Copy and clear pending charts immediately to prevent duplicate renders.\n const charts = [...message._pendingCharts];\n message._pendingCharts = [];\n\n // Defer to requestAnimationFrame so the browser has fully laid out the\n // canvas elements before Chart.js reads their dimensions.\n requestAnimationFrame(() => {\n for (const c of charts) {\n const canvas = document.getElementById(c.chartId);\n if (!canvas) {\n continue;\n }\n\n if (typeof Chart === 'undefined') {\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n continue;\n }\n\n // When the canvas is inside a hidden container (e.g., display:none),\n // it has zero dimensions. Keep the config for later rendering.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[c.chartId] = c.config;\n continue;\n }\n\n try {\n // Destroy existing chart instance if re-rendering\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n } catch (e) {\n console.error('Error creating chart:', e);\n }\n }\n });\n }\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n function compactObject(source) {\n if (!source || typeof source !== 'object') {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(source).filter(([, value]) => value !== undefined)\n );\n }\n\n const initialize = (instanceConfig) => {\n const config = Object.assign({}, defaultConfig, compactObject(instanceConfig));\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isInteractionStarted: false,\n isPlaceholderVisible: true,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n prompt: '',\n initialFieldValues: new Map(),\n settingsDirty: false,\n saveSettingsTimeout: null,\n saveIndicatorTimeout: null,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n currentAudioUrl: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2),\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n // Realtime (speech-to-speech) controller from the shared CoreAIRealtime module.\n realtimeController: null,\n notifications: [],\n notificationDismissTimers: {},\n copyTitle: config.copyTitle,\n copiedTitle: config.copiedTitle,\n copiedMessageIndex: -1,\n copyResetTimeoutId: null,\n activeCopyButton: null,\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadInteraction\", (data) => {\n this.initializeInteraction(data.itemId, true);\n this.messages = [];// Update the title field if it exists\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && data.title) {\n titleInput.value = data.title;\n }\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n });\n\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\n // Update the history list item if it exists\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\n if (historyItem) {\n historyItem.textContent = title || config.untitledText;\n }\n\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && title) {\n titleInput.value = title;\n }\n\n this.showSaveIndicator('Saved', 'text-success');\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n this.showSaveIndicator('Save failed', 'text-danger');\n\n if (this.isRecording) {\n this.stopRecording();\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, turnId, text) => {\n // Realtime: a placeholder for this turn was already inserted in the right position when\n // the utterance was captured (see onUserTurnPending), so just fill in its text.\n if (turnId && this._realtimePendingTurns && this._realtimePendingTurns[turnId]) {\n var pending = this._realtimePendingTurns[turnId];\n delete this._realtimePendingTurns[turnId];\n this.stopAudio();\n if (text) {\n pending.content = text;\n pending.rawContent = text;\n pending.isPartial = false;\n updateMessagePresentation(pending, pending.references);\n } else {\n var emptyIndex = this.messages.indexOf(pending);\n if (emptyIndex >= 0) { this.messages.splice(emptyIndex, 1); }\n }\n\n return;\n }\n\n if (text) {\n this.stopAudio();\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else if (this._conversationAssistantMessage) {\n // Realtime: the user's transcript lags the assistant's reply for the SAME turn (the\n // model answers the audio before speech-to-text finishes). Insert the user message\n // just before the streaming assistant message so the order stays You -> Assistant,\n // and keep that message streaming — ending it here split one reply into two bubbles.\n var at = this._conversationAssistantMessage.index;\n var userMsg = { role: 'user', content: text, rawContent: text, references: {} };\n updateMessagePresentation(userMsg, userMsg.references);\n this.messages.splice(at, 0, userMsg);\n this._conversationAssistantMessage.index = at + 1;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, references, appearance) => {\n // A new response id means a new turn — finalize the previous assistant message so two replies\n // never merge into one bubble (also covers barge-in, which starts a fresh response).\n if (this._conversationAssistantMessage && this._conversationAssistantResponseId && responseId && this._conversationAssistantResponseId !== responseId) {\n var prev = this.messages[this._conversationAssistantMessage.index];\n if (prev) { prev.isStreaming = false; }\n this._conversationAssistantMessage = null;\n }\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n appearance: this.normalizeAssistantAppearance(appearance),\n references: {},\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n this._conversationAssistantResponseId = responseId;\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.rawContent = this._conversationAssistantMessage.content;\n msg.references = normalizeReferences(Object.assign({}, msg.references || {}, references || {}));\n updateMessagePresentation(msg, msg.references);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId, references) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n msg.references = normalizeReferences(Object.assign({}, msg.references || {}, references || {}));\n updateMessagePresentation(msg, msg.references);\n }\n this._conversationAssistantMessage = null;\n this._conversationAssistantResponseId = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n // Realtime PCM streams straight to the low-latency player; other formats (TTS) are buffered.\n if (contentType === 'audio/pcm' && this.realtimeController) {\n this.realtimeController.receivePcm(bytes);\n } else {\n this.audioChunks.push(bytes);\n }\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"HistoryCleared\", (itemId) => {\n // Clear messages and show placeholder\n this.messages = [];\n this.showPlaceholder();\n\n // Hide the clear history button since there's no history now\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.add('d-none');\n }\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n this.reloadCurrentInteraction();\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n if (message.content) {\n message.rawContent = message.rawContent ?? message.content;\n updateMessagePresentation(message, message.references);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n async sendMessage() {\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // Flush any pending settings save before sending a message\n // to prevent concurrent hub calls that can cause database deadlocks.\n await this.flushPendingSave();\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n // Show the clear history button since we now have prompts\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.remove('d-none');\n }\n\n this.streamMessage(trimmedPrompt);\n this.inputElement.value = '';\n this.prompt = '';\n },\n streamMessage(trimmedPrompt) {\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n var messageIndex = this.messages.length;\n var currentItemId = this.getItemId();\n\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n if (chunk.sessionId && !currentItemId) {\n this.setItemId(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n messageIndex = this.messages.length;\n let newMessage = {\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n };\n\n this.messages.push(newMessage);\n message = newMessage;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = normalizeReference(value) ?? {};\n }\n }\n\n if (chunk.content) {\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n content += chunk.content;\n }\n\n message.rawContent = content;\n updateMessagePresentation(message, references);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n return {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n },\n processReferences(references, messageIndex) {\n references = normalizeReferences(references);\n\n if (Object.keys(references).length) {\n let message = this.messages[messageIndex];\n message.rawContent = message.rawContent ?? message.content ?? '';\n updateMessagePresentation(message, references);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Save any settings that were deferred during streaming.\n if (this.settingsDirty) {\n this.debouncedSaveSettings();\n }\n },\n handleExternalTtsStop(e) {\n if (e?.detail?.sourceId === this.ttsInstanceId) {\n return;\n }\n\n this.stopAudio(false);\n },\n updateTtsPlaybackButtons() {\n if (!this.chatContainer) {\n return;\n }\n\n var buttons = this.chatContainer.querySelectorAll('[data-tts-message-index]');\n\n buttons.forEach(button => {\n var buttonIndex = Number(button.getAttribute('data-tts-message-index'));\n var isPlaying = buttonIndex === this.ttsPlayingMessageIndex;\n var iconHtml = isPlaying\n ? ''\n : '';\n\n button.classList.toggle('tts-playing', isPlaying);\n button.setAttribute('title', isPlaying ? 'Pause audio' : 'Read aloud');\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n });\n },\n updateCopyButtons() {\n if (!this.chatContainer) {\n return;\n }\n\n var buttons = this.chatContainer.querySelectorAll('[data-copy-message-index]');\n\n buttons.forEach(button => {\n var buttonIndex = Number(button.getAttribute('data-copy-message-index'));\n var isCopied = buttonIndex === this.copiedMessageIndex;\n var iconHtml = isCopied\n ? ''\n : '';\n\n button.classList.toggle('text-success', isCopied);\n button.classList.toggle('text-secondary', !isCopied);\n button.setAttribute('title', isCopied ? this.copiedTitle : this.copyTitle);\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n });\n },\n setCopyButtonState(button, isCopied) {\n if (!button) {\n return;\n }\n\n var iconHtml = isCopied\n ? ''\n : '';\n\n button.classList.toggle('text-success', isCopied);\n button.classList.toggle('text-secondary', !isCopied);\n button.setAttribute('title', isCopied ? this.copiedTitle : this.copyTitle);\n button.replaceChildren(DOMPurify.sanitize(iconHtml, { RETURN_DOM_FRAGMENT: true }));\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio(false);\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\n detail: { sourceId: this.ttsInstanceId }\n }));\n this.ttsPlayingMessageIndex = index;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is currently playing, queue this blob for later.\n if (this.isPlayingAudio && this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioUrl = url;\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n const nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n if (this.currentAudioUrl) {\n URL.revokeObjectURL(this.currentAudioUrl);\n this.currentAudioUrl = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.$nextTick(() => this.updateTtsPlaybackButtons());\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var itemId = this.getItemId();\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, continuation is handled\n // by the persistent stream.\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getItemId() {\n return this.inputElement.getAttribute('data-interaction-id')\n || this.inputElement.getAttribute('data-item-id');\n },\n getSaveIndicatorElement() {\n if (config.saveIndicatorElementSelector) {\n return document.querySelector(config.saveIndicatorElementSelector);\n }\n\n return document.querySelector('[data-chat-interaction-save-indicator]');\n },\n showSaveIndicator(text, className) {\n const indicator = this.getSaveIndicatorElement();\n if (!indicator) {\n return;\n }\n\n indicator.textContent = text || '';\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\n\n if (this.saveIndicatorTimeout) {\n clearTimeout(this.saveIndicatorTimeout);\n this.saveIndicatorTimeout = null;\n }\n\n if (!text) {\n return;\n }\n\n this.saveIndicatorTimeout = setTimeout(() => {\n indicator.textContent = '';\n this.saveIndicatorTimeout = null;\n }, 3000);\n },\n clearPendingSettingsSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n },\n getFieldLabel(input) {\n const label = input\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\n ?.querySelector('label');\n\n if (!label) {\n return input.dataset.setting || 'This field';\n }\n\n return (label.textContent || '')\n .replace(/\\s+/g, ' ')\n .trim()\n || input.dataset.setting\n || 'This field';\n },\n getValidationFeedbackElement(input) {\n let feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n return feedback;\n }\n\n feedback = document.createElement('div');\n feedback.className = 'invalid-feedback';\n input.insertAdjacentElement('afterend', feedback);\n\n return feedback;\n },\n clearSettingValidationError(input) {\n input.classList.remove('is-invalid');\n input.removeAttribute('aria-invalid');\n\n const feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n feedback.textContent = '';\n }\n },\n setSettingValidationError(input, message) {\n const feedback = this.getValidationFeedbackElement(input);\n input.classList.add('is-invalid');\n input.setAttribute('aria-invalid', 'true');\n feedback.textContent = message;\n },\n getSettingValidationMessage(input) {\n if (!input || input.disabled || input.type !== 'number') {\n return null;\n }\n\n const value = (input.value || '').trim();\n if (!value) {\n return null;\n }\n\n const number = Number(value);\n const fieldLabel = this.getFieldLabel(input);\n\n if (Number.isNaN(number)) {\n return `${fieldLabel} must be a valid number.`;\n }\n\n const min = input.getAttribute('min');\n if (min !== null && number < Number(min)) {\n return `${fieldLabel} must be ${min} or greater.`;\n }\n\n const max = input.getAttribute('max');\n if (max !== null && number > Number(max)) {\n return `${fieldLabel} must be ${max} or less.`;\n }\n\n return null;\n },\n validateSettingInput(input) {\n const message = this.getSettingValidationMessage(input);\n if (!message) {\n this.clearSettingValidationError(input);\n return true;\n }\n\n this.setSettingValidationError(input, message);\n return false;\n },\n validateSettings() {\n let isValid = true;\n\n this.getSettingInputs().forEach(input => {\n isValid = this.validateSettingInput(input) && isValid;\n });\n\n return isValid;\n },\n queueSettingsSave() {\n if (!this.validateSettings()) {\n this.clearPendingSettingsSave();\n this.settingsDirty = false;\n this.showSaveIndicator('Fix errors', 'text-danger');\n return;\n }\n\n this.settingsDirty = true;\n this.showSaveIndicator('Saving...', 'text-warning');\n this.debouncedSaveSettings();\n },\n getSettingInputs() {\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\n if (explicitInputs.length > 0) {\n return explicitInputs;\n }\n\n return document.querySelectorAll(\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\n );\n },\n getSelectedGroupValues(groupName, fallbackSelector) {\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked, .capability-checkbox[data-group=\"${groupName}\"]:checked`);\n if (explicitSelections.length > 0) {\n const values = [];\n\n explicitSelections.forEach(checkbox => {\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\n if (value) {\n values.push(value);\n }\n });\n\n return values;\n }\n\n if (!fallbackSelector) {\n return [];\n }\n\n const values = [];\n const checkboxes = document.querySelectorAll(fallbackSelector);\n\n checkboxes.forEach(checkbox => {\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\n\n if (hiddenInput && hiddenInput.value) {\n values.push(hiddenInput.value);\n }\n });\n\n return values;\n },\n getPromptTemplateSelections() {\n const promptTemplates = [];\n\n document.querySelectorAll('.prompt-template-card').forEach(card => {\n const templateIdInput = card.querySelector('.prompt-template-id-input');\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\n\n if (!templateId) {\n return;\n }\n\n promptTemplates.push({\n templateId: templateId,\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\n });\n });\n\n return promptTemplates;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n // Replace existing notification with same type, or add new one.\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var itemId = this.getItemId();\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\n .catch(err => console.error('Failed to handle notification action:', err));\n },\n setItemId(itemId) {\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\n this.inputElement.setAttribute('data-item-id', itemId || '');\n },\n resetInteraction() {\n this.setItemId('');\n this.isInteractionStarted = false;\n this.messages = [];\n this.showPlaceholder();\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keyup', event => {\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.inputElement.addEventListener('paste', (e) => {\n // Use setTimeout to allow the paste to complete before checking the value\n setTimeout(() => {\n this.prompt = this.inputElement.value;\n if (this.inputElement.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n }, 0);\n });\n\n this.buttonElement.addEventListener('click', () => {\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\n\n for (var i = 0; i < chatInteractionItems.length; i++) {\n chatInteractionItems[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var itemId = e.target.getAttribute('data-interaction-id');\n\n if (!itemId) {\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\n return;\n }\n\n this.loadInteraction(itemId);\n });\n }\n\n const initialMessages = Array.isArray(config.messages) ? config.messages : [];\n\n for (let i = 0; i < initialMessages.length; i++) {\n this.addMessage(initialMessages[i]);\n }\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n document.addEventListener('input', event => {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('change', event => {\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .capability-checkbox[data-group], .group-toggle, .ci-agent-global-toggle')) {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n }\n\n this.queueSettingsSave();\n return;\n }\n\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('click', event => {\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\n return;\n }\n\n setTimeout(() => {\n this.queueSettingsSave();\n }, 0);\n });\n\n // Add event listener for clear history button\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.addEventListener('click', () => {\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\n if (itemId) {\n this.clearHistory(itemId);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n\n // Initialize realtime (speech-to-speech) mode via the shared CoreAIRealtime module. The\n // module owns the mic capture, playback, echo guard, push-to-talk and audio settings; the\n // callbacks below plug it into this app's connection and conversation-transcript display.\n if (window.CoreAIRealtime && config.realtimeButtonElementSelector) {\n this.realtimeController = window.CoreAIRealtime.attach({\n connection: this.connection,\n ensureConnected: () => Promise.resolve(this.connection),\n sendStart: (subject, voice, language, silenceMs, vadThreshold, allowInterruption) => {\n this.connection.send('StartRealtimeConversation', this.getItemId(), subject, voice, language, silenceMs, vadThreshold, allowInterruption);\n },\n // Prefer WebRTC (server-relay) when the server advertises it; the shared module falls back\n // to the WebSocket sendStart above if the peer cannot connect.\n webRtcEnabled: config.realtimeWebRtcEnabled === true,\n sendStartWebRtc: (offerSdp, voice, language, silenceMs, vadThreshold, allowInterruption) => {\n this.connection.send('StartRealtimeWebRtc', this.getItemId(), offerSdp, voice, language, silenceMs, vadThreshold, allowInterruption);\n },\n webRtcIceServers: Array.isArray(config.realtimeWebRtcIceServers) ? config.realtimeWebRtcIceServers : undefined,\n voiceName: config.realtimeVoiceName || '',\n getVoiceName: () => {\n var el = config.realtimeVoiceSelectElementSelector ? document.querySelector(config.realtimeVoiceSelectElementSelector) : null;\n return el ? el.value : '';\n },\n capableDeployments: config.realtimeCapableDeployments || [],\n realtimeEnabled: config.realtimeEnabled === true,\n selectors: {\n realtimeButton: config.realtimeButtonElementSelector,\n input: config.inputElementSelector,\n sendButton: config.sendButtonElementSelector,\n micButton: config.micButtonElementSelector,\n conversationButton: config.conversationButtonElementSelector,\n deploymentSelect: config.deploymentSelectElementSelector\n },\n onActivate: () => {\n this.isConversationMode = true;\n this._conversationPartialMessage = null;\n this._conversationAssistantMessage = null;\n },\n onDeactivate: () => {\n this.isConversationMode = false;\n if (this._conversationAssistantMessage) {\n var m = this.messages[this._conversationAssistantMessage.index];\n if (m) { m.isStreaming = false; }\n this._conversationAssistantMessage = null;\n }\n },\n onEnterRealtimeMode: () => {\n if (this.isRecording) { this.stopRecording(); }\n if (this.isConversationMode && (!this.realtimeController || !this.realtimeController.isActive())) { this.stopConversationMode(); }\n },\n // The utterance has been captured but not transcribed yet. Showing a placeholder now\n // puts the prompt above the reply it produces: transcription lags the spoken answer, so\n // a bubble added only when the text arrives lands underneath its own reply.\n onUserTurnPending: (turnId) => {\n if (!turnId) { return; }\n var placeholder = { role: 'user', content: '', rawContent: '', references: {}, isPartial: true };\n updateMessagePresentation(placeholder, placeholder.references);\n this._realtimePendingTurns = this._realtimePendingTurns || {};\n this._realtimePendingTurns[turnId] = placeholder;\n this.messages.push(placeholder);\n this.scrollToBottom();\n },\n onUserTurnDropped: (turnId) => {\n if (!turnId || !this._realtimePendingTurns) { return; }\n var dropped = this._realtimePendingTurns[turnId];\n if (!dropped) { return; }\n delete this._realtimePendingTurns[turnId];\n var at = this.messages.indexOf(dropped);\n if (at >= 0) { this.messages.splice(at, 1); }\n }\n });\n\n this.setupRealtimeVoicePicker(config);\n }\n },\n // Populates the per-interaction realtime voice picker from the selected realtime deployment's\n // voices (via the realtime-voices endpoint), and shows it only for realtime-capable deployments.\n setupRealtimeVoicePicker(config) {\n if (!config.realtimeVoiceSelectElementSelector || !config.realtimeVoicesUrl) {\n return;\n }\n\n var voiceSelect = document.querySelector(config.realtimeVoiceSelectElementSelector);\n if (!voiceSelect) {\n return;\n }\n\n var voiceGroup = config.realtimeVoiceGroupElementSelector ? document.querySelector(config.realtimeVoiceGroupElementSelector) : null;\n var deploymentSelect = config.deploymentSelectElementSelector ? document.querySelector(config.deploymentSelectElementSelector) : null;\n var capable = (config.realtimeCapableDeployments || []).map(function (n) { return (n || '').toLowerCase(); });\n var savedVoiceId = config.realtimeVoiceName || '';\n\n function isRealtimeDeployment(name) {\n return name && capable.indexOf(name.toLowerCase()) !== -1;\n }\n\n async function loadVoices() {\n var deploymentName = deploymentSelect ? deploymentSelect.value : '';\n var realtime = isRealtimeDeployment(deploymentName);\n if (voiceGroup) {\n voiceGroup.classList.toggle('d-none', !realtime);\n }\n if (!realtime) {\n return;\n }\n\n voiceSelect.innerHTML = '';\n\n try {\n const response = await fetch(config.realtimeVoicesUrl + '?deploymentName=' + encodeURIComponent(deploymentName), { credentials: 'same-origin' });\n const result = await response.json();\n if (!result || !Array.isArray(result.voices)) {\n return;\n }\n\n const grouped = new Map();\n for (const voice of result.voices) {\n const groupName = voice.gender || 'Voices';\n if (!grouped.has(groupName)) {\n grouped.set(groupName, []);\n }\n grouped.get(groupName).push(voice);\n }\n\n Array.from(grouped.keys()).sort((a, b) => a.localeCompare(b)).forEach(function (groupName) {\n const optgroup = document.createElement('optgroup');\n optgroup.label = groupName;\n grouped.get(groupName).forEach(function (voice) {\n const option = document.createElement('option');\n option.value = voice.id;\n option.textContent = voice.name;\n option.selected = voice.id === savedVoiceId;\n optgroup.appendChild(option);\n });\n voiceSelect.appendChild(optgroup);\n });\n } catch (err) {\n /* ignore voice load failures */\n }\n }\n\n if (deploymentSelect) {\n deploymentSelect.addEventListener('change', loadVoices);\n }\n loadVoices();\n },\n loadInteraction(itemId) {\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\n },\n reloadCurrentInteraction() {\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n },\n clearHistory(itemId) {\n const self = this;\n const clearHistoryConfirmed = () => {\n // Force-stop any live realtime voice session before clearing history.\n if (self.realtimeController && self.realtimeController.isActive()) {\n self.realtimeController.stop();\n }\n\n // Cancel any active stream before clearing history.\n if (self.stream) {\n self.stream.dispose();\n self.stream = null;\n self.hideTypingIndicator();\n self.streamingFinished();\n }\n\n self.connection.invoke(\"ClearHistory\", itemId)\n .catch(err => console.error('Error clearing history:', err));\n };\n\n if (typeof confirmDialog === 'function') {\n confirmDialog({\n title: config.clearHistoryTitle,\n message: config.clearHistoryMessage,\n okText: config.clearHistoryOkText,\n cancelText: config.clearHistoryCancelText,\n callback: function (confirmed) {\n if (confirmed) {\n clearHistoryConfirmed();\n }\n }\n });\n\n return;\n }\n\n if (window.confirm(config.clearHistoryMessage || 'Clear all messages?')) {\n clearHistoryConfirmed();\n }\n },\n debouncedSaveSettings() {\n // Clear any existing timeout to reset the debounce timer\n this.clearPendingSettingsSave();\n\n // Don't save while streaming — it will be saved when streaming completes.\n if (this.stream) {\n return;\n }\n\n // Set a new timeout to save after 850ms of no changes\n this.saveSettingsTimeout = setTimeout(() => {\n if (this.settingsDirty) {\n this.saveSettings();\n this.settingsDirty = false;\n }\n this.saveSettingsTimeout = null;\n }, 850);\n },\n getSelectedToolNames() {\n return this.getSelectedGroupValues(\n 'toolNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\n );\n },\n getSelectedMcpConnectionIds() {\n return this.getSelectedGroupValues(\n 'mcpConnectionIds',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\n );\n },\n getSelectedA2AConnectionIds() {\n return this.getSelectedGroupValues('a2aConnectionIds');\n },\n getSelectedAgentNames() {\n return this.getSelectedGroupValues(\n 'agentNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\n );\n },\n saveSettings() {\n const itemId = this.getItemId();\n if (!itemId) {\n return Promise.resolve();\n }\n\n if (!this.validateSettings()) {\n this.showSaveIndicator('Fix errors', 'text-danger');\n return Promise.resolve();\n }\n\n const settings = {};\n\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\n // This avoids coupling the JS to specific field names — new fields added by\n // any module are automatically included.\n const inputs = this.getSettingInputs();\n\n inputs.forEach(input => {\n const key = input.dataset.setting\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\n\n if (!key) {\n return;\n }\n\n if (input.type === 'checkbox') {\n settings[key] = input.checked;\n } else if (input.type === 'number') {\n settings[key] = input.value ? parseFloat(input.value) : null;\n } else {\n settings[key] = input.value || null;\n }\n });\n\n // Add tool, MCP connection, and agent collections (special handling).\n settings.toolNames = this.getSelectedToolNames();\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\n settings.agentNames = this.getSelectedAgentNames();\n\n const promptTemplates = this.getPromptTemplateSelections();\n if (promptTemplates.length > 0) {\n settings.promptTemplates = promptTemplates;\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\n }\n\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\n .catch(err => {\n console.error('Error saving settings:', err);\n this.showSaveIndicator('Save failed', 'text-danger');\n });\n },\n flushPendingSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n\n if (this.settingsDirty) {\n this.settingsDirty = false;\n return this.saveSettings();\n }\n\n return Promise.resolve();\n },\n initializeInteraction(itemId, force) {\n if (this.isInteractionStarted && !force) {\n return;\n }\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\n this.setItemId(itemId);\n this.isInteractionStarted = true;\n },\n clearCopiedMessageState() {\n if (this.copyResetTimeoutId) {\n window.clearTimeout(this.copyResetTimeoutId);\n this.copyResetTimeoutId = null;\n }\n\n if (this.activeCopyButton) {\n this.setCopyButtonState(this.activeCopyButton, false);\n this.activeCopyButton = null;\n }\n\n this.copiedMessageIndex = -1;\n },\n copyResponse(message, index, event) {\n const text = message && typeof message === 'object'\n ? message.copyContent ?? message.content ?? ''\n : message ?? '';\n const button = event?.currentTarget || event?.target?.closest?.('[data-copy-message-index]') || null;\n\n navigator.clipboard.writeText(text)\n .then(() => {\n this.clearCopiedMessageState();\n this.copiedMessageIndex = typeof index === 'number' ? index : -1;\n this.activeCopyButton = button;\n\n if (button) {\n this.setCopyButtonState(button, true);\n } else {\n this.$nextTick(() => this.updateCopyButtons());\n }\n\n this.copyResetTimeoutId = window.setTimeout(() => {\n this.clearCopiedMessageState();\n this.$nextTick(() => this.updateCopyButtons());\n }, Number(config.copyResetDelayMs) || 2000);\n })\n .catch(err => console.error('Failed to copy response:', err));\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var itemId = this.getItemId();\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n }\n },\n watch: {\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n },\n copiedMessageIndex() {\n this.$nextTick(() => this.updateCopyButtons());\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n\n this.$nextTick(() => {\n this.updateCopyButtons();\n refreshFontAwesomeIcons(this.$el);\n this.fontAwesomeObserver = observeFontAwesomeIcons(this.$el);\n });\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n\n if (this.fontAwesomeObserver) {\n this.fontAwesomeObserver.disconnect();\n this.fontAwesomeObserver = null;\n }\n\n this.clearCopiedMessageState();\n this.stopAudio(false);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n const autoInitializeSelector = '[data-chat-interaction-config]';\n\n function parseJsonAttribute(element, attributeName, description) {\n const rawValue = element.getAttribute(attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n } catch (error) {\n console.error('Failed to parse ' + description + ' JSON.', error);\n return null;\n }\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.chatInteractionInitialized === 'true') {\n return element ? element.__chatInteractionApp || null : null;\n }\n\n const config = parseJsonAttribute(element, 'data-chat-interaction-config', 'chat interaction config');\n if (!config) {\n return null;\n }\n\n const app = initialize(config);\n if (!app) {\n return null;\n }\n\n element.dataset.chatInteractionInitialized = 'true';\n element.__chatInteractionApp = app;\n\n return app;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches(autoInitializeSelector)) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll(autoInitializeSelector).forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n\n return {\n initialize: initialize,\n initializeFromElement: initializeFromElement,\n };\n}();\n\nwindow.chatInteractionDocumentManager = function () {\n const managerStateKey = '__chatInteractionDocumentManagerState';\n\n function normalizeDocumentInfo(document) {\n if (!document || typeof document !== 'object') {\n return null;\n }\n\n return {\n documentId: document.documentId || document.DocumentId || '',\n fileName: document.fileName || document.FileName || '',\n fileSize: document.fileSize || document.FileSize || 0\n };\n }\n\n function formatFileSize(bytes) {\n if (!bytes || bytes < 1024) {\n return (bytes || 0) + ' B';\n }\n\n if (bytes < 1024 * 1024) {\n return (bytes / 1024).toFixed(1) + ' KB';\n }\n\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n }\n\n function getDocumentKey(fileName, fileSize) {\n return ((fileName || '').trim().toLowerCase()) + '::' + (fileSize || 0);\n }\n\n function isDuplicateFile(file, knownKeys) {\n return knownKeys.has(getDocumentKey(file.name, file.size));\n }\n\n function getDocumentsFromDom(container) {\n if (!container) {\n return [];\n }\n\n return Array.from(container.querySelectorAll('[data-chat-document-id]'))\n .map(element => normalizeDocumentInfo({\n documentId: element.dataset.chatDocumentId,\n fileName: element.dataset.chatDocumentName,\n fileSize: Number(element.dataset.chatDocumentSize || 0)\n }))\n .filter(document => document && document.documentId);\n }\n\n function initialize(config) {\n if (!config || !config.itemId) {\n return;\n }\n\n const fileInput = document.getElementById('chat-doc-upload');\n const documentsList = document.getElementById('chat-documents-list');\n const status = document.getElementById('chat-doc-upload-status');\n const progressContainer = document.getElementById('chat-doc-upload-progress');\n const progressBar = document.getElementById('chat-doc-upload-progress-bar');\n const uploadQueue = document.getElementById('chat-doc-upload-queue');\n\n if (!fileInput || !documentsList || !status || !progressContainer || !progressBar || !uploadQueue) {\n return;\n }\n\n const previousState = fileInput[managerStateKey];\n if (previousState && typeof previousState.dispose === 'function') {\n previousState.dispose();\n }\n\n let interactionDocuments = (Array.isArray(config.existingDocuments) ? config.existingDocuments : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n\n if (interactionDocuments.length === 0) {\n interactionDocuments = getDocumentsFromDom(documentsList);\n }\n\n let uploadItems = [];\n let isUploadingDocuments = false;\n\n function createTextElement(tagName, className, text) {\n const element = document.createElement(tagName);\n if (className) {\n element.className = className;\n }\n\n element.textContent = text;\n return element;\n }\n\n function renderDocuments() {\n documentsList.innerHTML = '';\n\n if (interactionDocuments.length === 0) {\n documentsList.appendChild(createTextElement('div', 'text-muted small', 'No documents uploaded yet.'));\n return;\n }\n\n interactionDocuments.forEach(documentInfo => {\n const row = window.document.createElement('div');\n row.className = 'd-flex align-items-center gap-2 border rounded px-2 py-2 bg-white chat-document-row';\n row.dataset.chatDocumentId = documentInfo.documentId;\n row.dataset.chatDocumentName = documentInfo.fileName;\n row.dataset.chatDocumentSize = documentInfo.fileSize;\n\n const actions = window.document.createElement('div');\n actions.className = 'd-flex gap-1';\n\n const downloadBaseUrl = config.downloadDocumentBaseUrl || '/ai/documents/';\n const downloadLink = createTextElement('a', 'btn btn-sm btn-outline-secondary', '');\n downloadLink.title = 'Download';\n downloadLink.href = downloadBaseUrl + encodeURIComponent(documentInfo.documentId) + '/download';\n const downloadIcon = window.document.createElement('i');\n downloadIcon.className = 'fa-solid fa-download';\n downloadLink.appendChild(downloadIcon);\n\n const removeButton = createTextElement('button', 'btn btn-sm btn-outline-danger remove-chat-document-btn', '');\n removeButton.type = 'button';\n removeButton.title = 'Remove';\n removeButton.dataset.documentId = documentInfo.documentId;\n const removeIcon = window.document.createElement('i');\n removeIcon.className = 'fa-solid fa-trash';\n removeButton.appendChild(removeIcon);\n removeButton.addEventListener('click', () => removeDocument(documentInfo.documentId));\n\n actions.appendChild(downloadLink);\n actions.appendChild(removeButton);\n\n const details = window.document.createElement('div');\n details.className = 'min-w-0';\n\n const name = createTextElement('div', 'fw-semibold small text-truncate', documentInfo.fileName || 'Document');\n const icon = window.document.createElement('i');\n icon.className = 'fa-solid fa-file-lines me-1';\n name.prepend(icon);\n\n const size = createTextElement('div', 'text-muted small', formatFileSize(documentInfo.fileSize));\n\n details.appendChild(name);\n details.appendChild(size);\n\n row.appendChild(actions);\n row.appendChild(details);\n documentsList.appendChild(row);\n });\n }\n\n function showUploadStatus(message, cssClass) {\n if (!message) {\n status.textContent = '';\n status.className = 'small mt-2 d-none';\n return;\n }\n\n status.textContent = message;\n status.className = 'small mt-2 ' + (cssClass || 'text-muted');\n }\n\n function showUploadProgress(progress, message, cssClass) {\n if (progress === null || progress === undefined) {\n progressContainer.className = 'progress mt-2 d-none';\n progressContainer.setAttribute('aria-valuenow', '0');\n progressBar.className = 'progress-bar progress-bar-striped progress-bar-animated';\n progressBar.style.width = '0%';\n progressBar.textContent = '0%';\n return;\n }\n\n const roundedProgress = Math.max(0, Math.min(100, Math.round(progress)));\n progressContainer.className = 'progress mt-2';\n progressContainer.setAttribute('aria-valuenow', roundedProgress.toString());\n progressBar.className = 'progress-bar ' + (cssClass || 'progress-bar-striped progress-bar-animated');\n progressBar.style.width = roundedProgress + '%';\n progressBar.textContent = message || (roundedProgress + '%');\n }\n\n function getUploadStatePresentation(state) {\n switch (state) {\n case 'uploaded':\n return { label: 'Uploaded', badgeClass: 'text-bg-success', progressClass: 'bg-success' };\n case 'failed':\n return { label: 'Failed', badgeClass: 'text-bg-danger', progressClass: 'bg-danger' };\n case 'uploading':\n return { label: 'Uploading', badgeClass: 'text-bg-warning', progressClass: 'bg-warning progress-bar-striped progress-bar-animated' };\n default:\n return { label: 'Queued', badgeClass: 'text-bg-secondary', progressClass: 'bg-secondary progress-bar-striped progress-bar-animated' };\n }\n }\n\n function formatUploadMessage(item) {\n if (item.status === 'failed' && item.error) {\n return item.error;\n }\n\n if (item.status === 'uploaded') {\n return 'Upload completed successfully.';\n }\n\n if (item.status === 'uploading') {\n return item.progress + '% uploaded';\n }\n\n return 'Waiting to upload...';\n }\n\n function renderUploadQueue() {\n uploadQueue.innerHTML = '';\n\n uploadItems.forEach(item => {\n const presentation = getUploadStatePresentation(item.status);\n const card = document.createElement('div');\n card.className = 'border rounded px-2 py-2 bg-white';\n\n const header = document.createElement('div');\n header.className = 'd-flex justify-content-between align-items-start gap-2';\n\n const fileDetails = document.createElement('div');\n fileDetails.className = 'flex-grow-1 min-w-0';\n fileDetails.appendChild(createTextElement('div', 'fw-semibold small', item.fileName));\n fileDetails.appendChild(createTextElement('div', 'text-muted small', formatFileSize(item.fileSize)));\n\n const badge = createTextElement('span', 'badge ' + presentation.badgeClass, presentation.label);\n\n header.appendChild(fileDetails);\n header.appendChild(badge);\n\n const progress = document.createElement('div');\n progress.className = 'progress mt-2';\n progress.setAttribute('role', 'progressbar');\n progress.setAttribute('aria-valuemin', '0');\n progress.setAttribute('aria-valuemax', '100');\n progress.setAttribute('aria-valuenow', item.progress.toString());\n\n const progressState = document.createElement('div');\n progressState.className = 'progress-bar ' + presentation.progressClass;\n progressState.style.width = item.progress + '%';\n progressState.textContent = item.progress + '%';\n progress.appendChild(progressState);\n\n const message = createTextElement('div', item.status === 'failed' ? 'small text-danger mt-2' : 'small text-muted mt-2', formatUploadMessage(item));\n\n card.appendChild(header);\n card.appendChild(progress);\n card.appendChild(message);\n uploadQueue.appendChild(card);\n });\n }\n\n function createUploadItem(file, index) {\n return {\n id: file.name + '::' + file.size + '::' + file.lastModified + '::' + index + '::' + Date.now(),\n fileName: file.name,\n fileSize: file.size,\n status: 'queued',\n progress: 0,\n error: null\n };\n }\n\n function updateUploadItem(itemId, updates) {\n uploadItems = uploadItems.map(item => item.id === itemId ? Object.assign({}, item, updates) : item);\n renderUploadQueue();\n }\n\n function removeUploadItems(predicate) {\n uploadItems = uploadItems.filter(item => !predicate(item));\n renderUploadQueue();\n }\n\n function uploadSingleDocument(file, itemIdToUpdate, fileIndex, totalFiles) {\n return new Promise((resolve, reject) => {\n const formData = new FormData();\n formData.append('chatInteractionId', config.itemId);\n formData.append('files', file);\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', config.uploadDocumentUrl, true);\n\n xhr.upload.addEventListener('progress', event => {\n if (!event.lengthComputable) {\n return;\n }\n\n const fileProgress = Math.round((event.loaded / event.total) * 100);\n updateUploadItem(itemIdToUpdate, {\n status: 'uploading',\n progress: fileProgress\n });\n\n const overallProgress = ((fileIndex + (event.loaded / event.total)) / totalFiles) * 100;\n showUploadProgress(overallProgress, 'Uploading ' + (fileIndex + 1) + ' of ' + totalFiles, 'progress-bar-striped progress-bar-animated');\n });\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve(JSON.parse(xhr.responseText));\n } catch (error) {\n reject(new Error('Upload failed: invalid server response.'));\n }\n\n return;\n }\n\n reject(new Error((xhr.responseText || 'Upload failed.').trim()));\n });\n\n xhr.addEventListener('error', () => {\n reject(new Error('Upload failed. Please check your connection and try again.'));\n });\n\n xhr.send(formData);\n });\n }\n\n async function uploadDocuments(files) {\n if (!config.uploadDocumentUrl || !files || files.length === 0) {\n return;\n }\n\n if (isUploadingDocuments) {\n showUploadStatus('A document upload is already in progress.', 'text-warning');\n return;\n }\n\n isUploadingDocuments = true;\n\n const filesToUpload = [];\n const duplicateItems = [];\n const knownDocumentKeys = new Set(interactionDocuments.map(document => getDocumentKey(document.fileName, document.fileSize)));\n\n Array.from(files).forEach(file => {\n if (isDuplicateFile(file, knownDocumentKeys)) {\n duplicateItems.push(file);\n return;\n }\n\n knownDocumentKeys.add(getDocumentKey(file.name, file.size));\n filesToUpload.push(file);\n });\n\n if (duplicateItems.length > 0) {\n uploadItems = uploadItems.concat(duplicateItems.map((file, index) => Object.assign(createUploadItem(file, index), {\n status: 'failed',\n progress: 100,\n error: 'This document is already attached.'\n })));\n renderUploadQueue();\n }\n\n if (filesToUpload.length === 0) {\n isUploadingDocuments = false;\n showUploadStatus(duplicateItems.map(file => file.name + ': This document is already attached.').join(' | '), 'text-warning');\n showUploadProgress(null);\n return;\n }\n\n const pendingItems = filesToUpload.map(createUploadItem);\n uploadItems = uploadItems.concat(pendingItems);\n renderUploadQueue();\n showUploadProgress(0, 'Preparing upload...', 'progress-bar-striped progress-bar-animated');\n fileInput.disabled = true;\n\n try {\n let uploadedCount = 0;\n const failedUploads = duplicateItems.map(file => file.name + ': This document is already attached.');\n\n for (let i = 0; i < filesToUpload.length; i++) {\n const file = filesToUpload[i];\n const pendingItem = pendingItems[i];\n\n updateUploadItem(pendingItem.id, {\n status: 'uploading',\n progress: 0,\n error: null\n });\n\n showUploadStatus('Uploading ' + (i + 1) + ' of ' + filesToUpload.length + ' document(s)...', 'text-warning');\n\n try {\n const result = await uploadSingleDocument(file, pendingItem.id, i, filesToUpload.length);\n const uploaded = (Array.isArray(result.uploaded) ? result.uploaded : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n const failed = Array.isArray(result.failed) ? result.failed : [];\n\n if (uploaded.length > 0) {\n uploadedCount += uploaded.length;\n interactionDocuments = interactionDocuments.concat(uploaded);\n updateUploadItem(pendingItem.id, {\n status: 'uploaded',\n progress: 100,\n error: null\n });\n } else {\n const missingUploadMessage = failed.length > 0\n ? failed.map(entry => entry.fileName + ': ' + entry.error).join(' | ')\n : 'The server did not confirm that the file was uploaded.';\n if (failed.length === 0) {\n failedUploads.push(missingUploadMessage);\n }\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: 100,\n error: missingUploadMessage\n });\n }\n\n if (failed.length > 0) {\n const failedMessage = failed.map(entry => entry.fileName + ': ' + entry.error).join(' | ');\n failedUploads.push(failedMessage);\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: 100,\n error: failedMessage\n });\n }\n } catch (error) {\n const errorMessage = error && error.message\n ? error.message\n : 'Upload failed. Please try again.';\n console.error('Upload failed:', error);\n failedUploads.push(file.name + ': ' + errorMessage);\n updateUploadItem(pendingItem.id, {\n status: 'failed',\n progress: pendingItem.progress || 0,\n error: errorMessage\n });\n }\n }\n\n renderDocuments();\n\n if (failedUploads.length > 0) {\n removeUploadItems(item => item.status === 'uploaded');\n showUploadStatus(\n (uploadedCount > 0 ? ('Uploaded ' + uploadedCount + ' document(s). ') : '') + failedUploads.join(' | '),\n uploadedCount > 0 ? 'text-warning' : 'text-danger');\n showUploadProgress(null);\n return;\n }\n\n removeUploadItems(() => true);\n showUploadStatus('Uploaded ' + uploadedCount + ' document(s).', 'text-success');\n showUploadProgress(null);\n } catch (error) {\n console.error('Upload failed:', error);\n showUploadStatus('Upload failed. Please try again.', 'text-danger');\n showUploadProgress(null);\n } finally {\n isUploadingDocuments = false;\n fileInput.disabled = false;\n fileInput.value = '';\n }\n }\n\n async function removeDocument(documentId) {\n if (!config.removeDocumentUrl || !documentId || !window.confirm('Remove this document?')) {\n return;\n }\n\n try {\n const response = await fetch(config.removeDocumentUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n itemId: config.itemId,\n documentId: documentId\n })\n });\n\n if (!response.ok) {\n console.error('Failed to remove document:', await response.text());\n showUploadStatus('Failed to remove document.', 'text-danger');\n return;\n }\n\n const result = await response.json();\n const serverDocuments = (Array.isArray(result.documents) ? result.documents : [])\n .map(normalizeDocumentInfo)\n .filter(document => document && document.documentId);\n\n interactionDocuments = serverDocuments.length > 0\n ? serverDocuments\n : interactionDocuments.filter(document => document.documentId !== documentId);\n renderDocuments();\n showUploadStatus('Document removed.', 'text-success');\n } catch (error) {\n console.error('Remove failed:', error);\n showUploadStatus('Failed to remove document.', 'text-danger');\n }\n }\n\n const onFileInputChange = event => {\n const selectedFiles = event.target.files ? Array.from(event.target.files) : [];\n uploadDocuments(selectedFiles);\n };\n\n fileInput.addEventListener('change', onFileInputChange);\n fileInput[managerStateKey] = {\n dispose: () => {\n fileInput.removeEventListener('change', onFileInputChange);\n }\n };\n\n renderDocuments();\n renderUploadQueue();\n showUploadStatus(null);\n showUploadProgress(null);\n\n return fileInput[managerStateKey];\n }\n\n function parseJsonAttribute(element, attributeName, description) {\n const rawValue = element.getAttribute(attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n } catch (error) {\n console.error('Failed to parse ' + description + ' JSON.', error);\n return null;\n }\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.chatInteractionDocumentManagerInitialized === 'true') {\n return element ? element[managerStateKey] || null : null;\n }\n\n const config = parseJsonAttribute(element, 'data-chat-interaction-document-manager-config', 'chat interaction document manager config');\n if (!config) {\n return null;\n }\n\n const state = initialize(config);\n if (!state) {\n return null;\n }\n\n element.dataset.chatInteractionDocumentManagerInitialized = 'true';\n\n return state;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches('[data-chat-interaction-document-manager-config]')) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll('[data-chat-interaction-document-manager-config]').forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n\n return {\n initialize: initialize,\n initializeFromElement: initializeFromElement,\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} diff --git a/src/Startup/CrestApps.Core.Blazor.Web/Components/Pages/AI/AIProfiles/Edit.razor b/src/Startup/CrestApps.Core.Blazor.Web/Components/Pages/AI/AIProfiles/Edit.razor index 3ffea64a..a49956e7 100644 --- a/src/Startup/CrestApps.Core.Blazor.Web/Components/Pages/AI/AIProfiles/Edit.razor +++ b/src/Startup/CrestApps.Core.Blazor.Web/Components/Pages/AI/AIProfiles/Edit.razor @@ -865,14 +865,19 @@ else if (_model != null) @foreach (var doc in _model.AttachedDocuments) {
+
+ + + + +
@doc.FileName
@FormatFileSize(doc.FileSize)
-
} diff --git a/src/Startup/CrestApps.Core.Blazor.Web/Components/Pages/ChatInteractions/Chat.razor b/src/Startup/CrestApps.Core.Blazor.Web/Components/Pages/ChatInteractions/Chat.razor index 12384db6..815ff88a 100644 --- a/src/Startup/CrestApps.Core.Blazor.Web/Components/Pages/ChatInteractions/Chat.razor +++ b/src/Startup/CrestApps.Core.Blazor.Web/Components/Pages/ChatInteractions/Chat.razor @@ -355,19 +355,27 @@ else { @foreach (var document in _model.Documents) { -
-
-
@document.FileName
+
+ + + + +
+
+
@document.FileName
@FormatFileSize(document.FileSize)
-
} } @@ -775,6 +783,7 @@ else }).ToArray(), uploadDocumentUrl = "/ai/chat-interactions/upload-document", removeDocumentUrl = "/ai/chat-interactions/remove-document", + downloadDocumentBaseUrl = "/ai/documents/", }); _chatInteractionConfigJson = JsonSerializer.Serialize(new diff --git a/src/Startup/CrestApps.Core.Blazor.Web/Services/EntityCoreSampleServiceCollectionExtensions.cs b/src/Startup/CrestApps.Core.Blazor.Web/Services/EntityCoreSampleServiceCollectionExtensions.cs index 9f1bbb01..33939e53 100644 --- a/src/Startup/CrestApps.Core.Blazor.Web/Services/EntityCoreSampleServiceCollectionExtensions.cs +++ b/src/Startup/CrestApps.Core.Blazor.Web/Services/EntityCoreSampleServiceCollectionExtensions.cs @@ -51,6 +51,7 @@ public static IServiceCollection AddBlazorSampleHostServices(this IServiceCollec .AddScoped, AIMemoryEntryHandler>() .AddScoped() .AddScoped() + .AddScoped() .AddScoped() .AddScoped, ArticleHandler>() .AddScoped(); diff --git a/src/Startup/CrestApps.Core.Mvc.Web/Areas/AI/Views/AIProfile/Edit.cshtml b/src/Startup/CrestApps.Core.Mvc.Web/Areas/AI/Views/AIProfile/Edit.cshtml index 7e1016a0..9e80a41b 100644 --- a/src/Startup/CrestApps.Core.Mvc.Web/Areas/AI/Views/AIProfile/Edit.cshtml +++ b/src/Startup/CrestApps.Core.Mvc.Web/Areas/AI/Views/AIProfile/Edit.cshtml @@ -743,14 +743,19 @@ @foreach (var doc in Model.AttachedDocuments) {
+
+ + + + +
@doc.FileName
@(doc.FileSize < 1024 ? doc.FileSize + " B" : doc.FileSize < 1048576 ? (doc.FileSize / 1024.0).ToString("F1") + " KB" : (doc.FileSize / 1048576.0).ToString("F1") + " MB")
-
}
diff --git a/src/Startup/CrestApps.Core.Mvc.Web/Areas/ChatInteractions/Views/ChatInteraction/Chat.cshtml b/src/Startup/CrestApps.Core.Mvc.Web/Areas/ChatInteractions/Views/ChatInteraction/Chat.cshtml index 30ac63ba..aa093506 100644 --- a/src/Startup/CrestApps.Core.Mvc.Web/Areas/ChatInteractions/Views/ChatInteraction/Chat.cshtml +++ b/src/Startup/CrestApps.Core.Mvc.Web/Areas/ChatInteractions/Views/ChatInteraction/Chat.cshtml @@ -737,6 +737,7 @@ var interactionDocuments = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Model.Documents)); var uploadDocumentUrl = '@Url.Content("~/ai/chat-interactions/upload-document")'; var removeDocumentUrl = '@Url.Content("~/ai/chat-interactions/remove-document")'; + var downloadDocumentBaseUrl = '@Url.Content("~/ai/documents/")'; var audioChunkIntervalMs = 250; var speechToTextEnabled = @Model.SpeechToTextEnabled.ToString().ToLowerInvariant(); var conversationModeEnabled = @Model.ConversationModeEnabled.ToString().ToLowerInvariant(); @@ -1218,15 +1219,21 @@ interactionDocuments.forEach(function (doc) { var row = document.createElement('div'); - row.className = 'd-flex justify-content-between align-items-start border rounded px-2 py-2 bg-white'; + row.className = 'd-flex align-items-center border rounded px-2 py-2 bg-white'; + var downloadUrl = downloadDocumentBaseUrl + encodeURIComponent(doc.documentId) + '/download'; row.innerHTML = - '
' + - '
' + DOMPurify.sanitize(doc.fileName || 'Document') + '
' + - '
' + DOMPurify.sanitize(formatFileSize(doc.fileSize)) + '
' + + '
' + + '' + + '' + + '' + + '' + '
' + - ''; + '
' + + '
' + DOMPurify.sanitize(doc.fileName || 'Document') + '
' + + '
' + DOMPurify.sanitize(formatFileSize(doc.fileSize)) + '
' + + '
'; container.appendChild(row); }); diff --git a/src/Startup/CrestApps.Core.Mvc.Web/Services/YesSqlServiceCollectionExtensions.cs b/src/Startup/CrestApps.Core.Mvc.Web/Services/YesSqlServiceCollectionExtensions.cs index dadb0df7..e79593f1 100644 --- a/src/Startup/CrestApps.Core.Mvc.Web/Services/YesSqlServiceCollectionExtensions.cs +++ b/src/Startup/CrestApps.Core.Mvc.Web/Services/YesSqlServiceCollectionExtensions.cs @@ -81,6 +81,7 @@ public static IServiceCollection AddMvcSampleHostServices(this IServiceCollectio .AddScoped, AIMemoryEntryHandler>() .AddScoped() .AddScoped() + .AddScoped() .AddScoped(); services.TryAddEnumerable(ServiceDescriptor.Singleton()); diff --git a/src/Startup/CrestApps.Core.Startup.Shared/Areas/AIChat/Services/SampleAIProfileDocumentAuthorizationHandler.cs b/src/Startup/CrestApps.Core.Startup.Shared/Areas/AIChat/Services/SampleAIProfileDocumentAuthorizationHandler.cs new file mode 100644 index 00000000..947c2385 --- /dev/null +++ b/src/Startup/CrestApps.Core.Startup.Shared/Areas/AIChat/Services/SampleAIProfileDocumentAuthorizationHandler.cs @@ -0,0 +1,24 @@ +using CrestApps.Core.AI.Documents; +using CrestApps.Core.AI.Models; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization.Infrastructure; + +namespace CrestApps.Core.Startup.Shared.Areas.AIChat.Services; + +public sealed class SampleAIProfileDocumentAuthorizationHandler : AuthorizationHandler +{ + protected override Task HandleRequirementAsync( + AuthorizationHandlerContext context, + OperationAuthorizationRequirement requirement, + AIProfile resource) + { + if (resource != null && + requirement.Name == AIChatDocumentOperations.ManageDocuments.Name && + context.User.IsInRole("Administrator")) + { + context.Succeed(requirement); + } + + return Task.CompletedTask; + } +}