PageSourceSearch

https://ihaqdonate.com/assets/ChatActivitySettingsPage-CVqTEb5L.js

js ihaqdonate.com collected 2026-10-07 15:10:06 UTC 38,942 bytes, 8 lines download raw bytes

1import{w as Tt,o as Dt,r as vt,j as e,c as _t}from"./vendor-react-DgOz2jQd.js";import{_ as ct,au as St,aN as mt,b as N,T as A,B as z,n as Et,aO as Y,I as D,G as ht,R as W,w as _,A as Ct}from"./index-DayLiz0y.js";import{S as jt}from"./SettingsFooterGlass-ByNI82Tb.js";import{m as Nt,o as S,d as ut,e as u,f as $}from"./vendor-mobx-DziDysUD.js";import{W as L}from"./WidgetSettingsSectionGlass-CemLUDNY.js";import{T as R}from"./TextInputGlass-Buf8bN9v.js";import{S as F}from"./SliderGlass-DfJZQl-o.js";import{S as zt}from"./SettingsPreviewWrapperGlass-UfQRQoF_.js";import{W as $t}from"./WidgetIFramePreviewGlass-Tfo2u0jm.js";import{A as gt}from"./ArtGlass-xtrGyfYe.js";import{C as Rt}from"./ConfirmationPopUp-BXh0Xy_I.js";import{O as Bt}from"./OBSTestingControlGlass-C5Zd5zhw.js";import{W as Lt}from"./WidgetSettingsWrapperGlass-B2kKo5bl.js";import{F as Wt}from"./FormErrors-CIHowU4q.js";import{D as Ft}from"./DonationAnimations-COYPLGeT.js";import{U as yt}from"./types-DrtkSZ7f.js";import{I as pt}from"./ImageDropdownInputGlass-Jpan1qP-.js";import"./vendor-forms-CeN62axY.js";import"./vendor-query-CCb-kr4I.js";import"./pluralize-BqhPSiJS.js";import"./copyToClipboard-CMgYcUjS.js";import"./NavSecondaryGlass-DvbqFFFm.js";import"./lazyArts-D2K_1G8g.js";import"./throttle-YH3KbBjc.js";import"./MediaManagerPopUpGlass-Du1R7yrP.js";const Pt="https://json-schema.org/draft/2020-12/schema",kt="https://ihaq.local/schemas/chatEmotionConfig.json",Ot="ChatEmotionConfig",Ut="object",Vt=!1,Gt={version:{type:"number"},analyzer:{type:"object",additionalProperties:!1,properties:{windowSeconds:{type:["number","null"],minimum:6,maximum:30},dominantShare:{type:["number","null"],minimum:.2,maximum:.6},minMessagesInWindow:{type:["number","null"],minimum:3,maximum:15},burstMinRatio:{type:["number","null"],minimum:0,maximum:3}}},baseMoods:{type:"object",additionalProperties:!1,properties:{agree:{$ref:"#/$defs/widgetStyle"},disagree:{$ref:"#/$defs/widgetStyle"},toxic:{$ref:"#/$defs/widgetStyle"},sad:{$ref:"#/$defs/widgetStyle"},hype:{$ref:"#/$defs/widgetStyle"},happy:{$ref:"#/$defs/widgetStyle"}}},customMoods:{type:"array",maxItems:20,items:{type:"object",additionalProperties:!1,required:["id"],properties:{id:{type:"string",minLength:1,maxLength:64,description:"slug (a-z0-9_) или UUID; не должен совпадать с базовыми: agree/disagree/toxic/sad/hype/happy"},label:{type:"string",maxLength:64},widgetStyle:{$ref:"#/$defs/widgetStyle"}}}},lexicon:{type:"object",additionalProperties:{type:"string"},maxProperties:3e3,description:"token(lowercase) -> moodId"},emoteLexicon:{type:"object",additionalProperties:{type:"string"},maxProperties:2e3,description:"twitch emote name (lowercase) -> moodId"}},Yt={widgetStyle:{type:"object",additionalProperties:!1,properties:{imageId:{type:["string","null"]},imageTemplateId:{type:["number","null"]},imageAnimationId:{type:["number","null"]},textAnimationId:{type:["number","null"]}}}},Zt={$schema:Pt,$id:kt,title:Ot,type:Ut,additionalProperties:Vt,properties:Gt,$defs:Yt};let P=null,xt=null;const Jt=r=>r!=null&&r.length?r.map(t=>{const s=t.instancePath||"/",i=t.message||"invalid";return`${s} ${i}`.trim()}):[];async function qt(){if(P)return P;if(xt)return null;try{const[{default:r},{default:t}]=await Promise.all([ct(()=>import("./vendor-forms-CeN62axY.js").then(i=>i.a),[]),ct(()=>import("./vendor-forms-CeN62axY.js").then(i=>i.i),[])]),s=new r({allErrors:!0,strict:!1});return t(s),P=s.compile(Zt),P}catch(r){return xt=r,console.error("Failed to init Ajv validator",r),null}}async function Ht(r){const t=await qt();if(!t)return{isValid:!0,errors:[]};const s=!!t(r),i=s?[]:Jt(t.errors);return{isValid:s,errors:i}}const a="glass_chat-activity-widget-settings",ft=r=>r.name.toLowerCase().endsWith(".webm")||r.type==="video/webm",Mt=["agreeChatActivity","disagreeChatActivity","toxicChatActivity","sadChatActivity","happyChatActivity"],T=["agree","disagree","toxic","sad","happy"],k=6,O=30,Z=12,tt=.2,et=.6,J=.3,Xt=.01,U=3,V=15,q=5,it=0,st=3,H=1.3,Kt=.1,X=r=>Math.min(et,Math.max(tt,Math.round(r*100)/100)),K=r=>Math.min(st,Math.max(it,Math.round(r*10)/10)),Q={agree:["+1","база","согласен","согл","✅","yes","да","+","yep","го"],disagree:["-1","нет","не согласен","бред","👎","no","-"],toxic:["🤡","🤮","><","kys","идиот","даун","trash","мусор","тупой","дебил","заткнись","лох","хуйня","бля","фу","кринж"],sad:["f","cry","жаль","грустно","t_t","😭","😢","ass","2007","скучно","плак","слил","(","rip"],happy:["lul","😂","хаха","ахах","кек","kekw","rofl","смешно","🤣","😍","lmao","лол","nt","хах",")","lol","ура","круто"]},At={agree:[],disagree:[],toxic:[],sad:[],happy:[]},Qt={id:"",label:"",wordsText:"",emotesText:"",widgetStyle:{imageId:"",imageTemplateId:St.Top,imageAnimationId:1}},te=r=>{try{return JSON.parse(r)}catch{return null}},w=r=>{const t=r.trim();if(!t)return null;const s=t.replace(",","."),i=Number(s);return Number.isFinite(i)?i:null},ee=r=>{const t=r.imageId.trim()||null,s=w(r.imageTemplateId),i=w(r.imageAnimationId),o=w(r.textAnimationId);return t!=null||s!=null||i!=null||o!=null?{imageId:t,imageTemplateId:s,imageAnimationId:i,textAnimationId:o}:null},bt=r=>{const t=w(r.windowSeconds),s=w(r.dominantShare),i=w(r.minMessagesInWindow),o=w(r.burstMinRatio);return t!=null||s!=null||i!=null||o!=null?{windowSeconds:t,dominantShare:s,minMessagesInWindow:i,burstMinRatio:o}:null},E=r=>r.split(`
2`).map(t=>
2t.trim()).filter(Boolean),I=r=>Array.from(new Set(r)),ie=r=>r.length?r.join(", "):"—",se={agree:"agreeChatActivity",disagree:"disagreeChatActivity",toxic:"toxicChatActivity",sad:"sadChatActivity",happy:"happyChatActivity"},oe=(r,t,s)=>t?t.type==="standard"?r(`chatActivity:moods:${t.id}`):t.type==="customNew"?s!=null&&s.trim()?s:r("chatActivity:editor:custom:add"):s!=null&&s.trim()?s:r("chatActivity:editor:custom:untitled"):"",ae=()=>{const r=globalThis.crypto;return r!=null&&r.randomUUID?r.randomUUID():`mood_${Math.random().toString(16).slice(2)}_${Date.now().toString(16)}`};class ne extends vt.Component{constructor(t){super(t),this.chatActivityIndex=Math.floor(Math.random()*Mt.length),this.errors=new Wt,this.images=new Ft("noWebm"),this.standardInputs={agree:{wordsText:"",emotesText:""},disagree:{wordsText:"",emotesText:""},toxic:{wordsText:"",emotesText:""},sad:{wordsText:"",emotesText:""},happy:{wordsText:"",emotesText:""}},this.customMoods=[],this.analyzer={windowSeconds:String(Z),dominantShare:String(J),minMessagesInWindow:String(q),burstMinRatio:String(H)},this.isAnalyzerExpanded=!1,this.isEmotionDictionaryExpanded=!1,this.isEnabledDraft=!1,this.isEnabledDirty=!1,this.baseMoodStyles={agree:{imageId:"",imageTemplateId:"",imageAnimationId:"",textAnimationId:""},disagree:{imageId:"",imageTemplateId:"",imageAnimationId:"",textAnimationId:""},toxic:{imageId:"",imageTemplateId:"",imageAnimationId:"",textAnimationId:""},sad:{imageId:"",imageTemplateId:"",imageAnimationId:"",textAnimationId:""},happy:{imageId:"",imageTemplateId:"",imageAnimationId:"",textAnimationId:""}},this.isEditorBusy=!1,this.selectedMood=null,this.modalDraft=null,this.isRemoveCustomMoodConfirmationVisible=!1,this.removeCustomMoodIndex=null,this.activeAnalyzerDetails=null,this.initialIsEnabled=!1,this.initialPayloadString="",this.onResetAnalyzerSettings=()=>{this.setAnalyzerField("windowSeconds",String(Z)),this.setAnalyzerField("dominantShare",String(J)),this.setAnalyzerField("minMessagesInWindow",String(q)),this.setAnalyzerField("burstMinRatio",String(H))}
2,Nt(this,{standardInputs:S,customMoods:S,analyzer:S,isAnalyzerExpanded:S,isEmotionDictionaryExpanded:S,isEnabledDraft:S,isEnabledDirty:S,baseMoodStyles:S,isEditorBusy:S,selectedMood:S,modalDraft:S,isRemoveCustomMoodConfirmationVisible:S,removeCustomMoodIndex:S,activeAnalyzerDetails:S,initialIsEnabled:S,initialPayloadString:S,currentPayload:ut,hasChanges:ut,onSave:u.bound,onCancel:u.bound,onAddCustomMood:u.bound,onRemoveCustomMood:u.bound,openRemoveCustomMoodConfirmation:u.bound,closeRemoveCustomMoodConfirmation:u.bound,confirmRemoveCustomMood:u.bound,openAnalyzerDetails:u.bound,closeAnalyzerDetails:u.bound,openMoodEditor:u.bound,closeMoodEditor:u.bound,applyMoodEditor:u.bound,setModalWords:u.bound,setModalEmotes:u.bound,setModalLabel:u.bound,setModalImage:u.bound,setStandardWords:u.bound,setStandardEmotes:u.bound,setCustomId:u.bound,setCustomLabel:u.bound,setCustomWords:u.bound,setCustomEmotes:u.bound,setCustomImage:u.bound,setCustomImageTemplate:u.bound,setCustomImageAnimation:u.bound,setAnalyzerField:u.bound,setBaseMoodStyleField:u.bound,toggleAnalyzerExpanded:u.bound,toggleEmotionDictionaryExpanded:u.bound}),this.onConnectTwitch=this.onConnectTwitch.bind(this),this.onToggleEnabledDraft=this.onToggleEnabledDraft.bind(this),this.onTestMood=this.onTestMood.bind(this),this.onWindowSecondsSliderChange=this.onWindowSecondsSliderChange.bind(this),this.onDominantShareSliderChange=this.onDominantShareSliderChange.bind(this),this.onMinMessagesSliderChange=this.onMinMessagesSliderChange.bind(this),this.onBurstMinRatioSliderChange=this.onBurstMinRatioSliderChange.bind(this),this.isEnabledDraft=!!this.props.store.chatActivitySettings.isEnabled,this.bootstrapFromSettings(),this.getImages()}componentDidUpdate(t){const s=t.store.chatActivitySettings.isEnabled,i=this.props.store.chatActivitySettings.isEnabled;!this.isEnabledDirty&&s!==i&&$(()=>{this.initialIsEnabled=!!i,this.isEnabledDraft=!!i})}get isDisabled(){return this.props.store.chatActivitySettings.isLoading||this.isEditorBusy}get currentPayload(){const t={},s={};for(const i of T){const o=I(E(this.standardInputs[i].wordsText)),n=I(E(this.standardInputs[i].emotesText));o.forEach(d=>{t[d]=i}),n.forEach(d=>{s[d]=i})}for(const i of this.customMoods){const o=i.id.trim();if(!o)continue;const n=I(E(i.wordsText)),d=I(E(i.emotesText));n.forEach(y=>{t[y]=o}),d.forEach(y=>{s[y]=o})}return{version:1,analyzer:bt(this.analyzer)||void 0,baseMoods:(()=>{const i={};for(const o of T){const n=ee(this.baseMoodStyles[o]);n&&(i[o]=n)}return Object.keys(i).length?i:void 0})(),customMoods:this.customMoods.map(i=>({id:i.id.trim(),label:i.label.trim(),widgetStyle:{imageId:i.widgetStyle.imageId||void 0,imageTemplateId:i.widgetStyle.imageTemplateId,imageAnimationId:i.widgetStyle.imageAnimationId}})).filter(i=>i.id&&i.label),lexicon:t,emoteLexicon:s}}get hasChanges(){return this.isEnabledDraft!==this.initialIsEnabled?!0:JSON.stringify(this.currentPayload)!==this.initialPayloadString}async onConnectTwitch(){var t,s;try{const i=await mt.getTwitchLink();(s=(t=i==null?void 0:i.data)==null?void 0:t.data)!=null&&s.url&&(window.location.href=i.data.data.url)}catch(i){console.error("Failed to get twitch link",i)}}onToggleEnabledDraft(t){this.isEnabledDirty=!0,this.isEnabledDraft=t}async onTestMood(t){try{await mt.sendTestMood(t)}catch(s){console.error("Failed to send test mood",s)}}render(){return e.jsxs("div",{className:a,children:[e.jsxs("div",{className:`${a}__content`,children:[e.jsx("div",{className:`${a}__form`,children:this.renderLeftColumn()}),e.jsx("div",{className:`${a}__preview`,children:this.renderRightColumn()})]}),e.jsx(jt,{hasChanges:this.hasChanges,isDisabled:this.isDisabled,onSave:this.onSave,onCancel:this.onCancel,saveButtonText:this.props.t("widgetSettings:saveButtonText"),cancelButtonText:this.props.t("widgetSettings:cancelButtonText")})]})}renderLeftColumn(){return e.jsxs(e.Fragment,{children:[this.renderCommonSettings(),this.renderObsLink()]})}renderRightColumn(){return e.jsx(e.Fragment,{children:this.renderPreview()})}renderCommonSettings(){const{t}=this.props;return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:`${a}__header`,children:e.jsx(N,{value:t("donationSettings:donates:chatActivity:title"),size:"xl"})}),e.jsxs(L,{className:`${a}__card`,children:[e.jsx(N,{value:t("general:description","Описание"),size:"m"}),e.jsx(A,{size:"m",color:"white",isMarginDisabled:!0,children:t("chatActivity:form:description")})]}),e.jsxs(L,{className:`${a}__card`,children:[e.jsx(N,{value:t("widgetSettings:generalSettings",{defaultValue:"Общие настройки"}),size:"m"}),e.jsxs("div",{className:`${a}__toggle-row`,children:[this.props.store.chatActivitySettings.isTwitchLinked?e.jsx(z,{size:"m",theme:"secondary",text:t("chatActivity:form:twitchLinkedText"),isDisabled:!0}):e.jsx(z,{size:"m",theme:"accent",text:t("chatActivity:form:connectTwitchButtonText"),onClick:this.onConnectTwitch}),e.jsx(Et,{text:t("chatActivity:form:enableText"),isChecked:this.isEnabledDraft,onChange:this.onToggleEnabledDraft})]}),e.jsx(A,{size:"m",color:"primary",tag:"span",children:e.jsx(Y,{className:`${a}__info-message`,text:t("chatActivity:form:hintText"),icon:"outlineInfo",iconPosition:"left"})})]}),this.renderAnalyzerSettings(),this.renderEmotionsGrid(),this.renderMoodEditorModal(),this.renderRemoveCustomMoodConfirmationPopUp()]})}renderObsLink(){const{t}=this.props;return e.jsxs(L,{className:`${a}__card`,children:[e.jsx(N,{value:t("widgetSettings:obsLinkTitle"),size:"m"}),e.jsx(R,{placeholder:"https://link",isCopyonly:!0,value:this.props.store.chatActivitySettings.obsLink,isLoading:this.props.store.chatActivitySettings.isLoading})]})}renderRemoveCustomMoodConfirmationPopUp(){var o,n,d;const{t}=this.props,s=this.removeCustomMoodIndex,i=s!=null?(n=(o=this.customMoods[s])==null?void 0:o.label)!=null&&n.trim()?(d=this.customMoods[s])==null?void 0:d.label.trim():t("chatActivity:editor:custom:untitled"):"";return e.jsx(Rt,{isVisible:this.isRemoveCustomMoodConfirmationVisible,onClose:this.closeRemoveCustomMoodConfirmation,onConfirm:this.confirmRemoveCustomMood,title:t("chatActivity:editor:custom:deleteTitle","Удалить эмоцию?"),text:t("chatActivity:editor:custom:deleteText",{label:i,defaultValue:'Удалить кастомную эмоцию "{{label}}"? Это действие необратимо.'}),confirmText:t("general:delete","Удалить"),confirmStyle:"accent",cancelStyle:"secondary"})}renderAnalyzerSettings(){const{t}=this.props;return e.jsxs(L,{className:`${a}__card`,children:[e.jsxs("div",{className:`${a}__analyzer-header`,onClick:this.toggleAnalyzerExpanded,children:[e.jsx(N,{value:t("chatActivity:analyzer:title"),size:"m"}),e.jsx(D,{type:this.isAnalyzerExpanded?"arrowUp":"arrowDown",className:`${a}__chevron`})]}),this.isAnalyzerExpanded?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`${a}__analyzer-grid`,children:[e.jsx("div",{className:`${a}__analyzer-cell ${a}__analyzer-cell_tl`,children:e.jsx(F,{title:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.jsx(D,{type:"time",color:"white"}),e.jsx("span",{children:t("chatActivity:analyzer:windowSeconds:title")})]}),hintText:e.jsx(A,{size:"sm",color:"white",isMarginDisabled:!0,children:t("chatActivity:analyzer:windowSeconds:hint")}),min:k,max:O,value:this.getAnalyzerWindowSecondsSliderValue(),errorText:this.errors.getErrorBy("analyzer.windowSeconds"),onChange:this.onWindowSecondsSliderChange,isDisabled:this.isDisabled})}),e.jsx("div",{className:`${a}__analyzer-cell ${a}__analyzer-cell_tr`,children:e.jsx(F,{title:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.jsx(D,{type:"crown",color:"white"}),e.jsx("span",{children:t("chatActivity:analyzer:dominantShare:title")})]}),hintText:e.jsx(A,{size:"sm",color:"white",isMarginDisabled:!0,children:t("chatActivity:analyzer:dominantShare:hint")}),min:tt,max:et,step:Xt,value:this.getAnalyzerDominantShareSliderValue(),isPercentage:!0,errorText:this.errors.getErrorBy("analyzer.dominantShare"),onChange:this.onDominantShareSliderChange,isDisabled:this.isDisabled})}),e.jsx("div",{className:`${a}__analyzer-cell ${a}__analyzer-cell_bl`,children:e.jsx(F,{title:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.jsx(D,{type:"meeting",color:"white"}),e.jsx("span",{children:t("chatActivity:analyzer:minMessagesInWindow:title")})]}),hintText:e.jsx(A,{size:"sm",color:"white",isMarginDisabled:!0,children:t("chatActivity:analyzer:minMessagesInWindow:hint")}),min:U,max:V,value:this.getAnalyzerMinMessagesSliderValue(),errorText:this.errors.getErrorBy("analyzer.minMessagesInWindow"),onChange:this.onMinMessagesSliderChange,isDisabled:this.isDisabled})}),e.jsx("div",{className:`${a}__analyzer-cell ${a}__analyzer-cell_br`,children:e.jsx(F,{title:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[e.jsx(D,{type:"lightning",color:"white"}),e.jsx("span",{children:t("chatActivity:analyzer:burstMinRatio:title")})]}),hintText:e.jsx(A,{size:"sm",color:"white",isMarginDisabled:!0,children:t("chatActivity:analyzer:burstMinRatio:hint")}),min:it,max:st,step:Kt,value:this.getAnalyzerBurstMinRatioSliderValue(),formatDisplayValue:s=>s.toFixed(1),errorText:this.errors.getErrorBy("analyzer.burstMinRatio"),onChange:this.onBurstMinRatioSliderChange,isDisabled:this.isDisabled})})]}),e.jsx("div",{style:{marginTop:"16px"},children:e.jsx(z,{size:"s",theme:"secondary",text:t("chatActivity:analyzer:recommended:resetButton","Сбросить до рекомендуемых"),onClick:this.onResetAnalyzerSettings})}),this.renderAnalyzerDetailsPopUp()]}):null]})}renderAnalyzerDetailsPopUp(){const{t}=this.props,s=this.activeAnalyzerDetails;return s?e.jsx(ht,{isVisible:!0,onClose:this.closeAnalyzerDetails,children:e.jsx("div",{className:`${a}__analyzer-details-pop`,children:e.jsxs("div",{className:`${a}__analyzer-details-lines`,children:[e.jsx(A,{size:"m",color:"secondary",isMarginDisabled:!0,children:t(`chatActivity:analyzer:details:${s}:less`)}),e.jsx(A,{size:"m",color:"secondary",isMarginDisabled:!0,children:t(`chatActivity:analyzer:details:${s}:more`)})]})})}):null}renderEmotionsGrid(){const{t}=this.props,s=o=>{var g;const n=((g=this.baseMoodStyles[o])==null?void 0:g.imageId)||"",d=n?this.images.getAnimationById(n):null,y=t(`chatActivity:moods:${o}`),m=d?d.isVideo?e.jsx("video",{className:`${a}__grid-card-preview`,src:d.url,muted:!0,autoPlay:!0,loop:!0}):e.jsx("img",{className:`${a}__grid-card-preview`,src:d.url,alt:y}):e.jsx(gt,{type:se[o],className:`${a}__grid-card-art`});return e.jsxs("button",{type:"button",className:`${a}__grid-card`,onClick:()=>
2this.openMoodEditor({type:"standard",id:o}),children:[e.jsx("div",{className:`${a}__grid-card-media`,children:m}),e.jsx("div",{className:`${a}__grid-card-title`,children:e.jsx(A,{size:"m",color:"primary",bold:"700",isMarginDisabled:!0,children:y})}),e.jsx("div",{className:`${a}__grid-card-edit`,children:e.jsx(D,{type:"edit"})})]},`standard-${o}`)},i=(o,n)=>{var g;const d=o.widgetStyle.imageId?this.images.getAnimationById(o.widgetStyle.imageId):null,y=(g=o.label)!=null&&g.trim()?o.label:t("chatActivity:editor:custom:untitled"),m=d?d.isVideo?e.jsx("video",{className:`${a}__grid-card-preview`,src:d.url,muted:!0,autoPlay:!0,loop:!0}):e.jsx("img",{className:`${a}__grid-card-preview`,src:d.url,alt:y}):e.jsx("div",{className:`${a}__grid-card-placeholder`,children:t("chatActivity:editor:grid:noImage")});return e.jsxs("div",{role:"button",tabIndex:0,className:`${a}__grid-card`,onClick:()=>this.openMoodEditor({type:"custom",index:n}),onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),this.openMoodEditor({type:"custom",index:n}))},children:[e.jsx("button",{type:"button",className:`${a}__grid-card-remove`,"aria-label":t("chatActivity:editor:custom:remove"),onClick:h=>{h.preventDefault(),h.stopPropagation(),this.openRemoveCustomMoodConfirmation(n)},children:e.jsx("span",{"aria-hidden":!0,children:"×"})}),e.jsx("div",{className:`${a}__grid-card-media`,children:m}),e.jsx("div",{className:`${a}__grid-card-title`,children:e.jsx(A,{size:"m",color:"primary",bold:"700",isMarginDisabled:!0,children:y})}),e.jsx("div",{className:`${a}__grid-card-edit`,children:e.jsx(D,{type:"edit"})})]},`custom-${o.id}`)};return e.jsxs(L,{className:`${a}__card`,children:[e.jsxs("div",{className:`${a}__analyzer-header`,onClick:this.toggleEmotionDictionaryExpanded,children:[e.jsx(N,{value:t("chatActivity:editor:grid:title"),size:"m"}),e.jsx(D,{type:this.isEmotionDictionaryExpanded?"arrowUp":"arrowDown",className:`${a}__chevron`})]}),this.isEmotionDictionaryExpanded?e.jsxs(e.Fragment,{children:[e.jsx(A,{size:"m",color:"secondary",children:t("chatActivity:editor:grid:description")}),e.jsxs(Lt,{isLoading:this.props.store.chatActivitySettings.isLoading,children:[this.errors.getErrorBy("lexiconConflicts")?e.jsx(A,{size:"s",color:"primary",tag:"span",children:e.jsx(Y,{text:this.errors.getErrorBy("lexiconConflicts"),icon:"outlineInfo",iconPosition:"left",color:"red"})}):null,this.errors.getErrorBy("customMoods")?e.jsx(A,{size:"s",color:"primary",tag:"span",children:e.jsx(Y,{text:this.errors.getErrorBy("customMoods"),icon:"outlineInfo",iconPosition:"left",color:"red"})}):null,e.jsxs("div",{className:`${a}__grid`,children:[T.map(s),this.customMoods.map(i)]}),e.jsx("div",{className:`${a}__grid-toolbar`,style:{marginTop:"16px"},children:e.jsx(z,{size:"s",theme:"secondary",icon:"add",iconPosition:"left",text:t("chatActivity:editor:custom:add"),onClick:this.onAddCustomMood})})]})]}):null]})}renderMoodEditorModal(){var y,m;const{t}=this.props,s=this.selectedMood!=null&&this.modalDraft!=null,i=oe(t,this.selectedMood,((y=this.modalDraft)==null?void 0:y.type)==="custom"||((m=this.modalDraft)==null?void 0:m.type)==="customNew"?this.modalDraft.label:void 0),o=()=>e.jsxs(e.Fragment,{children:[e.jsx(z,{size:"m",theme:"accent",text:t("general:save"),onClick:this.applyMoodEditor}),e.jsx(z,{size:"m",theme:"secondary",text:t("general:cancel"),onClick:this.closeMoodEditor})]}),n=g=>{const h=g.id,j=g.imageId;return e.jsx("div",{className:`${a}__modal-body`,children:e.jsxs("div",{className:`${a}__modal-two-col`,children:[e.jsx("div",{className:`${a}__modal-col`,children:e.jsx(pt,{title:t("chatActivity:baseMoods:image:title"),placeholder:t("widgetSettings:image:placeholder"),currentValue:j,images:this.images,type:yt.AnimationNoWebm,onDelete:()=>this.setModalBaseMoodImageId(""),onSelect:f=>{if(f!=null&&f.isVideo){_(t("chatActivity:editor:errors:emotionImageNoWebm"),{variant:"error"});return}this.setModalBaseMoodImageId((f==null?void 0:f.id)||"")},onUpload:f=>this.handleUploadBaseMoodImage(f,h)})}),e.jsxs("div",{className:`${a}__modal-col`,style:{display:"flex",flexDirection:"column",gap:"24px"},children:[e.jsxs("div",{children:[e.jsx(R,{title:t("chatActivity:editor:words:title"),subtitle:t("chatActivity:editor:words:hint"),isMultiline:!0,value:g.wordsText,onChange:f=>this.setModalWords(f.target.value)}),e.jsxs("div",{className:`${a}__default-block`,children:[e.jsx(A,{size:"s",color:"secondary",bold:"700",isMarginDisabled:!0,children:t("chatActivity:editor:defaults:title")}),e.jsx(A,{size:"s",color:"secondary",isMarginDisabled:!0,style:{opacity:.8},children:ie(Q[h])})]})]}),e.jsxs("div",{children:[e.jsx(R,{title:t("chatActivity:editor:emotes:title"),subtitle:t("chatActivity:editor:emotes:hint"),isMultiline:!0,value:g.emotesText,onChange:f=>this.setModalEmotes(f.target.value)}),e.jsxs("div",{className:`${a}__default-block`,children:[e.jsx(A,{size:"s",color:"secondary",bold:"700",isMarginDisabled:!0,children:t("chatActivity:editor:defaults:title")}),e.jsx(A,{size:"s",color:"secondary",isMarginDisabled:!0,style:{opacity:.8},children:t(`chatActivity:editor:defaults:emotesRulesByMood.${h}`)})]})]})]})]})})},d=g=>e.jsx("div",{className:`${a}__modal-body`,children:e.jsxs("div",{className:`${a}__modal-two-col`,children:[e.jsxs("div",{className:`${a}__modal-col`,style:{display:"flex",flexDirection:"column",gap:"24px"},children:[e.jsx(R,{title:t("chatActivity:editor:custom:label"),placeholder:t("chatActivity:editor:custom:labelPlaceholder"),value:g.label,onChange:h=>this.setModalLabel(h.target.value)}),e.jsx(pt,{title:t("chatActivity:editor:custom:image"),placeholder:t("widgetSettings:image:placeholder"),currentValue:g.imageId,images:this.images,type:yt.AnimationNoWebm,onDelete:()=>this.setModalImage(null),onSelect:h=>{if(h!=null&&h.isVideo){_(t("chatActivity:editor:errors:emotionImageNoWebm"),{variant:"error"});return}this.setModalImage(h)},onUpload:h=>this.handleUploadImage(h,g.type==="custom"?g.index:null)})]}),e.jsxs("div",{className:`${a}__modal-col`,style:{display:"flex",flexDirection:"column",gap:"24px"},children:[e.jsx(R,{title:t("chatActivity:editor:words:title"),subtitle:t("chatActivity:editor:words:hint"),isMultiline:!0,value:g.wordsText,onChange:h=>this.setModalWords(h.target.value)}),e.jsx(R,{title:t("chatActivity:editor:emotes:title"),subtitle:t("chatActivity:editor:emotes:hint"),isMultiline:!0,value:g.emotesText,onChange:h=>this.setModalEmotes(h.target.value)})]})]})});return e.jsx(ht,{isVisible:s,onClose:this.closeMoodEditor,title:i,footer:o(),children:s&&this.modalDraft?this.modalDraft.type==="standard"?n(this.modalDraft):d(this.modalDraft):null})}renderTestButtons(){const{t}=this.props;return e.jsx(Bt,{info:t("chatActivity:test:description"),buttonText:t("chatActivity:test:buttonText"),onCreateTestDonation:()=>this.onTestMood("agree"),isDisabled:this.isDisabled})}renderPreview(){return e.jsx(zt,{isLoading:!1,isSticky:!0,renderFooter:this.renderTestButtons(),children:e.jsx($t,{isLoading:this.props.store.chatActivitySettings.isLoading,isVip:this.props.store.profile.isVip,children:e.jsx(gt,{type:Mt[this.chatActivityIndex],className:`${a}__art`})})})}getImages(){this.props.store.getDonationImages().then(t=>{this.images.setFromApi(t.data)}).catch(W)}handleUploadImage(t,s){return ft(t)?(_(this.props.t("chatActivity:editor:errors:emotionImageNoWebm"),{variant:"error"}),Promise.resolve()):this.props.store.uploadDonationAnimation(t).then(i=>{var n,d;this.images.addFromApi(i.data);const o=this.images.getAnimationById(i.data.id)||null;s!=null&&this.setCustomImage(s,o),((n=this.modalDraft)==null?void 0:n.type)==="custom"&&this.modalDraft.index===s&&this.setModalImage(o),((d=this.modalDraft)==null?void 0:d.type)==="customNew"&&this.setModalImage(o)}).catch(W)}handleUploadBaseMoodImage(t,s){if(ft(t)){_(this.props.t("chatActivity:editor:errors:emotionImageNoWebm"),{variant:"error"});return}this.props.store.uploadDonationAnimation(t).then(i=>{var n;this.images.addFromApi(i.data);const o=this.images.getAnimationById(i.data.id)||null;((n=this.modalDraft)==null?void 0:n.type)==="standard"&&this.modalDraft.id===s&&this.setModalBaseMoodImageId((o==null?void 0:o.id)||"")}).catch(W)}bootstrapFromSettings(){var at,nt,rt,dt;const t=this.props.store.chatActivitySettings.emotionConfigJson||"",s=t?te(t):null;if(!s||typeof s!="object")return;const i=s;
2if(i.version!==1)return;const o=(at=i.analyzer)==null?void 0:at.windowSeconds,n=o==null?"":String(Math.min(O,Math.max(k,Math.round(Number(o))))),d=(nt=i.analyzer)==null?void 0:nt.dominantShare,y=d==null?NaN:Number(d),m=d==null||!Number.isFinite(y)?"":String(X(y)),g=(rt=i.analyzer)==null?void 0:rt.minMessagesInWindow,h=g==null?NaN:Number(g),j=g==null||!Number.isFinite(h)?"":String(Math.min(V,Math.max(U,Math.round(h)))),f=(dt=i.analyzer)==null?void 0:dt.burstMinRatio,l=f==null?NaN:Number(f),c=f==null||!Number.isFinite(l)?"":String(K(l)),b={windowSeconds:n,dominantShare:m,minMessagesInWindow:j,burstMinRatio:c},v={agree:{imageId:"",imageTemplateId:"",imageAnimationId:"",textAnimationId:""},disagree:{imageId:"",imageTemplateId:"",imageAnimationId:"",textAnimationId:""},toxic:{imageId:"",imageTemplateId:"",imageAnimationId:"",textAnimationId:""},sad:{imageId:"",imageTemplateId:"",imageAnimationId:"",textAnimationId:""},happy:{imageId:"",imageTemplateId:"",imageAnimationId:"",textAnimationId:""}},B=i.baseMoods||{};for(const M of T){const p=B[M];p&&(v[M]={imageId:p.imageId?String(p.imageId):"",imageTemplateId:p.imageTemplateId==null?"":String(p.imageTemplateId),imageAnimationId:p.imageAnimationId==null?"":String(p.imageAnimationId),textAnimationId:p.textAnimationId==null?"":String(p.textAnimationId)})}const C={agree:{wordsText:"",emotesText:""},disagree:{wordsText:"",emotesText:""},toxic:{wordsText:"",emotesText:""},sad:{wordsText:"",emotesText:""},happy:{wordsText:"",emotesText:""}},It=i.lexicon||{},wt=i.emoteLexicon||{},ot=Array.isArray(i.customMoods)?i.customMoods.map(M=>{var p,x,lt;return{id:M.id||"",label:M.label||"",wordsText:"",emotesText:"",widgetStyle:{imageId:((p=M.widgetStyle)==null?void 0:p.imageId)||"",imageTemplateId:((x=M.widgetStyle)==null?void 0:x.imageTemplateId)||St.Top,imageAnimationId:Number(((lt=M.widgetStyle)==null?void 0:lt.imageAnimationId)||1)}}}):[],G=new Map;ot.forEach(M=>G.set(M.id,M));for(const[M,p]of Object.entries(It))if(T.includes(p)){const x=p;C[x].wordsText=(C[x].wordsText?`${C[x].wordsText}
3`:"")+M}else{const x=G.get(p);x&&(x.wordsText=(x.wordsText?`${x.wordsText}
4`:"")+M)}for(const[M,p]of Object.entries(wt))if(T.includes(p)){const x=p;C[x].emotesText=(C[x].emotesText?`${C[x].emotesText}
5`:"")+M}else{const x=G.get(p);x&&(x.emotesText=(x.emotesText?`${x.emotesText}
6`:"")+M)}$(()=>{this.standardInputs=C,this.customMoods=ot,this.analyzer=b,this.baseMoodStyles=v,this.initialIsEnabled=!!this.props.store.chatActivitySettings.isEnabled,this.initialPayloadString=JSON.stringify(this.currentPayload),this.isEnabledDirty=!1})}onAddCustomMood(){this.selectedMood={type:"customNew"},this.modalDraft={type:"customNew",id:ae(),label:"",imageId:"",wordsText:"",emotesText:""}}onRemoveCustomMood(t){this.customMoods=this.customMoods.filter((s,i)=>i!==t)}openRemoveCustomMoodConfirmation(t){this.removeCustomMoodIndex=t,this.isRemoveCustomMoodConfirmationVisible=!0}closeRemoveCustomMoodConfirmation(){this.isRemoveCustomMoodConfirmationVisible=!1,this.removeCustomMoodIndex=null}confirmRemoveCustomMood(){var s,i;const t=this.removeCustomMoodIndex;t!=null&&(((s=this.selectedMood)==null?void 0:s.type)==="custom"&&(this.selectedMood.index===t?this.closeMoodEditor():this.selectedMood.index>t&&(this.selectedMood={type:"custom",index:this.selectedMood.index-1},((i=this.modalDraft)==null?void 0:i.type)==="custom"&&(this.modalDraft={...this.modalDraft,index:this.modalDraft.index-1}))),this.onRemoveCustomMood(t),this.closeRemoveCustomMoodConfirmation())}openAnalyzerDetails(t){this.activeAnalyzerDetails=t}closeAnalyzerDetails(){this.activeAnalyzerDetails=null}setStandardWords(t,s){this.standardInputs={...this.standardInputs,[t]:{...this.standardInputs[t],wordsText:s}}}setStandardEmotes(t,s){this.standardInputs={...this.standardInputs,[t]:{...this.standardInputs[t],emotesText:s}}}setCustomId(t,s){const i=[...this.customMoods];i[t]={...i[t],id:s},this.customMoods=i}setCustomLabel(t,s){const i=[...this.customMoods];i[t]={...i[t],label:s},this.customMoods=i}setCustomWords(t,s){const i=[...this.customMoods];i[t]={...i[t],wordsText:s},this.customMoods=i}setCustomEmotes(t,s){const i=[...this.customMoods];i[t]={...i[t],emotesText:s},this.customMoods=i}openMoodEditor(t){var i,o;if(this.selectedMood=t,t.type==="standard"){const n=this.standardInputs[t.id],d=((i=this.baseMoodStyles[t.id])==null?void 0:i.imageId)||"";
6this.modalDraft={type:"standard",id:t.id,imageId:d,wordsText:n.wordsText,emotesText:n.emotesText};return}if(t.type!=="custom")return;const s=this.customMoods[t.index];this.modalDraft={type:"custom",index:t.index,label:(s==null?void 0:s.label)??"",imageId:((o=s==null?void 0:s.widgetStyle)==null?void 0:o.imageId)??"",wordsText:(s==null?void 0:s.wordsText)??"",emotesText:(s==null?void 0:s.emotesText)??""}}closeMoodEditor(){this.selectedMood=null,this.modalDraft=null}applyMoodEditor(){if(!this.modalDraft)return;if(this.modalDraft.type==="standard"){const{id:i,imageId:o,wordsText:n,emotesText:d}=this.modalDraft;this.standardInputs={...this.standardInputs,[i]:{wordsText:n,emotesText:d}},this.baseMoodStyles={...this.baseMoodStyles,[i]:{...this.baseMoodStyles[i],imageId:o}},this.closeMoodEditor();return}if(this.modalDraft.type==="customNew"){const{t:i}=this.props;if(!this.modalDraft.label.trim()){_(i("chatActivity:editor:errors:required"),{variant:"error"});return}const o=JSON.parse(JSON.stringify(Qt)),n={...o,id:this.modalDraft.id,label:this.modalDraft.label.trim(),wordsText:this.modalDraft.wordsText,emotesText:this.modalDraft.emotesText,widgetStyle:{...o.widgetStyle,imageId:this.modalDraft.imageId}};this.customMoods=[...this.customMoods,n],this.closeMoodEditor();return}const t=this.modalDraft.index,s=[...this.customMoods];if(!s[t]){this.closeMoodEditor();return}s[t]={...s[t],label:this.modalDraft.label,wordsText:this.modalDraft.wordsText,emotesText:this.modalDraft.emotesText,widgetStyle:{...s[t].widgetStyle,imageId:this.modalDraft.imageId}},this.customMoods=s,this.closeMoodEditor()}setModalWords(t){this.modalDraft&&(this.modalDraft={...this.modalDraft,wordsText:t})}setModalEmotes(t){this.modalDraft&&(this.modalDraft={...this.modalDraft,emotesText:t})}setModalLabel(t){!this.modalDraft||this.modalDraft.type!=="custom"&&this.modalDraft.type!=="customNew"||(this.modalDraft={...this.modalDraft,label:t})}setModalImage(t){!this.modalDraft||this.modalDraft.type!=="custom"&&this.modalDraft.type!=="customNew"||(this.modalDraft={...this.modalDraft,imageId:(t==null?void 0:t.id)||""})}setModalBaseMoodImageId(t){!this.modalDraft||this.modalDraft.type!=="standard"||(this.modalDraft={...this.modalDraft,imageId:t})}setCustomImage(t,s){const i=[...this.customMoods];i[t]={...i[t],widgetStyle:{...i[t].widgetStyle,imageId:(s==null?void 0:s.id)||""}},this.customMoods=i}setCustomImageTemplate(t,s){const i=[...this.customMoods];i[t]={...i[t],widgetStyle:{...i[t].widgetStyle,imageTemplateId:s}},this.customMoods=i}setCustomImageAnimation(t,s){const i=[...this.customMoods];i[t]={...i[t],widgetStyle:{...i[t].widgetStyle,imageAnimationId:s}},this.customMoods=i}setAnalyzerField(t,s){this.analyzer={...this.analyzer,[t]:s}}getAnalyzerWindowSecondsSliderValue(){const t=w(this.analyzer.windowSeconds);return t==null?Z:Math.min(O,Math.max(k,Math.round(t)))}onWindowSecondsSliderChange(t){this.setAnalyzerField("windowSeconds",String(t))}getAnalyzerDominantShareSliderValue(){const t=w(this.analyzer.dominantShare);return t==null?J:X(t)}onDominantShareSliderChange(t){this.setAnalyzerField("dominantShare",String(X(t)))}getAnalyzerMinMessagesSliderValue(){const t=w(this.analyzer.minMessagesInWindow);return t==null?q:Math.min(V,Math.max(U,Math.round(t)))}onMinMessagesSliderChange(t){this.setAnalyzerField("minMessagesInWindow",String(Math.round(t)))}getAnalyzerBurstMinRatioSliderValue(){const t=w(this.analyzer.burstMinRatio);return t==null?H:K(t)}onBurstMinRatioSliderChange(t){this.setAnalyzerField("burstMinRatio",String(K(t)))}setBaseMoodStyleField(t,s,i){this.baseMoodStyles={...this.baseMoodStyles,[t]:{...this.baseMoodStyles[t],[s]:i}}}toggleAnalyzerExpanded(){this.isAnalyzerExpanded=!this.isAnalyzerExpanded}toggleEmotionDictionaryExpanded(){this.isEmotionDictionaryExpanded=!this.isEmotionDictionaryExpanded}displayLabelForMoodId(t){var o;const{t:s}=this.props;if(T.includes(t))return s(`chatActivity:moods:${t}`);const i=this.customMoods.find(n=>n.id.trim()===t);return(o=i==null?void 0:i.label)!=null&&o.trim()?i.label.trim():i?s("chatActivity:editor:custom:untitled"):t}
6displayLabelForLexiconConflictMood(t,s,i){const{t:o}=this.props,n=this.displayLabelForMoodId(t);if(!T.includes(t))return n;const d=t,y=s==="word"?Q[d]:At[d];return y!=null&&y.length&&new Set(I(y)).has(i)?`${n} (${o("chatActivity:editor:errors:lexiconMoodBuiltinMark")})`:n}formatLexiconConflictMessages(t){const{t:s}=this.props,i=new Set,n=t.filter(m=>{const g=`${m.kind}\0${m.token}\0${[m.moodA,m.moodB].sort().join("\0")}`;return i.has(g)?!1:(i.add(g),!0)}).map(m=>s(m.kind==="word"?"chatActivity:editor:errors:lexiconConflictLineWord":"chatActivity:editor:errors:lexiconConflictLineEmote",{token:m.token,mood1:this.displayLabelForLexiconConflictMood(m.moodA,m.kind,m.token),mood2:this.displayLabelForLexiconConflictMood(m.moodB,m.kind,m.token)})),d=`${s("chatActivity:editor:errors:lexiconConflictIntro")}
7${n.join(`
8`)}`,y=n.length===0?s("chatActivity:editor:errors:fixBeforeSave"):n.length===1?n[0]:`${n[0]} (${s("chatActivity:editor:errors:lexiconConflictSnackbarMore",{count:n.length-1})})`;return{fullText:d,snackbarText:y}}async onSave(){const{t}=this.props;this.errors.clear();try{$(()=>{this.isEditorBusy=!0});const s=bt(this.analyzer);if(s){const{windowSeconds:l,dominantShare:c,minMessagesInWindow:b,burstMinRatio:v}=s;l!=null&&(l<k||l>O)&&this.errors.setError("analyzer.windowSeconds",t("chatActivity:analyzer:errors:windowSecondsRange")),c!=null&&(c<tt||c>et)&&this.errors.setError("analyzer.dominantShare",t("chatActivity:analyzer:errors:dominantShareRange")),b!=null&&(b<U||b>V)&&this.errors.setError("analyzer.minMessagesInWindow",t("chatActivity:analyzer:errors:minMessagesRange")),v!=null&&(v<it||v>st)&&this.errors.setError("analyzer.burstMinRatio",t("chatActivity:analyzer:errors:burstMinRatioRange"))}const o=this.customMoods.map(l=>l.id.trim()).filter(Boolean).reduce((l,c)=>(l[c]=(l[c]||0)+1,l),{});this.customMoods.forEach((l,c)=>{const b=l.id.trim(),v=l.label.trim();b&&o[b]>1&&this.errors.setError("customMoods",t("chatActivity:editor:errors:customIdUnique")),v||this.errors.setError(`custom.${c}.label`,t("chatActivity:editor:errors:required"))});const n={},d={},y=[],m=(l,c,b,v)=>{if(!l[c]){l[c]=b;return}l[c]!==b&&y.push({kind:v,token:c,moodA:l[c],moodB:b})};for(const l of T)I(Q[l]).forEach(c=>
8m(n,c,l,"word")),I(At[l]).forEach(c=>m(d,c,l,"emote"));for(const l of T){const c=I(E(this.standardInputs[l].wordsText)),b=I(E(this.standardInputs[l].emotesText));c.forEach(v=>m(n,v,l,"word")),b.forEach(v=>m(d,v,l,"emote"))}for(const l of this.customMoods){const c=l.id.trim();if(!c)continue;const b=I(E(l.wordsText)),v=I(E(l.emotesText));b.forEach(B=>m(n,B,c,"word")),v.forEach(B=>m(d,B,c,"emote"))}let g=null;if(y.length){const{fullText:l,snackbarText:c}=this.formatLexiconConflictMessages(y);this.errors.setError("lexiconConflicts",l),g=c,$(()=>{this.isEmotionDictionaryExpanded=!0})}if(this.errors.hasErrors){const l=[g,this.errors.getErrorBy("customMoods")].filter(c=>!!c);_(l.length?l.join(" — "):t("chatActivity:editor:errors:fixBeforeSave"),{variant:"error"});return}const h=this.currentPayload,j=await Ht(h);if(!j.isValid){_(t("chatActivity:editor:errors:fixBeforeSave"),{variant:"error"}),console.error("emotionConfigJson schema validation failed",j.errors);return}const f=JSON.stringify(h,null,2);await this.props.store.updateChatActivitySettings({isEnabled:this.isEnabledDraft,emotionConfigJson:f}),$(()=>{this.isEnabledDirty=!1,this.initialIsEnabled=this.isEnabledDraft,this.initialPayloadString=JSON.stringify(this.currentPayload)}),_(t("general:successSaveSettings"),{variant:"success"})}catch(s){W(s)}finally{$(()=>{this.isEditorBusy=!1})}}onCancel(){this.isEnabledDraft=!!this.props.store.chatActivitySettings.isEnabled,this.isEnabledDirty=!1,this.bootstrapFromSettings(),this.errors.clear()}}const re=Tt()(Dt(ne)),ze=()=>{const{store:r}=vt.useContext(Ct),t=_t();return e.jsx(re,{store:r,navigate:t})};export{ze as ChatActivitySettingsPage};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.