diff --git a/lib/addon-serialize.js b/lib/addon-serialize.js index d669293d06d801ef472d5c2454ce86876e5c321f..b4f77e4976dbe5179d93a44ef919730a828d3331 100644 --- a/lib/addon-serialize.js +++ b/lib/addon-serialize.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.SerializeAddon=e():t.SerializeAddon=e()}(globalThis,()=>(()=>{"use strict";var t={992(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DEFAULT_ANSI_COLORS=void 0;const s=r(993);e.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const t=[s.css.toColor("#2e3436"),s.css.toColor("#cc0000"),s.css.toColor("#4e9a06"),s.css.toColor("#c4a000"),s.css.toColor("#3465a4"),s.css.toColor("#75507b"),s.css.toColor("#06989a"),s.css.toColor("#d3d7cf"),s.css.toColor("#555753"),s.css.toColor("#ef2929"),s.css.toColor("#8ae234"),s.css.toColor("#fce94f"),s.css.toColor("#729fcf"),s.css.toColor("#ad7fa8"),s.css.toColor("#34e2e2"),s.css.toColor("#eeeeec")],e=[0,95,135,175,215,255];for(let r=0;r<216;r++){const i=e[r/36%6|0],n=e[r/6%6|0],o=e[r%6];t.push({css:s.channels.toCss(i,n,o),rgba:s.channels.toRgba(i,n,o)})}for(let e=0;e<24;e++){const r=8+10*e;t.push({css:s.channels.toCss(r,r,r),rgba:s.channels.toRgba(r,r,r)})}return t})())},993(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.rgba=e.rgb=e.css=e.color=e.channels=e.NULL_COLOR=void 0,e.toPaddedHex=c,e.contrastRatio=f;let r=0,s=0,i=0,n=0;var o,l,a,u,h;function c(t){const e=t.toString(16);return e.length<2?"0"+e:e}function f(t,e){return t>>0},t.toColor=function(e,r,s,i){return{css:t.toCss(e,r,s,i),rgba:t.toRgba(e,r,s,i)}}}(o||(e.channels=o={})),function(t){function e(t,e){return n=Math.round(255*e),[r,s,i]=h.toChannels(t.rgba),{css:o.toCss(r,s,i,n),rgba:o.toRgba(r,s,i,n)}}t.blend=function(t,e){if(n=(255&e.rgba)/255,1===n)return{css:e.css,rgba:e.rgba};const l=e.rgba>>24&255,a=e.rgba>>16&255,u=e.rgba>>8&255,h=t.rgba>>24&255,c=t.rgba>>16&255,f=t.rgba>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),{css:o.toCss(r,s,i),rgba:o.toRgba(r,s,i)}},t.isOpaque=function(t){return!(255&~t.rgba)},t.ensureContrastRatio=function(t,e,r){const s=h.ensureContrastRatio(t.rgba,e.rgba,r);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},t.opaque=function(t){const e=(255|t.rgba)>>>0;return[r,s,i]=h.toChannels(e),{css:o.toCss(r,s,i),rgba:e}},t.opacity=e,t.multiplyOpacity=function(t,r){return n=255&t.rgba,e(t,n*r/255)},t.toColorRGB=function(t){return[t.rgba>>24&255,t.rgba>>16&255,t.rgba>>8&255]}}(l||(e.color=l={})),function(t){let e,l;try{const t=document.createElement("canvas");t.width=1,t.height=1;const r=t.getContext("2d",{willReadFrequently:!0});r&&(e=r,e.globalCompositeOperation="copy",l=e.createLinearGradient(0,0,1,1))}catch{}t.toColor=function(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),o.toColor(r,s,i);case 5:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),n=parseInt(t.slice(4,5).repeat(2),16),o.toColor(r,s,i,n);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}const a=t.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return r=parseInt(a[1],10),s=parseInt(a[2],10),i=parseInt(a[3],10),n=Math.round(255*(void 0===a[5]?1:parseFloat(a[5]))),o.toColor(r,s,i,n);if("transparent"===t)return{css:"transparent",rgba:0};if(!e||!l)throw new Error("css.toColor: Unsupported css format");if(e.fillStyle=l,e.fillStyle=t,"string"!=typeof e.fillStyle)throw new Error("css.toColor: Unsupported css format");if(e.fillRect(0,0,1,1),[r,s,i,n]=e.getImageData(0,0,1,1).data,255!==n)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(r,s,i,n),css:t}}}(a||(e.css=a={})),function(t){function e(t,e,r){const s=t/255,i=e/255,n=r/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}t.relativeLuminance=function(t){return e(t>>16&255,t>>8&255,255&t)},t.relativeLuminance2=e}(u||(e.rgb=u={})),function(t){function e(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h0||l>0||a>0);)o-=Math.max(0,Math.ceil(.1*o)),l-=Math.max(0,Math.ceil(.1*l)),a-=Math.max(0,Math.ceil(.1*a)),h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));return(o<<24|l<<16|a<<8|255)>>>0}function l(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h>>0}t.blend=function(t,e){if(n=(255&e)/255,1===n)return e;const l=e>>24&255,a=e>>16&255,u=e>>8&255,h=t>>24&255,c=t>>16&255,f=t>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),o.toRgba(r,s,i)},t.ensureContrastRatio=function(t,r,s){const i=u.relativeLuminance(t>>8),n=u.relativeLuminance(r>>8);if(f(i,n)>8));if(of(i,u.relativeLuminance(e>>8))?n:e}return n}const o=l(t,r,s),a=f(i,u.relativeLuminance(o>>8));if(af(i,u.relativeLuminance(n>>8))?o:n}return o}},t.reduceLuminance=e,t.increaseLuminance=l,t.toChannels=function(t){return[t>>24&255,t>>16&255,t>>8&255,255&t]}}(h||(e.rgba=h={}))}},e={};function r(s){var i=e[s];if(void 0!==i)return i.exports;var n=e[s]={exports:{}};return t[s](n,n.exports,r),n.exports}var s={};return(()=>{var t=s;Object.defineProperty(t,"__esModule",{value:!0}),t.HTMLSerializeHandler=t.SerializeAddon=void 0;const e=r(992);function i(t,e,r){return Math.max(e,Math.min(t,r))}class n{constructor(t){this._buffer=t}serialize(t,e){const r=this._buffer.getNullCell(),s=this._buffer.getNullCell();let i=r;const n=t.start.y,o=t.end.y,l=t.start.x,a=t.end.x;this._beforeSerialize(o-n,n,o);for(let e=n;e<=o;e++){const n=this._buffer.getLine(e);if(n){const o=e===t.start.y?l:0,u=e===t.end.y?a:n.length;for(let t=o;t0&&!l(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`[${this._nullCellCount}X`);let r="";if(!e){t-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);const e=this._buffer.getLine(t),s=this._buffer.getLine(t+1);if(s.isWrapped){r="";const i=e.getCell(e.length-1,this._thisRowLastChar),n=e.getCell(e.length-2,this._thisRowLastSecondChar),o=s.getCell(0,this._nextRowFirstChar),a=o.getWidth()>1;let u=!1;(o.getChars()&&a?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||0===i.getWidth())&&l(i,o)&&(u=!0),a&&(n.getChars()||0===n.getWidth())&&l(i,o)&&l(n,o)&&(u=!0)),u||(r="-".repeat(this._nullCellCount+1),r+="",this._nullCellCount>0&&(r+="",r+=`[${e.length-this._nullCellCount}C`,r+=`[${this._nullCellCount}X`,r+=`[${e.length-this._nullCellCount}D`,r+=""),this._lastContentCursorRow=t+1,this._lastContentCursorCol=0,this._lastCursorRow=t+1,this._lastCursorCol=0)}else r="\r\n",this._lastCursorRow=t+1,this._lastCursorCol=0}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=r,this._currentRow="",this._nullCellCount=0}_diffStyle(t,e){const r=[];if(h(t,e))return r;const s=!o(t,e),i=!l(t,e),n=!u(t,e);if(s||i||n)if(t.isAttributeDefault())e.isAttributeDefault()||r.push(0);else{if(s){const e=t.getFgColor();t.isFgRGB()?r.push(38,2,e>>>16&255,e>>>8&255,255&e):t.isFgPalette()?e>=16?r.push(38,5,e):r.push(8&e?90+(7&e):30+(7&e)):r.push(39)}if(i){const e=t.getBgColor();t.isBgRGB()?r.push(48,2,e>>>16&255,e>>>8&255,255&e):t.isBgPalette()?e>=16?r.push(48,5,e):r.push(8&e?100+(7&e):40+(7&e)):r.push(49)}if(n){if(t.isInverse()!==e.isInverse()&&r.push(t.isInverse()?7:27),t.isBold()!==e.isBold()&&r.push(t.isBold()?1:22),a(t,e))t.isUnderline()!==e.isUnderline()&&r.push(t.isUnderline()?4:24);else{const e=t.getUnderlineStyle();if(0===e)r.push(24);else if(1===e&&t.isUnderlineColorDefault())r.push(4);else if(r.push("4:"+e),!t.isUnderlineColorDefault()){const e=t.getUnderlineColor();t.isUnderlineColorRGB()?r.push("58:2::"+(e>>>16&255)+":"+(e>>>8&255)+":"+(255&e)):r.push("58:5:"+e)}}t.isOverline()!==e.isOverline()&&r.push(t.isOverline()?53:55),t.isBlink()!==e.isBlink()&&r.push(t.isBlink()?5:25),t.isInvisible()!==e.isInvisible()&&r.push(t.isInvisible()?8:28),t.isItalic()!==e.isItalic()&&r.push(t.isItalic()?3:23),t.isDim()!==e.isDim()&&r.push(t.isDim()?2:22),t.isStrikethrough()!==e.isStrikethrough()&&r.push(t.isStrikethrough()?9:29)}}return r}_nextCell(t,e,r,s){if(0===t.getWidth())return;const i=""===t.getChars(),n=this._diffStyle(t,this._cursorStyle);if(i?!l(this._cursorStyle,t):n.length>0){this._nullCellCount>0&&(l(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s,this._currentRow+=`[${n.join(";")}m`;const t=this._buffer.getLine(r);void 0!==t&&(t.getCell(s,this._cursorStyle),this._cursorStyleRow=r,this._cursorStyleCol=s)}i?this._nullCellCount+=t.getWidth():(this._nullCellCount>0&&(l(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._currentRow+=t.getChars(),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s+t.getWidth())}_serializeString(t){let e=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(e=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let r="";for(let t=0;t{t>0?r+=`[${t}C`:t<0&&(r+=`[${-t}D`)};(t!==this._lastCursorRow||e!==this._lastCursorCol)&&((s=t-this._lastCursorRow)>0?r+=`[${s}B`:s<0&&(r+=`[${-s}A`),i(e-this._lastCursorCol))}var s;const i=this._terminal._core._inputHandler._curAttrData,n=this._diffStyle(i,this._cursorStyle);return n.length>0&&(r+=`[${n.join(";")}m`),r}}t.SerializeAddon=class{activate(t){this._terminal=t}_serializeBufferByScrollback(t,e,r){const s=e.length,n=void 0===r?s:i(r+t.rows,0,s);return this._serializeBufferByRange(t,e,{start:s-n,end:s-1},!1)}_serializeBufferByRange(t,e,r,s){return new c(e,t).serialize({start:{x:0,y:"number"==typeof r.start?r.start:r.start.line},end:{x:t.cols,y:"number"==typeof r.end?r.end:r.end.line}},s)}_serializeBufferAsHTML(t,e){const r=t.buffer.active,s=new f(r,t,e),n=e.onlySelection??!1,o=e.range;if(o)return s.serialize({start:{x:o.startCol,y:(o.startLine,o.startLine)},end:{x:t.cols,y:(o.endLine,o.endLine)}});if(!n){const n=r.length,o=e.scrollback,l=void 0===o?n:i(o+t.rows,0,n);return s.serialize({start:{x:0,y:n-l},end:{x:t.cols,y:n-1}})}const l=this._terminal?.getSelectionPosition();return void 0!==l?s.serialize({start:{x:l.start.x,y:l.start.y},end:{x:l.end.x,y:l.end.y}}):""}_serializeScrollRegion(t){const e=t._core.buffer,r=e.scrollTop,s=e.scrollBottom;return 0!==r||s!==t.rows-1?`[${r+1};${s+1}r`:""}_serializeModes(t){let e="";const r=t.modes;if(r.applicationCursorKeysMode&&(e+="[?1h"),r.applicationKeypadMode&&(e+="[?66h"),r.bracketedPasteMode&&(e+="[?2004h"),r.insertMode&&(e+=""),r.originMode&&(e+="[?6h"),r.reverseWraparoundMode&&(e+="[?45h"),r.sendFocusMode&&(e+="[?1004h"),!1===r.wraparoundMode&&(e+="[?7l"),"none"!==r.mouseTrackingMode)switch(r.mouseTrackingMode){case"x10":e+="[?9h";break;case"vt200":e+="[?1000h";break;case"drag":e+="[?1002h";break;case"any":e+="[?1003h"}return r.showCursor||(e+="[?25l"),e}serialize(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=t?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,t.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,t?.scrollback);return t?.excludeAltBuffer||"alternate"!==this._terminal.buffer.active.type||(e+=`[?1049h${this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0)}`),t?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e}serializeAsHTML(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,t??{})}dispose(){}};class f extends n{constructor(t,r,s){super(t),this._terminal=r,this._options=s,this._currentRow="",this._htmlContent="",r._core._themeService?this._ansiColors=r._core._themeService.colors.ansi:this._ansiColors=e.DEFAULT_ANSI_COLORS}_beforeSerialize(t,e,r){this._htmlContent+="\x3c!--StartFragment--\x3e
";let s="#000000",i="#ffffff";this._options.includeGlobalBackground&&(s=this._terminal.options.theme?.foreground??"#ffffff",i=this._terminal.options.theme?.background??"#000000");const n=[];n.push("color: "+s+";"),n.push("background-color: "+i+";"),n.push("font-family: "+this._terminal.options.fontFamily+";"),n.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
\x3c!--EndFragment--\x3e"}_rowEnd(t,e){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(t,e){const r=e?t.getFgColor():t.getBgColor();return(e?t.isFgRGB():t.isBgRGB())?"#"+[r>>16&255,r>>8&255,255&r].map(t=>t.toString(16).padStart(2,"0")).join(""):(e?t.isFgPalette():t.isBgPalette())?this._ansiColors[r].css:void 0}_getUnderlineColor(t){if(t.isUnderlineColorDefault())return;const e=t.getUnderlineColor();return t.isUnderlineColorRGB()?"#"+[e>>16&255,e>>8&255,255&e].map(t=>t.toString(16).padStart(2,"0")).join(""):this._ansiColors[e].css}_getUnderlineStyle(t){switch(t.getUnderlineStyle()){case 1:default:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed"}}_diffStyle(t,e){const r=[];if(h(t,e))return;const s=!o(t,e),i=!l(t,e),n=!u(t,e);if(s||i||n){const e=this._getHexColor(t,!0);e&&r.push("color: "+e+";");const s=this._getHexColor(t,!1);s&&r.push("background-color: "+s+";"),t.isInverse()&&r.push("color: #000000; background-color: #BFBFBF;"),t.isBold()&&r.push("font-weight: bold;");const i=[];if(t.isUnderline()&&i.push(this._getUnderlineStyle(t)),t.isOverline()&&i.push("overline"),t.isStrikethrough()&&i.push("line-through"),t.isBlink()&&i.push("blink"),i.length>0&&r.push("text-decoration: "+i.join(" ")+";"),t.isUnderline()){const e=this._getUnderlineColor(t);e&&r.push("text-decoration-color: "+e+";")}return t.isInvisible()&&r.push("visibility: hidden;"),t.isItalic()&&r.push("font-style: italic;"),t.isDim()&&r.push("opacity: 0.5;"),r}}_nextCell(t,e,r,s){if(0===t.getWidth())return;const i=""===t.getChars(),n=this._diffStyle(t,e);n&&(this._currentRow+=0===n.length?"":""),this._currentRow+=i?" ":function(t){switch(t){case"&":return"&";case"<":return"<"}return t}(t.getChars())}_serializeString(){return this._htmlContent}}t.HTMLSerializeHandler=f})(),s})()); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.SerializeAddon=e():t.SerializeAddon=e()}(globalThis,()=>(()=>{"use strict";var t={992(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DEFAULT_ANSI_COLORS=void 0;const s=r(993);e.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const t=[s.css.toColor("#2e3436"),s.css.toColor("#cc0000"),s.css.toColor("#4e9a06"),s.css.toColor("#c4a000"),s.css.toColor("#3465a4"),s.css.toColor("#75507b"),s.css.toColor("#06989a"),s.css.toColor("#d3d7cf"),s.css.toColor("#555753"),s.css.toColor("#ef2929"),s.css.toColor("#8ae234"),s.css.toColor("#fce94f"),s.css.toColor("#729fcf"),s.css.toColor("#ad7fa8"),s.css.toColor("#34e2e2"),s.css.toColor("#eeeeec")],e=[0,95,135,175,215,255];for(let r=0;r<216;r++){const i=e[r/36%6|0],n=e[r/6%6|0],o=e[r%6];t.push({css:s.channels.toCss(i,n,o),rgba:s.channels.toRgba(i,n,o)})}for(let e=0;e<24;e++){const r=8+10*e;t.push({css:s.channels.toCss(r,r,r),rgba:s.channels.toRgba(r,r,r)})}return t})())},993(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.rgba=e.rgb=e.css=e.color=e.channels=e.NULL_COLOR=void 0,e.toPaddedHex=c,e.contrastRatio=f;let r=0,s=0,i=0,n=0;var o,l,a,u,h;function c(t){const e=t.toString(16);return e.length<2?"0"+e:e}function f(t,e){return t>>0},t.toColor=function(e,r,s,i){return{css:t.toCss(e,r,s,i),rgba:t.toRgba(e,r,s,i)}}}(o||(e.channels=o={})),function(t){function e(t,e){return n=Math.round(255*e),[r,s,i]=h.toChannels(t.rgba),{css:o.toCss(r,s,i,n),rgba:o.toRgba(r,s,i,n)}}t.blend=function(t,e){if(n=(255&e.rgba)/255,1===n)return{css:e.css,rgba:e.rgba};const l=e.rgba>>24&255,a=e.rgba>>16&255,u=e.rgba>>8&255,h=t.rgba>>24&255,c=t.rgba>>16&255,f=t.rgba>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),{css:o.toCss(r,s,i),rgba:o.toRgba(r,s,i)}},t.isOpaque=function(t){return!(255&~t.rgba)},t.ensureContrastRatio=function(t,e,r){const s=h.ensureContrastRatio(t.rgba,e.rgba,r);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},t.opaque=function(t){const e=(255|t.rgba)>>>0;return[r,s,i]=h.toChannels(e),{css:o.toCss(r,s,i),rgba:e}},t.opacity=e,t.multiplyOpacity=function(t,r){return n=255&t.rgba,e(t,n*r/255)},t.toColorRGB=function(t){return[t.rgba>>24&255,t.rgba>>16&255,t.rgba>>8&255]}}(l||(e.color=l={})),function(t){let e,l;try{const t=document.createElement("canvas");t.width=1,t.height=1;const r=t.getContext("2d",{willReadFrequently:!0});r&&(e=r,e.globalCompositeOperation="copy",l=e.createLinearGradient(0,0,1,1))}catch{}t.toColor=function(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),o.toColor(r,s,i);case 5:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),n=parseInt(t.slice(4,5).repeat(2),16),o.toColor(r,s,i,n);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}const a=t.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return r=parseInt(a[1],10),s=parseInt(a[2],10),i=parseInt(a[3],10),n=Math.round(255*(void 0===a[5]?1:parseFloat(a[5]))),o.toColor(r,s,i,n);if("transparent"===t)return{css:"transparent",rgba:0};if(!e||!l)throw new Error("css.toColor: Unsupported css format");if(e.fillStyle=l,e.fillStyle=t,"string"!=typeof e.fillStyle)throw new Error("css.toColor: Unsupported css format");if(e.fillRect(0,0,1,1),[r,s,i,n]=e.getImageData(0,0,1,1).data,255!==n)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(r,s,i,n),css:t}}}(a||(e.css=a={})),function(t){function e(t,e,r){const s=t/255,i=e/255,n=r/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}t.relativeLuminance=function(t){return e(t>>16&255,t>>8&255,255&t)},t.relativeLuminance2=e}(u||(e.rgb=u={})),function(t){function e(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h0||l>0||a>0);)o-=Math.max(0,Math.ceil(.1*o)),l-=Math.max(0,Math.ceil(.1*l)),a-=Math.max(0,Math.ceil(.1*a)),h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));return(o<<24|l<<16|a<<8|255)>>>0}function l(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h>>0}t.blend=function(t,e){if(n=(255&e)/255,1===n)return e;const l=e>>24&255,a=e>>16&255,u=e>>8&255,h=t>>24&255,c=t>>16&255,f=t>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),o.toRgba(r,s,i)},t.ensureContrastRatio=function(t,r,s){const i=u.relativeLuminance(t>>8),n=u.relativeLuminance(r>>8);if(f(i,n)>8));if(of(i,u.relativeLuminance(e>>8))?n:e}return n}const o=l(t,r,s),a=f(i,u.relativeLuminance(o>>8));if(af(i,u.relativeLuminance(n>>8))?o:n}return o}},t.reduceLuminance=e,t.increaseLuminance=l,t.toChannels=function(t){return[t>>24&255,t>>16&255,t>>8&255,255&t]}}(h||(e.rgba=h={}))}},e={};function r(s){var i=e[s];if(void 0!==i)return i.exports;var n=e[s]={exports:{}};return t[s](n,n.exports,r),n.exports}var s={};return(()=>{var t=s;Object.defineProperty(t,"__esModule",{value:!0}),t.HTMLSerializeHandler=t.SerializeAddon=void 0;const e=r(992);function i(t){return t.extended?.urlId??0}function n(t,e){if(!e)return"";const r=t._core?._oscLinkService?.getLinkData(e);return r?`]8;${void 0===r.id?"":`id=${r.id}`};${r.uri}\\`:""}function o(t,e,r){return Math.max(e,Math.min(t,r))}class l{constructor(t){this._buffer=t}serialize(t,e){const r=this._buffer.getNullCell(),s=this._buffer.getNullCell();let i=r;const n=t.start.y,o=t.end.y,l=t.start.x,a=t.end.x;this._beforeSerialize(o-n,n,o);for(let e=n;e<=o;e++){const n=this._buffer.getLine(e);if(n){const o=e===t.start.y?l:0,u=e===t.end.y?a:n.length;for(let t=o;t0&&!u(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`[${this._nullCellCount}X`);let r="";if(!e){t-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);const e=this._buffer.getLine(t),s=this._buffer.getLine(t+1);if(s.isWrapped){r="";const i=e.getCell(e.length-1,this._thisRowLastChar),n=e.getCell(e.length-2,this._thisRowLastSecondChar),o=s.getCell(0,this._nextRowFirstChar),l=o.getWidth()>1;let a=!1;if(o.getChars()&&(l?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||0===i.getWidth())&&u(i,o)&&(a=!0),l&&(n.getChars()||0===n.getWidth())&&u(i,o)&&u(n,o)&&(a=!0)),!a){if(r="-".repeat(this._nullCellCount+1),r+="",this._nullCellCount>0){r+="";const t=e.length-this._nullCellCount;t>0&&(r+=`[${t}C`),r+=`[${this._nullCellCount}X`,t>0&&(r+=`[${t}D`),r+=""}this._lastContentCursorRow=t+1,this._lastContentCursorCol=0,this._lastCursorRow=t+1,this._lastCursorCol=0}}else r="\r\n",this._lastCursorRow=t+1,this._lastCursorCol=0}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=r,this._currentRow="",this._nullCellCount=0}_diffStyle(t,e){const r=[];if(f(t,e))return r;const s=!a(t,e),i=!u(t,e),n=!c(t,e);if(s||i||n)if(t.isAttributeDefault())e.isAttributeDefault()||r.push(0);else{if(s){const e=t.getFgColor();t.isFgRGB()?r.push(38,2,e>>>16&255,e>>>8&255,255&e):t.isFgPalette()?e>=16?r.push(38,5,e):r.push(8&e?90+(7&e):30+(7&e)):r.push(39)}if(i){const e=t.getBgColor();t.isBgRGB()?r.push(48,2,e>>>16&255,e>>>8&255,255&e):t.isBgPalette()?e>=16?r.push(48,5,e):r.push(8&e?100+(7&e):40+(7&e)):r.push(49)}if(n){t.isInverse()!==e.isInverse()&&r.push(t.isInverse()?7:27);const s=t.isBold()!==e.isBold(),i=t.isDim()!==e.isDim();if(s||i){const e=s&&!t.isBold()||i&&!t.isDim();e&&r.push(22),t.isBold()&&(s||e)&&r.push(1),t.isDim()&&(i||e)&&r.push(2)}if(h(t,e))t.isUnderline()!==e.isUnderline()&&r.push(t.isUnderline()?4:24);else{const e=t.getUnderlineStyle();if(0===e)r.push(24);else if(1===e&&t.isUnderlineColorDefault())r.push(4);else if(r.push("4:"+e),!t.isUnderlineColorDefault()){const e=t.getUnderlineColor();t.isUnderlineColorRGB()?r.push("58:2::"+(e>>>16&255)+":"+(e>>>8&255)+":"+(255&e)):r.push("58:5:"+e)}}t.isOverline()!==e.isOverline()&&r.push(t.isOverline()?53:55),t.isBlink()!==e.isBlink()&&r.push(t.isBlink()?5:25),t.isInvisible()!==e.isInvisible()&&r.push(t.isInvisible()?8:28),t.isItalic()!==e.isItalic()&&r.push(t.isItalic()?3:23),t.isStrikethrough()!==e.isStrikethrough()&&r.push(t.isStrikethrough()?9:29)}}return r}_setOscLink(t){if(t===this._activeOscLinkId)return"";let e=this._activeOscLinkId?"]8;;\\":"";this._activeOscLinkId=0;const r=n(this._terminal,t);return r&&(this._activeOscLinkId=t,e+=r),e}_nextCell(t,e,r,s){if(0===t.getWidth())return;const n=""===t.getChars(),o=n&&t.isInverse()?this._buffer.getLine(r+1):void 0,l=o?.getCell(0,this._nextRowFirstChar),a=s===this._terminal.cols-1&&o?.isWrapped&&(l?.getWidth()??0)>1&&!!l&&f(t,l),h=n&&!!t.isInverse()&&!a,c=this._diffStyle(t,this._cursorStyle);if(n?h?c.length>0:!u(this._cursorStyle,t):c.length>0){this._nullCellCount>0&&(u(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s,this._currentRow+=`[${c.join(";")}m`;const t=this._buffer.getLine(r);void 0!==t&&(t.getCell(s,this._cursorStyle),this._cursorStyleRow=r,this._cursorStyleCol=s)}if(n&&!h)this._nullCellCount+=t.getWidth();else{if(this._nullCellCount>0&&(u(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._currentRow+=this._setOscLink(i(t)),h){const e=!!t.isUnderline()||!!t.isStrikethrough()||!!t.isOverline();if(e&&(this._currentRow+=""),this._currentRow+=" ".repeat(t.getWidth()),e){const e=this._diffStyle(t,this._defaultCell);this._currentRow+=`[${e.join(";")}m`}}else this._currentRow+=t.getChars();this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s+t.getWidth()}}_serializeString(t){let e=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(e=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let r="";for(let t=0;t{t>0?r+=`[${t}C`:t<0&&(r+=`[${-t}D`)};(t!==this._lastCursorRow||e!==this._lastCursorCol)&&((s=t-this._lastCursorRow)>0?r+=`[${s}B`:s<0&&(r+=`[${-s}A`),i(e-this._lastCursorCol))}var s;const i=this._terminal._core._inputHandler._curAttrData,n=this._diffStyle(i,this._cursorStyle);return n.length>0&&(r+=`[${n.join(";")}m`),r}}t.SerializeAddon=class{activate(t){this._terminal=t}_serializeBufferByScrollback(t,e,r){const s=e.length,i=void 0===r?s:o(r+t.rows,0,s);return this._serializeBufferByRange(t,e,{start:s-i,end:s-1},!1)}_serializeBufferByRange(t,e,r,s){return new _(e,t).serialize({start:{x:0,y:"number"==typeof r.start?r.start:r.start.line},end:{x:t.cols,y:"number"==typeof r.end?r.end:r.end.line}},s)}_serializeBufferAsHTML(t,e){const r=t.buffer.active,s=new d(r,t,e),i=e.onlySelection??!1,n=e.range;if(n)return s.serialize({start:{x:n.startCol,y:(n.startLine,n.startLine)},end:{x:t.cols,y:(n.endLine,n.endLine)}});if(!i){const i=r.length,n=e.scrollback,l=void 0===n?i:o(n+t.rows,0,i);return s.serialize({start:{x:0,y:i-l},end:{x:t.cols,y:i-1}})}const l=this._terminal?.getSelectionPosition();return void 0!==l?s.serialize({start:{x:l.start.x,y:l.start.y},end:{x:l.end.x,y:l.end.y}}):""}_serializeScrollRegion(t){const e=t._core.buffer,r=e.scrollTop,s=e.scrollBottom;return 0!==r||s!==t.rows-1?`[${r+1};${s+1}r`:""}_serializeModes(t){let e="";const r=t.modes;if(r.applicationCursorKeysMode&&(e+="[?1h"),r.applicationKeypadMode&&(e+="[?66h"),r.bracketedPasteMode&&(e+="[?2004h"),r.insertMode&&(e+=""),r.originMode&&(e+="[?6h"),r.reverseWraparoundMode&&(e+="[?45h"),r.sendFocusMode&&(e+="[?1004h"),!1===r.wraparoundMode&&(e+="[?7l"),"none"!==r.mouseTrackingMode)switch(r.mouseTrackingMode){case"x10":e+="[?9h";break;case"vt200":e+="[?1000h";break;case"drag":e+="[?1002h";break;case"any":e+="[?1003h"}return r.showCursor||(e+="[?25l"),e}serialize(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=t?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,t.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,t?.scrollback);return t?.excludeAltBuffer||"alternate"!==this._terminal.buffer.active.type||(e+=`[?1049h${this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0)}`),t?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e+=function(t){const e=t._core?._inputHandler?._curAttrData;return e?n(t,i(e)):""}(this._terminal),e}serializeAsHTML(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,t??{})}dispose(){}};class d extends l{constructor(t,r,s){super(t),this._terminal=r,this._options=s,this._currentRow="",this._htmlContent="",r._core._themeService?this._ansiColors=r._core._themeService.colors.ansi:this._ansiColors=e.DEFAULT_ANSI_COLORS}_beforeSerialize(t,e,r){this._htmlContent+="\x3c!--StartFragment--\x3e
";let s="#000000",i="#ffffff";this._options.includeGlobalBackground&&(s=this._terminal.options.theme?.foreground??"#ffffff",i=this._terminal.options.theme?.background??"#000000");const n=[];n.push("color: "+s+";"),n.push("background-color: "+i+";"),n.push("font-family: "+this._terminal.options.fontFamily+";"),n.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
\x3c!--EndFragment--\x3e"}_rowEnd(t,e){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(t,e){const r=e?t.getFgColor():t.getBgColor();return(e?t.isFgRGB():t.isBgRGB())?"#"+[r>>16&255,r>>8&255,255&r].map(t=>t.toString(16).padStart(2,"0")).join(""):(e?t.isFgPalette():t.isBgPalette())?this._ansiColors[r].css:void 0}_getUnderlineColor(t){if(t.isUnderlineColorDefault())return;const e=t.getUnderlineColor();return t.isUnderlineColorRGB()?"#"+[e>>16&255,e>>8&255,255&e].map(t=>t.toString(16).padStart(2,"0")).join(""):this._ansiColors[e].css}_getUnderlineStyle(t){switch(t.getUnderlineStyle()){case 1:default:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed"}}_diffStyle(t,e){const r=[];if(f(t,e))return;const s=!a(t,e),i=!u(t,e),n=!c(t,e);if(s||i||n){const e=this._getHexColor(t,!0);e&&r.push("color: "+e+";");const s=this._getHexColor(t,!1);s&&r.push("background-color: "+s+";"),t.isInverse()&&r.push("color: #000000; background-color: #BFBFBF;"),t.isBold()&&r.push("font-weight: bold;");const i=[];if(t.isUnderline()&&i.push(this._getUnderlineStyle(t)),t.isOverline()&&i.push("overline"),t.isStrikethrough()&&i.push("line-through"),t.isBlink()&&i.push("blink"),i.length>0&&r.push("text-decoration: "+i.join(" ")+";"),t.isUnderline()){const e=this._getUnderlineColor(t);e&&r.push("text-decoration-color: "+e+";")}return t.isInvisible()&&r.push("visibility: hidden;"),t.isItalic()&&r.push("font-style: italic;"),t.isDim()&&r.push("opacity: 0.5;"),r}}_nextCell(t,e,r,s){if(0===t.getWidth())return;const i=""===t.getChars(),n=this._diffStyle(t,e);n&&(this._currentRow+=0===n.length?"
":""),this._currentRow+=i?" ":function(t){switch(t){case"&":return"&";case"<":return"<"}return t}(t.getChars())}_serializeString(){return this._htmlContent}}t.HTMLSerializeHandler=d})(),s})()); //# sourceMappingURL=addon-serialize.js.map \ No newline at end of file diff --git a/lib/addon-serialize.js.map b/lib/addon-serialize.js.map index bac96176091146ab7eb07d1d7b280286e047278c..54a78516a87fe7fe3ea2c61bc6d778b1f29acc6c 100644 --- a/lib/addon-serialize.js.map +++ b/lib/addon-serialize.js.map @@ -1 +1 @@ -{"version":3,"file":"addon-serialize.js","mappings":"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","sources":["webpack://SerializeAddon/webpack/universalModuleDefinition","webpack://SerializeAddon/../src/browser/Types.ts","webpack://SerializeAddon/../src/common/Color.ts","webpack://SerializeAddon/webpack/bootstrap","webpack://SerializeAddon/./src/SerializeAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SerializeAddon\"] = factory();\n\telse\n\t\troot[\"SerializeAddon\"] = factory();\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * (EXPERIMENTAL) This Addon is still under development\n */\n\nimport type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize';\nimport { IColor } from 'common/Types';\nimport { IAttributeData } from 'common/buffer/Types';\nimport { DEFAULT_ANSI_COLORS } from 'browser/Types';\nimport { UnderlineStyle } from 'common/buffer/Constants';\n\nfunction constrain(value: number, low: number, high: number): number {\n return Math.max(low, Math.min(value, high));\n}\n\nfunction escapeHTMLChar(c: string): string {\n switch (c) {\n case '&': return '&';\n case '<': return '<';\n }\n return c;\n}\n\n// TODO: Refine this template class later\nabstract class BaseSerializeHandler {\n constructor(\n protected readonly _buffer: IBuffer\n ) {\n }\n\n public serialize(range: IBufferRange, excludeFinalCursorPosition?: boolean): string {\n // we need two of them to flip between old and new cell\n const cell1 = this._buffer.getNullCell();\n const cell2 = this._buffer.getNullCell();\n let oldCell = cell1;\n\n const startRow = range.start.y;\n const endRow = range.end.y;\n const startColumn = range.start.x;\n const endColumn = range.end.x;\n\n this._beforeSerialize(endRow - startRow, startRow, endRow);\n\n for (let row = startRow; row <= endRow; row++) {\n const line = this._buffer.getLine(row);\n if (line) {\n const startLineColumn = row === range.start.y ? startColumn : 0;\n const endLineColumn = row === range.end.y ? endColumn: line.length;\n for (let col = startLineColumn; col < endLineColumn; col++) {\n const c = line.getCell(col, oldCell === cell1 ? cell2 : cell1);\n if (!c) {\n console.warn(`Can't get cell at row=${row}, col=${col}`);\n continue;\n }\n this._nextCell(c, oldCell, row, col);\n oldCell = c;\n }\n }\n this._rowEnd(row, row === endRow);\n }\n\n this._afterSerialize();\n\n return this._serializeString(excludeFinalCursorPosition);\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { }\n protected _rowEnd(row: number, isLastRow: boolean): void { }\n protected _beforeSerialize(rows: number, startRow: number, endRow: number): void { }\n protected _afterSerialize(): void { }\n protected _serializeString(excludeFinalCursorPosition?: boolean): string { return ''; }\n}\n\nfunction equalFg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getFgColorMode() === cell2.getFgColorMode()\n && cell1.getFgColor() === cell2.getFgColor();\n}\n\nfunction equalBg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getBgColorMode() === cell2.getBgColorMode()\n && cell1.getBgColor() === cell2.getBgColor();\n}\n\nfunction equalUnderline(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n // If neither cell has underline, consider them equal regardless of internal underline color\n // values\n if (!cell1.isUnderline() && !cell2.isUnderline()) {\n return true;\n }\n if (cell1.getUnderlineStyle() !== cell2.getUnderlineStyle()) {\n return false;\n }\n const cell1Default = cell1.isUnderlineColorDefault();\n const cell2Default = cell2.isUnderlineColorDefault();\n if (cell1Default && cell2Default) {\n return true;\n }\n if (cell1Default !== cell2Default) {\n return false;\n }\n return cell1.getUnderlineColor() === cell2.getUnderlineColor()\n && cell1.getUnderlineColorMode() === cell2.getUnderlineColorMode();\n}\n\nfunction equalFlags(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.isInverse() === cell2.isInverse()\n && cell1.isBold() === cell2.isBold()\n && cell1.isUnderline() === cell2.isUnderline()\n && equalUnderline(cell1, cell2)\n && cell1.isOverline() === cell2.isOverline()\n && cell1.isBlink() === cell2.isBlink()\n && cell1.isInvisible() === cell2.isInvisible()\n && cell1.isItalic() === cell2.isItalic()\n && cell1.isDim() === cell2.isDim()\n && cell1.isStrikethrough() === cell2.isStrikethrough();\n}\n\nfunction attributesEquals(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n const cell1AsBufferCell = cell1 as IBufferCell;\n if (typeof cell1AsBufferCell.attributesEquals === 'function') {\n return cell1AsBufferCell.attributesEquals(cell2);\n }\n return equalFg(cell1, cell2)\n && equalBg(cell1, cell2)\n && equalFlags(cell1, cell2);\n}\n\nclass StringSerializeHandler extends BaseSerializeHandler {\n private _rowIndex: number = 0;\n private _allRows: string[] = new Array();\n private _allRowSeparators: string[] = new Array();\n private _currentRow: string = '';\n private _nullCellCount: number = 0;\n\n // we can see a full colored cell and a null cell that only have background the same style\n // but the information isn't preserved by null cell itself\n // so wee need to record it when required.\n private _cursorStyle: IBufferCell = this._buffer.getNullCell();\n\n // where exact the cursor styles comes from\n // because we can't copy the cell directly\n // so we remember where the content comes from instead\n private _cursorStyleRow: number = 0;\n private _cursorStyleCol: number = 0;\n\n // this is a null cell for reference for checking whether background is empty or not\n private _backgroundCell: IBufferCell = this._buffer.getNullCell();\n\n private _firstRow: number = 0;\n private _lastCursorRow: number = 0;\n private _lastCursorCol: number = 0;\n private _lastContentCursorRow: number = 0;\n private _lastContentCursorCol: number = 0;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal\n ) {\n super(buffer);\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._allRows = new Array(rows);\n this._lastContentCursorRow = start;\n this._lastCursorRow = start;\n this._firstRow = start;\n }\n\n private _thisRowLastChar: IBufferCell = this._buffer.getNullCell();\n private _thisRowLastSecondChar: IBufferCell = this._buffer.getNullCell();\n private _nextRowFirstChar: IBufferCell = this._buffer.getNullCell();\n protected _rowEnd(row: number, isLastRow: boolean): void {\n // if there is colorful empty cell at line end, we must pad it back, or the color block\n // will missing\n if (this._nullCellCount > 0 && !equalBg(this._cursorStyle, this._backgroundCell)) {\n // use clear right to set background.\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n\n let rowSeparator = '';\n\n // handle row separator\n if (!isLastRow) {\n // Enable BCE\n if (row - this._firstRow >= this._terminal.rows) {\n this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);\n }\n\n // Fetch current line\n const currentLine = this._buffer.getLine(row)!;\n // Fetch next line\n const nextLine = this._buffer.getLine(row + 1)!;\n\n if (!nextLine.isWrapped) {\n // just insert the line break\n rowSeparator = '\\r\\n';\n // we sended the enter\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n } else {\n rowSeparator = '';\n const thisRowLastChar = currentLine.getCell(currentLine.length - 1, this._thisRowLastChar)!;\n const thisRowLastSecondChar = currentLine.getCell(currentLine.length - 2, this._thisRowLastSecondChar)!;\n const nextRowFirstChar = nextLine.getCell(0, this._nextRowFirstChar)!;\n const isNextRowFirstCharDoubleWidth = nextRowFirstChar.getWidth() > 1;\n\n // validate whether this line wrap is ever possible\n // which mean whether cursor can placed at a overflow position (x === row) naturally\n let isValid = false;\n\n if (\n // you must output character to cause overflow, control sequence can't do this\n nextRowFirstChar.getChars() &&\n isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0\n ) {\n if (\n // the last character can't be null,\n // you can't use control sequence to move cursor to (x === row)\n (thisRowLastChar.getChars() || thisRowLastChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n\n if (\n // the second to last character can't be null if the next line starts with CJK,\n // you can't use control sequence to move cursor to (x === row)\n isNextRowFirstCharDoubleWidth &&\n (thisRowLastSecondChar.getChars() || thisRowLastSecondChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar) &&\n equalBg(thisRowLastSecondChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n }\n\n if (!isValid) {\n // force the wrap with magic\n // insert enough character to force the wrap\n rowSeparator = '-'.repeat(this._nullCellCount + 1);\n // move back and erase next line head\n rowSeparator += '\\u001b[1D\\u001b[1X';\n\n if (this._nullCellCount > 0) {\n // do these because we filled the last several null slot, which we shouldn't\n rowSeparator += '\\u001b[A';\n rowSeparator += `\\u001b[${currentLine.length - this._nullCellCount}C`;\n rowSeparator += `\\u001b[${this._nullCellCount}X`;\n rowSeparator += `\\u001b[${currentLine.length - this._nullCellCount}D`;\n rowSeparator += '\\u001b[B';\n }\n\n // This is content and need the be serialized even it is invisible.\n // without this, wrap will be missing from outputs.\n this._lastContentCursorRow = row + 1;\n this._lastContentCursorCol = 0;\n\n // force commit the cursor position\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n }\n }\n }\n\n this._allRows[this._rowIndex] = this._currentRow;\n this._allRowSeparators[this._rowIndex++] = rowSeparator;\n this._currentRow = '';\n this._nullCellCount = 0;\n }\n\n private _diffStyle(cell: IBufferCell | IAttributeData, oldCell: IBufferCell): number[] {\n const sgrSeq: number[] = [];\n if (attributesEquals(cell, oldCell)) {\n return sgrSeq;\n }\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n if (cell.isAttributeDefault()) {\n if (!oldCell.isAttributeDefault()) {\n sgrSeq.push(0);\n }\n } else {\n if (fgChanged) {\n const color = cell.getFgColor();\n if (cell.isFgRGB()) { sgrSeq.push(38, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isFgPalette()) {\n if (color >= 16) { sgrSeq.push(38, 5, color); }\n else { sgrSeq.push(color & 8 ? 90 + (color & 7) : 30 + (color & 7)); }\n }\n else { sgrSeq.push(39); }\n }\n if (bgChanged) {\n const color = cell.getBgColor();\n if (cell.isBgRGB()) { sgrSeq.push(48, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isBgPalette()) {\n if (color >= 16) { sgrSeq.push(48, 5, color); }\n else { sgrSeq.push(color & 8 ? 100 + (color & 7) : 40 + (color & 7)); }\n }\n else { sgrSeq.push(49); }\n }\n if (flagsChanged) {\n if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); }\n if (cell.isBold() !== oldCell.isBold()) { sgrSeq.push(cell.isBold() ? 1 : 22); }\n if (!equalUnderline(cell, oldCell)) {\n const style = cell.getUnderlineStyle();\n if (style === UnderlineStyle.NONE) {\n sgrSeq.push(24);\n } else if (style === UnderlineStyle.SINGLE && cell.isUnderlineColorDefault()) {\n sgrSeq.push(4);\n } else {\n // Use SGR 4:X format for underline styles\n sgrSeq.push('4:' + style as unknown as number);\n // Handle underline color\n if (!cell.isUnderlineColorDefault()) {\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n sgrSeq.push('58:2::' + ((color >>> 16) & 0xFF) + ':' + ((color >>> 8) & 0xFF) + ':' + (color & 0xFF) as unknown as number);\n } else {\n sgrSeq.push('58:5:' + color as unknown as number);\n }\n }\n }\n } else if (cell.isUnderline() !== oldCell.isUnderline()) {\n sgrSeq.push(cell.isUnderline() ? 4 : 24);\n }\n if (cell.isOverline() !== oldCell.isOverline()) { sgrSeq.push(cell.isOverline() ? 53 : 55); }\n if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); }\n if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); }\n if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); }\n if (cell.isDim() !== oldCell.isDim()) { sgrSeq.push(cell.isDim() ? 2 : 22); }\n if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); }\n }\n }\n }\n\n return sgrSeq;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const sgrSeq = this._diffStyle(cell, this._cursorStyle);\n\n // the empty cell style is only assumed to be changed when background changed, because\n // foreground is always 0.\n const styleChanged = isEmptyCell ? !equalBg(this._cursorStyle, cell) : sgrSeq.length > 0;\n\n /**\n * handles style change\n */\n if (styleChanged) {\n // before update the style, we need to fill empty cell back\n if (this._nullCellCount > 0) {\n // use clear right to set background.\n if (!equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n // use move right to move cursor.\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n this._nullCellCount = 0;\n }\n\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col;\n\n this._currentRow += `\\u001b[${sgrSeq.join(';')}m`;\n\n // update the last cursor style\n const line = this._buffer.getLine(row);\n if (line !== undefined) {\n line.getCell(col, this._cursorStyle);\n this._cursorStyleRow = row;\n this._cursorStyleCol = col;\n }\n }\n\n /**\n * handles actual content\n */\n if (isEmptyCell) {\n this._nullCellCount += cell.getWidth();\n } else {\n if (this._nullCellCount > 0) {\n // we can just assume we have same style with previous one here\n // because style change is handled by previous stage\n // use move right when background is empty, use clear right when there is background.\n if (equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n } else {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n }\n this._nullCellCount = 0;\n }\n\n this._currentRow += cell.getChars();\n\n // update cursor\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col + cell.getWidth();\n }\n }\n\n protected _serializeString(excludeFinalCursorPosition: boolean): string {\n let rowEnd = this._allRows.length;\n\n // the fixup is only required for data without scrollback\n // because it will always be placed at last line otherwise\n if (this._buffer.length - this._firstRow <= this._terminal.rows) {\n rowEnd = this._lastContentCursorRow + 1 - this._firstRow;\n this._lastCursorCol = this._lastContentCursorCol;\n this._lastCursorRow = this._lastContentCursorRow;\n }\n\n let content = '';\n\n for (let i = 0; i < rowEnd; i++) {\n content += this._allRows[i];\n if (i + 1 < rowEnd) {\n content += this._allRowSeparators[i];\n }\n }\n\n // restore the cursor\n if (!excludeFinalCursorPosition) {\n const realCursorRow = this._buffer.baseY + this._buffer.cursorY;\n const realCursorCol = this._buffer.cursorX;\n\n const cursorMoved = (realCursorRow !== this._lastCursorRow || realCursorCol !== this._lastCursorCol);\n\n const moveRight = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}C`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}D`;\n }\n };\n const moveDown = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}B`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}A`;\n }\n };\n\n if (cursorMoved) {\n moveDown(realCursorRow - this._lastCursorRow);\n moveRight(realCursorCol - this._lastCursorCol);\n }\n }\n\n // Restore the cursor's current style, see https://github.com/xtermjs/xterm.js/issues/3677\n // HACK: Internal API access since it's awkward to expose this in the API and serialize will\n // likely be the only consumer\n const curAttrData: IAttributeData = (this._terminal as any)._core._inputHandler._curAttrData;\n const sgrSeq = this._diffStyle(curAttrData, this._cursorStyle);\n if (sgrSeq.length > 0) {\n content += `\\u001b[${sgrSeq.join(';')}m`;\n }\n\n return content;\n }\n}\n\nexport class SerializeAddon implements ITerminalAddon, ISerializeApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n private _serializeBufferByScrollback(terminal: Terminal, buffer: IBuffer, scrollback?: number): string {\n const maxRows = buffer.length;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return this._serializeBufferByRange(terminal, buffer, {\n start: maxRows - correctRows,\n end: maxRows - 1\n }, false);\n }\n\n private _serializeBufferByRange(terminal: Terminal, buffer: IBuffer, range: ISerializeRange, excludeFinalCursorPosition: boolean): string {\n const handler = new StringSerializeHandler(buffer, terminal);\n return handler.serialize({\n start: { x: 0, y: typeof range.start === 'number' ? range.start : range.start.line },\n end: { x: terminal.cols, y: typeof range.end === 'number' ? range.end : range.end.line }\n }, excludeFinalCursorPosition);\n }\n\n private _serializeBufferAsHTML(terminal: Terminal, options: Partial): string {\n const buffer = terminal.buffer.active;\n const handler = new HTMLSerializeHandler(buffer, terminal, options);\n const onlySelection = options.onlySelection ?? false;\n const range = options.range;\n if (range) {\n return handler.serialize({\n start: { x: range.startCol, y: typeof range.startLine === 'number' ? range.startLine : range.startLine },\n end: { x: terminal.cols, y: typeof range.endLine === 'number' ? range.endLine : range.endLine }\n });\n }\n if (!onlySelection) {\n const maxRows = buffer.length;\n const scrollback = options.scrollback;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return handler.serialize({\n start: { x: 0, y: maxRows - correctRows },\n end: { x: terminal.cols, y: maxRows - 1 }\n });\n }\n\n const selection = this._terminal?.getSelectionPosition();\n if (selection !== undefined) {\n return handler.serialize({\n start: { x: selection.start.x, y: selection.start.y },\n end: { x: selection.end.x, y: selection.end.y }\n });\n }\n\n return '';\n }\n\n /**\n * Serializes the scroll region (DECSTBM) if it's not set to the full terminal size.\n * Uses internal API access since scroll region is not exposed in the public API.\n */\n private _serializeScrollRegion(terminal: Terminal): string {\n // HACK: Internal API access since scroll region is not exposed in the public API\n const buffer = (terminal as any)._core.buffer;\n const scrollTop: number = buffer.scrollTop;\n const scrollBottom: number = buffer.scrollBottom;\n\n // Only serialize if scroll region is not the default (full terminal size)\n if (scrollTop !== 0 || scrollBottom !== terminal.rows - 1) {\n // DECSTBM uses 1-based indices: CSI Ps ; Ps r\n return `\\x1b[${scrollTop + 1};${scrollBottom + 1}r`;\n }\n\n return '';\n }\n\n private _serializeModes(terminal: Terminal): string {\n let content = '';\n const modes = terminal.modes;\n\n // Default: false\n if (modes.applicationCursorKeysMode) content += '\\x1b[?1h';\n if (modes.applicationKeypadMode) content += '\\x1b[?66h';\n if (modes.bracketedPasteMode) content += '\\x1b[?2004h';\n if (modes.insertMode) content += '\\x1b[4h';\n if (modes.originMode) content += '\\x1b[?6h';\n if (modes.reverseWraparoundMode) content += '\\x1b[?45h';\n if (modes.sendFocusMode) content += '\\x1b[?1004h';\n // synchronizedOutputMode doesn't need to be serialized as it's a temporary mode\n\n // Default: true\n if (modes.wraparoundMode === false) content += '\\x1b[?7l';\n\n // Default: 'none'\n if (modes.mouseTrackingMode !== 'none') {\n switch (modes.mouseTrackingMode) {\n case 'x10': content += '\\x1b[?9h'; break;\n case 'vt200': content += '\\x1b[?1000h'; break;\n case 'drag': content += '\\x1b[?1002h'; break;\n case 'any': content += '\\x1b[?1003h'; break;\n }\n }\n\n // Cursor visibility (DECTCEM)\n // Default: visible\n if (!modes.showCursor) {\n content += '\\x1b[?25l';\n }\n\n return content;\n }\n\n public serialize(options?: ISerializeOptions): string {\n // TODO: Add combinedData support\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n // Normal buffer\n let content = options?.range\n ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, options.range, true)\n : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, options?.scrollback);\n\n // Alternate buffer\n if (!options?.excludeAltBuffer) {\n if (this._terminal.buffer.active.type === 'alternate') {\n const alternativeScreenContent = this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, undefined);\n content += `\\u001b[?1049h\\u001b[H${alternativeScreenContent}`;\n }\n }\n\n // Modes and scroll region\n if (!options?.excludeModes) {\n content += this._serializeModes(this._terminal);\n content += this._serializeScrollRegion(this._terminal);\n }\n\n return content;\n }\n\n public serializeAsHTML(options?: Partial): string {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n return this._serializeBufferAsHTML(this._terminal, options ?? {});\n }\n\n public dispose(): void { }\n}\n\nexport class HTMLSerializeHandler extends BaseSerializeHandler {\n private _currentRow: string = '';\n\n private _htmlContent = '';\n\n private _ansiColors: Readonly;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal,\n private readonly _options: Partial\n ) {\n super(buffer);\n\n // For xterm headless: fallback to ansi colors\n if ((_terminal as any)._core._themeService) {\n this._ansiColors = (_terminal as any)._core._themeService.colors.ansi;\n }\n else {\n this._ansiColors = DEFAULT_ANSI_COLORS;\n }\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._htmlContent += '
';\n\n    let foreground = '#000000';\n    let background = '#ffffff';\n    if (this._options.includeGlobalBackground ?? false) {\n      foreground = this._terminal.options.theme?.foreground ?? '#ffffff';\n      background = this._terminal.options.theme?.background ?? '#000000';\n    }\n\n    const globalStyleDefinitions = [];\n    globalStyleDefinitions.push('color: ' + foreground + ';');\n    globalStyleDefinitions.push('background-color: ' + background + ';');\n    globalStyleDefinitions.push('font-family: ' + this._terminal.options.fontFamily + ';');\n    globalStyleDefinitions.push('font-size: ' + this._terminal.options.fontSize + 'px;');\n    this._htmlContent += '
';\n }\n\n protected _afterSerialize(): void {\n this._htmlContent += '
';\n this._htmlContent += '
';\n }\n\n protected _rowEnd(row: number, isLastRow: boolean): void {\n this._htmlContent += '
' + this._currentRow + '
';\n this._currentRow = '';\n }\n\n private _getHexColor(cell: IBufferCell, isFg: boolean): string | undefined {\n const color = isFg ? cell.getFgColor() : cell.getBgColor();\n if (isFg ? cell.isFgRGB() : cell.isBgRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n if (isFg ? cell.isFgPalette() : cell.isBgPalette()) {\n return this._ansiColors[color].css;\n }\n return undefined;\n }\n\n private _getUnderlineColor(cell: IBufferCell): string | undefined {\n if (cell.isUnderlineColorDefault()) {\n return undefined;\n }\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n // Palette color\n return this._ansiColors[color].css;\n }\n\n private _getUnderlineStyle(cell: IBufferCell): string {\n switch (cell.getUnderlineStyle()) {\n case UnderlineStyle.SINGLE:\n return 'underline';\n case UnderlineStyle.DOUBLE:\n return 'underline double';\n case UnderlineStyle.CURLY:\n return 'underline wavy';\n case UnderlineStyle.DOTTED:\n return 'underline dotted';\n case UnderlineStyle.DASHED:\n return 'underline dashed';\n default:\n return 'underline';\n }\n }\n\n private _diffStyle(cell: IBufferCell, oldCell: IBufferCell): string[] | undefined {\n const content: string[] = [];\n\n if (attributesEquals(cell, oldCell)) {\n return undefined;\n }\n\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n const fgHexColor = this._getHexColor(cell, true);\n if (fgHexColor) {\n content.push('color: ' + fgHexColor + ';');\n }\n\n const bgHexColor = this._getHexColor(cell, false);\n if (bgHexColor) {\n content.push('background-color: ' + bgHexColor + ';');\n }\n\n if (cell.isInverse()) { content.push('color: #000000; background-color: #BFBFBF;'); }\n if (cell.isBold()) { content.push('font-weight: bold;'); }\n\n // Handle text-decoration (underline, overline, strikethrough, blink)\n const decorations: string[] = [];\n if (cell.isUnderline()) {\n decorations.push(this._getUnderlineStyle(cell));\n }\n if (cell.isOverline()) {\n decorations.push('overline');\n }\n if (cell.isStrikethrough()) {\n decorations.push('line-through');\n }\n if (cell.isBlink()) {\n decorations.push('blink');\n }\n if (decorations.length > 0) {\n content.push('text-decoration: ' + decorations.join(' ') + ';');\n }\n\n // Handle underline color\n if (cell.isUnderline()) {\n const underlineColor = this._getUnderlineColor(cell);\n if (underlineColor) {\n content.push('text-decoration-color: ' + underlineColor + ';');\n }\n }\n\n if (cell.isInvisible()) { content.push('visibility: hidden;'); }\n if (cell.isItalic()) { content.push('font-style: italic;'); }\n if (cell.isDim()) { content.push('opacity: 0.5;'); }\n\n return content;\n }\n\n return undefined;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const styleDefinitions = this._diffStyle(cell, oldCell);\n\n // handles style change\n if (styleDefinitions) {\n this._currentRow += styleDefinitions.length === 0 ?\n '
' :\n '';\n }\n\n // handles actual content\n if (isEmptyCell) {\n this._currentRow += ' ';\n } else {\n this._currentRow += escapeHTMLChar(cell.getChars());\n }\n }\n\n protected _serializeString(): string {\n return this._htmlContent;\n }\n}\n"],"names":["root","factory","exports","module","define","amd","globalThis","Color_1","__webpack_require__","DEFAULT_ANSI_COLORS","Object","freeze","colors","css","toColor","v","i","r","g","b","push","channels","toCss","rgba","toRgba","c","$r","$g","$b","$a","color","rgb","toPaddedHex","s","toString","length","contrastRatio","l1","l2","NULL_COLOR","a","undefined","color_1","opacity","Math","round","toChannels","blend","bg","fg","fgR","fgG","fgB","bgR","bgG","bgB","isOpaque","ensureContrastRatio","ratio","result","opaque","rgbaColor","multiplyOpacity","factor","toColorRGB","css_1","$ctx","$litmusColor","canvas","document","createElement","width","height","ctx","getContext","willReadFrequently","globalCompositeOperation","createLinearGradient","match","parseInt","slice","repeat","rgbaMatch","parseFloat","Error","fillStyle","fillRect","getImageData","data","rgb_1","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","bgRgba","fgRgba","cr","max","ceil","increaseLuminance","min","bgL","fgL","resultA","resultARatio","resultB","value","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","Types_1","constrain","low","high","BaseSerializeHandler","constructor","_buffer","serialize","range","excludeFinalCursorPosition","cell1","this","getNullCell","cell2","oldCell","startRow","start","y","endRow","end","startColumn","x","endColumn","_beforeSerialize","row","line","getLine","startLineColumn","endLineColumn","col","getCell","_nextCell","console","warn","_rowEnd","_afterSerialize","_serializeString","cell","isLastRow","rows","equalFg","getFgColorMode","getFgColor","equalBg","getBgColorMode","getBgColor","equalUnderline","isUnderline","getUnderlineStyle","cell1Default","isUnderlineColorDefault","cell2Default","getUnderlineColor","getUnderlineColorMode","equalFlags","isInverse","isBold","isOverline","isBlink","isInvisible","isItalic","isDim","isStrikethrough","attributesEquals","cell1AsBufferCell","StringSerializeHandler","buffer","_terminal","super","_rowIndex","_allRows","Array","_allRowSeparators","_currentRow","_nullCellCount","_cursorStyle","_cursorStyleRow","_cursorStyleCol","_backgroundCell","_firstRow","_lastCursorRow","_lastCursorCol","_lastContentCursorRow","_lastContentCursorCol","_thisRowLastChar","_thisRowLastSecondChar","_nextRowFirstChar","rowSeparator","currentLine","nextLine","isWrapped","thisRowLastChar","thisRowLastSecondChar","nextRowFirstChar","isNextRowFirstCharDoubleWidth","getWidth","isValid","getChars","_diffStyle","sgrSeq","fgChanged","bgChanged","flagsChanged","isAttributeDefault","isFgRGB","isFgPalette","isBgRGB","isBgPalette","style","isUnderlineColorRGB","isEmptyCell","join","rowEnd","content","realCursorRow","baseY","cursorY","realCursorCol","cursorX","moveRight","offset","curAttrData","_core","_inputHandler","_curAttrData","activate","terminal","_serializeBufferByScrollback","scrollback","maxRows","correctRows","_serializeBufferByRange","cols","_serializeBufferAsHTML","options","active","handler","HTMLSerializeHandler","onlySelection","startCol","startLine","endLine","selection","getSelectionPosition","_serializeScrollRegion","scrollTop","scrollBottom","_serializeModes","modes","applicationCursorKeysMode","applicationKeypadMode","bracketedPasteMode","insertMode","originMode","reverseWraparoundMode","sendFocusMode","wraparoundMode","mouseTrackingMode","showCursor","normal","excludeAltBuffer","type","alternate","excludeModes","serializeAsHTML","dispose","_options","_htmlContent","_themeService","_ansiColors","ansi","foreground","background","includeGlobalBackground","theme","globalStyleDefinitions","fontFamily","fontSize","_getHexColor","isFg","map","padStart","_getUnderlineColor","_getUnderlineStyle","fgHexColor","bgHexColor","decorations","underlineColor","styleDefinitions","escapeHTMLChar"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"addon-serialize.js","mappings":"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","sources":["webpack://SerializeAddon/webpack/universalModuleDefinition","webpack://SerializeAddon/../src/browser/Types.ts","webpack://SerializeAddon/../src/common/Color.ts","webpack://SerializeAddon/webpack/bootstrap","webpack://SerializeAddon/./src/SerializeAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SerializeAddon\"] = factory();\n\telse\n\t\troot[\"SerializeAddon\"] = factory();\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * (EXPERIMENTAL) This Addon is still under development\n */\n\nimport type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize';\nimport { IColor } from 'common/Types';\nimport { IAttributeData } from 'common/buffer/Types';\nimport { DEFAULT_ANSI_COLORS } from 'browser/Types';\nimport { UnderlineStyle } from 'common/buffer/Constants';\n\ntype OscLinkData = { id?: string; uri: string };\ntype OscLinkedCell = { extended?: { urlId?: number } };\ntype TerminalWithOscLinks = Terminal & {\n _core?: {\n _inputHandler?: { _curAttrData?: IAttributeData & OscLinkedCell };\n _oscLinkService?: { getLinkData: (linkId: number) => OscLinkData | undefined };\n };\n};\n\nfunction getOscLinkId(cell: IBufferCell | IAttributeData): number {\n return (cell as typeof cell & OscLinkedCell).extended?.urlId ?? 0;\n}\n\nfunction getOscLinkOpenSequence(terminal: Terminal, linkId: number): string {\n if (!linkId) {\n return '';\n }\n const data = (terminal as TerminalWithOscLinks)._core?._oscLinkService?.getLinkData(linkId);\n if (!data) {\n return '';\n }\n const params = data.id === undefined ? '' : `id=${data.id}`;\n return `\\u001b]8;${params};${data.uri}\\u001b\\\\`;\n}\n\nfunction getActiveOscLinkSequence(terminal: Terminal): string {\n const attrs = (terminal as TerminalWithOscLinks)._core?._inputHandler?._curAttrData;\n return attrs ? getOscLinkOpenSequence(terminal, getOscLinkId(attrs)) : '';\n}\n\nfunction constrain(value: number, low: number, high: number): number {\n return Math.max(low, Math.min(value, high));\n}\n\nfunction escapeHTMLChar(c: string): string {\n switch (c) {\n case '&': return '&';\n case '<': return '<';\n }\n return c;\n}\n\n// TODO: Refine this template class later\nabstract class BaseSerializeHandler {\n constructor(\n protected readonly _buffer: IBuffer\n ) {\n }\n\n public serialize(range: IBufferRange, excludeFinalCursorPosition?: boolean): string {\n // we need two of them to flip between old and new cell\n const cell1 = this._buffer.getNullCell();\n const cell2 = this._buffer.getNullCell();\n let oldCell = cell1;\n\n const startRow = range.start.y;\n const endRow = range.end.y;\n const startColumn = range.start.x;\n const endColumn = range.end.x;\n\n this._beforeSerialize(endRow - startRow, startRow, endRow);\n\n for (let row = startRow; row <= endRow; row++) {\n const line = this._buffer.getLine(row);\n if (line) {\n const startLineColumn = row === range.start.y ? startColumn : 0;\n const endLineColumn = row === range.end.y ? endColumn: line.length;\n for (let col = startLineColumn; col < endLineColumn; col++) {\n const c = line.getCell(col, oldCell === cell1 ? cell2 : cell1);\n if (!c) {\n console.warn(`Can't get cell at row=${row}, col=${col}`);\n continue;\n }\n this._nextCell(c, oldCell, row, col);\n oldCell = c;\n }\n }\n this._rowEnd(row, row === endRow);\n }\n\n this._afterSerialize();\n\n return this._serializeString(excludeFinalCursorPosition);\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { }\n protected _rowEnd(row: number, isLastRow: boolean): void { }\n protected _beforeSerialize(rows: number, startRow: number, endRow: number): void { }\n protected _afterSerialize(): void { }\n protected _serializeString(excludeFinalCursorPosition?: boolean): string { return ''; }\n}\n\nfunction equalFg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getFgColorMode() === cell2.getFgColorMode()\n && cell1.getFgColor() === cell2.getFgColor();\n}\n\nfunction equalBg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getBgColorMode() === cell2.getBgColorMode()\n && cell1.getBgColor() === cell2.getBgColor();\n}\n\nfunction equalUnderline(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n // If neither cell has underline, consider them equal regardless of internal underline color\n // values\n if (!cell1.isUnderline() && !cell2.isUnderline()) {\n return true;\n }\n if (cell1.getUnderlineStyle() !== cell2.getUnderlineStyle()) {\n return false;\n }\n const cell1Default = cell1.isUnderlineColorDefault();\n const cell2Default = cell2.isUnderlineColorDefault();\n if (cell1Default && cell2Default) {\n return true;\n }\n if (cell1Default !== cell2Default) {\n return false;\n }\n return cell1.getUnderlineColor() === cell2.getUnderlineColor()\n && cell1.getUnderlineColorMode() === cell2.getUnderlineColorMode();\n}\n\nfunction equalFlags(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.isInverse() === cell2.isInverse()\n && cell1.isBold() === cell2.isBold()\n && cell1.isUnderline() === cell2.isUnderline()\n && equalUnderline(cell1, cell2)\n && cell1.isOverline() === cell2.isOverline()\n && cell1.isBlink() === cell2.isBlink()\n && cell1.isInvisible() === cell2.isInvisible()\n && cell1.isItalic() === cell2.isItalic()\n && cell1.isDim() === cell2.isDim()\n && cell1.isStrikethrough() === cell2.isStrikethrough();\n}\n\nfunction attributesEquals(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n const cell1AsBufferCell = cell1 as IBufferCell;\n if (typeof cell1AsBufferCell.attributesEquals === 'function') {\n return cell1AsBufferCell.attributesEquals(cell2);\n }\n return equalFg(cell1, cell2)\n && equalBg(cell1, cell2)\n && equalFlags(cell1, cell2);\n}\n\nclass StringSerializeHandler extends BaseSerializeHandler {\n private _rowIndex: number = 0;\n private _allRows: string[] = new Array();\n private _allRowSeparators: string[] = new Array();\n private _currentRow: string = '';\n private _nullCellCount: number = 0;\n\n // we can see a full colored cell and a null cell that only have background the same style\n // but the information isn't preserved by null cell itself\n // so wee need to record it when required.\n private _cursorStyle: IBufferCell = this._buffer.getNullCell();\n\n // where exact the cursor styles comes from\n // because we can't copy the cell directly\n // so we remember where the content comes from instead\n private _cursorStyleRow: number = 0;\n private _cursorStyleCol: number = 0;\n\n // this is a null cell for reference for checking whether background is empty or not\n private _backgroundCell: IBufferCell = this._buffer.getNullCell();\n private _defaultCell: IBufferCell = this._buffer.getNullCell();\n\n private _firstRow: number = 0;\n private _lastCursorRow: number = 0;\n private _lastCursorCol: number = 0;\n private _lastContentCursorRow: number = 0;\n private _lastContentCursorCol: number = 0;\n private _activeOscLinkId: number = 0;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal\n ) {\n super(buffer);\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._allRows = new Array(rows);\n this._lastContentCursorRow = start;\n this._lastCursorRow = start;\n this._firstRow = start;\n }\n\n private _thisRowLastChar: IBufferCell = this._buffer.getNullCell();\n private _thisRowLastSecondChar: IBufferCell = this._buffer.getNullCell();\n private _nextRowFirstChar: IBufferCell = this._buffer.getNullCell();\n protected _rowEnd(row: number, isLastRow: boolean): void {\n // if there is colorful empty cell at line end, we must pad it back, or the color block\n // will missing\n if (this._nullCellCount > 0 && !equalBg(this._cursorStyle, this._backgroundCell)) {\n // use clear right to set background.\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n\n let rowSeparator = '';\n\n // handle row separator\n if (!isLastRow) {\n // Enable BCE\n if (row - this._firstRow >= this._terminal.rows) {\n this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);\n }\n\n // Fetch current line\n const currentLine = this._buffer.getLine(row)!;\n // Fetch next line\n const nextLine = this._buffer.getLine(row + 1)!;\n\n if (!nextLine.isWrapped) {\n // just insert the line break\n rowSeparator = '\\r\\n';\n // we sended the enter\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n } else {\n rowSeparator = '';\n const thisRowLastChar = currentLine.getCell(currentLine.length - 1, this._thisRowLastChar)!;\n const thisRowLastSecondChar = currentLine.getCell(currentLine.length - 2, this._thisRowLastSecondChar)!;\n const nextRowFirstChar = nextLine.getCell(0, this._nextRowFirstChar)!;\n const isNextRowFirstCharDoubleWidth = nextRowFirstChar.getWidth() > 1;\n\n // validate whether this line wrap is ever possible\n // which mean whether cursor can placed at a overflow position (x === row) naturally\n let isValid = false;\n\n if (\n // you must output character to cause overflow, control sequence can't do this\n nextRowFirstChar.getChars() &&\n (isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0)\n ) {\n if (\n // the last character can't be null,\n // you can't use control sequence to move cursor to (x === row)\n (thisRowLastChar.getChars() || thisRowLastChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n\n if (\n // the second to last character can't be null if the next line starts with CJK,\n // you can't use control sequence to move cursor to (x === row)\n isNextRowFirstCharDoubleWidth &&\n (thisRowLastSecondChar.getChars() || thisRowLastSecondChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar) &&\n equalBg(thisRowLastSecondChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n }\n\n if (!isValid) {\n // force the wrap with magic\n // insert enough character to force the wrap\n rowSeparator = '-'.repeat(this._nullCellCount + 1);\n // move back and erase next line head\n rowSeparator += '\\u001b[1D\\u001b[1X';\n\n if (this._nullCellCount > 0) {\n // do these because we filled the last several null slot, which we shouldn't\n rowSeparator += '\\u001b[A';\n const contentCellCount = currentLine.length - this._nullCellCount;\n if (contentCellCount > 0) {\n rowSeparator += `\\u001b[${contentCellCount}C`;\n }\n rowSeparator += `\\u001b[${this._nullCellCount}X`;\n if (contentCellCount > 0) {\n rowSeparator += `\\u001b[${contentCellCount}D`;\n }\n rowSeparator += '\\u001b[B';\n }\n\n // This is content and need the be serialized even it is invisible.\n // without this, wrap will be missing from outputs.\n this._lastContentCursorRow = row + 1;\n this._lastContentCursorCol = 0;\n\n // force commit the cursor position\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n }\n }\n }\n\n this._allRows[this._rowIndex] = this._currentRow;\n this._allRowSeparators[this._rowIndex++] = rowSeparator;\n this._currentRow = '';\n this._nullCellCount = 0;\n }\n\n private _diffStyle(cell: IBufferCell | IAttributeData, oldCell: IBufferCell): number[] {\n const sgrSeq: number[] = [];\n if (attributesEquals(cell, oldCell)) {\n return sgrSeq;\n }\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n if (cell.isAttributeDefault()) {\n if (!oldCell.isAttributeDefault()) {\n sgrSeq.push(0);\n }\n } else {\n if (fgChanged) {\n const color = cell.getFgColor();\n if (cell.isFgRGB()) { sgrSeq.push(38, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isFgPalette()) {\n if (color >= 16) { sgrSeq.push(38, 5, color); }\n else { sgrSeq.push(color & 8 ? 90 + (color & 7) : 30 + (color & 7)); }\n }\n else { sgrSeq.push(39); }\n }\n if (bgChanged) {\n const color = cell.getBgColor();\n if (cell.isBgRGB()) { sgrSeq.push(48, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isBgPalette()) {\n if (color >= 16) { sgrSeq.push(48, 5, color); }\n else { sgrSeq.push(color & 8 ? 100 + (color & 7) : 40 + (color & 7)); }\n }\n else { sgrSeq.push(49); }\n }\n if (flagsChanged) {\n if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); }\n // PATCH(orca): bold (1) and dim (2) share the single reset param 22, so\n // they must be diffed as one intensity group with the clearing 22 emitted\n // BEFORE any re-set. Upstream's independent per-flag diff could emit\n // \"1;22\" (bold set, then wiped by dim's clear — \\x1b[2mA\\x1b[22m\\x1b[1mB\n // loses B's bold on round-trip) or a bare \"22\" that drops a still-set\n // bold/dim, garbling Orca's hidden-terminal snapshot restores.\n const boldChanged = cell.isBold() !== oldCell.isBold();\n const dimChanged = cell.isDim() !== oldCell.isDim();\n if (boldChanged || dimChanged) {\n const clearsIntensity = (boldChanged && !cell.isBold()) || (dimChanged && !cell.isDim());\n if (clearsIntensity) { sgrSeq.push(22); }\n if (cell.isBold() && (boldChanged || clearsIntensity)) { sgrSeq.push(1); }\n if (cell.isDim() && (dimChanged || clearsIntensity)) { sgrSeq.push(2); }\n }\n if (!equalUnderline(cell, oldCell)) {\n const style = cell.getUnderlineStyle();\n if (style === UnderlineStyle.NONE) {\n sgrSeq.push(24);\n } else if (style === UnderlineStyle.SINGLE && cell.isUnderlineColorDefault()) {\n sgrSeq.push(4);\n } else {\n // Use SGR 4:X format for underline styles\n sgrSeq.push('4:' + style as unknown as number);\n // Handle underline color\n if (!cell.isUnderlineColorDefault()) {\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n sgrSeq.push('58:2::' + ((color >>> 16) & 0xFF) + ':' + ((color >>> 8) & 0xFF) + ':' + (color & 0xFF) as unknown as number);\n } else {\n sgrSeq.push('58:5:' + color as unknown as number);\n }\n }\n }\n } else if (cell.isUnderline() !== oldCell.isUnderline()) {\n sgrSeq.push(cell.isUnderline() ? 4 : 24);\n }\n if (cell.isOverline() !== oldCell.isOverline()) { sgrSeq.push(cell.isOverline() ? 53 : 55); }\n if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); }\n if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); }\n if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); }\n // PATCH(orca): dim handled in the intensity group above.\n if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); }\n }\n }\n }\n\n return sgrSeq;\n }\n\n private _setOscLink(linkId: number): string {\n if (linkId === this._activeOscLinkId) {\n return '';\n }\n let sequence = this._activeOscLinkId ? '\\u001b]8;;\\u001b\\\\' : '';\n this._activeOscLinkId = 0;\n const openSequence = getOscLinkOpenSequence(this._terminal, linkId);\n if (openSequence) {\n this._activeOscLinkId = linkId;\n sequence += openSequence;\n }\n return sequence;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n const nextLine = isEmptyCell && cell.isInverse() ? this._buffer.getLine(row + 1) : undefined;\n const nextRowFirstCell = nextLine?.getCell(0, this._nextRowFirstChar);\n // A pending wide glyph recreates its own final-column padding during replay.\n const isWideWrapPadding = col === this._terminal.cols - 1 &&\n nextLine?.isWrapped &&\n (nextRowFirstCell?.getWidth() ?? 0) > 1 &&\n !!nextRowFirstCell && attributesEquals(cell, nextRowFirstCell);\n // Cursor movement cannot reproduce an inverse cell's visible background.\n const materializeEmptyCell = isEmptyCell && !!cell.isInverse() && !isWideWrapPadding;\n\n const sgrSeq = this._diffStyle(cell, this._cursorStyle);\n\n const styleChanged = isEmptyCell\n ? materializeEmptyCell ? sgrSeq.length > 0 : !equalBg(this._cursorStyle, cell)\n : sgrSeq.length > 0;\n\n /**\n * handles style change\n */\n if (styleChanged) {\n // before update the style, we need to fill empty cell back\n if (this._nullCellCount > 0) {\n // use clear right to set background.\n if (!equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n // use move right to move cursor.\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n this._nullCellCount = 0;\n }\n\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col;\n\n this._currentRow += `\\u001b[${sgrSeq.join(';')}m`;\n\n // update the last cursor style\n const line = this._buffer.getLine(row);\n if (line !== undefined) {\n line.getCell(col, this._cursorStyle);\n this._cursorStyleRow = row;\n this._cursorStyleCol = col;\n }\n }\n\n /**\n * handles actual content\n */\n if (isEmptyCell && !materializeEmptyCell) {\n this._nullCellCount += cell.getWidth();\n } else {\n if (this._nullCellCount > 0) {\n // we can just assume we have same style with previous one here\n // because style change is handled by previous stage\n // use move right when background is empty, use clear right when there is background.\n if (equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n } else {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n }\n this._nullCellCount = 0;\n }\n\n // PATCH(orca): styling alone leaves restored OSC 8 links looking live but unclickable.\n this._currentRow += this._setOscLink(getOscLinkId(cell));\n\n if (materializeEmptyCell) {\n const hasDecoration = !!cell.isUnderline() || !!cell.isStrikethrough() || !!cell.isOverline();\n if (hasDecoration) {\n this._currentRow += '\\u001b[24;29;55m';\n }\n this._currentRow += ' '.repeat(cell.getWidth());\n if (hasDecoration) {\n const restoreSgrSeq = this._diffStyle(cell, this._defaultCell);\n this._currentRow += `\\u001b[0m\\u001b[${restoreSgrSeq.join(';')}m`;\n }\n } else {\n this._currentRow += cell.getChars();\n }\n\n // update cursor\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col + cell.getWidth();\n }\n }\n\n protected _serializeString(excludeFinalCursorPosition: boolean): string {\n let rowEnd = this._allRows.length;\n\n // the fixup is only required for data without scrollback\n // because it will always be placed at last line otherwise\n if (this._buffer.length - this._firstRow <= this._terminal.rows) {\n rowEnd = this._lastContentCursorRow + 1 - this._firstRow;\n this._lastCursorCol = this._lastContentCursorCol;\n this._lastCursorRow = this._lastContentCursorRow;\n }\n\n let content = '';\n\n for (let i = 0; i < rowEnd; i++) {\n content += this._allRows[i];\n if (i + 1 < rowEnd) {\n content += this._allRowSeparators[i];\n }\n }\n\n // Each buffer is self-contained so links cannot leak into a following buffer.\n content += this._setOscLink(0);\n\n // restore the cursor\n if (!excludeFinalCursorPosition) {\n const realCursorRow = this._buffer.baseY + this._buffer.cursorY;\n const realCursorCol = this._buffer.cursorX;\n\n const cursorMoved = (realCursorRow !== this._lastCursorRow || realCursorCol !== this._lastCursorCol);\n\n const moveRight = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}C`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}D`;\n }\n };\n const moveDown = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}B`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}A`;\n }\n };\n\n if (cursorMoved) {\n moveDown(realCursorRow - this._lastCursorRow);\n moveRight(realCursorCol - this._lastCursorCol);\n }\n }\n\n // Restore the cursor's current style, see https://github.com/xtermjs/xterm.js/issues/3677\n // HACK: Internal API access since it's awkward to expose this in the API and serialize will\n // likely be the only consumer\n const curAttrData: IAttributeData = (this._terminal as any)._core._inputHandler._curAttrData;\n const sgrSeq = this._diffStyle(curAttrData, this._cursorStyle);\n if (sgrSeq.length > 0) {\n content += `\\u001b[${sgrSeq.join(';')}m`;\n }\n\n return content;\n }\n}\n\nexport class SerializeAddon implements ITerminalAddon, ISerializeApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n private _serializeBufferByScrollback(terminal: Terminal, buffer: IBuffer, scrollback?: number): string {\n const maxRows = buffer.length;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return this._serializeBufferByRange(terminal, buffer, {\n start: maxRows - correctRows,\n end: maxRows - 1\n }, false);\n }\n\n private _serializeBufferByRange(terminal: Terminal, buffer: IBuffer, range: ISerializeRange, excludeFinalCursorPosition: boolean): string {\n const handler = new StringSerializeHandler(buffer, terminal);\n return handler.serialize({\n start: { x: 0, y: typeof range.start === 'number' ? range.start : range.start.line },\n end: { x: terminal.cols, y: typeof range.end === 'number' ? range.end : range.end.line }\n }, excludeFinalCursorPosition);\n }\n\n private _serializeBufferAsHTML(terminal: Terminal, options: Partial): string {\n const buffer = terminal.buffer.active;\n const handler = new HTMLSerializeHandler(buffer, terminal, options);\n const onlySelection = options.onlySelection ?? false;\n const range = options.range;\n if (range) {\n return handler.serialize({\n start: { x: range.startCol, y: typeof range.startLine === 'number' ? range.startLine : range.startLine },\n end: { x: terminal.cols, y: typeof range.endLine === 'number' ? range.endLine : range.endLine }\n });\n }\n if (!onlySelection) {\n const maxRows = buffer.length;\n const scrollback = options.scrollback;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return handler.serialize({\n start: { x: 0, y: maxRows - correctRows },\n end: { x: terminal.cols, y: maxRows - 1 }\n });\n }\n\n const selection = this._terminal?.getSelectionPosition();\n if (selection !== undefined) {\n return handler.serialize({\n start: { x: selection.start.x, y: selection.start.y },\n end: { x: selection.end.x, y: selection.end.y }\n });\n }\n\n return '';\n }\n\n /**\n * Serializes the scroll region (DECSTBM) if it's not set to the full terminal size.\n * Uses internal API access since scroll region is not exposed in the public API.\n */\n private _serializeScrollRegion(terminal: Terminal): string {\n // HACK: Internal API access since scroll region is not exposed in the public API\n const buffer = (terminal as any)._core.buffer;\n const scrollTop: number = buffer.scrollTop;\n const scrollBottom: number = buffer.scrollBottom;\n\n // Only serialize if scroll region is not the default (full terminal size)\n if (scrollTop !== 0 || scrollBottom !== terminal.rows - 1) {\n // DECSTBM uses 1-based indices: CSI Ps ; Ps r\n return `\\x1b[${scrollTop + 1};${scrollBottom + 1}r`;\n }\n\n return '';\n }\n\n private _serializeModes(terminal: Terminal): string {\n let content = '';\n const modes = terminal.modes;\n\n // Default: false\n if (modes.applicationCursorKeysMode) content += '\\x1b[?1h';\n if (modes.applicationKeypadMode) content += '\\x1b[?66h';\n if (modes.bracketedPasteMode) content += '\\x1b[?2004h';\n if (modes.insertMode) content += '\\x1b[4h';\n if (modes.originMode) content += '\\x1b[?6h';\n if (modes.reverseWraparoundMode) content += '\\x1b[?45h';\n if (modes.sendFocusMode) content += '\\x1b[?1004h';\n // synchronizedOutputMode doesn't need to be serialized as it's a temporary mode\n\n // Default: true\n if (modes.wraparoundMode === false) content += '\\x1b[?7l';\n\n // Default: 'none'\n if (modes.mouseTrackingMode !== 'none') {\n switch (modes.mouseTrackingMode) {\n case 'x10': content += '\\x1b[?9h'; break;\n case 'vt200': content += '\\x1b[?1000h'; break;\n case 'drag': content += '\\x1b[?1002h'; break;\n case 'any': content += '\\x1b[?1003h'; break;\n }\n }\n\n // Cursor visibility (DECTCEM)\n // Default: visible\n if (!modes.showCursor) {\n content += '\\x1b[?25l';\n }\n\n return content;\n }\n\n public serialize(options?: ISerializeOptions): string {\n // TODO: Add combinedData support\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n // Normal buffer\n let content = options?.range\n ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, options.range, true)\n : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, options?.scrollback);\n\n // Alternate buffer\n if (!options?.excludeAltBuffer) {\n if (this._terminal.buffer.active.type === 'alternate') {\n const alternativeScreenContent = this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, undefined);\n content += `\\u001b[?1049h\\u001b[H${alternativeScreenContent}`;\n }\n }\n\n // Modes and scroll region\n if (!options?.excludeModes) {\n content += this._serializeModes(this._terminal);\n content += this._serializeScrollRegion(this._terminal);\n }\n\n // Restore the source terminal's live OSC pen only after all buffers are complete.\n content += getActiveOscLinkSequence(this._terminal);\n\n return content;\n }\n\n public serializeAsHTML(options?: Partial): string {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n return this._serializeBufferAsHTML(this._terminal, options ?? {});\n }\n\n public dispose(): void { }\n}\n\nexport class HTMLSerializeHandler extends BaseSerializeHandler {\n private _currentRow: string = '';\n\n private _htmlContent = '';\n\n private _ansiColors: Readonly;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal,\n private readonly _options: Partial\n ) {\n super(buffer);\n\n // For xterm headless: fallback to ansi colors\n if ((_terminal as any)._core._themeService) {\n this._ansiColors = (_terminal as any)._core._themeService.colors.ansi;\n }\n else {\n this._ansiColors = DEFAULT_ANSI_COLORS;\n }\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._htmlContent += '
';\n\n    let foreground = '#000000';\n    let background = '#ffffff';\n    if (this._options.includeGlobalBackground ?? false) {\n      foreground = this._terminal.options.theme?.foreground ?? '#ffffff';\n      background = this._terminal.options.theme?.background ?? '#000000';\n    }\n\n    const globalStyleDefinitions = [];\n    globalStyleDefinitions.push('color: ' + foreground + ';');\n    globalStyleDefinitions.push('background-color: ' + background + ';');\n    globalStyleDefinitions.push('font-family: ' + this._terminal.options.fontFamily + ';');\n    globalStyleDefinitions.push('font-size: ' + this._terminal.options.fontSize + 'px;');\n    this._htmlContent += '
';\n }\n\n protected _afterSerialize(): void {\n this._htmlContent += '
';\n this._htmlContent += '
';\n }\n\n protected _rowEnd(row: number, isLastRow: boolean): void {\n this._htmlContent += '
' + this._currentRow + '
';\n this._currentRow = '';\n }\n\n private _getHexColor(cell: IBufferCell, isFg: boolean): string | undefined {\n const color = isFg ? cell.getFgColor() : cell.getBgColor();\n if (isFg ? cell.isFgRGB() : cell.isBgRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n if (isFg ? cell.isFgPalette() : cell.isBgPalette()) {\n return this._ansiColors[color].css;\n }\n return undefined;\n }\n\n private _getUnderlineColor(cell: IBufferCell): string | undefined {\n if (cell.isUnderlineColorDefault()) {\n return undefined;\n }\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n // Palette color\n return this._ansiColors[color].css;\n }\n\n private _getUnderlineStyle(cell: IBufferCell): string {\n switch (cell.getUnderlineStyle()) {\n case UnderlineStyle.SINGLE:\n return 'underline';\n case UnderlineStyle.DOUBLE:\n return 'underline double';\n case UnderlineStyle.CURLY:\n return 'underline wavy';\n case UnderlineStyle.DOTTED:\n return 'underline dotted';\n case UnderlineStyle.DASHED:\n return 'underline dashed';\n default:\n return 'underline';\n }\n }\n\n private _diffStyle(cell: IBufferCell, oldCell: IBufferCell): string[] | undefined {\n const content: string[] = [];\n\n if (attributesEquals(cell, oldCell)) {\n return undefined;\n }\n\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n const fgHexColor = this._getHexColor(cell, true);\n if (fgHexColor) {\n content.push('color: ' + fgHexColor + ';');\n }\n\n const bgHexColor = this._getHexColor(cell, false);\n if (bgHexColor) {\n content.push('background-color: ' + bgHexColor + ';');\n }\n\n if (cell.isInverse()) { content.push('color: #000000; background-color: #BFBFBF;'); }\n if (cell.isBold()) { content.push('font-weight: bold;'); }\n\n // Handle text-decoration (underline, overline, strikethrough, blink)\n const decorations: string[] = [];\n if (cell.isUnderline()) {\n decorations.push(this._getUnderlineStyle(cell));\n }\n if (cell.isOverline()) {\n decorations.push('overline');\n }\n if (cell.isStrikethrough()) {\n decorations.push('line-through');\n }\n if (cell.isBlink()) {\n decorations.push('blink');\n }\n if (decorations.length > 0) {\n content.push('text-decoration: ' + decorations.join(' ') + ';');\n }\n\n // Handle underline color\n if (cell.isUnderline()) {\n const underlineColor = this._getUnderlineColor(cell);\n if (underlineColor) {\n content.push('text-decoration-color: ' + underlineColor + ';');\n }\n }\n\n if (cell.isInvisible()) { content.push('visibility: hidden;'); }\n if (cell.isItalic()) { content.push('font-style: italic;'); }\n if (cell.isDim()) { content.push('opacity: 0.5;'); }\n\n return content;\n }\n\n return undefined;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const styleDefinitions = this._diffStyle(cell, oldCell);\n\n // handles style change\n if (styleDefinitions) {\n this._currentRow += styleDefinitions.length === 0 ?\n '
' :\n '';\n }\n\n // handles actual content\n if (isEmptyCell) {\n this._currentRow += ' ';\n } else {\n this._currentRow += escapeHTMLChar(cell.getChars());\n }\n }\n\n protected _serializeString(): string {\n return this._htmlContent;\n }\n}\n"],"names":["root","factory","exports","module","define","amd","globalThis","Color_1","__webpack_require__","DEFAULT_ANSI_COLORS","Object","freeze","colors","css","toColor","v","i","r","g","b","push","channels","toCss","rgba","toRgba","c","$r","$g","$b","$a","color","rgb","toPaddedHex","s","toString","length","contrastRatio","l1","l2","NULL_COLOR","a","undefined","color_1","opacity","Math","round","toChannels","blend","bg","fg","fgR","fgG","fgB","bgR","bgG","bgB","isOpaque","ensureContrastRatio","ratio","result","opaque","rgbaColor","multiplyOpacity","factor","toColorRGB","css_1","$ctx","$litmusColor","canvas","document","createElement","width","height","ctx","getContext","willReadFrequently","globalCompositeOperation","createLinearGradient","match","parseInt","slice","repeat","rgbaMatch","parseFloat","Error","fillStyle","fillRect","getImageData","data","rgb_1","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","bgRgba","fgRgba","cr","max","ceil","increaseLuminance","min","bgL","fgL","resultA","resultARatio","resultB","value","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","Types_1","getOscLinkId","cell","extended","urlId","getOscLinkOpenSequence","terminal","linkId","_core","_oscLinkService","getLinkData","id","uri","constrain","low","high","BaseSerializeHandler","constructor","_buffer","serialize","range","excludeFinalCursorPosition","cell1","this","getNullCell","cell2","oldCell","startRow","start","y","endRow","end","startColumn","x","endColumn","_beforeSerialize","row","line","getLine","startLineColumn","endLineColumn","col","getCell","_nextCell","console","warn","_rowEnd","_afterSerialize","_serializeString","isLastRow","rows","equalFg","getFgColorMode","getFgColor","equalBg","getBgColorMode","getBgColor","equalUnderline","isUnderline","getUnderlineStyle","cell1Default","isUnderlineColorDefault","cell2Default","getUnderlineColor","getUnderlineColorMode","equalFlags","isInverse","isBold","isOverline","isBlink","isInvisible","isItalic","isDim","isStrikethrough","attributesEquals","cell1AsBufferCell","StringSerializeHandler","buffer","_terminal","super","_rowIndex","_allRows","Array","_allRowSeparators","_currentRow","_nullCellCount","_cursorStyle","_cursorStyleRow","_cursorStyleCol","_backgroundCell","_defaultCell","_firstRow","_lastCursorRow","_lastCursorCol","_lastContentCursorRow","_lastContentCursorCol","_activeOscLinkId","_thisRowLastChar","_thisRowLastSecondChar","_nextRowFirstChar","rowSeparator","currentLine","nextLine","isWrapped","thisRowLastChar","thisRowLastSecondChar","nextRowFirstChar","isNextRowFirstCharDoubleWidth","getWidth","isValid","getChars","contentCellCount","_diffStyle","sgrSeq","fgChanged","bgChanged","flagsChanged","isAttributeDefault","isFgRGB","isFgPalette","isBgRGB","isBgPalette","boldChanged","dimChanged","clearsIntensity","style","isUnderlineColorRGB","_setOscLink","sequence","openSequence","isEmptyCell","nextRowFirstCell","isWideWrapPadding","cols","materializeEmptyCell","join","hasDecoration","restoreSgrSeq","rowEnd","content","realCursorRow","baseY","cursorY","realCursorCol","cursorX","moveRight","offset","curAttrData","_inputHandler","_curAttrData","activate","_serializeBufferByScrollback","scrollback","maxRows","correctRows","_serializeBufferByRange","_serializeBufferAsHTML","options","active","handler","HTMLSerializeHandler","onlySelection","startCol","startLine","endLine","selection","getSelectionPosition","_serializeScrollRegion","scrollTop","scrollBottom","_serializeModes","modes","applicationCursorKeysMode","applicationKeypadMode","bracketedPasteMode","insertMode","originMode","reverseWraparoundMode","sendFocusMode","wraparoundMode","mouseTrackingMode","showCursor","normal","excludeAltBuffer","type","alternate","excludeModes","attrs","getActiveOscLinkSequence","serializeAsHTML","dispose","_options","_htmlContent","_themeService","_ansiColors","ansi","foreground","background","includeGlobalBackground","theme","globalStyleDefinitions","fontFamily","fontSize","_getHexColor","isFg","map","padStart","_getUnderlineColor","_getUnderlineStyle","fgHexColor","bgHexColor","decorations","underlineColor","styleDefinitions","escapeHTMLChar"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/addon-serialize.mjs b/lib/addon-serialize.mjs index a5c4c4dd05b7efcc23d0e45661ffd4e42da80f21..b9bb467ab8a701c6d31a0f7a539010fad828e6da 100644 --- a/lib/addon-serialize.mjs +++ b/lib/addon-serialize.mjs @@ -14,6 +14,6 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -var m=0,b=0,_=0,p=0;var g;(t=>{function a(r,l,s,i){return i!==void 0?`#${w(r)}${w(l)}${w(s)}${w(i)}`:`#${w(r)}${w(l)}${w(s)}`}t.toCss=a;function n(r,l,s,i=255){return(r<<24|l<<16|s<<8|i)>>>0}t.toRgba=n;function e(r,l,s,i){return{css:t.toCss(r,l,s,i),rgba:t.toRgba(r,l,s,i)}}t.toColor=e})(g||={});var N;(i=>{function a(o,u){if(p=(u.rgba&255)/255,p===1)return{css:u.css,rgba:u.rgba};let f=u.rgba>>24&255,C=u.rgba>>16&255,c=u.rgba>>8&255,h=o.rgba>>24&255,d=o.rgba>>16&255,I=o.rgba>>8&255;m=h+Math.round((f-h)*p),b=d+Math.round((C-d)*p),_=I+Math.round((c-I)*p);let L=g.toCss(m,b,_),E=g.toRgba(m,b,_);return{css:L,rgba:E}}i.blend=a;function n(o){return(o.rgba&255)===255}i.isOpaque=n;function e(o,u,f){let C=B.ensureContrastRatio(o.rgba,u.rgba,f);if(C)return g.toColor(C>>24&255,C>>16&255,C>>8&255)}i.ensureContrastRatio=e;function t(o){let u=(o.rgba|255)>>>0;return[m,b,_]=B.toChannels(u),{css:g.toCss(m,b,_),rgba:u}}i.opaque=t;function r(o,u){return p=Math.round(u*255),[m,b,_]=B.toChannels(o.rgba),{css:g.toCss(m,b,_,p),rgba:g.toRgba(m,b,_,p)}}i.opacity=r;function l(o,u){return p=o.rgba&255,r(o,p*u/255)}i.multiplyOpacity=l;function s(o){return[o.rgba>>24&255,o.rgba>>16&255,o.rgba>>8&255]}i.toColorRGB=s})(N||={});var x;(t=>{let a,n;try{let r=document.createElement("canvas");r.width=1,r.height=1;let l=r.getContext("2d",{willReadFrequently:!0});l&&(a=l,a.globalCompositeOperation="copy",n=a.createLinearGradient(0,0,1,1))}catch{}function e(r){if(r.match(/#[\da-f]{3,8}/i))switch(r.length){case 4:return m=parseInt(r.slice(1,2).repeat(2),16),b=parseInt(r.slice(2,3).repeat(2),16),_=parseInt(r.slice(3,4).repeat(2),16),g.toColor(m,b,_);case 5:return m=parseInt(r.slice(1,2).repeat(2),16),b=parseInt(r.slice(2,3).repeat(2),16),_=parseInt(r.slice(3,4).repeat(2),16),p=parseInt(r.slice(4,5).repeat(2),16),g.toColor(m,b,_,p);case 7:return{css:r,rgba:(parseInt(r.slice(1),16)<<8|255)>>>0};case 9:return{css:r,rgba:parseInt(r.slice(1),16)>>>0}}let l=r.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(l)return m=parseInt(l[1],10),b=parseInt(l[2],10),_=parseInt(l[3],10),p=Math.round((l[5]===void 0?1:parseFloat(l[5]))*255),g.toColor(m,b,_,p);if(r==="transparent")return{css:"transparent",rgba:0};if(!a||!n)throw new Error("css.toColor: Unsupported css format");if(a.fillStyle=n,a.fillStyle=r,typeof a.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(a.fillRect(0,0,1,1),[m,b,_,p]=a.getImageData(0,0,1,1).data,p!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:g.toRgba(m,b,_,p),css:r}}t.toColor=e})(x||={});var v;(e=>{function a(t){return n(t>>16&255,t>>8&255,t&255)}e.relativeLuminance=a;function n(t,r,l){let s=t/255,i=r/255,o=l/255,u=s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4),f=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4),C=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4);return u*.2126+f*.7152+C*.0722}e.relativeLuminance2=n})(v||={});var B;(l=>{function a(s,i){if(p=(i&255)/255,p===1)return i;let o=i>>24&255,u=i>>16&255,f=i>>8&255,C=s>>24&255,c=s>>16&255,h=s>>8&255;return m=C+Math.round((o-C)*p),b=c+Math.round((u-c)*p),_=h+Math.round((f-h)*p),g.toRgba(m,b,_)}l.blend=a;function n(s,i,o){let u=v.relativeLuminance(s>>8),f=v.relativeLuminance(i>>8);if(R(u,f)>8));if(I>8));return I>E?d:L}return d}let c=t(s,i,o),h=R(u,v.relativeLuminance(c>>8));if(h>8));return h>I?c:d}return c}}l.ensureContrastRatio=n;function e(s,i,o){let u=s>>24&255,f=s>>16&255,C=s>>8&255,c=i>>24&255,h=i>>16&255,d=i>>8&255,I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));for(;I0||h>0||d>0);)c-=Math.max(0,Math.ceil(c*.1)),h-=Math.max(0,Math.ceil(h*.1)),d-=Math.max(0,Math.ceil(d*.1)),I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));return(c<<24|h<<16|d<<8|255)>>>0}l.reduceLuminance=e;function t(s,i,o){let u=s>>24&255,f=s>>16&255,C=s>>8&255,c=i>>24&255,h=i>>16&255,d=i>>8&255,I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));for(;I>>0}l.increaseLuminance=t;function r(s){return[s>>24&255,s>>16&255,s>>8&255,s&255]}l.toChannels=r})(B||={});function w(a){let n=a.toString(16);return n.length<2?"0"+n:n}function R(a,n){return a{let a=[x.toColor("#2e3436"),x.toColor("#cc0000"),x.toColor("#4e9a06"),x.toColor("#c4a000"),x.toColor("#3465a4"),x.toColor("#75507b"),x.toColor("#06989a"),x.toColor("#d3d7cf"),x.toColor("#555753"),x.toColor("#ef2929"),x.toColor("#8ae234"),x.toColor("#fce94f"),x.toColor("#729fcf"),x.toColor("#ad7fa8"),x.toColor("#34e2e2"),x.toColor("#eeeeec")],n=[0,95,135,175,215,255];for(let e=0;e<216;e++){let t=n[e/36%6|0],r=n[e/6%6|0],l=n[e%6];a.push({css:g.toCss(t,r,l),rgba:g.toRgba(t,r,l)})}for(let e=0;e<24;e++){let t=8+e*10;a.push({css:g.toCss(t,t,t),rgba:g.toRgba(t,t,t)})}return a})());function A(a,n,e){return Math.max(n,Math.min(a,e))}function z(a){switch(a){case"&":return"&";case"<":return"<"}return a}var S=class{constructor(n){this._buffer=n}serialize(n,e){let t=this._buffer.getNullCell(),r=this._buffer.getNullCell(),l=t,s=n.start.y,i=n.end.y,o=n.start.x,u=n.end.x;this._beforeSerialize(i-s,s,i);for(let f=s;f<=i;f++){let C=this._buffer.getLine(f);if(C){let c=f===n.start.y?o:0,h=f===n.end.y?u:C.length;for(let d=c;d0&&!F(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`\x1B[${this._nullCellCount}X`);let r="";if(!t){e-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);let l=this._buffer.getLine(e),s=this._buffer.getLine(e+1);if(!s.isWrapped)r=`\r -`,this._lastCursorRow=e+1,this._lastCursorCol=0;else{r="";let i=l.getCell(l.length-1,this._thisRowLastChar),o=l.getCell(l.length-2,this._thisRowLastSecondChar),u=s.getCell(0,this._nextRowFirstChar),f=u.getWidth()>1,C=!1;(u.getChars()&&f?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||i.getWidth()===0)&&F(i,u)&&(C=!0),f&&(o.getChars()||o.getWidth()===0)&&F(i,u)&&F(o,u)&&(C=!0)),C||(r="-".repeat(this._nullCellCount+1),r+="\x1B[1D\x1B[1X",this._nullCellCount>0&&(r+="\x1B[A",r+=`\x1B[${l.length-this._nullCellCount}C`,r+=`\x1B[${this._nullCellCount}X`,r+=`\x1B[${l.length-this._nullCellCount}D`,r+="\x1B[B"),this._lastContentCursorRow=e+1,this._lastContentCursorCol=0,this._lastCursorRow=e+1,this._lastCursorCol=0)}}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=r,this._currentRow="",this._nullCellCount=0}_diffStyle(e,t){let r=[];if(U(e,t))return r;let l=!T(e,t),s=!F(e,t),i=!M(e,t);if(l||s||i)if(e.isAttributeDefault())t.isAttributeDefault()||r.push(0);else{if(l){let o=e.getFgColor();e.isFgRGB()?r.push(38,2,o>>>16&255,o>>>8&255,o&255):e.isFgPalette()?o>=16?r.push(38,5,o):r.push(o&8?90+(o&7):30+(o&7)):r.push(39)}if(s){let o=e.getBgColor();e.isBgRGB()?r.push(48,2,o>>>16&255,o>>>8&255,o&255):e.isBgPalette()?o>=16?r.push(48,5,o):r.push(o&8?100+(o&7):40+(o&7)):r.push(49)}if(i){if(e.isInverse()!==t.isInverse()&&r.push(e.isInverse()?7:27),e.isBold()!==t.isBold()&&r.push(e.isBold()?1:22),O(e,t))e.isUnderline()!==t.isUnderline()&&r.push(e.isUnderline()?4:24);else{let o=e.getUnderlineStyle();if(o===0)r.push(24);else if(o===1&&e.isUnderlineColorDefault())r.push(4);else if(r.push("4:"+o),!e.isUnderlineColorDefault()){let u=e.getUnderlineColor();e.isUnderlineColorRGB()?r.push("58:2::"+(u>>>16&255)+":"+(u>>>8&255)+":"+(u&255)):r.push("58:5:"+u)}}e.isOverline()!==t.isOverline()&&r.push(e.isOverline()?53:55),e.isBlink()!==t.isBlink()&&r.push(e.isBlink()?5:25),e.isInvisible()!==t.isInvisible()&&r.push(e.isInvisible()?8:28),e.isItalic()!==t.isItalic()&&r.push(e.isItalic()?3:23),e.isDim()!==t.isDim()&&r.push(e.isDim()?2:22),e.isStrikethrough()!==t.isStrikethrough()&&r.push(e.isStrikethrough()?9:29)}}return r}_nextCell(e,t,r,l){if(e.getWidth()===0)return;let i=e.getChars()==="",o=this._diffStyle(e,this._cursorStyle);if(i?!F(this._cursorStyle,e):o.length>0){this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`\x1B[${this._nullCellCount}X`),this._currentRow+=`\x1B[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=l,this._currentRow+=`\x1B[${o.join(";")}m`;let f=this._buffer.getLine(r);f!==void 0&&(f.getCell(l,this._cursorStyle),this._cursorStyleRow=r,this._cursorStyleCol=l)}i?this._nullCellCount+=e.getWidth():(this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)?this._currentRow+=`\x1B[${this._nullCellCount}C`:(this._currentRow+=`\x1B[${this._nullCellCount}X`,this._currentRow+=`\x1B[${this._nullCellCount}C`),this._nullCellCount=0),this._currentRow+=e.getChars(),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=l+e.getWidth())}_serializeString(e){let t=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(t=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let r="";for(let i=0;i{c>0?r+=`\x1B[${c}C`:c<0&&(r+=`\x1B[${-c}D`)};u&&((c=>{c>0?r+=`\x1B[${c}B`:c<0&&(r+=`\x1B[${-c}A`)})(i-this._lastCursorRow),f(o-this._lastCursorCol))}let l=this._terminal._core._inputHandler._curAttrData,s=this._diffStyle(l,this._cursorStyle);return s.length>0&&(r+=`\x1B[${s.join(";")}m`),r}},H=class{activate(n){this._terminal=n}_serializeBufferByScrollback(n,e,t){let r=e.length,l=t===void 0?r:A(t+n.rows,0,r);return this._serializeBufferByRange(n,e,{start:r-l,end:r-1},!1)}_serializeBufferByRange(n,e,t,r){return new y(e,n).serialize({start:{x:0,y:typeof t.start=="number"?t.start:t.start.line},end:{x:n.cols,y:typeof t.end=="number"?t.end:t.end.line}},r)}_serializeBufferAsHTML(n,e){let t=n.buffer.active,r=new D(t,n,e),l=e.onlySelection??!1,s=e.range;if(s)return r.serialize({start:{x:s.startCol,y:(typeof s.startLine=="number",s.startLine)},end:{x:n.cols,y:(typeof s.endLine=="number",s.endLine)}});if(!l){let o=t.length,u=e.scrollback,f=u===void 0?o:A(u+n.rows,0,o);return r.serialize({start:{x:0,y:o-f},end:{x:n.cols,y:o-1}})}let i=this._terminal?.getSelectionPosition();return i!==void 0?r.serialize({start:{x:i.start.x,y:i.start.y},end:{x:i.end.x,y:i.end.y}}):""}_serializeScrollRegion(n){let e=n._core.buffer,t=e.scrollTop,r=e.scrollBottom;return t!==0||r!==n.rows-1?`\x1B[${t+1};${r+1}r`:""}_serializeModes(n){let e="",t=n.modes;if(t.applicationCursorKeysMode&&(e+="\x1B[?1h"),t.applicationKeypadMode&&(e+="\x1B[?66h"),t.bracketedPasteMode&&(e+="\x1B[?2004h"),t.insertMode&&(e+="\x1B[4h"),t.originMode&&(e+="\x1B[?6h"),t.reverseWraparoundMode&&(e+="\x1B[?45h"),t.sendFocusMode&&(e+="\x1B[?1004h"),t.wraparoundMode===!1&&(e+="\x1B[?7l"),t.mouseTrackingMode!=="none")switch(t.mouseTrackingMode){case"x10":e+="\x1B[?9h";break;case"vt200":e+="\x1B[?1000h";break;case"drag":e+="\x1B[?1002h";break;case"any":e+="\x1B[?1003h";break}return t.showCursor||(e+="\x1B[?25l"),e}serialize(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=n?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,n.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,n?.scrollback);if(!n?.excludeAltBuffer&&this._terminal.buffer.active.type==="alternate"){let t=this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0);e+=`\x1B[?1049h\x1B[H${t}`}return n?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e}serializeAsHTML(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,n??{})}dispose(){}},D=class extends S{constructor(e,t,r){super(e);this._terminal=t;this._options=r;this._currentRow="";this._htmlContent="";t._core._themeService?this._ansiColors=t._core._themeService.colors.ansi:this._ansiColors=k}_beforeSerialize(e,t,r){this._htmlContent+="
";let l="#000000",s="#ffffff";(this._options.includeGlobalBackground??!1)&&(l=this._terminal.options.theme?.foreground??"#ffffff",s=this._terminal.options.theme?.background??"#000000");let i=[];i.push("color: "+l+";"),i.push("background-color: "+s+";"),i.push("font-family: "+this._terminal.options.fontFamily+";"),i.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
"}_rowEnd(e,t){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(e,t){let r=t?e.getFgColor():e.getBgColor();if(t?e.isFgRGB():e.isBgRGB())return"#"+[r>>16&255,r>>8&255,r&255].map(s=>s.toString(16).padStart(2,"0")).join("");if(t?e.isFgPalette():e.isBgPalette())return this._ansiColors[r].css}_getUnderlineColor(e){if(e.isUnderlineColorDefault())return;let t=e.getUnderlineColor();return e.isUnderlineColorRGB()?"#"+[t>>16&255,t>>8&255,t&255].map(l=>l.toString(16).padStart(2,"0")).join(""):this._ansiColors[t].css}_getUnderlineStyle(e){switch(e.getUnderlineStyle()){case 1:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed";default:return"underline"}}_diffStyle(e,t){let r=[];if(U(e,t))return;let l=!T(e,t),s=!F(e,t),i=!M(e,t);if(l||s||i){let o=this._getHexColor(e,!0);o&&r.push("color: "+o+";");let u=this._getHexColor(e,!1);u&&r.push("background-color: "+u+";"),e.isInverse()&&r.push("color: #000000; background-color: #BFBFBF;"),e.isBold()&&r.push("font-weight: bold;");let f=[];if(e.isUnderline()&&f.push(this._getUnderlineStyle(e)),e.isOverline()&&f.push("overline"),e.isStrikethrough()&&f.push("line-through"),e.isBlink()&&f.push("blink"),f.length>0&&r.push("text-decoration: "+f.join(" ")+";"),e.isUnderline()){let C=this._getUnderlineColor(e);C&&r.push("text-decoration-color: "+C+";")}return e.isInvisible()&&r.push("visibility: hidden;"),e.isItalic()&&r.push("font-style: italic;"),e.isDim()&&r.push("opacity: 0.5;"),r}}_nextCell(e,t,r,l){if(e.getWidth()===0)return;let i=e.getChars()==="",o=this._diffStyle(e,t);o&&(this._currentRow+=o.length===0?"
":""),i?this._currentRow+=" ":this._currentRow+=z(e.getChars())}_serializeString(){return this._htmlContent}};export{D as HTMLSerializeHandler,H as SerializeAddon}; +var b=0,_=0,I=0,p=0;var g;(r=>{function s(t,u,a,i){return i!==void 0?`#${L(t)}${L(u)}${L(a)}${L(i)}`:`#${L(t)}${L(u)}${L(a)}`}r.toCss=s;function n(t,u,a,i=255){return(t<<24|u<<16|a<<8|i)>>>0}r.toRgba=n;function e(t,u,a,i){return{css:r.toCss(t,u,a,i),rgba:r.toRgba(t,u,a,i)}}r.toColor=e})(g||={});var W;(i=>{function s(o,l){if(p=(l.rgba&255)/255,p===1)return{css:l.css,rgba:l.rgba};let f=l.rgba>>24&255,d=l.rgba>>16&255,c=l.rgba>>8&255,C=o.rgba>>24&255,h=o.rgba>>16&255,m=o.rgba>>8&255;b=C+Math.round((f-C)*p),_=h+Math.round((d-h)*p),I=m+Math.round((c-m)*p);let w=g.toCss(b,_,I),E=g.toRgba(b,_,I);return{css:w,rgba:E}}i.blend=s;function n(o){return(o.rgba&255)===255}i.isOpaque=n;function e(o,l,f){let d=S.ensureContrastRatio(o.rgba,l.rgba,f);if(d)return g.toColor(d>>24&255,d>>16&255,d>>8&255)}i.ensureContrastRatio=e;function r(o){let l=(o.rgba|255)>>>0;return[b,_,I]=S.toChannels(l),{css:g.toCss(b,_,I),rgba:l}}i.opaque=r;function t(o,l){return p=Math.round(l*255),[b,_,I]=S.toChannels(o.rgba),{css:g.toCss(b,_,I,p),rgba:g.toRgba(b,_,I,p)}}i.opacity=t;function u(o,l){return p=o.rgba&255,t(o,p*l/255)}i.multiplyOpacity=u;function a(o){return[o.rgba>>24&255,o.rgba>>16&255,o.rgba>>8&255]}i.toColorRGB=a})(W||={});var x;(r=>{let s,n;try{let t=document.createElement("canvas");t.width=1,t.height=1;let u=t.getContext("2d",{willReadFrequently:!0});u&&(s=u,s.globalCompositeOperation="copy",n=s.createLinearGradient(0,0,1,1))}catch{}function e(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return b=parseInt(t.slice(1,2).repeat(2),16),_=parseInt(t.slice(2,3).repeat(2),16),I=parseInt(t.slice(3,4).repeat(2),16),g.toColor(b,_,I);case 5:return b=parseInt(t.slice(1,2).repeat(2),16),_=parseInt(t.slice(2,3).repeat(2),16),I=parseInt(t.slice(3,4).repeat(2),16),p=parseInt(t.slice(4,5).repeat(2),16),g.toColor(b,_,I,p);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}let u=t.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(u)return b=parseInt(u[1],10),_=parseInt(u[2],10),I=parseInt(u[3],10),p=Math.round((u[5]===void 0?1:parseFloat(u[5]))*255),g.toColor(b,_,I,p);if(t==="transparent")return{css:"transparent",rgba:0};if(!s||!n)throw new Error("css.toColor: Unsupported css format");if(s.fillStyle=n,s.fillStyle=t,typeof s.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(s.fillRect(0,0,1,1),[b,_,I,p]=s.getImageData(0,0,1,1).data,p!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:g.toRgba(b,_,I,p),css:t}}r.toColor=e})(x||={});var v;(e=>{function s(r){return n(r>>16&255,r>>8&255,r&255)}e.relativeLuminance=s;function n(r,t,u){let a=r/255,i=t/255,o=u/255,l=a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4),f=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4),d=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4);return l*.2126+f*.7152+d*.0722}e.relativeLuminance2=n})(v||={});var S;(u=>{function s(a,i){if(p=(i&255)/255,p===1)return i;let o=i>>24&255,l=i>>16&255,f=i>>8&255,d=a>>24&255,c=a>>16&255,C=a>>8&255;return b=d+Math.round((o-d)*p),_=c+Math.round((l-c)*p),I=C+Math.round((f-C)*p),g.toRgba(b,_,I)}u.blend=s;function n(a,i,o){let l=v.relativeLuminance(a>>8),f=v.relativeLuminance(i>>8);if(R(l,f)>8));if(m>8));return m>E?h:w}return h}let c=r(a,i,o),C=R(l,v.relativeLuminance(c>>8));if(C>8));return C>m?c:h}return c}}u.ensureContrastRatio=n;function e(a,i,o){let l=a>>24&255,f=a>>16&255,d=a>>8&255,c=i>>24&255,C=i>>16&255,h=i>>8&255,m=R(v.relativeLuminance2(c,C,h),v.relativeLuminance2(l,f,d));for(;m0||C>0||h>0);)c-=Math.max(0,Math.ceil(c*.1)),C-=Math.max(0,Math.ceil(C*.1)),h-=Math.max(0,Math.ceil(h*.1)),m=R(v.relativeLuminance2(c,C,h),v.relativeLuminance2(l,f,d));return(c<<24|C<<16|h<<8|255)>>>0}u.reduceLuminance=e;function r(a,i,o){let l=a>>24&255,f=a>>16&255,d=a>>8&255,c=i>>24&255,C=i>>16&255,h=i>>8&255,m=R(v.relativeLuminance2(c,C,h),v.relativeLuminance2(l,f,d));for(;m>>0}u.increaseLuminance=r;function t(a){return[a>>24&255,a>>16&255,a>>8&255,a&255]}u.toChannels=t})(S||={});function L(s){let n=s.toString(16);return n.length<2?"0"+n:n}function R(s,n){return s{let s=[x.toColor("#2e3436"),x.toColor("#cc0000"),x.toColor("#4e9a06"),x.toColor("#c4a000"),x.toColor("#3465a4"),x.toColor("#75507b"),x.toColor("#06989a"),x.toColor("#d3d7cf"),x.toColor("#555753"),x.toColor("#ef2929"),x.toColor("#8ae234"),x.toColor("#fce94f"),x.toColor("#729fcf"),x.toColor("#ad7fa8"),x.toColor("#34e2e2"),x.toColor("#eeeeec")],n=[0,95,135,175,215,255];for(let e=0;e<216;e++){let r=n[e/36%6|0],t=n[e/6%6|0],u=n[e%6];s.push({css:g.toCss(r,t,u),rgba:g.toRgba(r,t,u)})}for(let e=0;e<24;e++){let r=8+e*10;s.push({css:g.toCss(r,r,r),rgba:g.toRgba(r,r,r)})}return s})());function U(s){return s.extended?.urlId??0}function N(s,n){if(!n)return"";let e=s._core?._oscLinkService?.getLinkData(n);return e?`\x1B]8;${e.id===void 0?"":`id=${e.id}`};${e.uri}\x1B\\`:""}function $(s){let n=s._core?._inputHandler?._curAttrData;return n?N(s,U(n)):""}function A(s,n,e){return Math.max(n,Math.min(s,e))}function P(s){switch(s){case"&":return"&";case"<":return"<"}return s}var B=class{constructor(n){this._buffer=n}serialize(n,e){let r=this._buffer.getNullCell(),t=this._buffer.getNullCell(),u=r,a=n.start.y,i=n.end.y,o=n.start.x,l=n.end.x;this._beforeSerialize(i-a,a,i);for(let f=a;f<=i;f++){let d=this._buffer.getLine(f);if(d){let c=f===n.start.y?o:0,C=f===n.end.y?l:d.length;for(let h=c;h0&&!F(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`\x1B[${this._nullCellCount}X`);let t="";if(!r){e-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);let u=this._buffer.getLine(e),a=this._buffer.getLine(e+1);if(!a.isWrapped)t=`\r +`,this._lastCursorRow=e+1,this._lastCursorCol=0;else{t="";let i=u.getCell(u.length-1,this._thisRowLastChar),o=u.getCell(u.length-2,this._thisRowLastSecondChar),l=a.getCell(0,this._nextRowFirstChar),f=l.getWidth()>1,d=!1;if(l.getChars()&&(f?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||i.getWidth()===0)&&F(i,l)&&(d=!0),f&&(o.getChars()||o.getWidth()===0)&&F(i,l)&&F(o,l)&&(d=!0)),!d){if(t="-".repeat(this._nullCellCount+1),t+="\x1B[1D\x1B[1X",this._nullCellCount>0){t+="\x1B[A";let c=u.length-this._nullCellCount;c>0&&(t+=`\x1B[${c}C`),t+=`\x1B[${this._nullCellCount}X`,c>0&&(t+=`\x1B[${c}D`),t+="\x1B[B"}this._lastContentCursorRow=e+1,this._lastContentCursorCol=0,this._lastCursorRow=e+1,this._lastCursorCol=0}}}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=t,this._currentRow="",this._nullCellCount=0}_diffStyle(e,r){let t=[];if(y(e,r))return t;let u=!T(e,r),a=!F(e,r),i=!M(e,r);if(u||a||i)if(e.isAttributeDefault())r.isAttributeDefault()||t.push(0);else{if(u){let o=e.getFgColor();e.isFgRGB()?t.push(38,2,o>>>16&255,o>>>8&255,o&255):e.isFgPalette()?o>=16?t.push(38,5,o):t.push(o&8?90+(o&7):30+(o&7)):t.push(39)}if(a){let o=e.getBgColor();e.isBgRGB()?t.push(48,2,o>>>16&255,o>>>8&255,o&255):e.isBgPalette()?o>=16?t.push(48,5,o):t.push(o&8?100+(o&7):40+(o&7)):t.push(49)}if(i){e.isInverse()!==r.isInverse()&&t.push(e.isInverse()?7:27);let o=e.isBold()!==r.isBold(),l=e.isDim()!==r.isDim();if(o||l){let f=o&&!e.isBold()||l&&!e.isDim();f&&t.push(22),e.isBold()&&(o||f)&&t.push(1),e.isDim()&&(l||f)&&t.push(2)}if(z(e,r))e.isUnderline()!==r.isUnderline()&&t.push(e.isUnderline()?4:24);else{let f=e.getUnderlineStyle();if(f===0)t.push(24);else if(f===1&&e.isUnderlineColorDefault())t.push(4);else if(t.push("4:"+f),!e.isUnderlineColorDefault()){let d=e.getUnderlineColor();e.isUnderlineColorRGB()?t.push("58:2::"+(d>>>16&255)+":"+(d>>>8&255)+":"+(d&255)):t.push("58:5:"+d)}}e.isOverline()!==r.isOverline()&&t.push(e.isOverline()?53:55),e.isBlink()!==r.isBlink()&&t.push(e.isBlink()?5:25),e.isInvisible()!==r.isInvisible()&&t.push(e.isInvisible()?8:28),e.isItalic()!==r.isItalic()&&t.push(e.isItalic()?3:23),e.isStrikethrough()!==r.isStrikethrough()&&t.push(e.isStrikethrough()?9:29)}}return t}_setOscLink(e){if(e===this._activeOscLinkId)return"";let r=this._activeOscLinkId?"\x1B]8;;\x1B\\":"";this._activeOscLinkId=0;let t=N(this._terminal,e);return t&&(this._activeOscLinkId=e,r+=t),r}_nextCell(e,r,t,u){if(e.getWidth()===0)return;let i=e.getChars()==="",o=i&&e.isInverse()?this._buffer.getLine(t+1):void 0,l=o?.getCell(0,this._nextRowFirstChar),f=u===this._terminal.cols-1&&o?.isWrapped&&(l?.getWidth()??0)>1&&!!l&&y(e,l),d=i&&!!e.isInverse()&&!f,c=this._diffStyle(e,this._cursorStyle);if(i?d?c.length>0:!F(this._cursorStyle,e):c.length>0){this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`\x1B[${this._nullCellCount}X`),this._currentRow+=`\x1B[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=t,this._lastContentCursorCol=this._lastCursorCol=u,this._currentRow+=`\x1B[${c.join(";")}m`;let h=this._buffer.getLine(t);h!==void 0&&(h.getCell(u,this._cursorStyle),this._cursorStyleRow=t,this._cursorStyleCol=u)}if(i&&!d)this._nullCellCount+=e.getWidth();else{if(this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)?this._currentRow+=`\x1B[${this._nullCellCount}C`:(this._currentRow+=`\x1B[${this._nullCellCount}X`,this._currentRow+=`\x1B[${this._nullCellCount}C`),this._nullCellCount=0),this._currentRow+=this._setOscLink(U(e)),d){let h=!!e.isUnderline()||!!e.isStrikethrough()||!!e.isOverline();if(h&&(this._currentRow+="\x1B[24;29;55m"),this._currentRow+=" ".repeat(e.getWidth()),h){let m=this._diffStyle(e,this._defaultCell);this._currentRow+=`\x1B[0m\x1B[${m.join(";")}m`}}else this._currentRow+=e.getChars();this._lastContentCursorRow=this._lastCursorRow=t,this._lastContentCursorCol=this._lastCursorCol=u+e.getWidth()}}_serializeString(e){let r=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(r=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let t="";for(let i=0;i{c>0?t+=`\x1B[${c}C`:c<0&&(t+=`\x1B[${-c}D`)};l&&((c=>{c>0?t+=`\x1B[${c}B`:c<0&&(t+=`\x1B[${-c}A`)})(i-this._lastCursorRow),f(o-this._lastCursorCol))}let u=this._terminal._core._inputHandler._curAttrData,a=this._diffStyle(u,this._cursorStyle);return a.length>0&&(t+=`\x1B[${a.join(";")}m`),t}},H=class{activate(n){this._terminal=n}_serializeBufferByScrollback(n,e,r){let t=e.length,u=r===void 0?t:A(r+n.rows,0,t);return this._serializeBufferByRange(n,e,{start:t-u,end:t-1},!1)}_serializeBufferByRange(n,e,r,t){return new D(e,n).serialize({start:{x:0,y:typeof r.start=="number"?r.start:r.start.line},end:{x:n.cols,y:typeof r.end=="number"?r.end:r.end.line}},t)}_serializeBufferAsHTML(n,e){let r=n.buffer.active,t=new k(r,n,e),u=e.onlySelection??!1,a=e.range;if(a)return t.serialize({start:{x:a.startCol,y:(typeof a.startLine=="number",a.startLine)},end:{x:n.cols,y:(typeof a.endLine=="number",a.endLine)}});if(!u){let o=r.length,l=e.scrollback,f=l===void 0?o:A(l+n.rows,0,o);return t.serialize({start:{x:0,y:o-f},end:{x:n.cols,y:o-1}})}let i=this._terminal?.getSelectionPosition();return i!==void 0?t.serialize({start:{x:i.start.x,y:i.start.y},end:{x:i.end.x,y:i.end.y}}):""}_serializeScrollRegion(n){let e=n._core.buffer,r=e.scrollTop,t=e.scrollBottom;return r!==0||t!==n.rows-1?`\x1B[${r+1};${t+1}r`:""}_serializeModes(n){let e="",r=n.modes;if(r.applicationCursorKeysMode&&(e+="\x1B[?1h"),r.applicationKeypadMode&&(e+="\x1B[?66h"),r.bracketedPasteMode&&(e+="\x1B[?2004h"),r.insertMode&&(e+="\x1B[4h"),r.originMode&&(e+="\x1B[?6h"),r.reverseWraparoundMode&&(e+="\x1B[?45h"),r.sendFocusMode&&(e+="\x1B[?1004h"),r.wraparoundMode===!1&&(e+="\x1B[?7l"),r.mouseTrackingMode!=="none")switch(r.mouseTrackingMode){case"x10":e+="\x1B[?9h";break;case"vt200":e+="\x1B[?1000h";break;case"drag":e+="\x1B[?1002h";break;case"any":e+="\x1B[?1003h";break}return r.showCursor||(e+="\x1B[?25l"),e}serialize(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=n?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,n.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,n?.scrollback);if(!n?.excludeAltBuffer&&this._terminal.buffer.active.type==="alternate"){let r=this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0);e+=`\x1B[?1049h\x1B[H${r}`}return n?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e+=$(this._terminal),e}serializeAsHTML(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,n??{})}dispose(){}},k=class extends B{constructor(e,r,t){super(e);this._terminal=r;this._options=t;this._currentRow="";this._htmlContent="";r._core._themeService?this._ansiColors=r._core._themeService.colors.ansi:this._ansiColors=O}_beforeSerialize(e,r,t){this._htmlContent+="
";let u="#000000",a="#ffffff";(this._options.includeGlobalBackground??!1)&&(u=this._terminal.options.theme?.foreground??"#ffffff",a=this._terminal.options.theme?.background??"#000000");let i=[];i.push("color: "+u+";"),i.push("background-color: "+a+";"),i.push("font-family: "+this._terminal.options.fontFamily+";"),i.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
"}_rowEnd(e,r){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(e,r){let t=r?e.getFgColor():e.getBgColor();if(r?e.isFgRGB():e.isBgRGB())return"#"+[t>>16&255,t>>8&255,t&255].map(a=>a.toString(16).padStart(2,"0")).join("");if(r?e.isFgPalette():e.isBgPalette())return this._ansiColors[t].css}_getUnderlineColor(e){if(e.isUnderlineColorDefault())return;let r=e.getUnderlineColor();return e.isUnderlineColorRGB()?"#"+[r>>16&255,r>>8&255,r&255].map(u=>u.toString(16).padStart(2,"0")).join(""):this._ansiColors[r].css}_getUnderlineStyle(e){switch(e.getUnderlineStyle()){case 1:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed";default:return"underline"}}_diffStyle(e,r){let t=[];if(y(e,r))return;let u=!T(e,r),a=!F(e,r),i=!M(e,r);if(u||a||i){let o=this._getHexColor(e,!0);o&&t.push("color: "+o+";");let l=this._getHexColor(e,!1);l&&t.push("background-color: "+l+";"),e.isInverse()&&t.push("color: #000000; background-color: #BFBFBF;"),e.isBold()&&t.push("font-weight: bold;");let f=[];if(e.isUnderline()&&f.push(this._getUnderlineStyle(e)),e.isOverline()&&f.push("overline"),e.isStrikethrough()&&f.push("line-through"),e.isBlink()&&f.push("blink"),f.length>0&&t.push("text-decoration: "+f.join(" ")+";"),e.isUnderline()){let d=this._getUnderlineColor(e);d&&t.push("text-decoration-color: "+d+";")}return e.isInvisible()&&t.push("visibility: hidden;"),e.isItalic()&&t.push("font-style: italic;"),e.isDim()&&t.push("opacity: 0.5;"),t}}_nextCell(e,r,t,u){if(e.getWidth()===0)return;let i=e.getChars()==="",o=this._diffStyle(e,r);o&&(this._currentRow+=o.length===0?"
":""),i?this._currentRow+=" ":this._currentRow+=P(e.getChars())}_serializeString(){return this._htmlContent}};export{k as HTMLSerializeHandler,H as SerializeAddon}; //# sourceMappingURL=addon-serialize.mjs.map diff --git a/lib/addon-serialize.mjs.map b/lib/addon-serialize.mjs.map index e9357c67686de63dd29db518781758345aacdd0f..ea0eb0dac817d0d691fd3b1d5b4a58187430efac 100644 --- a/lib/addon-serialize.mjs.map +++ b/lib/addon-serialize.mjs.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../src/common/Color.ts", "../../../src/browser/Types.ts", "../src/SerializeAddon.ts"], - "sourcesContent": ["/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * (EXPERIMENTAL) This Addon is still under development\n */\n\nimport type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize';\nimport { IColor } from 'common/Types';\nimport { IAttributeData } from 'common/buffer/Types';\nimport { DEFAULT_ANSI_COLORS } from 'browser/Types';\nimport { UnderlineStyle } from 'common/buffer/Constants';\n\nfunction constrain(value: number, low: number, high: number): number {\n return Math.max(low, Math.min(value, high));\n}\n\nfunction escapeHTMLChar(c: string): string {\n switch (c) {\n case '&': return '&';\n case '<': return '<';\n }\n return c;\n}\n\n// TODO: Refine this template class later\nabstract class BaseSerializeHandler {\n constructor(\n protected readonly _buffer: IBuffer\n ) {\n }\n\n public serialize(range: IBufferRange, excludeFinalCursorPosition?: boolean): string {\n // we need two of them to flip between old and new cell\n const cell1 = this._buffer.getNullCell();\n const cell2 = this._buffer.getNullCell();\n let oldCell = cell1;\n\n const startRow = range.start.y;\n const endRow = range.end.y;\n const startColumn = range.start.x;\n const endColumn = range.end.x;\n\n this._beforeSerialize(endRow - startRow, startRow, endRow);\n\n for (let row = startRow; row <= endRow; row++) {\n const line = this._buffer.getLine(row);\n if (line) {\n const startLineColumn = row === range.start.y ? startColumn : 0;\n const endLineColumn = row === range.end.y ? endColumn: line.length;\n for (let col = startLineColumn; col < endLineColumn; col++) {\n const c = line.getCell(col, oldCell === cell1 ? cell2 : cell1);\n if (!c) {\n console.warn(`Can't get cell at row=${row}, col=${col}`);\n continue;\n }\n this._nextCell(c, oldCell, row, col);\n oldCell = c;\n }\n }\n this._rowEnd(row, row === endRow);\n }\n\n this._afterSerialize();\n\n return this._serializeString(excludeFinalCursorPosition);\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { }\n protected _rowEnd(row: number, isLastRow: boolean): void { }\n protected _beforeSerialize(rows: number, startRow: number, endRow: number): void { }\n protected _afterSerialize(): void { }\n protected _serializeString(excludeFinalCursorPosition?: boolean): string { return ''; }\n}\n\nfunction equalFg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getFgColorMode() === cell2.getFgColorMode()\n && cell1.getFgColor() === cell2.getFgColor();\n}\n\nfunction equalBg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getBgColorMode() === cell2.getBgColorMode()\n && cell1.getBgColor() === cell2.getBgColor();\n}\n\nfunction equalUnderline(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n // If neither cell has underline, consider them equal regardless of internal underline color\n // values\n if (!cell1.isUnderline() && !cell2.isUnderline()) {\n return true;\n }\n if (cell1.getUnderlineStyle() !== cell2.getUnderlineStyle()) {\n return false;\n }\n const cell1Default = cell1.isUnderlineColorDefault();\n const cell2Default = cell2.isUnderlineColorDefault();\n if (cell1Default && cell2Default) {\n return true;\n }\n if (cell1Default !== cell2Default) {\n return false;\n }\n return cell1.getUnderlineColor() === cell2.getUnderlineColor()\n && cell1.getUnderlineColorMode() === cell2.getUnderlineColorMode();\n}\n\nfunction equalFlags(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.isInverse() === cell2.isInverse()\n && cell1.isBold() === cell2.isBold()\n && cell1.isUnderline() === cell2.isUnderline()\n && equalUnderline(cell1, cell2)\n && cell1.isOverline() === cell2.isOverline()\n && cell1.isBlink() === cell2.isBlink()\n && cell1.isInvisible() === cell2.isInvisible()\n && cell1.isItalic() === cell2.isItalic()\n && cell1.isDim() === cell2.isDim()\n && cell1.isStrikethrough() === cell2.isStrikethrough();\n}\n\nfunction attributesEquals(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n const cell1AsBufferCell = cell1 as IBufferCell;\n if (typeof cell1AsBufferCell.attributesEquals === 'function') {\n return cell1AsBufferCell.attributesEquals(cell2);\n }\n return equalFg(cell1, cell2)\n && equalBg(cell1, cell2)\n && equalFlags(cell1, cell2);\n}\n\nclass StringSerializeHandler extends BaseSerializeHandler {\n private _rowIndex: number = 0;\n private _allRows: string[] = new Array();\n private _allRowSeparators: string[] = new Array();\n private _currentRow: string = '';\n private _nullCellCount: number = 0;\n\n // we can see a full colored cell and a null cell that only have background the same style\n // but the information isn't preserved by null cell itself\n // so wee need to record it when required.\n private _cursorStyle: IBufferCell = this._buffer.getNullCell();\n\n // where exact the cursor styles comes from\n // because we can't copy the cell directly\n // so we remember where the content comes from instead\n private _cursorStyleRow: number = 0;\n private _cursorStyleCol: number = 0;\n\n // this is a null cell for reference for checking whether background is empty or not\n private _backgroundCell: IBufferCell = this._buffer.getNullCell();\n\n private _firstRow: number = 0;\n private _lastCursorRow: number = 0;\n private _lastCursorCol: number = 0;\n private _lastContentCursorRow: number = 0;\n private _lastContentCursorCol: number = 0;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal\n ) {\n super(buffer);\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._allRows = new Array(rows);\n this._lastContentCursorRow = start;\n this._lastCursorRow = start;\n this._firstRow = start;\n }\n\n private _thisRowLastChar: IBufferCell = this._buffer.getNullCell();\n private _thisRowLastSecondChar: IBufferCell = this._buffer.getNullCell();\n private _nextRowFirstChar: IBufferCell = this._buffer.getNullCell();\n protected _rowEnd(row: number, isLastRow: boolean): void {\n // if there is colorful empty cell at line end, we must pad it back, or the color block\n // will missing\n if (this._nullCellCount > 0 && !equalBg(this._cursorStyle, this._backgroundCell)) {\n // use clear right to set background.\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n\n let rowSeparator = '';\n\n // handle row separator\n if (!isLastRow) {\n // Enable BCE\n if (row - this._firstRow >= this._terminal.rows) {\n this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);\n }\n\n // Fetch current line\n const currentLine = this._buffer.getLine(row)!;\n // Fetch next line\n const nextLine = this._buffer.getLine(row + 1)!;\n\n if (!nextLine.isWrapped) {\n // just insert the line break\n rowSeparator = '\\r\\n';\n // we sended the enter\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n } else {\n rowSeparator = '';\n const thisRowLastChar = currentLine.getCell(currentLine.length - 1, this._thisRowLastChar)!;\n const thisRowLastSecondChar = currentLine.getCell(currentLine.length - 2, this._thisRowLastSecondChar)!;\n const nextRowFirstChar = nextLine.getCell(0, this._nextRowFirstChar)!;\n const isNextRowFirstCharDoubleWidth = nextRowFirstChar.getWidth() > 1;\n\n // validate whether this line wrap is ever possible\n // which mean whether cursor can placed at a overflow position (x === row) naturally\n let isValid = false;\n\n if (\n // you must output character to cause overflow, control sequence can't do this\n nextRowFirstChar.getChars() &&\n isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0\n ) {\n if (\n // the last character can't be null,\n // you can't use control sequence to move cursor to (x === row)\n (thisRowLastChar.getChars() || thisRowLastChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n\n if (\n // the second to last character can't be null if the next line starts with CJK,\n // you can't use control sequence to move cursor to (x === row)\n isNextRowFirstCharDoubleWidth &&\n (thisRowLastSecondChar.getChars() || thisRowLastSecondChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar) &&\n equalBg(thisRowLastSecondChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n }\n\n if (!isValid) {\n // force the wrap with magic\n // insert enough character to force the wrap\n rowSeparator = '-'.repeat(this._nullCellCount + 1);\n // move back and erase next line head\n rowSeparator += '\\u001b[1D\\u001b[1X';\n\n if (this._nullCellCount > 0) {\n // do these because we filled the last several null slot, which we shouldn't\n rowSeparator += '\\u001b[A';\n rowSeparator += `\\u001b[${currentLine.length - this._nullCellCount}C`;\n rowSeparator += `\\u001b[${this._nullCellCount}X`;\n rowSeparator += `\\u001b[${currentLine.length - this._nullCellCount}D`;\n rowSeparator += '\\u001b[B';\n }\n\n // This is content and need the be serialized even it is invisible.\n // without this, wrap will be missing from outputs.\n this._lastContentCursorRow = row + 1;\n this._lastContentCursorCol = 0;\n\n // force commit the cursor position\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n }\n }\n }\n\n this._allRows[this._rowIndex] = this._currentRow;\n this._allRowSeparators[this._rowIndex++] = rowSeparator;\n this._currentRow = '';\n this._nullCellCount = 0;\n }\n\n private _diffStyle(cell: IBufferCell | IAttributeData, oldCell: IBufferCell): number[] {\n const sgrSeq: number[] = [];\n if (attributesEquals(cell, oldCell)) {\n return sgrSeq;\n }\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n if (cell.isAttributeDefault()) {\n if (!oldCell.isAttributeDefault()) {\n sgrSeq.push(0);\n }\n } else {\n if (fgChanged) {\n const color = cell.getFgColor();\n if (cell.isFgRGB()) { sgrSeq.push(38, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isFgPalette()) {\n if (color >= 16) { sgrSeq.push(38, 5, color); }\n else { sgrSeq.push(color & 8 ? 90 + (color & 7) : 30 + (color & 7)); }\n }\n else { sgrSeq.push(39); }\n }\n if (bgChanged) {\n const color = cell.getBgColor();\n if (cell.isBgRGB()) { sgrSeq.push(48, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isBgPalette()) {\n if (color >= 16) { sgrSeq.push(48, 5, color); }\n else { sgrSeq.push(color & 8 ? 100 + (color & 7) : 40 + (color & 7)); }\n }\n else { sgrSeq.push(49); }\n }\n if (flagsChanged) {\n if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); }\n if (cell.isBold() !== oldCell.isBold()) { sgrSeq.push(cell.isBold() ? 1 : 22); }\n if (!equalUnderline(cell, oldCell)) {\n const style = cell.getUnderlineStyle();\n if (style === UnderlineStyle.NONE) {\n sgrSeq.push(24);\n } else if (style === UnderlineStyle.SINGLE && cell.isUnderlineColorDefault()) {\n sgrSeq.push(4);\n } else {\n // Use SGR 4:X format for underline styles\n sgrSeq.push('4:' + style as unknown as number);\n // Handle underline color\n if (!cell.isUnderlineColorDefault()) {\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n sgrSeq.push('58:2::' + ((color >>> 16) & 0xFF) + ':' + ((color >>> 8) & 0xFF) + ':' + (color & 0xFF) as unknown as number);\n } else {\n sgrSeq.push('58:5:' + color as unknown as number);\n }\n }\n }\n } else if (cell.isUnderline() !== oldCell.isUnderline()) {\n sgrSeq.push(cell.isUnderline() ? 4 : 24);\n }\n if (cell.isOverline() !== oldCell.isOverline()) { sgrSeq.push(cell.isOverline() ? 53 : 55); }\n if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); }\n if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); }\n if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); }\n if (cell.isDim() !== oldCell.isDim()) { sgrSeq.push(cell.isDim() ? 2 : 22); }\n if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); }\n }\n }\n }\n\n return sgrSeq;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const sgrSeq = this._diffStyle(cell, this._cursorStyle);\n\n // the empty cell style is only assumed to be changed when background changed, because\n // foreground is always 0.\n const styleChanged = isEmptyCell ? !equalBg(this._cursorStyle, cell) : sgrSeq.length > 0;\n\n /**\n * handles style change\n */\n if (styleChanged) {\n // before update the style, we need to fill empty cell back\n if (this._nullCellCount > 0) {\n // use clear right to set background.\n if (!equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n // use move right to move cursor.\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n this._nullCellCount = 0;\n }\n\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col;\n\n this._currentRow += `\\u001b[${sgrSeq.join(';')}m`;\n\n // update the last cursor style\n const line = this._buffer.getLine(row);\n if (line !== undefined) {\n line.getCell(col, this._cursorStyle);\n this._cursorStyleRow = row;\n this._cursorStyleCol = col;\n }\n }\n\n /**\n * handles actual content\n */\n if (isEmptyCell) {\n this._nullCellCount += cell.getWidth();\n } else {\n if (this._nullCellCount > 0) {\n // we can just assume we have same style with previous one here\n // because style change is handled by previous stage\n // use move right when background is empty, use clear right when there is background.\n if (equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n } else {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n }\n this._nullCellCount = 0;\n }\n\n this._currentRow += cell.getChars();\n\n // update cursor\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col + cell.getWidth();\n }\n }\n\n protected _serializeString(excludeFinalCursorPosition: boolean): string {\n let rowEnd = this._allRows.length;\n\n // the fixup is only required for data without scrollback\n // because it will always be placed at last line otherwise\n if (this._buffer.length - this._firstRow <= this._terminal.rows) {\n rowEnd = this._lastContentCursorRow + 1 - this._firstRow;\n this._lastCursorCol = this._lastContentCursorCol;\n this._lastCursorRow = this._lastContentCursorRow;\n }\n\n let content = '';\n\n for (let i = 0; i < rowEnd; i++) {\n content += this._allRows[i];\n if (i + 1 < rowEnd) {\n content += this._allRowSeparators[i];\n }\n }\n\n // restore the cursor\n if (!excludeFinalCursorPosition) {\n const realCursorRow = this._buffer.baseY + this._buffer.cursorY;\n const realCursorCol = this._buffer.cursorX;\n\n const cursorMoved = (realCursorRow !== this._lastCursorRow || realCursorCol !== this._lastCursorCol);\n\n const moveRight = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}C`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}D`;\n }\n };\n const moveDown = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}B`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}A`;\n }\n };\n\n if (cursorMoved) {\n moveDown(realCursorRow - this._lastCursorRow);\n moveRight(realCursorCol - this._lastCursorCol);\n }\n }\n\n // Restore the cursor's current style, see https://github.com/xtermjs/xterm.js/issues/3677\n // HACK: Internal API access since it's awkward to expose this in the API and serialize will\n // likely be the only consumer\n const curAttrData: IAttributeData = (this._terminal as any)._core._inputHandler._curAttrData;\n const sgrSeq = this._diffStyle(curAttrData, this._cursorStyle);\n if (sgrSeq.length > 0) {\n content += `\\u001b[${sgrSeq.join(';')}m`;\n }\n\n return content;\n }\n}\n\nexport class SerializeAddon implements ITerminalAddon, ISerializeApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n private _serializeBufferByScrollback(terminal: Terminal, buffer: IBuffer, scrollback?: number): string {\n const maxRows = buffer.length;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return this._serializeBufferByRange(terminal, buffer, {\n start: maxRows - correctRows,\n end: maxRows - 1\n }, false);\n }\n\n private _serializeBufferByRange(terminal: Terminal, buffer: IBuffer, range: ISerializeRange, excludeFinalCursorPosition: boolean): string {\n const handler = new StringSerializeHandler(buffer, terminal);\n return handler.serialize({\n start: { x: 0, y: typeof range.start === 'number' ? range.start : range.start.line },\n end: { x: terminal.cols, y: typeof range.end === 'number' ? range.end : range.end.line }\n }, excludeFinalCursorPosition);\n }\n\n private _serializeBufferAsHTML(terminal: Terminal, options: Partial): string {\n const buffer = terminal.buffer.active;\n const handler = new HTMLSerializeHandler(buffer, terminal, options);\n const onlySelection = options.onlySelection ?? false;\n const range = options.range;\n if (range) {\n return handler.serialize({\n start: { x: range.startCol, y: typeof range.startLine === 'number' ? range.startLine : range.startLine },\n end: { x: terminal.cols, y: typeof range.endLine === 'number' ? range.endLine : range.endLine }\n });\n }\n if (!onlySelection) {\n const maxRows = buffer.length;\n const scrollback = options.scrollback;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return handler.serialize({\n start: { x: 0, y: maxRows - correctRows },\n end: { x: terminal.cols, y: maxRows - 1 }\n });\n }\n\n const selection = this._terminal?.getSelectionPosition();\n if (selection !== undefined) {\n return handler.serialize({\n start: { x: selection.start.x, y: selection.start.y },\n end: { x: selection.end.x, y: selection.end.y }\n });\n }\n\n return '';\n }\n\n /**\n * Serializes the scroll region (DECSTBM) if it's not set to the full terminal size.\n * Uses internal API access since scroll region is not exposed in the public API.\n */\n private _serializeScrollRegion(terminal: Terminal): string {\n // HACK: Internal API access since scroll region is not exposed in the public API\n const buffer = (terminal as any)._core.buffer;\n const scrollTop: number = buffer.scrollTop;\n const scrollBottom: number = buffer.scrollBottom;\n\n // Only serialize if scroll region is not the default (full terminal size)\n if (scrollTop !== 0 || scrollBottom !== terminal.rows - 1) {\n // DECSTBM uses 1-based indices: CSI Ps ; Ps r\n return `\\x1b[${scrollTop + 1};${scrollBottom + 1}r`;\n }\n\n return '';\n }\n\n private _serializeModes(terminal: Terminal): string {\n let content = '';\n const modes = terminal.modes;\n\n // Default: false\n if (modes.applicationCursorKeysMode) content += '\\x1b[?1h';\n if (modes.applicationKeypadMode) content += '\\x1b[?66h';\n if (modes.bracketedPasteMode) content += '\\x1b[?2004h';\n if (modes.insertMode) content += '\\x1b[4h';\n if (modes.originMode) content += '\\x1b[?6h';\n if (modes.reverseWraparoundMode) content += '\\x1b[?45h';\n if (modes.sendFocusMode) content += '\\x1b[?1004h';\n // synchronizedOutputMode doesn't need to be serialized as it's a temporary mode\n\n // Default: true\n if (modes.wraparoundMode === false) content += '\\x1b[?7l';\n\n // Default: 'none'\n if (modes.mouseTrackingMode !== 'none') {\n switch (modes.mouseTrackingMode) {\n case 'x10': content += '\\x1b[?9h'; break;\n case 'vt200': content += '\\x1b[?1000h'; break;\n case 'drag': content += '\\x1b[?1002h'; break;\n case 'any': content += '\\x1b[?1003h'; break;\n }\n }\n\n // Cursor visibility (DECTCEM)\n // Default: visible\n if (!modes.showCursor) {\n content += '\\x1b[?25l';\n }\n\n return content;\n }\n\n public serialize(options?: ISerializeOptions): string {\n // TODO: Add combinedData support\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n // Normal buffer\n let content = options?.range\n ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, options.range, true)\n : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, options?.scrollback);\n\n // Alternate buffer\n if (!options?.excludeAltBuffer) {\n if (this._terminal.buffer.active.type === 'alternate') {\n const alternativeScreenContent = this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, undefined);\n content += `\\u001b[?1049h\\u001b[H${alternativeScreenContent}`;\n }\n }\n\n // Modes and scroll region\n if (!options?.excludeModes) {\n content += this._serializeModes(this._terminal);\n content += this._serializeScrollRegion(this._terminal);\n }\n\n return content;\n }\n\n public serializeAsHTML(options?: Partial): string {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n return this._serializeBufferAsHTML(this._terminal, options ?? {});\n }\n\n public dispose(): void { }\n}\n\nexport class HTMLSerializeHandler extends BaseSerializeHandler {\n private _currentRow: string = '';\n\n private _htmlContent = '';\n\n private _ansiColors: Readonly;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal,\n private readonly _options: Partial\n ) {\n super(buffer);\n\n // For xterm headless: fallback to ansi colors\n if ((_terminal as any)._core._themeService) {\n this._ansiColors = (_terminal as any)._core._themeService.colors.ansi;\n }\n else {\n this._ansiColors = DEFAULT_ANSI_COLORS;\n }\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._htmlContent += '
';\n\n    let foreground = '#000000';\n    let background = '#ffffff';\n    if (this._options.includeGlobalBackground ?? false) {\n      foreground = this._terminal.options.theme?.foreground ?? '#ffffff';\n      background = this._terminal.options.theme?.background ?? '#000000';\n    }\n\n    const globalStyleDefinitions = [];\n    globalStyleDefinitions.push('color: ' + foreground + ';');\n    globalStyleDefinitions.push('background-color: ' + background + ';');\n    globalStyleDefinitions.push('font-family: ' + this._terminal.options.fontFamily + ';');\n    globalStyleDefinitions.push('font-size: ' + this._terminal.options.fontSize + 'px;');\n    this._htmlContent += '
';\n }\n\n protected _afterSerialize(): void {\n this._htmlContent += '
';\n this._htmlContent += '
';\n }\n\n protected _rowEnd(row: number, isLastRow: boolean): void {\n this._htmlContent += '
' + this._currentRow + '
';\n this._currentRow = '';\n }\n\n private _getHexColor(cell: IBufferCell, isFg: boolean): string | undefined {\n const color = isFg ? cell.getFgColor() : cell.getBgColor();\n if (isFg ? cell.isFgRGB() : cell.isBgRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n if (isFg ? cell.isFgPalette() : cell.isBgPalette()) {\n return this._ansiColors[color].css;\n }\n return undefined;\n }\n\n private _getUnderlineColor(cell: IBufferCell): string | undefined {\n if (cell.isUnderlineColorDefault()) {\n return undefined;\n }\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n // Palette color\n return this._ansiColors[color].css;\n }\n\n private _getUnderlineStyle(cell: IBufferCell): string {\n switch (cell.getUnderlineStyle()) {\n case UnderlineStyle.SINGLE:\n return 'underline';\n case UnderlineStyle.DOUBLE:\n return 'underline double';\n case UnderlineStyle.CURLY:\n return 'underline wavy';\n case UnderlineStyle.DOTTED:\n return 'underline dotted';\n case UnderlineStyle.DASHED:\n return 'underline dashed';\n default:\n return 'underline';\n }\n }\n\n private _diffStyle(cell: IBufferCell, oldCell: IBufferCell): string[] | undefined {\n const content: string[] = [];\n\n if (attributesEquals(cell, oldCell)) {\n return undefined;\n }\n\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n const fgHexColor = this._getHexColor(cell, true);\n if (fgHexColor) {\n content.push('color: ' + fgHexColor + ';');\n }\n\n const bgHexColor = this._getHexColor(cell, false);\n if (bgHexColor) {\n content.push('background-color: ' + bgHexColor + ';');\n }\n\n if (cell.isInverse()) { content.push('color: #000000; background-color: #BFBFBF;'); }\n if (cell.isBold()) { content.push('font-weight: bold;'); }\n\n // Handle text-decoration (underline, overline, strikethrough, blink)\n const decorations: string[] = [];\n if (cell.isUnderline()) {\n decorations.push(this._getUnderlineStyle(cell));\n }\n if (cell.isOverline()) {\n decorations.push('overline');\n }\n if (cell.isStrikethrough()) {\n decorations.push('line-through');\n }\n if (cell.isBlink()) {\n decorations.push('blink');\n }\n if (decorations.length > 0) {\n content.push('text-decoration: ' + decorations.join(' ') + ';');\n }\n\n // Handle underline color\n if (cell.isUnderline()) {\n const underlineColor = this._getUnderlineColor(cell);\n if (underlineColor) {\n content.push('text-decoration-color: ' + underlineColor + ';');\n }\n }\n\n if (cell.isInvisible()) { content.push('visibility: hidden;'); }\n if (cell.isItalic()) { content.push('font-style: italic;'); }\n if (cell.isDim()) { content.push('opacity: 0.5;'); }\n\n return content;\n }\n\n return undefined;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const styleDefinitions = this._diffStyle(cell, oldCell);\n\n // handles style change\n if (styleDefinitions) {\n this._currentRow += styleDefinitions.length === 0 ?\n '
' :\n '';\n }\n\n // handles actual content\n if (isEmptyCell) {\n this._currentRow += ' ';\n } else {\n this._currentRow += escapeHTMLChar(cell.getChars());\n }\n }\n\n protected _serializeString(): string {\n return this._htmlContent;\n }\n}\n"], - "mappings": ";;;;;;;;;;;;;;;;AAOA,IAAIA,EAAK,EACLC,EAAK,EACLC,EAAK,EACLC,EAAK,EAUF,IAAUC,MAAV,CACE,SAASC,EAAM,EAAWC,EAAWC,EAAWC,EAAoB,CACzE,OAAIA,IAAM,OACD,IAAIC,EAAY,CAAC,CAAC,GAAGA,EAAYH,CAAC,CAAC,GAAGG,EAAYF,CAAC,CAAC,GAAGE,EAAYD,CAAC,CAAC,GAEvE,IAAIC,EAAY,CAAC,CAAC,GAAGA,EAAYH,CAAC,CAAC,GAAGG,EAAYF,CAAC,CAAC,EAC7D,CALOH,EAAS,MAAAC,EAOT,SAASK,EAAO,EAAWJ,EAAWC,EAAWC,EAAY,IAAc,CAIhF,OAAQ,GAAK,GAAKF,GAAK,GAAKC,GAAK,EAAIC,KAAO,CAC9C,CALOJ,EAAS,OAAAM,EAOT,SAASC,EAAQ,EAAWL,EAAWC,EAAWC,EAAoB,CAC3E,MAAO,CACL,IAAKJ,EAAS,MAAM,EAAGE,EAAGC,EAAGC,CAAC,EAC9B,KAAMJ,EAAS,OAAO,EAAGE,EAAGC,EAAGC,CAAC,CAClC,CACF,CALOJ,EAAS,QAAAO,IAfDP,IAAA,IA0BV,IAAUQ,MAAV,CACE,SAASC,EAAMC,EAAYC,EAAoB,CAEpD,GADAC,GAAMD,EAAG,KAAO,KAAQ,IACpBC,IAAO,EACT,MAAO,CACL,IAAKD,EAAG,IACR,KAAMA,EAAG,IACX,EAEF,IAAME,EAAOF,EAAG,MAAQ,GAAM,IACxBG,EAAOH,EAAG,MAAQ,GAAM,IACxBI,EAAOJ,EAAG,MAAQ,EAAK,IACvBK,EAAON,EAAG,MAAQ,GAAM,IACxBO,EAAOP,EAAG,MAAQ,GAAM,IACxBQ,EAAOR,EAAG,MAAQ,EAAK,IAC7BS,EAAKH,EAAM,KAAK,OAAOH,EAAMG,GAAOJ,CAAE,EACtCQ,EAAKH,EAAM,KAAK,OAAOH,EAAMG,GAAOL,CAAE,EACtCS,EAAKH,EAAM,KAAK,OAAOH,EAAMG,GAAON,CAAE,EACtC,IAAMU,EAAMtB,EAAS,MAAMmB,EAAIC,EAAIC,CAAE,EAC/BE,EAAOvB,EAAS,OAAOmB,EAAIC,EAAIC,CAAE,EACvC,MAAO,CAAE,IAAAC,EAAK,KAAAC,CAAK,CACrB,CApBOf,EAAS,MAAAC,EAsBT,SAASe,EAAShB,EAAwB,CAC/C,OAAQA,EAAM,KAAO,OAAU,GACjC,CAFOA,EAAS,SAAAgB,EAIT,SAASC,EAAoBf,EAAYC,EAAYe,EAAmC,CAC7F,IAAMC,EAASJ,EAAK,oBAAoBb,EAAG,KAAMC,EAAG,KAAMe,CAAK,EAC/D,GAAKC,EAGL,OAAO3B,EAAS,QACb2B,GAAU,GAAK,IACfA,GAAU,GAAK,IACfA,GAAU,EAAK,GAClB,CACF,CAVOnB,EAAS,oBAAAiB,EAYT,SAASG,EAAOpB,EAAuB,CAC5C,IAAMqB,GAAarB,EAAM,KAAO,OAAU,EAC1C,OAACW,EAAIC,EAAIC,CAAE,EAAIE,EAAK,WAAWM,CAAS,EACjC,CACL,IAAK7B,EAAS,MAAMmB,EAAIC,EAAIC,CAAE,EAC9B,KAAMQ,CACR,CACF,CAPOrB,EAAS,OAAAoB,EAST,SAASE,EAAQtB,EAAesB,EAAyB,CAC9D,OAAAlB,EAAK,KAAK,MAAMkB,EAAU,GAAI,EAC9B,CAACX,EAAIC,EAAIC,CAAE,EAAIE,EAAK,WAAWf,EAAM,IAAI,EAClC,CACL,IAAKR,EAAS,MAAMmB,EAAIC,EAAIC,EAAIT,CAAE,EAClC,KAAMZ,EAAS,OAAOmB,EAAIC,EAAIC,EAAIT,CAAE,CACtC,CACF,CAPOJ,EAAS,QAAAsB,EAST,SAASC,EAAgBvB,EAAewB,EAAwB,CACrE,OAAApB,EAAKJ,EAAM,KAAO,IACXsB,EAAQtB,EAAQI,EAAKoB,EAAU,GAAI,CAC5C,CAHOxB,EAAS,gBAAAuB,EAKT,SAASE,EAAWzB,EAA0B,CACnD,MAAO,CAAEA,EAAM,MAAQ,GAAM,IAAOA,EAAM,MAAQ,GAAM,IAAOA,EAAM,MAAQ,EAAK,GAAI,CACxF,CAFOA,EAAS,WAAAyB,IA9DDzB,IAAA,IAuEV,IAAUc,MAAV,CAEL,IAAIY,EACAC,EACJ,GAAI,CAEF,IAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQ,EACfA,EAAO,OAAS,EAChB,IAAMC,EAAMD,EAAO,WAAW,KAAM,CAClC,mBAAoB,EACtB,CAAC,EACGC,IACFH,EAAOG,EACPH,EAAK,yBAA2B,OAChCC,EAAeD,EAAK,qBAAqB,EAAG,EAAG,EAAG,CAAC,EAEvD,MACM,CAEN,CASO,SAAS3B,EAAQe,EAAqB,CAE3C,GAAIA,EAAI,MAAM,gBAAgB,EAC5B,OAAQA,EAAI,OAAQ,CAClB,IAAK,GACH,OAAAH,EAAK,SAASG,EAAI,MAAM,EAAG,CAAC,EAAE,OAAO,CAAC,EAAG,EAAE,EAC3CF,EAAK,SAASE,EAAI,MAAM,EAAG,CAAC,EAAE,OAAO,CAAC,EAAG,EAAE,EAC3CD,EAAK,SAASC,EAAI,MAAM,EAAG,CAAC,EAAE,OAAO,CAAC,EAAG,EAAE,EACpCtB,EAAS,QAAQmB,EAAIC,EAAIC,CAAE,EAEpC,IAAK,GACH,OAAAF,EAAK,SAASG,EAAI,MAAM,EAAG,CAAC,EAAE,OAAO,CAAC,EAAG,EAAE,EAC3CF,EAAK,SAASE,EAAI,MAAM,EAAG,CAAC,EAAE,OAAO,CAAC,EAAG,EAAE,EAC3CD,EAAK,SAASC,EAAI,MAAM,EAAG,CAAC,EAAE,OAAO,CAAC,EAAG,EAAE,EAC3CV,EAAK,SAASU,EAAI,MAAM,EAAG,CAAC,EAAE,OAAO,CAAC,EAAG,EAAE,EACpCtB,EAAS,QAAQmB,EAAIC,EAAIC,EAAIT,CAAE,EAExC,IAAK,GACH,MAAO,CACL,IAAAU,EACA,MAAO,SAASA,EAAI,MAAM,CAAC,EAAG,EAAE,GAAK,EAAI,OAAU,CACrD,EACF,IAAK,GACH,MAAO,CACL,IAAAA,EACA,KAAM,SAASA,EAAI,MAAM,CAAC,EAAG,EAAE,IAAM,CACvC,CACJ,CAIF,IAAMgB,EAAYhB,EAAI,MAAM,oFAAoF,EAChH,GAAIgB,EACF,OAAAnB,EAAK,SAASmB,EAAU,CAAC,EAAG,EAAE,EAC9BlB,EAAK,SAASkB,EAAU,CAAC,EAAG,EAAE,EAC9BjB,EAAK,SAASiB,EAAU,CAAC,EAAG,EAAE,EAC9B1B,EAAK,KAAK,OAAO0B,EAAU,CAAC,IAAM,OAAY,EAAI,WAAWA,EAAU,CAAC,CAAC,GAAK,GAAI,EAC3EtC,EAAS,QAAQmB,EAAIC,EAAIC,EAAIT,CAAE,EAIxC,GAAIU,IAAQ,cACV,MAAO,CACL,IAAK,cACL,KAAM,CACR,EAIF,GAAI,CAACY,GAAQ,CAACC,EACZ,MAAM,IAAI,MAAM,qCAAqC,EAOvD,GAFAD,EAAK,UAAYC,EACjBD,EAAK,UAAYZ,EACb,OAAOY,EAAK,WAAc,SAC5B,MAAM,IAAI,MAAM,qCAAqC,EAOvD,GAJAA,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EACxB,CAACf,EAAIC,EAAIC,EAAIT,CAAE,EAAIsB,EAAK,aAAa,EAAG,EAAG,EAAG,CAAC,EAAE,KAG7CtB,IAAO,IACT,MAAM,IAAI,MAAM,qCAAqC,EAMvD,MAAO,CACL,KAAMZ,EAAS,OAAOmB,EAAIC,EAAIC,EAAIT,CAAE,EACpC,IAAAU,CACF,CACF,CA5EOA,EAAS,QAAAf,IA7BDe,IAAA,IA+GV,IAAUiB,MAAV,CAOE,SAASC,EAAkBD,EAAqB,CACrD,OAAOE,EACJF,GAAO,GAAM,IACbA,GAAO,EAAM,IACbA,EAAa,GAAI,CACtB,CALOA,EAAS,kBAAAC,EAeT,SAASC,EAAmBC,EAAWxC,EAAWC,EAAmB,CAC1E,IAAMwC,EAAKD,EAAI,IACTE,EAAK1C,EAAI,IACT2C,EAAK1C,EAAI,IACT2C,EAAKH,GAAM,OAAUA,EAAK,MAAQ,KAAK,KAAKA,EAAK,MAAS,MAAO,GAAG,EACpEI,EAAKH,GAAM,OAAUA,EAAK,MAAQ,KAAK,KAAKA,EAAK,MAAS,MAAO,GAAG,EACpEI,EAAKH,GAAM,OAAUA,EAAK,MAAQ,KAAK,KAAKA,EAAK,MAAS,MAAO,GAAG,EAC1E,OAAOC,EAAK,MAASC,EAAK,MAASC,EAAK,KAC1C,CAROT,EAAS,mBAAAE,IAtBDF,IAAA,IAoCV,IAAUhB,MAAV,CACE,SAASd,EAAMC,EAAYC,EAAoB,CAEpD,GADAC,GAAMD,EAAK,KAAQ,IACfC,IAAO,EACT,OAAOD,EAET,IAAME,EAAOF,GAAM,GAAM,IACnBG,EAAOH,GAAM,GAAM,IACnBI,EAAOJ,GAAM,EAAK,IAClBK,EAAON,GAAM,GAAM,IACnBO,EAAOP,GAAM,GAAM,IACnBQ,EAAOR,GAAM,EAAK,IACxB,OAAAS,EAAKH,EAAM,KAAK,OAAOH,EAAMG,GAAOJ,CAAE,EACtCQ,EAAKH,EAAM,KAAK,OAAOH,EAAMG,GAAOL,CAAE,EACtCS,EAAKH,EAAM,KAAK,OAAOH,EAAMG,GAAON,CAAE,EAC/BZ,EAAS,OAAOmB,EAAIC,EAAIC,CAAE,CACnC,CAfOE,EAAS,MAAAd,EA8BT,SAASgB,EAAoBwB,EAAgBC,EAAgBxB,EAAmC,CACrG,IAAMyB,EAAMZ,EAAI,kBAAkBU,GAAU,CAAC,EACvCG,EAAMb,EAAI,kBAAkBW,GAAU,CAAC,EAE7C,GADWG,EAAcF,EAAKC,CAAG,EACxB1B,EAAO,CACd,GAAI0B,EAAMD,EAAK,CACb,IAAMG,EAAUC,EAAgBN,EAAQC,EAAQxB,CAAK,EAC/C8B,EAAeH,EAAcF,EAAKZ,EAAI,kBAAkBe,GAAW,CAAC,CAAC,EAC3E,GAAIE,EAAe9B,EAAO,CACxB,IAAM+B,EAAUC,EAAkBT,EAAQC,EAAQxB,CAAK,EACjDiC,EAAeN,EAAcF,EAAKZ,EAAI,kBAAkBkB,GAAW,CAAC,CAAC,EAC3E,OAAOD,EAAeG,EAAeL,EAAUG,CACjD,CACA,OAAOH,CACT,CACA,IAAMA,EAAUI,EAAkBT,EAAQC,EAAQxB,CAAK,EACjD8B,EAAeH,EAAcF,EAAKZ,EAAI,kBAAkBe,GAAW,CAAC,CAAC,EAC3E,GAAIE,EAAe9B,EAAO,CACxB,IAAM+B,EAAUF,EAAgBN,EAAQC,EAAQxB,CAAK,EAC/CiC,EAAeN,EAAcF,EAAKZ,EAAI,kBAAkBkB,GAAW,CAAC,CAAC,EAC3E,OAAOD,EAAeG,EAAeL,EAAUG,CACjD,CACA,OAAOH,CACT,CAEF,CAzBO/B,EAAS,oBAAAE,EA2BT,SAAS8B,EAAgBN,EAAgBC,EAAgBxB,EAAuB,CAGrF,IAAMV,EAAOiC,GAAU,GAAM,IACvBhC,EAAOgC,GAAU,GAAM,IACvB/B,EAAO+B,GAAW,EAAK,IACzBpC,EAAOqC,GAAU,GAAM,IACvBpC,EAAOoC,GAAU,GAAM,IACvBnC,EAAOmC,GAAW,EAAK,IACvBU,EAAKP,EAAcd,EAAI,mBAAmB1B,EAAKC,EAAKC,CAAG,EAAGwB,EAAI,mBAAmBvB,EAAKC,EAAKC,CAAG,CAAC,EACnG,KAAO0C,EAAKlC,IAAUb,EAAM,GAAKC,EAAM,GAAKC,EAAM,IAEhDF,GAAO,KAAK,IAAI,EAAG,KAAK,KAAKA,EAAM,EAAG,CAAC,EACvCC,GAAO,KAAK,IAAI,EAAG,KAAK,KAAKA,EAAM,EAAG,CAAC,EACvCC,GAAO,KAAK,IAAI,EAAG,KAAK,KAAKA,EAAM,EAAG,CAAC,EACvC6C,EAAKP,EAAcd,EAAI,mBAAmB1B,EAAKC,EAAKC,CAAG,EAAGwB,EAAI,mBAAmBvB,EAAKC,EAAKC,CAAG,CAAC,EAEjG,OAAQL,GAAO,GAAKC,GAAO,GAAKC,GAAO,EAAI,OAAU,CACvD,CAlBOQ,EAAS,gBAAAgC,EAoBT,SAASG,EAAkBT,EAAgBC,EAAgBxB,EAAuB,CAGvF,IAAMV,EAAOiC,GAAU,GAAM,IACvBhC,EAAOgC,GAAU,GAAM,IACvB/B,EAAO+B,GAAW,EAAK,IACzBpC,EAAOqC,GAAU,GAAM,IACvBpC,EAAOoC,GAAU,GAAM,IACvBnC,EAAOmC,GAAW,EAAK,IACvBU,EAAKP,EAAcd,EAAI,mBAAmB1B,EAAKC,EAAKC,CAAG,EAAGwB,EAAI,mBAAmBvB,EAAKC,EAAKC,CAAG,CAAC,EACnG,KAAO0C,EAAKlC,IAAUb,EAAM,KAAQC,EAAM,KAAQC,EAAM,MAEtDF,EAAM,KAAK,IAAI,IAAMA,EAAM,KAAK,MAAM,IAAMA,GAAO,EAAG,CAAC,EACvDC,EAAM,KAAK,IAAI,IAAMA,EAAM,KAAK,MAAM,IAAMA,GAAO,EAAG,CAAC,EACvDC,EAAM,KAAK,IAAI,IAAMA,EAAM,KAAK,MAAM,IAAMA,GAAO,EAAG,CAAC,EACvD6C,EAAKP,EAAcd,EAAI,mBAAmB1B,EAAKC,EAAKC,CAAG,EAAGwB,EAAI,mBAAmBvB,EAAKC,EAAKC,CAAG,CAAC,EAEjG,OAAQL,GAAO,GAAKC,GAAO,GAAKC,GAAO,EAAI,OAAU,CACvD,CAlBOQ,EAAS,kBAAAmC,EAoBT,SAASG,EAAWC,EAAiD,CAC1E,MAAO,CAAEA,GAAS,GAAM,IAAOA,GAAS,GAAM,IAAOA,GAAS,EAAK,IAAMA,EAAQ,GAAI,CACvF,CAFOvC,EAAS,WAAAsC,IAlGDtC,IAAA,IAuGV,SAASlB,EAAY0D,EAAmB,CAC7C,IAAMC,EAAID,EAAE,SAAS,EAAE,EACvB,OAAOC,EAAE,OAAS,EAAI,IAAMA,EAAIA,CAClC,CAQO,SAASX,EAAcY,EAAYC,EAAoB,CAC5D,OAAID,EAAKC,GACCA,EAAK,MAASD,EAAK,MAErBA,EAAK,MAASC,EAAK,IAC7B,CCzMO,IAAMC,EAAsB,OAAO,QAAQ,IAAM,CACtD,IAAMC,EAAS,CAEbC,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EAErBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,EACrBA,EAAI,QAAQ,SAAS,CACvB,EAIMC,EAAI,CAAC,EAAM,GAAM,IAAM,IAAM,IAAM,GAAI,EAC7C,QAASC,EAAI,EAAGA,EAAI,IAAKA,IAAK,CAC5B,IAAMC,EAAIF,EAAGC,EAAI,GAAM,EAAI,CAAC,EACtBE,EAAIH,EAAGC,EAAI,EAAK,EAAI,CAAC,EACrBG,EAAIJ,EAAEC,EAAI,CAAC,EACjBH,EAAO,KAAK,CACV,IAAKO,EAAS,MAAMH,EAAGC,EAAGC,CAAC,EAC3B,KAAMC,EAAS,OAAOH,EAAGC,EAAGC,CAAC,CAC/B,CAAC,CACH,CAGA,QAASH,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,IAAMK,EAAI,EAAIL,EAAI,GAClBH,EAAO,KAAK,CACV,IAAKO,EAAS,MAAMC,EAAGA,EAAGA,CAAC,EAC3B,KAAMD,EAAS,OAAOC,EAAGA,EAAGA,CAAC,CAC/B,CAAC,CACH,CAEA,OAAOR,CACT,GAAG,CAAC,ECrNJ,SAASS,EAAUC,EAAeC,EAAaC,EAAsB,CACnE,OAAO,KAAK,IAAID,EAAK,KAAK,IAAID,EAAOE,CAAI,CAAC,CAC5C,CAEA,SAASC,EAAeC,EAAmB,CACzC,OAAQA,EAAG,CACT,IAAK,IAAK,MAAO,QACjB,IAAK,IAAK,MAAO,MACnB,CACA,OAAOA,CACT,CAGA,IAAeC,EAAf,KAAoC,CAClC,YACqBC,EACnB,CADmB,aAAAA,CAErB,CAEO,UAAUC,EAAqBC,EAA8C,CAElF,IAAMC,EAAQ,KAAK,QAAQ,YAAY,EACjCC,EAAQ,KAAK,QAAQ,YAAY,EACnCC,EAAUF,EAERG,EAAWL,EAAM,MAAM,EACvBM,EAASN,EAAM,IAAI,EACnBO,EAAcP,EAAM,MAAM,EAC1BQ,EAAYR,EAAM,IAAI,EAE5B,KAAK,iBAAiBM,EAASD,EAAUA,EAAUC,CAAM,EAEzD,QAASG,EAAMJ,EAAUI,GAAOH,EAAQG,IAAO,CAC7C,IAAMC,EAAO,KAAK,QAAQ,QAAQD,CAAG,EACrC,GAAIC,EAAM,CACR,IAAMC,EAAkBF,IAAQT,EAAM,MAAM,EAAIO,EAAc,EACxDK,EAAgBH,IAAQT,EAAM,IAAI,EAAIQ,EAAWE,EAAK,OAC5D,QAASG,EAAMF,EAAiBE,EAAMD,EAAeC,IAAO,CAC1D,IAAMhB,EAAIa,EAAK,QAAQG,EAAKT,IAAYF,EAAQC,EAAQD,CAAK,EAC7D,GAAI,CAACL,EAAG,CACN,QAAQ,KAAK,yBAAyBY,CAAG,SAASI,CAAG,EAAE,EACvD,QACF,CACA,KAAK,UAAUhB,EAAGO,EAASK,EAAKI,CAAG,EACnCT,EAAUP,CACZ,CACF,CACA,KAAK,QAAQY,EAAKA,IAAQH,CAAM,CAClC,CAEA,YAAK,gBAAgB,EAEd,KAAK,iBAAiBL,CAA0B,CACzD,CAEU,UAAUa,EAAmBV,EAAsBK,EAAaI,EAAmB,CAAE,CACrF,QAAQJ,EAAaM,EAA0B,CAAE,CACjD,iBAAiBC,EAAcX,EAAkBC,EAAsB,CAAE,CACzE,iBAAwB,CAAE,CAC1B,iBAAiBL,EAA8C,CAAE,MAAO,EAAI,CACxF,EAEA,SAASgB,EAAQf,EAAqCC,EAA6B,CACjF,OAAOD,EAAM,eAAe,IAAMC,EAAM,eAAe,GAClDD,EAAM,WAAW,IAAMC,EAAM,WAAW,CAC/C,CAEA,SAASe,EAAQhB,EAAqCC,EAA6B,CACjF,OAAOD,EAAM,eAAe,IAAMC,EAAM,eAAe,GAClDD,EAAM,WAAW,IAAMC,EAAM,WAAW,CAC/C,CAEA,SAASgB,EAAejB,EAAqCC,EAA6B,CAGxF,GAAI,CAACD,EAAM,YAAY,GAAK,CAACC,EAAM,YAAY,EAC7C,MAAO,GAET,GAAID,EAAM,kBAAkB,IAAMC,EAAM,kBAAkB,EACxD,MAAO,GAET,IAAMiB,EAAelB,EAAM,wBAAwB,EAC7CmB,EAAelB,EAAM,wBAAwB,EACnD,OAAIiB,GAAgBC,EACX,GAELD,IAAiBC,EACZ,GAEFnB,EAAM,kBAAkB,IAAMC,EAAM,kBAAkB,GACxDD,EAAM,sBAAsB,IAAMC,EAAM,sBAAsB,CACrE,CAEA,SAASmB,EAAWpB,EAAqCC,EAA6B,CACpF,OAAOD,EAAM,UAAU,IAAMC,EAAM,UAAU,GACxCD,EAAM,OAAO,IAAMC,EAAM,OAAO,GAChCD,EAAM,YAAY,IAAMC,EAAM,YAAY,GAC1CgB,EAAejB,EAAOC,CAAK,GAC3BD,EAAM,WAAW,IAAMC,EAAM,WAAW,GACxCD,EAAM,QAAQ,IAAMC,EAAM,QAAQ,GAClCD,EAAM,YAAY,IAAMC,EAAM,YAAY,GAC1CD,EAAM,SAAS,IAAMC,EAAM,SAAS,GACpCD,EAAM,MAAM,IAAMC,EAAM,MAAM,GAC9BD,EAAM,gBAAgB,IAAMC,EAAM,gBAAgB,CACzD,CAEA,SAASoB,EAAiBrB,EAAqCC,EAA6B,CAC1F,IAAMqB,EAAoBtB,EAC1B,OAAI,OAAOsB,EAAkB,kBAAqB,WACzCA,EAAkB,iBAAiBrB,CAAK,EAE1Cc,EAAQf,EAAOC,CAAK,GACtBe,EAAQhB,EAAOC,CAAK,GACpBmB,EAAWpB,EAAOC,CAAK,CAC9B,CAEA,IAAMsB,EAAN,cAAqC3B,CAAqB,CA2BxD,YACE4B,EACiBC,EACjB,CACA,MAAMD,CAAM,EAFK,eAAAC,EA5BnB,KAAQ,UAAoB,EAC5B,KAAQ,SAAqB,IAAI,MACjC,KAAQ,kBAA8B,IAAI,MAC1C,KAAQ,YAAsB,GAC9B,KAAQ,eAAyB,EAKjC,KAAQ,aAA4B,KAAK,QAAQ,YAAY,EAK7D,KAAQ,gBAA0B,EAClC,KAAQ,gBAA0B,EAGlC,KAAQ,gBAA+B,KAAK,QAAQ,YAAY,EAEhE,KAAQ,UAAoB,EAC5B,KAAQ,eAAyB,EACjC,KAAQ,eAAyB,EACjC,KAAQ,sBAAgC,EACxC,KAAQ,sBAAgC,EAgBxC,KAAQ,iBAAgC,KAAK,QAAQ,YAAY,EACjE,KAAQ,uBAAsC,KAAK,QAAQ,YAAY,EACvE,KAAQ,kBAAiC,KAAK,QAAQ,YAAY,CAXlE,CAEU,iBAAiBX,EAAcY,EAAeC,EAAmB,CACzE,KAAK,SAAW,IAAI,MAAcb,CAAI,EACtC,KAAK,sBAAwBY,EAC7B,KAAK,eAAiBA,EACtB,KAAK,UAAYA,CACnB,CAKU,QAAQnB,EAAaM,EAA0B,CAGnD,KAAK,eAAiB,GAAK,CAACG,EAAQ,KAAK,aAAc,KAAK,eAAe,IAE7E,KAAK,aAAe,QAAU,KAAK,cAAc,KAGnD,IAAIY,EAAe,GAGnB,GAAI,CAACf,EAAW,CAEVN,EAAM,KAAK,WAAa,KAAK,UAAU,MACzC,KAAK,QAAQ,QAAQ,KAAK,eAAe,GAAG,QAAQ,KAAK,gBAAiB,KAAK,eAAe,EAIhG,IAAMsB,EAAc,KAAK,QAAQ,QAAQtB,CAAG,EAEtCuB,EAAW,KAAK,QAAQ,QAAQvB,EAAM,CAAC,EAE7C,GAAI,CAACuB,EAAS,UAEZF,EAAe;AAAA,EAEf,KAAK,eAAiBrB,EAAM,EAC5B,KAAK,eAAiB,MACjB,CACLqB,EAAe,GACf,IAAMG,EAAkBF,EAAY,QAAQA,EAAY,OAAS,EAAG,KAAK,gBAAgB,EACnFG,EAAwBH,EAAY,QAAQA,EAAY,OAAS,EAAG,KAAK,sBAAsB,EAC/FI,EAAmBH,EAAS,QAAQ,EAAG,KAAK,iBAAiB,EAC7DI,EAAgCD,EAAiB,SAAS,EAAI,EAIhEE,EAAU,IAIZF,EAAiB,SAAS,GACxBC,EAAgC,KAAK,gBAAkB,EAAI,KAAK,gBAAkB,MAKjFH,EAAgB,SAAS,GAAKA,EAAgB,SAAS,IAAM,IAG9Df,EAAQe,EAAiBE,CAAgB,IAEzCE,EAAU,IAMVD,IACCF,EAAsB,SAAS,GAAKA,EAAsB,SAAS,IAAM,IAG1EhB,EAAQe,EAAiBE,CAAgB,GACzCjB,EAAQgB,EAAuBC,CAAgB,IAE/CE,EAAU,KAITA,IAGHP,EAAe,IAAI,OAAO,KAAK,eAAiB,CAAC,EAEjDA,GAAgB,iBAEZ,KAAK,eAAiB,IAExBA,GAAgB,SAChBA,GAAgB,QAAUC,EAAY,OAAS,KAAK,cAAc,IAClED,GAAgB,QAAU,KAAK,cAAc,IAC7CA,GAAgB,QAAUC,EAAY,OAAS,KAAK,cAAc,IAClED,GAAgB,UAKlB,KAAK,sBAAwBrB,EAAM,EACnC,KAAK,sBAAwB,EAG7B,KAAK,eAAiBA,EAAM,EAC5B,KAAK,eAAiB,EAE1B,CACF,CAEA,KAAK,SAAS,KAAK,SAAS,EAAI,KAAK,YACrC,KAAK,kBAAkB,KAAK,WAAW,EAAIqB,EAC3C,KAAK,YAAc,GACnB,KAAK,eAAiB,CACxB,CAEQ,WAAWhB,EAAoCV,EAAgC,CACrF,IAAMkC,EAAmB,CAAC,EAC1B,GAAIf,EAAiBT,EAAMV,CAAO,EAChC,OAAOkC,EAET,IAAMC,EAAY,CAACtB,EAAQH,EAAMV,CAAO,EAClCoC,EAAY,CAACtB,EAAQJ,EAAMV,CAAO,EAClCqC,EAAe,CAACnB,EAAWR,EAAMV,CAAO,EAE9C,GAAImC,GAAaC,GAAaC,EAC5B,GAAI3B,EAAK,mBAAmB,EACrBV,EAAQ,mBAAmB,GAC9BkC,EAAO,KAAK,CAAC,MAEV,CACL,GAAIC,EAAW,CACb,IAAMG,EAAQ5B,EAAK,WAAW,EAC1BA,EAAK,QAAQ,EAAKwB,EAAO,KAAK,GAAI,EAAII,IAAU,GAAM,IAAOA,IAAU,EAAK,IAAMA,EAAQ,GAAI,EACzF5B,EAAK,YAAY,EACpB4B,GAAS,GAAMJ,EAAO,KAAK,GAAI,EAAGI,CAAK,EACpCJ,EAAO,KAAKI,EAAQ,EAAI,IAAMA,EAAQ,GAAK,IAAMA,EAAQ,EAAE,EAE7DJ,EAAO,KAAK,EAAE,CACvB,CACA,GAAIE,EAAW,CACb,IAAME,EAAQ5B,EAAK,WAAW,EAC1BA,EAAK,QAAQ,EAAKwB,EAAO,KAAK,GAAI,EAAII,IAAU,GAAM,IAAOA,IAAU,EAAK,IAAMA,EAAQ,GAAI,EACzF5B,EAAK,YAAY,EACpB4B,GAAS,GAAMJ,EAAO,KAAK,GAAI,EAAGI,CAAK,EACpCJ,EAAO,KAAKI,EAAQ,EAAI,KAAOA,EAAQ,GAAK,IAAMA,EAAQ,EAAE,EAE9DJ,EAAO,KAAK,EAAE,CACvB,CACA,GAAIG,EAAc,CAGhB,GAFI3B,EAAK,UAAU,IAAMV,EAAQ,UAAU,GAAKkC,EAAO,KAAKxB,EAAK,UAAU,EAAI,EAAI,EAAE,EACjFA,EAAK,OAAO,IAAMV,EAAQ,OAAO,GAAKkC,EAAO,KAAKxB,EAAK,OAAO,EAAI,EAAI,EAAE,EACvEK,EAAeL,EAAMV,CAAO,EAmBtBU,EAAK,YAAY,IAAMV,EAAQ,YAAY,GACpDkC,EAAO,KAAKxB,EAAK,YAAY,EAAI,EAAI,EAAE,MApBL,CAClC,IAAM6B,EAAQ7B,EAAK,kBAAkB,EACrC,GAAI6B,IAAU,EACZL,EAAO,KAAK,EAAE,UACLK,IAAU,GAAyB7B,EAAK,wBAAwB,EACzEwB,EAAO,KAAK,CAAC,UAGbA,EAAO,KAAK,KAAOK,CAA0B,EAEzC,CAAC7B,EAAK,wBAAwB,EAAG,CACnC,IAAM4B,EAAQ5B,EAAK,kBAAkB,EACjCA,EAAK,oBAAoB,EAC3BwB,EAAO,KAAK,UAAaI,IAAU,GAAM,KAAQ,KAAQA,IAAU,EAAK,KAAQ,KAAOA,EAAQ,IAA0B,EAEzHJ,EAAO,KAAK,QAAUI,CAA0B,CAEpD,CAEJ,CAGI5B,EAAK,WAAW,IAAMV,EAAQ,WAAW,GAAKkC,EAAO,KAAKxB,EAAK,WAAW,EAAI,GAAK,EAAE,EACrFA,EAAK,QAAQ,IAAMV,EAAQ,QAAQ,GAAKkC,EAAO,KAAKxB,EAAK,QAAQ,EAAI,EAAI,EAAE,EAC3EA,EAAK,YAAY,IAAMV,EAAQ,YAAY,GAAKkC,EAAO,KAAKxB,EAAK,YAAY,EAAI,EAAI,EAAE,EACvFA,EAAK,SAAS,IAAMV,EAAQ,SAAS,GAAKkC,EAAO,KAAKxB,EAAK,SAAS,EAAI,EAAI,EAAE,EAC9EA,EAAK,MAAM,IAAMV,EAAQ,MAAM,GAAKkC,EAAO,KAAKxB,EAAK,MAAM,EAAI,EAAI,EAAE,EACrEA,EAAK,gBAAgB,IAAMV,EAAQ,gBAAgB,GAAKkC,EAAO,KAAKxB,EAAK,gBAAgB,EAAI,EAAI,EAAE,CACzG,CACF,CAGF,OAAOwB,CACT,CAEU,UAAUxB,EAAmBV,EAAsBK,EAAaI,EAAmB,CAI3F,GAF0BC,EAAK,SAAS,IAAM,EAG5C,OAIF,IAAM8B,EAAc9B,EAAK,SAAS,IAAM,GAElCwB,EAAS,KAAK,WAAWxB,EAAM,KAAK,YAAY,EAStD,GALqB8B,EAAc,CAAC1B,EAAQ,KAAK,aAAcJ,CAAI,EAAIwB,EAAO,OAAS,EAKrE,CAEZ,KAAK,eAAiB,IAEnBpB,EAAQ,KAAK,aAAc,KAAK,eAAe,IAClD,KAAK,aAAe,QAAU,KAAK,cAAc,KAGnD,KAAK,aAAe,QAAU,KAAK,cAAc,IACjD,KAAK,eAAiB,GAGxB,KAAK,sBAAwB,KAAK,eAAiBT,EACnD,KAAK,sBAAwB,KAAK,eAAiBI,EAEnD,KAAK,aAAe,QAAUyB,EAAO,KAAK,GAAG,CAAC,IAG9C,IAAM5B,EAAO,KAAK,QAAQ,QAAQD,CAAG,EACjCC,IAAS,SACXA,EAAK,QAAQG,EAAK,KAAK,YAAY,EACnC,KAAK,gBAAkBJ,EACvB,KAAK,gBAAkBI,EAE3B,CAKI+B,EACF,KAAK,gBAAkB9B,EAAK,SAAS,GAEjC,KAAK,eAAiB,IAIpBI,EAAQ,KAAK,aAAc,KAAK,eAAe,EACjD,KAAK,aAAe,QAAU,KAAK,cAAc,KAEjD,KAAK,aAAe,QAAU,KAAK,cAAc,IACjD,KAAK,aAAe,QAAU,KAAK,cAAc,KAEnD,KAAK,eAAiB,GAGxB,KAAK,aAAeJ,EAAK,SAAS,EAGlC,KAAK,sBAAwB,KAAK,eAAiBL,EACnD,KAAK,sBAAwB,KAAK,eAAiBI,EAAMC,EAAK,SAAS,EAE3E,CAEU,iBAAiBb,EAA6C,CACtE,IAAI4C,EAAS,KAAK,SAAS,OAIvB,KAAK,QAAQ,OAAS,KAAK,WAAa,KAAK,UAAU,OACzDA,EAAS,KAAK,sBAAwB,EAAI,KAAK,UAC/C,KAAK,eAAiB,KAAK,sBAC3B,KAAK,eAAiB,KAAK,uBAG7B,IAAIC,EAAU,GAEd,QAAS,EAAI,EAAG,EAAID,EAAQ,IAC1BC,GAAW,KAAK,SAAS,CAAC,EACtB,EAAI,EAAID,IACVC,GAAW,KAAK,kBAAkB,CAAC,GAKvC,GAAI,CAAC7C,EAA4B,CAC/B,IAAM8C,EAAgB,KAAK,QAAQ,MAAQ,KAAK,QAAQ,QAClDC,EAAgB,KAAK,QAAQ,QAE7BC,EAAeF,IAAkB,KAAK,gBAAkBC,IAAkB,KAAK,eAE/EE,EAAaC,GAAyB,CACtCA,EAAS,EACXL,GAAW,QAAUK,CAAM,IAClBA,EAAS,IAClBL,GAAW,QAAU,CAACK,CAAM,IAEhC,EASIF,KARcE,GAAyB,CACrCA,EAAS,EACXL,GAAW,QAAUK,CAAM,IAClBA,EAAS,IAClBL,GAAW,QAAU,CAACK,CAAM,IAEhC,GAGWJ,EAAgB,KAAK,cAAc,EAC5CG,EAAUF,EAAgB,KAAK,cAAc,EAEjD,CAKA,IAAMI,EAA+B,KAAK,UAAkB,MAAM,cAAc,aAC1Ed,EAAS,KAAK,WAAWc,EAAa,KAAK,YAAY,EAC7D,OAAId,EAAO,OAAS,IAClBQ,GAAW,QAAUR,EAAO,KAAK,GAAG,CAAC,KAGhCQ,CACT,CACF,EAEaO,EAAN,KAA8D,CAG5D,SAASC,EAA0B,CACxC,KAAK,UAAYA,CACnB,CAEQ,6BAA6BA,EAAoB5B,EAAiB6B,EAA6B,CACrG,IAAMC,EAAU9B,EAAO,OACjB+B,EAAeF,IAAe,OAAaC,EAAUhE,EAAU+D,EAAaD,EAAS,KAAM,EAAGE,CAAO,EAC3G,OAAO,KAAK,wBAAwBF,EAAU5B,EAAQ,CACpD,MAAO8B,EAAUC,EACjB,IAAKD,EAAU,CACjB,EAAG,EAAK,CACV,CAEQ,wBAAwBF,EAAoB5B,EAAiB1B,EAAwBC,EAA6C,CAExI,OADgB,IAAIwB,EAAuBC,EAAQ4B,CAAQ,EAC5C,UAAU,CACvB,MAAO,CAAE,EAAG,EAAe,EAAG,OAAOtD,EAAM,OAAU,SAAWA,EAAM,MAAQA,EAAM,MAAM,IAAK,EAC/F,IAAO,CAAE,EAAGsD,EAAS,KAAM,EAAG,OAAOtD,EAAM,KAAU,SAAWA,EAAM,IAAQA,EAAM,IAAI,IAAO,CACjG,EAAGC,CAA0B,CAC/B,CAEQ,uBAAuBqD,EAAoBI,EAAiD,CAClG,IAAMhC,EAAS4B,EAAS,OAAO,OACzBK,EAAU,IAAIC,EAAqBlC,EAAQ4B,EAAUI,CAAO,EAC5DG,EAAgBH,EAAQ,eAAiB,GACzC1D,EAAQ0D,EAAQ,MACtB,GAAI1D,EACF,OAAO2D,EAAQ,UAAU,CACvB,MAAO,CAAE,EAAG3D,EAAM,SAAsB,GAAG,OAAOA,EAAM,WAAc,SAAWA,EAAM,UAA4B,EACnH,IAAO,CAAE,EAAGsD,EAAS,KAAM,GAAG,OAAOtD,EAAM,SAAc,SAAWA,EAAM,QAA4B,CACxG,CAAC,EAEH,GAAI,CAAC6D,EAAe,CAClB,IAAML,EAAU9B,EAAO,OACjB6B,EAAaG,EAAQ,WACrBD,EAAeF,IAAe,OAAaC,EAAUhE,EAAU+D,EAAaD,EAAS,KAAM,EAAGE,CAAO,EAC3G,OAAOG,EAAQ,UAAU,CACvB,MAAO,CAAE,EAAG,EAAe,EAAGH,EAAUC,CAAY,EACpD,IAAO,CAAE,EAAGH,EAAS,KAAM,EAAGE,EAAU,CAAY,CACtD,CAAC,CACH,CAEA,IAAMM,EAAY,KAAK,WAAW,qBAAqB,EACvD,OAAIA,IAAc,OACTH,EAAQ,UAAU,CACvB,MAAO,CAAE,EAAGG,EAAU,MAAM,EAAG,EAAGA,EAAU,MAAM,CAAE,EACpD,IAAO,CAAE,EAAGA,EAAU,IAAI,EAAK,EAAGA,EAAU,IAAI,CAAI,CACtD,CAAC,EAGI,EACT,CAMQ,uBAAuBR,EAA4B,CAEzD,IAAM5B,EAAU4B,EAAiB,MAAM,OACjCS,EAAoBrC,EAAO,UAC3BsC,EAAuBtC,EAAO,aAGpC,OAAIqC,IAAc,GAAKC,IAAiBV,EAAS,KAAO,EAE/C,QAAQS,EAAY,CAAC,IAAIC,EAAe,CAAC,IAG3C,EACT,CAEQ,gBAAgBV,EAA4B,CAClD,IAAIR,EAAU,GACRmB,EAAQX,EAAS,MAgBvB,GAbIW,EAAM,4BAA2BnB,GAAW,YAC5CmB,EAAM,wBAAuBnB,GAAW,aACxCmB,EAAM,qBAAoBnB,GAAW,eACrCmB,EAAM,aAAYnB,GAAW,WAC7BmB,EAAM,aAAYnB,GAAW,YAC7BmB,EAAM,wBAAuBnB,GAAW,aACxCmB,EAAM,gBAAenB,GAAW,eAIhCmB,EAAM,iBAAmB,KAAOnB,GAAW,YAG3CmB,EAAM,oBAAsB,OAC9B,OAAQA,EAAM,kBAAmB,CAC/B,IAAK,MAAOnB,GAAW,WAAY,MACnC,IAAK,QAASA,GAAW,cAAe,MACxC,IAAK,OAAQA,GAAW,cAAe,MACvC,IAAK,MAAOA,GAAW,cAAe,KACxC,CAKF,OAAKmB,EAAM,aACTnB,GAAW,aAGNA,CACT,CAEO,UAAUY,EAAqC,CAEpD,GAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,2CAA2C,EAI7D,IAAIZ,EAAUY,GAAS,MACnB,KAAK,wBAAwB,KAAK,UAAW,KAAK,UAAU,OAAO,OAAQA,EAAQ,MAAO,EAAI,EAC9F,KAAK,6BAA6B,KAAK,UAAW,KAAK,UAAU,OAAO,OAAQA,GAAS,UAAU,EAGvG,GAAI,CAACA,GAAS,kBACR,KAAK,UAAU,OAAO,OAAO,OAAS,YAAa,CACrD,IAAMQ,EAA2B,KAAK,6BAA6B,KAAK,UAAW,KAAK,UAAU,OAAO,UAAW,MAAS,EAC7HpB,GAAW,oBAAwBoB,CAAwB,EAC7D,CAIF,OAAKR,GAAS,eACZZ,GAAW,KAAK,gBAAgB,KAAK,SAAS,EAC9CA,GAAW,KAAK,uBAAuB,KAAK,SAAS,GAGhDA,CACT,CAEO,gBAAgBY,EAAkD,CACvE,GAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,2CAA2C,EAG7D,OAAO,KAAK,uBAAuB,KAAK,UAAWA,GAAW,CAAC,CAAC,CAClE,CAEO,SAAgB,CAAE,CAC3B,EAEaE,EAAN,cAAmC9D,CAAqB,CAO7D,YACE4B,EACiBC,EACAwC,EACjB,CACA,MAAMzC,CAAM,EAHK,eAAAC,EACA,cAAAwC,EATnB,KAAQ,YAAsB,GAE9B,KAAQ,aAAe,GAYhBxC,EAAkB,MAAM,cAC3B,KAAK,YAAeA,EAAkB,MAAM,cAAc,OAAO,KAGjE,KAAK,YAAcyC,CAEvB,CAEU,iBAAiBpD,EAAcY,EAAeC,EAAmB,CACzE,KAAK,cAAgB,wCAErB,IAAIwC,EAAa,UACbC,EAAa,WACb,KAAK,SAAS,yBAA2B,MAC3CD,EAAa,KAAK,UAAU,QAAQ,OAAO,YAAc,UACzDC,EAAa,KAAK,UAAU,QAAQ,OAAO,YAAc,WAG3D,IAAMC,EAAyB,CAAC,EAChCA,EAAuB,KAAK,UAAYF,EAAa,GAAG,EACxDE,EAAuB,KAAK,qBAAuBD,EAAa,GAAG,EACnEC,EAAuB,KAAK,gBAAkB,KAAK,UAAU,QAAQ,WAAa,GAAG,EACrFA,EAAuB,KAAK,cAAgB,KAAK,UAAU,QAAQ,SAAW,KAAK,EACnF,KAAK,cAAgB,eAAkBA,EAAuB,KAAK,GAAG,EAAI,IAC5E,CAEU,iBAAwB,CAChC,KAAK,cAAgB,SACrB,KAAK,cAAgB,wCACvB,CAEU,QAAQ9D,EAAaM,EAA0B,CACvD,KAAK,cAAgB,cAAgB,KAAK,YAAc,gBACxD,KAAK,YAAc,EACrB,CAEQ,aAAaD,EAAmB0D,EAAmC,CACzE,IAAM9B,EAAQ8B,EAAO1D,EAAK,WAAW,EAAIA,EAAK,WAAW,EACzD,GAAI0D,EAAO1D,EAAK,QAAQ,EAAIA,EAAK,QAAQ,EAMvC,MAAO,IALK,CACT4B,GAAS,GAAM,IACfA,GAAU,EAAK,IACfA,EAAe,GAClB,EACiB,IAAI+B,GAAKA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EAEpE,GAAID,EAAO1D,EAAK,YAAY,EAAIA,EAAK,YAAY,EAC/C,OAAO,KAAK,YAAY4B,CAAK,EAAE,GAGnC,CAEQ,mBAAmB5B,EAAuC,CAChE,GAAIA,EAAK,wBAAwB,EAC/B,OAEF,IAAM4B,EAAQ5B,EAAK,kBAAkB,EACrC,OAAIA,EAAK,oBAAoB,EAMpB,IALK,CACT4B,GAAS,GAAM,IACfA,GAAU,EAAK,IACfA,EAAe,GAClB,EACiB,IAAI+B,GAAKA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EAG7D,KAAK,YAAY/B,CAAK,EAAE,GACjC,CAEQ,mBAAmB5B,EAA2B,CACpD,OAAQA,EAAK,kBAAkB,EAAG,CAChC,OACE,MAAO,YACT,OACE,MAAO,mBACT,OACE,MAAO,iBACT,OACE,MAAO,mBACT,OACE,MAAO,mBACT,QACE,MAAO,WACX,CACF,CAEQ,WAAWA,EAAmBV,EAA4C,CAChF,IAAM0C,EAAoB,CAAC,EAE3B,GAAIvB,EAAiBT,EAAMV,CAAO,EAChC,OAGF,IAAMmC,EAAY,CAACtB,EAAQH,EAAMV,CAAO,EAClCoC,EAAY,CAACtB,EAAQJ,EAAMV,CAAO,EAClCqC,EAAe,CAACnB,EAAWR,EAAMV,CAAO,EAE9C,GAAImC,GAAaC,GAAaC,EAAc,CAC1C,IAAMiC,EAAa,KAAK,aAAa5D,EAAM,EAAI,EAC3C4D,GACF5B,EAAQ,KAAK,UAAY4B,EAAa,GAAG,EAG3C,IAAMC,EAAa,KAAK,aAAa7D,EAAM,EAAK,EAC5C6D,GACF7B,EAAQ,KAAK,qBAAuB6B,EAAa,GAAG,EAGlD7D,EAAK,UAAU,GAAKgC,EAAQ,KAAK,4CAA4C,EAC7EhC,EAAK,OAAO,GAAKgC,EAAQ,KAAK,oBAAoB,EAGtD,IAAM8B,EAAwB,CAAC,EAkB/B,GAjBI9D,EAAK,YAAY,GACnB8D,EAAY,KAAK,KAAK,mBAAmB9D,CAAI,CAAC,EAE5CA,EAAK,WAAW,GAClB8D,EAAY,KAAK,UAAU,EAEzB9D,EAAK,gBAAgB,GACvB8D,EAAY,KAAK,cAAc,EAE7B9D,EAAK,QAAQ,GACf8D,EAAY,KAAK,OAAO,EAEtBA,EAAY,OAAS,GACvB9B,EAAQ,KAAK,oBAAsB8B,EAAY,KAAK,GAAG,EAAI,GAAG,EAI5D9D,EAAK,YAAY,EAAG,CACtB,IAAM+D,EAAiB,KAAK,mBAAmB/D,CAAI,EAC/C+D,GACF/B,EAAQ,KAAK,0BAA4B+B,EAAiB,GAAG,CAEjE,CAEA,OAAI/D,EAAK,YAAY,GAAKgC,EAAQ,KAAK,qBAAqB,EACxDhC,EAAK,SAAS,GAAKgC,EAAQ,KAAK,qBAAqB,EACrDhC,EAAK,MAAM,GAAKgC,EAAQ,KAAK,eAAe,EAEzCA,CACT,CAGF,CAEU,UAAUhC,EAAmBV,EAAsBK,EAAaI,EAAmB,CAG3F,GAD0BC,EAAK,SAAS,IAAM,EAE5C,OAIF,IAAM8B,EAAc9B,EAAK,SAAS,IAAM,GAElCgE,EAAmB,KAAK,WAAWhE,EAAMV,CAAO,EAGlD0E,IACF,KAAK,aAAeA,EAAiB,SAAW,EAC9C,gBACA,uBAA0BA,EAAiB,KAAK,GAAG,EAAI,MAIvDlC,EACF,KAAK,aAAe,IAEpB,KAAK,aAAehD,EAAekB,EAAK,SAAS,CAAC,CAEtD,CAEU,kBAA2B,CACnC,OAAO,KAAK,YACd,CACF", - "names": ["$r", "$g", "$b", "$a", "channels", "toCss", "g", "b", "a", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "$a", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "$r", "$g", "$b", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "r", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "DEFAULT_ANSI_COLORS", "colors", "css", "v", "i", "r", "g", "b", "channels", "c", "constrain", "value", "low", "high", "escapeHTMLChar", "c", "BaseSerializeHandler", "_buffer", "range", "excludeFinalCursorPosition", "cell1", "cell2", "oldCell", "startRow", "endRow", "startColumn", "endColumn", "row", "line", "startLineColumn", "endLineColumn", "col", "cell", "isLastRow", "rows", "equalFg", "equalBg", "equalUnderline", "cell1Default", "cell2Default", "equalFlags", "attributesEquals", "cell1AsBufferCell", "StringSerializeHandler", "buffer", "_terminal", "start", "end", "rowSeparator", "currentLine", "nextLine", "thisRowLastChar", "thisRowLastSecondChar", "nextRowFirstChar", "isNextRowFirstCharDoubleWidth", "isValid", "sgrSeq", "fgChanged", "bgChanged", "flagsChanged", "color", "style", "isEmptyCell", "rowEnd", "content", "realCursorRow", "realCursorCol", "cursorMoved", "moveRight", "offset", "curAttrData", "SerializeAddon", "terminal", "scrollback", "maxRows", "correctRows", "options", "handler", "HTMLSerializeHandler", "onlySelection", "selection", "scrollTop", "scrollBottom", "modes", "alternativeScreenContent", "_options", "DEFAULT_ANSI_COLORS", "foreground", "background", "globalStyleDefinitions", "isFg", "x", "fgHexColor", "bgHexColor", "decorations", "underlineColor", "styleDefinitions"] + "sourcesContent": ["/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * (EXPERIMENTAL) This Addon is still under development\n */\n\nimport type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize';\nimport { IColor } from 'common/Types';\nimport { IAttributeData } from 'common/buffer/Types';\nimport { DEFAULT_ANSI_COLORS } from 'browser/Types';\nimport { UnderlineStyle } from 'common/buffer/Constants';\n\ntype OscLinkData = { id?: string; uri: string };\ntype OscLinkedCell = { extended?: { urlId?: number } };\ntype TerminalWithOscLinks = Terminal & {\n _core?: {\n _inputHandler?: { _curAttrData?: IAttributeData & OscLinkedCell };\n _oscLinkService?: { getLinkData: (linkId: number) => OscLinkData | undefined };\n };\n};\n\nfunction getOscLinkId(cell: IBufferCell | IAttributeData): number {\n return (cell as typeof cell & OscLinkedCell).extended?.urlId ?? 0;\n}\n\nfunction getOscLinkOpenSequence(terminal: Terminal, linkId: number): string {\n if (!linkId) {\n return '';\n }\n const data = (terminal as TerminalWithOscLinks)._core?._oscLinkService?.getLinkData(linkId);\n if (!data) {\n return '';\n }\n const params = data.id === undefined ? '' : `id=${data.id}`;\n return `\\u001b]8;${params};${data.uri}\\u001b\\\\`;\n}\n\nfunction getActiveOscLinkSequence(terminal: Terminal): string {\n const attrs = (terminal as TerminalWithOscLinks)._core?._inputHandler?._curAttrData;\n return attrs ? getOscLinkOpenSequence(terminal, getOscLinkId(attrs)) : '';\n}\n\nfunction constrain(value: number, low: number, high: number): number {\n return Math.max(low, Math.min(value, high));\n}\n\nfunction escapeHTMLChar(c: string): string {\n switch (c) {\n case '&': return '&';\n case '<': return '<';\n }\n return c;\n}\n\n// TODO: Refine this template class later\nabstract class BaseSerializeHandler {\n constructor(\n protected readonly _buffer: IBuffer\n ) {\n }\n\n public serialize(range: IBufferRange, excludeFinalCursorPosition?: boolean): string {\n // we need two of them to flip between old and new cell\n const cell1 = this._buffer.getNullCell();\n const cell2 = this._buffer.getNullCell();\n let oldCell = cell1;\n\n const startRow = range.start.y;\n const endRow = range.end.y;\n const startColumn = range.start.x;\n const endColumn = range.end.x;\n\n this._beforeSerialize(endRow - startRow, startRow, endRow);\n\n for (let row = startRow; row <= endRow; row++) {\n const line = this._buffer.getLine(row);\n if (line) {\n const startLineColumn = row === range.start.y ? startColumn : 0;\n const endLineColumn = row === range.end.y ? endColumn: line.length;\n for (let col = startLineColumn; col < endLineColumn; col++) {\n const c = line.getCell(col, oldCell === cell1 ? cell2 : cell1);\n if (!c) {\n console.warn(`Can't get cell at row=${row}, col=${col}`);\n continue;\n }\n this._nextCell(c, oldCell, row, col);\n oldCell = c;\n }\n }\n this._rowEnd(row, row === endRow);\n }\n\n this._afterSerialize();\n\n return this._serializeString(excludeFinalCursorPosition);\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { }\n protected _rowEnd(row: number, isLastRow: boolean): void { }\n protected _beforeSerialize(rows: number, startRow: number, endRow: number): void { }\n protected _afterSerialize(): void { }\n protected _serializeString(excludeFinalCursorPosition?: boolean): string { return ''; }\n}\n\nfunction equalFg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getFgColorMode() === cell2.getFgColorMode()\n && cell1.getFgColor() === cell2.getFgColor();\n}\n\nfunction equalBg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getBgColorMode() === cell2.getBgColorMode()\n && cell1.getBgColor() === cell2.getBgColor();\n}\n\nfunction equalUnderline(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n // If neither cell has underline, consider them equal regardless of internal underline color\n // values\n if (!cell1.isUnderline() && !cell2.isUnderline()) {\n return true;\n }\n if (cell1.getUnderlineStyle() !== cell2.getUnderlineStyle()) {\n return false;\n }\n const cell1Default = cell1.isUnderlineColorDefault();\n const cell2Default = cell2.isUnderlineColorDefault();\n if (cell1Default && cell2Default) {\n return true;\n }\n if (cell1Default !== cell2Default) {\n return false;\n }\n return cell1.getUnderlineColor() === cell2.getUnderlineColor()\n && cell1.getUnderlineColorMode() === cell2.getUnderlineColorMode();\n}\n\nfunction equalFlags(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.isInverse() === cell2.isInverse()\n && cell1.isBold() === cell2.isBold()\n && cell1.isUnderline() === cell2.isUnderline()\n && equalUnderline(cell1, cell2)\n && cell1.isOverline() === cell2.isOverline()\n && cell1.isBlink() === cell2.isBlink()\n && cell1.isInvisible() === cell2.isInvisible()\n && cell1.isItalic() === cell2.isItalic()\n && cell1.isDim() === cell2.isDim()\n && cell1.isStrikethrough() === cell2.isStrikethrough();\n}\n\nfunction attributesEquals(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n const cell1AsBufferCell = cell1 as IBufferCell;\n if (typeof cell1AsBufferCell.attributesEquals === 'function') {\n return cell1AsBufferCell.attributesEquals(cell2);\n }\n return equalFg(cell1, cell2)\n && equalBg(cell1, cell2)\n && equalFlags(cell1, cell2);\n}\n\nclass StringSerializeHandler extends BaseSerializeHandler {\n private _rowIndex: number = 0;\n private _allRows: string[] = new Array();\n private _allRowSeparators: string[] = new Array();\n private _currentRow: string = '';\n private _nullCellCount: number = 0;\n\n // we can see a full colored cell and a null cell that only have background the same style\n // but the information isn't preserved by null cell itself\n // so wee need to record it when required.\n private _cursorStyle: IBufferCell = this._buffer.getNullCell();\n\n // where exact the cursor styles comes from\n // because we can't copy the cell directly\n // so we remember where the content comes from instead\n private _cursorStyleRow: number = 0;\n private _cursorStyleCol: number = 0;\n\n // this is a null cell for reference for checking whether background is empty or not\n private _backgroundCell: IBufferCell = this._buffer.getNullCell();\n private _defaultCell: IBufferCell = this._buffer.getNullCell();\n\n private _firstRow: number = 0;\n private _lastCursorRow: number = 0;\n private _lastCursorCol: number = 0;\n private _lastContentCursorRow: number = 0;\n private _lastContentCursorCol: number = 0;\n private _activeOscLinkId: number = 0;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal\n ) {\n super(buffer);\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._allRows = new Array(rows);\n this._lastContentCursorRow = start;\n this._lastCursorRow = start;\n this._firstRow = start;\n }\n\n private _thisRowLastChar: IBufferCell = this._buffer.getNullCell();\n private _thisRowLastSecondChar: IBufferCell = this._buffer.getNullCell();\n private _nextRowFirstChar: IBufferCell = this._buffer.getNullCell();\n protected _rowEnd(row: number, isLastRow: boolean): void {\n // if there is colorful empty cell at line end, we must pad it back, or the color block\n // will missing\n if (this._nullCellCount > 0 && !equalBg(this._cursorStyle, this._backgroundCell)) {\n // use clear right to set background.\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n\n let rowSeparator = '';\n\n // handle row separator\n if (!isLastRow) {\n // Enable BCE\n if (row - this._firstRow >= this._terminal.rows) {\n this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);\n }\n\n // Fetch current line\n const currentLine = this._buffer.getLine(row)!;\n // Fetch next line\n const nextLine = this._buffer.getLine(row + 1)!;\n\n if (!nextLine.isWrapped) {\n // just insert the line break\n rowSeparator = '\\r\\n';\n // we sended the enter\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n } else {\n rowSeparator = '';\n const thisRowLastChar = currentLine.getCell(currentLine.length - 1, this._thisRowLastChar)!;\n const thisRowLastSecondChar = currentLine.getCell(currentLine.length - 2, this._thisRowLastSecondChar)!;\n const nextRowFirstChar = nextLine.getCell(0, this._nextRowFirstChar)!;\n const isNextRowFirstCharDoubleWidth = nextRowFirstChar.getWidth() > 1;\n\n // validate whether this line wrap is ever possible\n // which mean whether cursor can placed at a overflow position (x === row) naturally\n let isValid = false;\n\n if (\n // you must output character to cause overflow, control sequence can't do this\n nextRowFirstChar.getChars() &&\n (isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0)\n ) {\n if (\n // the last character can't be null,\n // you can't use control sequence to move cursor to (x === row)\n (thisRowLastChar.getChars() || thisRowLastChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n\n if (\n // the second to last character can't be null if the next line starts with CJK,\n // you can't use control sequence to move cursor to (x === row)\n isNextRowFirstCharDoubleWidth &&\n (thisRowLastSecondChar.getChars() || thisRowLastSecondChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar) &&\n equalBg(thisRowLastSecondChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n }\n\n if (!isValid) {\n // force the wrap with magic\n // insert enough character to force the wrap\n rowSeparator = '-'.repeat(this._nullCellCount + 1);\n // move back and erase next line head\n rowSeparator += '\\u001b[1D\\u001b[1X';\n\n if (this._nullCellCount > 0) {\n // do these because we filled the last several null slot, which we shouldn't\n rowSeparator += '\\u001b[A';\n const contentCellCount = currentLine.length - this._nullCellCount;\n if (contentCellCount > 0) {\n rowSeparator += `\\u001b[${contentCellCount}C`;\n }\n rowSeparator += `\\u001b[${this._nullCellCount}X`;\n if (contentCellCount > 0) {\n rowSeparator += `\\u001b[${contentCellCount}D`;\n }\n rowSeparator += '\\u001b[B';\n }\n\n // This is content and need the be serialized even it is invisible.\n // without this, wrap will be missing from outputs.\n this._lastContentCursorRow = row + 1;\n this._lastContentCursorCol = 0;\n\n // force commit the cursor position\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n }\n }\n }\n\n this._allRows[this._rowIndex] = this._currentRow;\n this._allRowSeparators[this._rowIndex++] = rowSeparator;\n this._currentRow = '';\n this._nullCellCount = 0;\n }\n\n private _diffStyle(cell: IBufferCell | IAttributeData, oldCell: IBufferCell): number[] {\n const sgrSeq: number[] = [];\n if (attributesEquals(cell, oldCell)) {\n return sgrSeq;\n }\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n if (cell.isAttributeDefault()) {\n if (!oldCell.isAttributeDefault()) {\n sgrSeq.push(0);\n }\n } else {\n if (fgChanged) {\n const color = cell.getFgColor();\n if (cell.isFgRGB()) { sgrSeq.push(38, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isFgPalette()) {\n if (color >= 16) { sgrSeq.push(38, 5, color); }\n else { sgrSeq.push(color & 8 ? 90 + (color & 7) : 30 + (color & 7)); }\n }\n else { sgrSeq.push(39); }\n }\n if (bgChanged) {\n const color = cell.getBgColor();\n if (cell.isBgRGB()) { sgrSeq.push(48, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isBgPalette()) {\n if (color >= 16) { sgrSeq.push(48, 5, color); }\n else { sgrSeq.push(color & 8 ? 100 + (color & 7) : 40 + (color & 7)); }\n }\n else { sgrSeq.push(49); }\n }\n if (flagsChanged) {\n if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); }\n // PATCH(orca): bold (1) and dim (2) share the single reset param 22, so\n // they must be diffed as one intensity group with the clearing 22 emitted\n // BEFORE any re-set. Upstream's independent per-flag diff could emit\n // \"1;22\" (bold set, then wiped by dim's clear \u2014 \\x1b[2mA\\x1b[22m\\x1b[1mB\n // loses B's bold on round-trip) or a bare \"22\" that drops a still-set\n // bold/dim, garbling Orca's hidden-terminal snapshot restores.\n const boldChanged = cell.isBold() !== oldCell.isBold();\n const dimChanged = cell.isDim() !== oldCell.isDim();\n if (boldChanged || dimChanged) {\n const clearsIntensity = (boldChanged && !cell.isBold()) || (dimChanged && !cell.isDim());\n if (clearsIntensity) { sgrSeq.push(22); }\n if (cell.isBold() && (boldChanged || clearsIntensity)) { sgrSeq.push(1); }\n if (cell.isDim() && (dimChanged || clearsIntensity)) { sgrSeq.push(2); }\n }\n if (!equalUnderline(cell, oldCell)) {\n const style = cell.getUnderlineStyle();\n if (style === UnderlineStyle.NONE) {\n sgrSeq.push(24);\n } else if (style === UnderlineStyle.SINGLE && cell.isUnderlineColorDefault()) {\n sgrSeq.push(4);\n } else {\n // Use SGR 4:X format for underline styles\n sgrSeq.push('4:' + style as unknown as number);\n // Handle underline color\n if (!cell.isUnderlineColorDefault()) {\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n sgrSeq.push('58:2::' + ((color >>> 16) & 0xFF) + ':' + ((color >>> 8) & 0xFF) + ':' + (color & 0xFF) as unknown as number);\n } else {\n sgrSeq.push('58:5:' + color as unknown as number);\n }\n }\n }\n } else if (cell.isUnderline() !== oldCell.isUnderline()) {\n sgrSeq.push(cell.isUnderline() ? 4 : 24);\n }\n if (cell.isOverline() !== oldCell.isOverline()) { sgrSeq.push(cell.isOverline() ? 53 : 55); }\n if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); }\n if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); }\n if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); }\n // PATCH(orca): dim handled in the intensity group above.\n if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); }\n }\n }\n }\n\n return sgrSeq;\n }\n\n private _setOscLink(linkId: number): string {\n if (linkId === this._activeOscLinkId) {\n return '';\n }\n let sequence = this._activeOscLinkId ? '\\u001b]8;;\\u001b\\\\' : '';\n this._activeOscLinkId = 0;\n const openSequence = getOscLinkOpenSequence(this._terminal, linkId);\n if (openSequence) {\n this._activeOscLinkId = linkId;\n sequence += openSequence;\n }\n return sequence;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n const nextLine = isEmptyCell && cell.isInverse() ? this._buffer.getLine(row + 1) : undefined;\n const nextRowFirstCell = nextLine?.getCell(0, this._nextRowFirstChar);\n // A pending wide glyph recreates its own final-column padding during replay.\n const isWideWrapPadding = col === this._terminal.cols - 1 &&\n nextLine?.isWrapped &&\n (nextRowFirstCell?.getWidth() ?? 0) > 1 &&\n !!nextRowFirstCell && attributesEquals(cell, nextRowFirstCell);\n // Cursor movement cannot reproduce an inverse cell's visible background.\n const materializeEmptyCell = isEmptyCell && !!cell.isInverse() && !isWideWrapPadding;\n\n const sgrSeq = this._diffStyle(cell, this._cursorStyle);\n\n const styleChanged = isEmptyCell\n ? materializeEmptyCell ? sgrSeq.length > 0 : !equalBg(this._cursorStyle, cell)\n : sgrSeq.length > 0;\n\n /**\n * handles style change\n */\n if (styleChanged) {\n // before update the style, we need to fill empty cell back\n if (this._nullCellCount > 0) {\n // use clear right to set background.\n if (!equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n // use move right to move cursor.\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n this._nullCellCount = 0;\n }\n\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col;\n\n this._currentRow += `\\u001b[${sgrSeq.join(';')}m`;\n\n // update the last cursor style\n const line = this._buffer.getLine(row);\n if (line !== undefined) {\n line.getCell(col, this._cursorStyle);\n this._cursorStyleRow = row;\n this._cursorStyleCol = col;\n }\n }\n\n /**\n * handles actual content\n */\n if (isEmptyCell && !materializeEmptyCell) {\n this._nullCellCount += cell.getWidth();\n } else {\n if (this._nullCellCount > 0) {\n // we can just assume we have same style with previous one here\n // because style change is handled by previous stage\n // use move right when background is empty, use clear right when there is background.\n if (equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n } else {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n }\n this._nullCellCount = 0;\n }\n\n // PATCH(orca): styling alone leaves restored OSC 8 links looking live but unclickable.\n this._currentRow += this._setOscLink(getOscLinkId(cell));\n\n if (materializeEmptyCell) {\n const hasDecoration = !!cell.isUnderline() || !!cell.isStrikethrough() || !!cell.isOverline();\n if (hasDecoration) {\n this._currentRow += '\\u001b[24;29;55m';\n }\n this._currentRow += ' '.repeat(cell.getWidth());\n if (hasDecoration) {\n const restoreSgrSeq = this._diffStyle(cell, this._defaultCell);\n this._currentRow += `\\u001b[0m\\u001b[${restoreSgrSeq.join(';')}m`;\n }\n } else {\n this._currentRow += cell.getChars();\n }\n\n // update cursor\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col + cell.getWidth();\n }\n }\n\n protected _serializeString(excludeFinalCursorPosition: boolean): string {\n let rowEnd = this._allRows.length;\n\n // the fixup is only required for data without scrollback\n // because it will always be placed at last line otherwise\n if (this._buffer.length - this._firstRow <= this._terminal.rows) {\n rowEnd = this._lastContentCursorRow + 1 - this._firstRow;\n this._lastCursorCol = this._lastContentCursorCol;\n this._lastCursorRow = this._lastContentCursorRow;\n }\n\n let content = '';\n\n for (let i = 0; i < rowEnd; i++) {\n content += this._allRows[i];\n if (i + 1 < rowEnd) {\n content += this._allRowSeparators[i];\n }\n }\n\n // Each buffer is self-contained so links cannot leak into a following buffer.\n content += this._setOscLink(0);\n\n // restore the cursor\n if (!excludeFinalCursorPosition) {\n const realCursorRow = this._buffer.baseY + this._buffer.cursorY;\n const realCursorCol = this._buffer.cursorX;\n\n const cursorMoved = (realCursorRow !== this._lastCursorRow || realCursorCol !== this._lastCursorCol);\n\n const moveRight = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}C`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}D`;\n }\n };\n const moveDown = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}B`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}A`;\n }\n };\n\n if (cursorMoved) {\n moveDown(realCursorRow - this._lastCursorRow);\n moveRight(realCursorCol - this._lastCursorCol);\n }\n }\n\n // Restore the cursor's current style, see https://github.com/xtermjs/xterm.js/issues/3677\n // HACK: Internal API access since it's awkward to expose this in the API and serialize will\n // likely be the only consumer\n const curAttrData: IAttributeData = (this._terminal as any)._core._inputHandler._curAttrData;\n const sgrSeq = this._diffStyle(curAttrData, this._cursorStyle);\n if (sgrSeq.length > 0) {\n content += `\\u001b[${sgrSeq.join(';')}m`;\n }\n\n return content;\n }\n}\n\nexport class SerializeAddon implements ITerminalAddon, ISerializeApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n private _serializeBufferByScrollback(terminal: Terminal, buffer: IBuffer, scrollback?: number): string {\n const maxRows = buffer.length;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return this._serializeBufferByRange(terminal, buffer, {\n start: maxRows - correctRows,\n end: maxRows - 1\n }, false);\n }\n\n private _serializeBufferByRange(terminal: Terminal, buffer: IBuffer, range: ISerializeRange, excludeFinalCursorPosition: boolean): string {\n const handler = new StringSerializeHandler(buffer, terminal);\n return handler.serialize({\n start: { x: 0, y: typeof range.start === 'number' ? range.start : range.start.line },\n end: { x: terminal.cols, y: typeof range.end === 'number' ? range.end : range.end.line }\n }, excludeFinalCursorPosition);\n }\n\n private _serializeBufferAsHTML(terminal: Terminal, options: Partial): string {\n const buffer = terminal.buffer.active;\n const handler = new HTMLSerializeHandler(buffer, terminal, options);\n const onlySelection = options.onlySelection ?? false;\n const range = options.range;\n if (range) {\n return handler.serialize({\n start: { x: range.startCol, y: typeof range.startLine === 'number' ? range.startLine : range.startLine },\n end: { x: terminal.cols, y: typeof range.endLine === 'number' ? range.endLine : range.endLine }\n });\n }\n if (!onlySelection) {\n const maxRows = buffer.length;\n const scrollback = options.scrollback;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return handler.serialize({\n start: { x: 0, y: maxRows - correctRows },\n end: { x: terminal.cols, y: maxRows - 1 }\n });\n }\n\n const selection = this._terminal?.getSelectionPosition();\n if (selection !== undefined) {\n return handler.serialize({\n start: { x: selection.start.x, y: selection.start.y },\n end: { x: selection.end.x, y: selection.end.y }\n });\n }\n\n return '';\n }\n\n /**\n * Serializes the scroll region (DECSTBM) if it's not set to the full terminal size.\n * Uses internal API access since scroll region is not exposed in the public API.\n */\n private _serializeScrollRegion(terminal: Terminal): string {\n // HACK: Internal API access since scroll region is not exposed in the public API\n const buffer = (terminal as any)._core.buffer;\n const scrollTop: number = buffer.scrollTop;\n const scrollBottom: number = buffer.scrollBottom;\n\n // Only serialize if scroll region is not the default (full terminal size)\n if (scrollTop !== 0 || scrollBottom !== terminal.rows - 1) {\n // DECSTBM uses 1-based indices: CSI Ps ; Ps r\n return `\\x1b[${scrollTop + 1};${scrollBottom + 1}r`;\n }\n\n return '';\n }\n\n private _serializeModes(terminal: Terminal): string {\n let content = '';\n const modes = terminal.modes;\n\n // Default: false\n if (modes.applicationCursorKeysMode) content += '\\x1b[?1h';\n if (modes.applicationKeypadMode) content += '\\x1b[?66h';\n if (modes.bracketedPasteMode) content += '\\x1b[?2004h';\n if (modes.insertMode) content += '\\x1b[4h';\n if (modes.originMode) content += '\\x1b[?6h';\n if (modes.reverseWraparoundMode) content += '\\x1b[?45h';\n if (modes.sendFocusMode) content += '\\x1b[?1004h';\n // synchronizedOutputMode doesn't need to be serialized as it's a temporary mode\n\n // Default: true\n if (modes.wraparoundMode === false) content += '\\x1b[?7l';\n\n // Default: 'none'\n if (modes.mouseTrackingMode !== 'none') {\n switch (modes.mouseTrackingMode) {\n case 'x10': content += '\\x1b[?9h'; break;\n case 'vt200': content += '\\x1b[?1000h'; break;\n case 'drag': content += '\\x1b[?1002h'; break;\n case 'any': content += '\\x1b[?1003h'; break;\n }\n }\n\n // Cursor visibility (DECTCEM)\n // Default: visible\n if (!modes.showCursor) {\n content += '\\x1b[?25l';\n }\n\n return content;\n }\n\n public serialize(options?: ISerializeOptions): string {\n // TODO: Add combinedData support\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n // Normal buffer\n let content = options?.range\n ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, options.range, true)\n : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, options?.scrollback);\n\n // Alternate buffer\n if (!options?.excludeAltBuffer) {\n if (this._terminal.buffer.active.type === 'alternate') {\n const alternativeScreenContent = this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, undefined);\n content += `\\u001b[?1049h\\u001b[H${alternativeScreenContent}`;\n }\n }\n\n // Modes and scroll region\n if (!options?.excludeModes) {\n content += this._serializeModes(this._terminal);\n content += this._serializeScrollRegion(this._terminal);\n }\n\n // Restore the source terminal's live OSC pen only after all buffers are complete.\n content += getActiveOscLinkSequence(this._terminal);\n\n return content;\n }\n\n public serializeAsHTML(options?: Partial): string {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n return this._serializeBufferAsHTML(this._terminal, options ?? {});\n }\n\n public dispose(): void { }\n}\n\nexport class HTMLSerializeHandler extends BaseSerializeHandler {\n private _currentRow: string = '';\n\n private _htmlContent = '';\n\n private _ansiColors: Readonly;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal,\n private readonly _options: Partial\n ) {\n super(buffer);\n\n // For xterm headless: fallback to ansi colors\n if ((_terminal as any)._core._themeService) {\n this._ansiColors = (_terminal as any)._core._themeService.colors.ansi;\n }\n else {\n this._ansiColors = DEFAULT_ANSI_COLORS;\n }\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._htmlContent += '
';\n\n    let foreground = '#000000';\n    let background = '#ffffff';\n    if (this._options.includeGlobalBackground ?? false) {\n      foreground = this._terminal.options.theme?.foreground ?? '#ffffff';\n      background = this._terminal.options.theme?.background ?? '#000000';\n    }\n\n    const globalStyleDefinitions = [];\n    globalStyleDefinitions.push('color: ' + foreground + ';');\n    globalStyleDefinitions.push('background-color: ' + background + ';');\n    globalStyleDefinitions.push('font-family: ' + this._terminal.options.fontFamily + ';');\n    globalStyleDefinitions.push('font-size: ' + this._terminal.options.fontSize + 'px;');\n    this._htmlContent += '
';\n }\n\n protected _afterSerialize(): void {\n this._htmlContent += '
';\n this._htmlContent += '
';\n }\n\n protected _rowEnd(row: number, isLastRow: boolean): void {\n this._htmlContent += '
' + this._currentRow + '
';\n this._currentRow = '';\n }\n\n private _getHexColor(cell: IBufferCell, isFg: boolean): string | undefined {\n const color = isFg ? cell.getFgColor() : cell.getBgColor();\n if (isFg ? cell.isFgRGB() : cell.isBgRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n if (isFg ? cell.isFgPalette() : cell.isBgPalette()) {\n return this._ansiColors[color].css;\n }\n return undefined;\n }\n\n private _getUnderlineColor(cell: IBufferCell): string | undefined {\n if (cell.isUnderlineColorDefault()) {\n return undefined;\n }\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n // Palette color\n return this._ansiColors[color].css;\n }\n\n private _getUnderlineStyle(cell: IBufferCell): string {\n switch (cell.getUnderlineStyle()) {\n case UnderlineStyle.SINGLE:\n return 'underline';\n case UnderlineStyle.DOUBLE:\n return 'underline double';\n case UnderlineStyle.CURLY:\n return 'underline wavy';\n case UnderlineStyle.DOTTED:\n return 'underline dotted';\n case UnderlineStyle.DASHED:\n return 'underline dashed';\n default:\n return 'underline';\n }\n }\n\n private _diffStyle(cell: IBufferCell, oldCell: IBufferCell): string[] | undefined {\n const content: string[] = [];\n\n if (attributesEquals(cell, oldCell)) {\n return undefined;\n }\n\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n const fgHexColor = this._getHexColor(cell, true);\n if (fgHexColor) {\n content.push('color: ' + fgHexColor + ';');\n }\n\n const bgHexColor = this._getHexColor(cell, false);\n if (bgHexColor) {\n content.push('background-color: ' + bgHexColor + ';');\n }\n\n if (cell.isInverse()) { content.push('color: #000000; background-color: #BFBFBF;'); }\n if (cell.isBold()) { content.push('font-weight: bold;'); }\n\n // Handle text-decoration (underline, overline, strikethrough, blink)\n const decorations: string[] = [];\n if (cell.isUnderline()) {\n decorations.push(this._getUnderlineStyle(cell));\n }\n if (cell.isOverline()) {\n decorations.push('overline');\n }\n if (cell.isStrikethrough()) {\n decorations.push('line-through');\n }\n if (cell.isBlink()) {\n decorations.push('blink');\n }\n if (decorations.length > 0) {\n content.push('text-decoration: ' + decorations.join(' ') + ';');\n }\n\n // Handle underline color\n if (cell.isUnderline()) {\n const underlineColor = this._getUnderlineColor(cell);\n if (underlineColor) {\n content.push('text-decoration-color: ' + underlineColor + ';');\n }\n }\n\n if (cell.isInvisible()) { content.push('visibility: hidden;'); }\n if (cell.isItalic()) { content.push('font-style: italic;'); }\n if (cell.isDim()) { content.push('opacity: 0.5;'); }\n\n return content;\n }\n\n return undefined;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const styleDefinitions = this._diffStyle(cell, oldCell);\n\n // handles style change\n if (styleDefinitions) {\n this._currentRow += styleDefinitions.length === 0 ?\n '
' :\n '';\n }\n\n // handles actual content\n if (isEmptyCell) {\n this._currentRow += ' ';\n } else {\n this._currentRow += escapeHTMLChar(cell.getChars());\n }\n }\n\n protected _serializeString(): string {\n return this._htmlContent;\n }\n}\n"], + "mappings": "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", + "names": ["$r", "$g", "$b", "$a", "channels", "toCss", "r", "g", "b", "a", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "$a", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "$r", "$g", "$b", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "DEFAULT_ANSI_COLORS", "colors", "css", "v", "i", "g", "b", "channels", "c", "getOscLinkId", "cell", "getOscLinkOpenSequence", "terminal", "linkId", "data", "getActiveOscLinkSequence", "attrs", "constrain", "value", "low", "high", "escapeHTMLChar", "c", "BaseSerializeHandler", "_buffer", "range", "excludeFinalCursorPosition", "cell1", "cell2", "oldCell", "startRow", "endRow", "startColumn", "endColumn", "row", "line", "startLineColumn", "endLineColumn", "col", "isLastRow", "rows", "equalFg", "equalBg", "equalUnderline", "cell1Default", "cell2Default", "equalFlags", "attributesEquals", "cell1AsBufferCell", "StringSerializeHandler", "buffer", "_terminal", "start", "end", "rowSeparator", "currentLine", "nextLine", "thisRowLastChar", "thisRowLastSecondChar", "nextRowFirstChar", "isNextRowFirstCharDoubleWidth", "isValid", "contentCellCount", "sgrSeq", "fgChanged", "bgChanged", "flagsChanged", "color", "boldChanged", "dimChanged", "clearsIntensity", "style", "sequence", "openSequence", "isEmptyCell", "nextRowFirstCell", "isWideWrapPadding", "materializeEmptyCell", "hasDecoration", "restoreSgrSeq", "rowEnd", "content", "realCursorRow", "realCursorCol", "cursorMoved", "moveRight", "offset", "curAttrData", "SerializeAddon", "scrollback", "maxRows", "correctRows", "options", "handler", "HTMLSerializeHandler", "onlySelection", "selection", "scrollTop", "scrollBottom", "modes", "alternativeScreenContent", "_options", "DEFAULT_ANSI_COLORS", "foreground", "background", "globalStyleDefinitions", "isFg", "x", "fgHexColor", "bgHexColor", "decorations", "underlineColor", "styleDefinitions"] } diff --git a/src/SerializeAddon.ts b/src/SerializeAddon.ts index e1728feb219c362dfa2ecb602ff99f830d520757..957da98c8b30835cc2d114b4b66b228b01fdff0a 100644 --- a/src/SerializeAddon.ts +++ b/src/SerializeAddon.ts @@ -12,6 +12,36 @@ import { IAttributeData } from 'common/buffer/Types'; import { DEFAULT_ANSI_COLORS } from 'browser/Types'; import { UnderlineStyle } from 'common/buffer/Constants'; +type OscLinkData = { id?: string; uri: string }; +type OscLinkedCell = { extended?: { urlId?: number } }; +type TerminalWithOscLinks = Terminal & { + _core?: { + _inputHandler?: { _curAttrData?: IAttributeData & OscLinkedCell }; + _oscLinkService?: { getLinkData: (linkId: number) => OscLinkData | undefined }; + }; +}; + +function getOscLinkId(cell: IBufferCell | IAttributeData): number { + return (cell as typeof cell & OscLinkedCell).extended?.urlId ?? 0; +} + +function getOscLinkOpenSequence(terminal: Terminal, linkId: number): string { + if (!linkId) { + return ''; + } + const data = (terminal as TerminalWithOscLinks)._core?._oscLinkService?.getLinkData(linkId); + if (!data) { + return ''; + } + const params = data.id === undefined ? '' : `id=${data.id}`; + return `\u001b]8;${params};${data.uri}\u001b\\`; +} + +function getActiveOscLinkSequence(terminal: Terminal): string { + const attrs = (terminal as TerminalWithOscLinks)._core?._inputHandler?._curAttrData; + return attrs ? getOscLinkOpenSequence(terminal, getOscLinkId(attrs)) : ''; +} + function constrain(value: number, low: number, high: number): number { return Math.max(low, Math.min(value, high)); } @@ -148,12 +178,14 @@ class StringSerializeHandler extends BaseSerializeHandler { // this is a null cell for reference for checking whether background is empty or not private _backgroundCell: IBufferCell = this._buffer.getNullCell(); + private _defaultCell: IBufferCell = this._buffer.getNullCell(); private _firstRow: number = 0; private _lastCursorRow: number = 0; private _lastCursorCol: number = 0; private _lastContentCursorRow: number = 0; private _lastContentCursorCol: number = 0; + private _activeOscLinkId: number = 0; constructor( buffer: IBuffer, @@ -214,7 +246,7 @@ class StringSerializeHandler extends BaseSerializeHandler { if ( // you must output character to cause overflow, control sequence can't do this nextRowFirstChar.getChars() && - isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0 + (isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0) ) { if ( // the last character can't be null, @@ -251,9 +283,14 @@ class StringSerializeHandler extends BaseSerializeHandler { if (this._nullCellCount > 0) { // do these because we filled the last several null slot, which we shouldn't rowSeparator += '\u001b[A'; - rowSeparator += `\u001b[${currentLine.length - this._nullCellCount}C`; + const contentCellCount = currentLine.length - this._nullCellCount; + if (contentCellCount > 0) { + rowSeparator += `\u001b[${contentCellCount}C`; + } rowSeparator += `\u001b[${this._nullCellCount}X`; - rowSeparator += `\u001b[${currentLine.length - this._nullCellCount}D`; + if (contentCellCount > 0) { + rowSeparator += `\u001b[${contentCellCount}D`; + } rowSeparator += '\u001b[B'; } @@ -310,7 +347,20 @@ class StringSerializeHandler extends BaseSerializeHandler { } if (flagsChanged) { if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); } - if (cell.isBold() !== oldCell.isBold()) { sgrSeq.push(cell.isBold() ? 1 : 22); } + // PATCH(orca): bold (1) and dim (2) share the single reset param 22, so + // they must be diffed as one intensity group with the clearing 22 emitted + // BEFORE any re-set. Upstream's independent per-flag diff could emit + // "1;22" (bold set, then wiped by dim's clear — \x1b[2mA\x1b[22m\x1b[1mB + // loses B's bold on round-trip) or a bare "22" that drops a still-set + // bold/dim, garbling Orca's hidden-terminal snapshot restores. + const boldChanged = cell.isBold() !== oldCell.isBold(); + const dimChanged = cell.isDim() !== oldCell.isDim(); + if (boldChanged || dimChanged) { + const clearsIntensity = (boldChanged && !cell.isBold()) || (dimChanged && !cell.isDim()); + if (clearsIntensity) { sgrSeq.push(22); } + if (cell.isBold() && (boldChanged || clearsIntensity)) { sgrSeq.push(1); } + if (cell.isDim() && (dimChanged || clearsIntensity)) { sgrSeq.push(2); } + } if (!equalUnderline(cell, oldCell)) { const style = cell.getUnderlineStyle(); if (style === UnderlineStyle.NONE) { @@ -337,7 +387,7 @@ class StringSerializeHandler extends BaseSerializeHandler { if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); } if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); } if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); } - if (cell.isDim() !== oldCell.isDim()) { sgrSeq.push(cell.isDim() ? 2 : 22); } + // PATCH(orca): dim handled in the intensity group above. if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); } } } @@ -346,6 +396,20 @@ class StringSerializeHandler extends BaseSerializeHandler { return sgrSeq; } + private _setOscLink(linkId: number): string { + if (linkId === this._activeOscLinkId) { + return ''; + } + let sequence = this._activeOscLinkId ? '\u001b]8;;\u001b\\' : ''; + this._activeOscLinkId = 0; + const openSequence = getOscLinkOpenSequence(this._terminal, linkId); + if (openSequence) { + this._activeOscLinkId = linkId; + sequence += openSequence; + } + return sequence; + } + protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { // a width 0 cell don't need to be count because it is just a placeholder after a CJK character; const isPlaceHolderCell = cell.getWidth() === 0; @@ -356,12 +420,21 @@ class StringSerializeHandler extends BaseSerializeHandler { // this cell don't have content const isEmptyCell = cell.getChars() === ''; + const nextLine = isEmptyCell && cell.isInverse() ? this._buffer.getLine(row + 1) : undefined; + const nextRowFirstCell = nextLine?.getCell(0, this._nextRowFirstChar); + // A pending wide glyph recreates its own final-column padding during replay. + const isWideWrapPadding = col === this._terminal.cols - 1 && + nextLine?.isWrapped && + (nextRowFirstCell?.getWidth() ?? 0) > 1 && + !!nextRowFirstCell && attributesEquals(cell, nextRowFirstCell); + // Cursor movement cannot reproduce an inverse cell's visible background. + const materializeEmptyCell = isEmptyCell && !!cell.isInverse() && !isWideWrapPadding; const sgrSeq = this._diffStyle(cell, this._cursorStyle); - // the empty cell style is only assumed to be changed when background changed, because - // foreground is always 0. - const styleChanged = isEmptyCell ? !equalBg(this._cursorStyle, cell) : sgrSeq.length > 0; + const styleChanged = isEmptyCell + ? materializeEmptyCell ? sgrSeq.length > 0 : !equalBg(this._cursorStyle, cell) + : sgrSeq.length > 0; /** * handles style change @@ -395,7 +468,7 @@ class StringSerializeHandler extends BaseSerializeHandler { /** * handles actual content */ - if (isEmptyCell) { + if (isEmptyCell && !materializeEmptyCell) { this._nullCellCount += cell.getWidth(); } else { if (this._nullCellCount > 0) { @@ -411,7 +484,22 @@ class StringSerializeHandler extends BaseSerializeHandler { this._nullCellCount = 0; } - this._currentRow += cell.getChars(); + // PATCH(orca): styling alone leaves restored OSC 8 links looking live but unclickable. + this._currentRow += this._setOscLink(getOscLinkId(cell)); + + if (materializeEmptyCell) { + const hasDecoration = !!cell.isUnderline() || !!cell.isStrikethrough() || !!cell.isOverline(); + if (hasDecoration) { + this._currentRow += '\u001b[24;29;55m'; + } + this._currentRow += ' '.repeat(cell.getWidth()); + if (hasDecoration) { + const restoreSgrSeq = this._diffStyle(cell, this._defaultCell); + this._currentRow += `\u001b[0m\u001b[${restoreSgrSeq.join(';')}m`; + } + } else { + this._currentRow += cell.getChars(); + } // update cursor this._lastContentCursorRow = this._lastCursorRow = row; @@ -439,6 +527,9 @@ class StringSerializeHandler extends BaseSerializeHandler { } } + // Each buffer is self-contained so links cannot leak into a following buffer. + content += this._setOscLink(0); + // restore the cursor if (!excludeFinalCursorPosition) { const realCursorRow = this._buffer.baseY + this._buffer.cursorY; @@ -616,6 +707,9 @@ export class SerializeAddon implements ITerminalAddon, ISerializeApi { content += this._serializeScrollRegion(this._terminal); } + // Restore the source terminal's live OSC pen only after all buffers are complete. + content += getActiveOscLinkSequence(this._terminal); + return content; }