@promptbook/components 0.112.0-93 → 0.112.0-96
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/index.es.js +437 -497
- package/esm/index.es.js.map +1 -1
- package/esm/src/book-components/Chat/utils/renderMarkdown.test.d.ts +1 -0
- package/esm/src/version.d.ts +1 -1
- package/package.json +3 -1
- package/umd/index.umd.js +440 -500
- package/umd/index.umd.js.map +1 -1
- package/umd/src/book-components/Chat/utils/renderMarkdown.test.d.ts +1 -0
- package/umd/src/version.d.ts +1 -1
package/umd/index.umd.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react/jsx-runtime'), require('spacetrim'), require('react'), require('crypto-js'), require('crypto-js/enc-hex'), require('path'), require('moment'), require('mime-types'), require('crypto'), require('react-dom'), require('@monaco-editor/react'), require('destroyable'), require('
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', 'react/jsx-runtime', 'spacetrim', 'react', 'crypto-js', 'crypto-js/enc-hex', 'path', 'moment', 'mime-types', 'crypto', 'react-dom', '@monaco-editor/react', 'destroyable', '
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["promptbook-components"] = {}, global.jsxRuntime, global.spacetrim, global.react, global.cryptoJs, global.hexEncoder, global.path, global.moment, global.mimeTypes, global.crypto$1, global.reactDom, global.MonacoEditor, global.destroyable, global.
|
|
5
|
-
})(this, (function (exports, jsxRuntime, spacetrim, react, cryptoJs, hexEncoder, path, moment, mimeTypes, crypto$1, reactDom, MonacoEditor, destroyable,
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react/jsx-runtime'), require('spacetrim'), require('react'), require('crypto-js'), require('crypto-js/enc-hex'), require('path'), require('moment'), require('mime-types'), require('crypto'), require('react-dom'), require('@monaco-editor/react'), require('destroyable'), require('react-dom/client'), require('dompurify'), require('katex'), require('showdown'), require('rxjs'), require('html-to-image'), require('jspdf'), require('lucide-react'), require('moment/locale/cs'), require('waitasecond'), require('crypto-js/sha256'), require('papaparse'), require('@openai/agents'), require('colors'), require('bottleneck'), require('openai'), require('qrcode')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', 'react/jsx-runtime', 'spacetrim', 'react', 'crypto-js', 'crypto-js/enc-hex', 'path', 'moment', 'mime-types', 'crypto', 'react-dom', '@monaco-editor/react', 'destroyable', 'react-dom/client', 'dompurify', 'katex', 'showdown', 'rxjs', 'html-to-image', 'jspdf', 'lucide-react', 'moment/locale/cs', 'waitasecond', 'crypto-js/sha256', 'papaparse', '@openai/agents', 'colors', 'bottleneck', 'openai', 'qrcode'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["promptbook-components"] = {}, global.jsxRuntime, global.spacetrim, global.react, global.cryptoJs, global.hexEncoder, global.path, global.moment, global.mimeTypes, global.crypto$1, global.reactDom, global.MonacoEditor, global.destroyable, global.client, global.createDOMPurify, global.katex, global.showdown, global.rxjs, global.htmlToImage, global.jspdf, global.lucideReact, null, global.waitasecond, global.sha256, global.papaparse, global.agents, global.colors, global.Bottleneck, global.OpenAI, global.QRCode));
|
|
5
|
+
})(this, (function (exports, jsxRuntime, spacetrim, react, cryptoJs, hexEncoder, path, moment, mimeTypes, crypto$1, reactDom, MonacoEditor, destroyable, client, createDOMPurify, katex, showdown, rxjs, htmlToImage, jspdf, lucideReact, cs, waitasecond, sha256, papaparse, agents, colors, Bottleneck, OpenAI, QRCode) { 'use strict';
|
|
6
6
|
|
|
7
7
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
8
8
|
|
|
9
9
|
var hexEncoder__default = /*#__PURE__*/_interopDefaultLegacy(hexEncoder);
|
|
10
10
|
var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
|
|
11
11
|
var MonacoEditor__default = /*#__PURE__*/_interopDefaultLegacy(MonacoEditor);
|
|
12
|
+
var createDOMPurify__default = /*#__PURE__*/_interopDefaultLegacy(createDOMPurify);
|
|
12
13
|
var katex__default = /*#__PURE__*/_interopDefaultLegacy(katex);
|
|
13
14
|
var sha256__default = /*#__PURE__*/_interopDefaultLegacy(sha256);
|
|
14
15
|
var colors__default = /*#__PURE__*/_interopDefaultLegacy(colors);
|
|
@@ -30,7 +31,7 @@
|
|
|
30
31
|
* @generated
|
|
31
32
|
* @see https://github.com/webgptorg/promptbook
|
|
32
33
|
*/
|
|
33
|
-
const PROMPTBOOK_ENGINE_VERSION = '0.112.0-
|
|
34
|
+
const PROMPTBOOK_ENGINE_VERSION = '0.112.0-96';
|
|
34
35
|
/**
|
|
35
36
|
* TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
|
|
36
37
|
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
@@ -21541,19 +21542,341 @@
|
|
|
21541
21542
|
return markers;
|
|
21542
21543
|
}
|
|
21543
21544
|
|
|
21544
|
-
var css_248z$b = ".MarkdownContent-module_MarkdownContent__2JuyX{--md-text-color:var(--chat-md-text-color,inherit);--md-muted-color:var(--chat-md-muted-color,currentColor);--md-link-color:var(--chat-md-link-color,#2563eb);--md-heading-color:var(--chat-heading-text-color,var(--md-text-color));--md-heading-font-family:var(\n --chat-md-heading-font-family,var(--font-poppins,\"Poppins\",system-ui,-apple-system,sans-serif)\n );--md-body-font-family:var(\n --chat-md-body-font-family,var(--font-poppins,\"Poppins\",system-ui,-apple-system,sans-serif)\n );--md-code-font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",monospace;--md-inline-code-bg:var(--chat-md-inline-code-bg,rgba(15,23,42,.08));--md-inline-code-border:var(--chat-md-inline-code-border,rgba(15,23,42,.12));--md-inline-code-color:var(--chat-md-inline-code-color,var(--md-text-color));--md-blockquote-bg:var(--chat-md-blockquote-bg,rgba(248,250,252,.92));--md-blockquote-border:var(--chat-md-blockquote-border,rgba(59,130,246,.35));--md-table-bg:var(--chat-md-table-bg,rgba(248,250,252,.92));--md-table-row-alt-bg:var(--chat-md-table-row-alt-bg,rgba(241,245,249,.9));--md-table-head-bg:var(--chat-md-table-head-bg,rgba(226,232,240,.95));--md-table-border:var(--chat-md-table-border,rgba(148,163,184,.36));--md-citation-bg:var(--chat-md-citation-bg,rgba(59,130,246,.14));--md-citation-color:var(--chat-md-citation-color,#1d4ed8);color:var(--md-text-color);font-family:var(--md-body-font-family);font-size:inherit;letter-spacing:.002em;line-height:1.65}.MarkdownContent-module_MarkdownContent__2JuyX>:first-child{margin-top:0!important}.MarkdownContent-module_MarkdownContent__2JuyX>:last-child{margin-bottom:0!important}.MarkdownContent-module_MarkdownContent__2JuyX :is(h1,h2,h3,h4,h5,h6){text-wrap:balance;color:var(--md-heading-color);font-family:var(--md-heading-font-family);font-weight:600;letter-spacing:.01em;line-height:1.24;margin:1.4em 0 .55em;position:relative}.MarkdownContent-module_MarkdownContent__2JuyX h1{font-size:1.52rem}.MarkdownContent-module_MarkdownContent__2JuyX h2{font-size:1.4rem}.MarkdownContent-module_MarkdownContent__2JuyX h3{font-size:1.26rem}.MarkdownContent-module_MarkdownContent__2JuyX h4{font-size:1.14rem}.MarkdownContent-module_MarkdownContent__2JuyX h5{font-size:1.04rem}.MarkdownContent-module_MarkdownContent__2JuyX h6{font-size:.98rem}.MarkdownContent-module_MarkdownContent__2JuyX p{text-wrap:pretty;margin:0 0 .9em}.MarkdownContent-module_MarkdownContent__2JuyX p:empty{display:none}.MarkdownContent-module_MarkdownContent__2JuyX :is(ul,ol){display:grid;gap:.35em;margin:.65em 0 1em;padding-inline-start:1.35rem}.MarkdownContent-module_MarkdownContent__2JuyX ul{list-style:disc}.MarkdownContent-module_MarkdownContent__2JuyX ol{list-style:decimal}.MarkdownContent-module_MarkdownContent__2JuyX li{line-height:1.58}.MarkdownContent-module_MarkdownContent__2JuyX li>:is(ul,ol){margin-bottom:0;margin-top:.45em}.MarkdownContent-module_MarkdownContent__2JuyX ul:has(>li>[data-chat-progress-marker]){list-style:none;padding-inline-start:0}.MarkdownContent-module_MarkdownContent__2JuyX ul:has(>li>[data-chat-progress-marker])>li{list-style:none}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker]{border-radius:999px;color:var(--md-link-color);display:inline-flex;height:1rem;margin-right:.58rem;transform-origin:center;vertical-align:text-bottom;width:1rem}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=pending]{animation:MarkdownContent-module_chatProgressMarkerSpin__TpoKr .85s linear infinite;border:2px solid color-mix(in srgb,currentColor 22%,transparent);border-top-color:currentcolor;box-sizing:border-box}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=completed]{align-items:center;background:color-mix(in srgb,currentColor 12%,transparent);border:2px solid;box-sizing:border-box;justify-content:center}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=completed]:before{border-bottom:2px solid;border-right:2px solid;box-sizing:border-box;content:\"\";display:block;height:.5rem;margin-top:-.06rem;transform:rotate(45deg);width:.26rem}@keyframes MarkdownContent-module_chatProgressMarkerSpin__TpoKr{to{transform:rotate(1turn)}}.MarkdownContent-module_MarkdownContent__2JuyX a{color:var(--md-link-color);text-decoration-color:currentColor;text-decoration-line:underline;text-decoration-thickness:1.4px;text-underline-offset:.16em;transition:opacity .2s ease,text-decoration-thickness .2s ease}.MarkdownContent-module_MarkdownContent__2JuyX a:focus-visible,.MarkdownContent-module_MarkdownContent__2JuyX a:hover{opacity:.92;text-decoration-thickness:2px}.MarkdownContent-module_MarkdownContent__2JuyX img{border-radius:14px;display:block;height:auto;margin:.95em 0;max-width:100%}.MarkdownContent-module_MarkdownContent__2JuyX blockquote,.MarkdownContent-module_MarkdownContent__2JuyX hr,.MarkdownContent-module_MarkdownContent__2JuyX pre,.MarkdownContent-module_MarkdownContent__2JuyX table{margin:.95em 0}.MarkdownContent-module_MarkdownContent__2JuyX pre{background:transparent;border:none;border-radius:12px;box-shadow:none;display:block;overflow:visible;padding:0}.MarkdownContent-module_MarkdownContent__2JuyX blockquote{background:var(--md-blockquote-bg);border:none;border-left:3px solid var(--md-blockquote-border);border-radius:12px;box-shadow:none;color:var(--md-muted-color);display:block;padding:.72em .96em}.MarkdownContent-module_MarkdownContent__2JuyX blockquote>:last-child{margin-bottom:0}.MarkdownContent-module_MarkdownContent__2JuyX code{background:var(--md-inline-code-bg);border:1px solid var(--md-inline-code-border);border-radius:8px;color:var(--md-inline-code-color);font-family:var(--md-code-font-family);font-size:.88em;line-height:1.45;margin:0;padding:.14em .42em;word-break:break-word}.MarkdownContent-module_MarkdownContent__2JuyX pre code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:normal}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg{background:#181c23;border:1px solid rgba(148,163,184,.35);border-radius:12px;box-shadow:0 6px 18px rgba(2,6,23,.28);color:#f8fafc;font-family:var(--md-code-font-family);font-size:14px;line-height:1.6;overflow-x:auto}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:normal}.MarkdownContent-module_MarkdownContent__2JuyX table{background:var(--md-table-bg);border:1px solid var(--md-table-border);border-collapse:separate;border-radius:12px;border-spacing:0;box-shadow:0 2px 8px rgba(15,23,42,.1);color:inherit;font-size:.93em;overflow:hidden;width:100%}.MarkdownContent-module_MarkdownContent__2JuyX td,.MarkdownContent-module_MarkdownContent__2JuyX th{background:none;border-bottom:1px solid var(--md-table-border);color:inherit;padding:.58em .72em;text-align:left;vertical-align:top}.MarkdownContent-module_MarkdownContent__2JuyX th{background:var(--md-table-head-bg);font-weight:600}.MarkdownContent-module_MarkdownContent__2JuyX tr:last-child td{border-bottom:none}.MarkdownContent-module_MarkdownContent__2JuyX tr:nth-child(2n) td{background:var(--md-table-row-alt-bg)}.MarkdownContent-module_MarkdownContent__2JuyX hr{border:none;border-top:1px solid var(--md-table-border);opacity:.8}.MarkdownContent-module_MarkdownContent__2JuyX details{background:color-mix(in srgb,var(--md-table-bg) 82%,hsla(0,0%,100%,.3) 18%);border:1px solid var(--md-table-border);border-radius:16px;box-shadow:0 8px 22px rgba(15,23,42,.08);margin:.95em 0;overflow:hidden;transition:border-color .18s ease,box-shadow .18s ease,transform .18s ease}.MarkdownContent-module_MarkdownContent__2JuyX details:focus-within,.MarkdownContent-module_MarkdownContent__2JuyX details:hover{border-color:color-mix(in srgb,var(--md-link-color) 24%,var(--md-table-border) 76%);box-shadow:0 12px 28px rgba(15,23,42,.12)}.MarkdownContent-module_MarkdownContent__2JuyX details>summary{align-items:center;background:linear-gradient(180deg,color-mix(in srgb,var(--md-table-head-bg) 88%,hsla(0,0%,100%,.85) 12%),color-mix(in srgb,var(--md-table-bg) 82%,hsla(0,0%,100%,.7) 18%));color:var(--md-link-color);cursor:pointer;display:flex;font-weight:600;gap:.72rem;list-style:none;padding:.9em 1.05em;transition:background .18s ease,color .18s ease;user-select:none}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:before{border-bottom:2px solid;border-right:2px solid;content:\"\";flex:0 0 auto;height:.62rem;margin-top:-.04rem;opacity:.82;transform:rotate(-45deg);transition:transform .18s ease,opacity .18s ease;width:.62rem}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:focus-visible,.MarkdownContent-module_MarkdownContent__2JuyX details>summary:hover{background:linear-gradient(180deg,color-mix(in srgb,var(--md-table-head-bg) 76%,hsla(0,0%,100%,.95) 24%),color-mix(in srgb,var(--md-table-bg) 74%,hsla(0,0%,100%,.82) 26%))}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:focus-visible{outline:2px solid color-mix(in srgb,var(--md-link-color) 52%,transparent);outline-offset:-2px}.MarkdownContent-module_MarkdownContent__2JuyX details>summary::-webkit-details-marker{display:none}.MarkdownContent-module_MarkdownContent__2JuyX details[open]>summary{border-bottom:1px solid color-mix(in srgb,var(--md-table-border) 88%,transparent)}.MarkdownContent-module_MarkdownContent__2JuyX details[open]>summary:before{opacity:1;transform:rotate(45deg)}.MarkdownContent-module_MarkdownContent__2JuyX details>:not(summary){margin-left:1.05em;margin-right:1.05em}.MarkdownContent-module_MarkdownContent__2JuyX details>summary+*{margin-top:.95em}.MarkdownContent-module_MarkdownContent__2JuyX details>:last-child{margin-bottom:1.05em}.MarkdownContent-module_MarkdownContent__2JuyX strong{font-weight:650}.MarkdownContent-module_MarkdownContent__2JuyX em{font-style:italic}.MarkdownContent-module_citationRef__fKqaT,.MarkdownContent-module_citation__11SMw{align-items:center;background:var(--md-citation-bg);border-radius:999px;color:var(--md-citation-color);display:inline-flex;font-size:.74em;font-weight:700;justify-content:center;line-height:1.45;margin:0 .1em;min-width:1.4em;padding:0 .35em;vertical-align:super}.MarkdownContent-module_MarkdownContent__2JuyX sup[data-citation-footnote]{color:currentColor;display:inline;font-size:.72em;font-weight:700;line-height:1;margin:0 .7em 0 .08em;vertical-align:super}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUNJLGlEQUFtRCxDQUNuRCx3REFBMEQsQ0FDMUQsaURBQW1ELENBQ25ELHNFQUF3RSxDQUN4RTs7S0FHQyxDQUNEOztLQUdDLENBQ0QsbUdBQTBHLENBQzFHLG9FQUEwRSxDQUMxRSw0RUFBa0YsQ0FDbEYsNEVBQThFLENBQzlFLHFFQUEyRSxDQUMzRSw0RUFBa0YsQ0FDbEYsMkRBQWlFLENBQ2pFLDBFQUFnRixDQUNoRixxRUFBMkUsQ0FDM0UsbUVBQXlFLENBQ3pFLGdFQUFzRSxDQUN0RSx5REFBMkQsQ0FFM0QsMEJBQTJCLENBQzNCLHNDQUF1QyxDQUN2QyxpQkFBa0IsQ0FFbEIscUJBQXVCLENBRHZCLGdCQUVKLENBRUEsNERBQ0ksc0JBQ0osQ0FFQSwyREFDSSx5QkFDSixDQUVBLHNFQVFJLGlCQUFrQixDQUxsQiw2QkFBOEIsQ0FDOUIseUNBQTBDLENBQzFDLGVBQWdCLENBRWhCLG9CQUFzQixDQUR0QixnQkFBaUIsQ0FKakIsb0JBQXNCLENBRHRCLGlCQVFKLENBRUEsa0RBQ0ksaUJBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLGtEQUNJLGlCQUNKLENBRUEsa0RBQ0ksaUJBQ0osQ0FFQSxrREFDSSxpQkFDSixDQUVBLGtEQUNJLGdCQUNKLENBRUEsaURBRUksZ0JBQWlCLENBRGpCLGVBRUosQ0FFQSx1REFDSSxZQUNKLENBRUEsMERBR0ksWUFBYSxDQUNiLFNBQVcsQ0FIWCxrQkFBb0IsQ0FDcEIsNEJBR0osQ0FFQSxrREFDSSxlQUNKLENBRUEsa0RBQ0ksa0JBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLDZEQUVJLGVBQWdCLENBRGhCLGdCQUVKLENBRUEsdUZBQ0ksZUFBZ0IsQ0FDaEIsc0JBQ0osQ0FFQSwwRkFDSSxlQUNKLENBRUEsMkVBTUksbUJBQW9CLENBQ3BCLDBCQUEyQixDQU4zQixtQkFBb0IsQ0FFcEIsV0FBWSxDQUNaLG1C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QXFDLENBRHJDLHNCQUFvQyxDQUxwQyxVQUFXLENBR1gsYUFBYyxDQURkLGFBQWUsQ0FFZixrQkFBb0IsQ0FJcEIsV0FBYSxDQURiLHdCQUF5QixDQUV6QixnREFBb0QsQ0FScEQsWUFTSixDQUVBLGtKQUVJLDJLQUtKLENBRUEsNkVBQ0kseUVBQTRFLENBQzVFLG1CQUNKLENBRUEsdUZBQ0ksWUFDSixDQUVBLHFFQUNJLGlGQUNKLENBRUEsNEVBRUksU0FBVSxDQURWLHVCQUVKLENBRUEscUVBQ0ksa0JBQW1CLENBQ25CLG1CQUNKLENBRUEsaUVBQ0ksZ0JBQ0osQ0FFQSxtRUFDSSxvQkFDSixDQUVBLHNEQUNJLGVBQ0osQ0FFQSxrREFDSSxpQkFDSixDQWtCQSxtRkFFSSxrQkFBbUIsQ0FXbkIsZ0NBQWlDLENBTmpDLG1CQUFvQixDQUtwQiw4QkFBK0IsQ0FYL0IsbUJBQW9CLENBT3BCLGVBQWlCLENBQ2pCLGVBQWdCLENBTmhCLHNCQUF1QixDQU92QixnQkFBaUIsQ0FMakIsYUFBZSxDQURmLGVBQWdCLENBRWhCLGVBQWlCLENBS2pCLG9CQUdKLENBRUEsMkVBT0ksa0JBQW1CLENBTm5CLGNBQWUsQ0FFZixlQUFpQixDQUNqQixlQUFnQixDQUNoQixhQUFjLENBSGQscUJBQXdCLENBSXhCLG9CQUVKIiwiZmlsZSI6Ik1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLk1hcmtkb3duQ29udGVudCB7XG4gICAgLS1tZC10ZXh0LWNvbG9yOiB2YXIoLS1jaGF0LW1kLXRleHQtY29sb3IsIGluaGVyaXQpO1xuICAgIC0tbWQtbXV0ZWQtY29sb3I6IHZhcigtLWNoYXQtbWQtbXV0ZWQtY29sb3IsIGN1cnJlbnRDb2xvcik7XG4gICAgLS1tZC1saW5rLWNvbG9yOiB2YXIoLS1jaGF0LW1kLWxpbmstY29sb3IsICMyNTYzZWIpO1xuICAgIC0tbWQtaGVhZGluZy1jb2xvcjogdmFyKC0tY2hhdC1oZWFkaW5nLXRleHQtY29sb3IsIHZhcigtLW1kLXRleHQtY29sb3IpKTtcbiAgICAtLW1kLWhlYWRpbmctZm9udC1mYW1pbHk6IHZhcihcbiAgICAgICAgLS1jaGF0LW1kLWhlYWRpbmctZm9udC1mYW1pbHksXG4gICAgICAgIHZhcigtLWZvbnQtcG9wcGlucywgJ1BvcHBpbnMnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYpXG4gICAgKTtcbiAgICAtLW1kLWJvZHktZm9udC1mYW1pbHk6IHZhcihcbiAgICAgICAgLS1jaGF0LW1kLWJvZHktZm9udC1mYW1pbHksXG4gICAgICAgIHZhcigtLWZvbnQtcG9wcGlucywgJ1BvcHBpbnMnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYpXG4gICAgKTtcbiAgICAtLW1kLWNvZGUtZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1xuICAgIC0tbWQtaW5saW5lLWNvZGUtYmc6IHZhcigtLWNoYXQtbWQtaW5saW5lLWNvZGUtYmcsIHJnYmEoMTUsIDIzLCA0MiwgMC4wOCkpO1xuICAgIC0tbWQtaW5saW5lLWNvZGUtYm9yZGVyOiB2YXIoLS1jaGF0LW1kLWlubGluZS1jb2RlLWJvcmRlciwgcmdiYSgxNSwgMjMsIDQyLCAwLjEyKSk7XG4gICAgLS1tZC1pbmxpbmUtY29kZS1jb2xvcjogdmFyKC0tY2hhdC1tZC1pbmxpbmUtY29kZS1jb2xvciwgdmFyKC0tbWQtdGV4dC1jb2xvcikpO1xuICAgIC0tbWQtYmxvY2txdW90ZS1iZzogdmFyKC0tY2hhdC1tZC1ibG9ja3F1b3RlLWJnLCByZ2JhKDI0OCwgMjUwLCAyNTIsIDAuOTIpKTtcbiAgICAtLW1kLWJsb2NrcXVvdGUtYm9yZGVyOiB2YXIoLS1jaGF0LW1kLWJsb2NrcXVvdGUtYm9yZGVyLCByZ2JhKDU5LCAxMzAsIDI0NiwgMC4zNSkpO1xuICAgIC0tbWQtdGFibGUtYmc6IHZhcigtLWNoYXQtbWQtdGFibGUtYmcsIHJnYmEoMjQ4LCAyNTAsIDI1MiwgMC45MikpO1xuICAgIC0tbWQtdGFibGUtcm93LWFsdC1iZzogdmFyKC0tY2hhdC1tZC10YWJsZS1yb3ctYWx0LWJnLCByZ2JhKDI0MSwgMjQ1LCAyNDksIDAuOSkpO1xuICAgIC0tbWQtdGFibGUtaGVhZC1iZzogdmFyKC0tY2hhdC1tZC10YWJsZS1oZWFkLWJnLCByZ2JhKDIyNiwgMjMyLCAyNDAsIDAuOTUpKTtcbiAgICAtLW1kLXRhYmxlLWJvcmRlcjogdmFyKC0tY2hhdC1tZC10YWJsZS1ib3JkZXIsIHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC4zNikpO1xuICAgIC0tbWQtY2l0YXRpb24tYmc6IHZhcigtLWNoYXQtbWQtY2l0YXRpb24tYmcsIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjE0KSk7XG4gICAgLS1tZC1jaXRhdGlvbi1jb2xvcjogdmFyKC0tY2hhdC1tZC1jaXRhdGlvbi1jb2xvciwgIzFkNGVkOCk7XG5cbiAgICBjb2xvcjogdmFyKC0tbWQtdGV4dC1jb2xvcik7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLW1kLWJvZHktZm9udC1mYW1pbHkpO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogMS42NTtcbiAgICBsZXR0ZXItc3BhY2luZzogMC4wMDJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCA+IDpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50O1xufVxuXG4uTWFya2Rvd25Db250ZW50ID4gOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1ib3R0b206IDAgIWltcG9ydGFudDtcbn1cblxuLk1hcmtkb3duQ29udGVudCA6aXMoaDEsIGgyLCBoMywgaDQsIGg1LCBoNikge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW46IDEuNGVtIDAgMC41NWVtO1xuICAgIGNvbG9yOiB2YXIoLS1tZC1oZWFkaW5nLWNvbG9yKTtcbiAgICBmb250LWZhbWlseTogdmFyKC0tbWQtaGVhZGluZy1mb250LWZhbWlseSk7XG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICBsaW5lLWhlaWdodDogMS4yNDtcbiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtO1xuICAgIHRleHQtd3JhcDogYmFsYW5jZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoMSB7XG4gICAgZm9udC1zaXplOiAxLjUycmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGgyIHtcbiAgICBmb250LXNpemU6IDEuNHJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoMyB7XG4gICAgZm9udC1zaXplOiAxLjI2cmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGg0IHtcbiAgICBmb250LXNpemU6IDEuMTRyZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgaDUge1xuICAgIGZvbnQtc2l6ZTogMS4wNHJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoNiB7XG4gICAgZm9udC1zaXplOiAwLjk4cmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHAge1xuICAgIG1hcmdpbjogMCAwIDAuOWVtO1xuICAgIHRleHQtd3JhcDogcHJldHR5O1xufVxuXG4uTWFya2Rvd25Db250ZW50IHA6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgOmlzKHVsLCBvbCkge1xuICAgIG1hcmdpbjogMC42NWVtIDAgMWVtO1xuICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAxLjM1cmVtO1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ2FwOiAwLjM1ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdWwge1xuICAgIGxpc3Qtc3R5bGU6IGRpc2M7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgb2wge1xuICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgbGkge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjU4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IGxpID4gOmlzKHVsLCBvbCkge1xuICAgIG1hcmdpbi10b3A6IDAuNDVlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHVsOmhhcyg+IGxpID4gW2RhdGEtY2hhdC1wcm9ncmVzcy1tYXJrZXJdKSB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICBwYWRkaW5nLWlubGluZS1zdGFydDogMDtcbn1cblxuLk1hcmtkb3duQ29udGVudCB1bDpoYXMoPiBsaSA+IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyXSkgPiBsaSB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBbZGF0YS1jaGF0LXByb2dyZXNzLW1hcmtlcl0ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIHdpZHRoOiAxcmVtO1xuICAgIGhlaWdodDogMXJlbTtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuNThyZW07XG4gICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgW2RhdGEtY2hhdC1wcm9ncmVzcy1tYXJrZXI9J3BlbmRpbmcnXSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXI6IDJweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDIyJSwgdHJhbnNwYXJlbnQpO1xuICAgIGJvcmRlci10b3AtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgICBhbmltYXRpb246IGNoYXRQcm9ncmVzc01hcmtlclNwaW4gMC44NXMgbGluZWFyIGluZmluaXRlO1xufVxuXG4uTWFya2Rvd25Db250ZW50IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyPSdjb21wbGV0ZWQnXSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDEyJSwgdHJhbnNwYXJlbnQpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyPSdjb21wbGV0ZWQnXTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHdpZHRoOiAwLjI2cmVtO1xuICAgIGhlaWdodDogMC41cmVtO1xuICAgIG1hcmdpbi10b3A6IC0wLjA2cmVtO1xuICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgY3VycmVudENvbG9yO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbn1cblxuQGtleWZyYW1lcyBjaGF0UHJvZ3Jlc3NNYXJrZXJTcGluIHtcbiAgICB0byB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgfVxufVxuXG4uTWFya2Rvd25Db250ZW50IGEge1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lO1xuICAgIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDEuNHB4O1xuICAgIHRleHQtdW5kZXJsaW5lLW9mZnNldDogMC4xNmVtO1xuICAgIHRleHQtZGVjb3JhdGlvbi1jb2xvcjogY3VycmVudENvbG9yO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLCB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIDAuMnMgZWFzZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBhOmhvdmVyLFxuLk1hcmtkb3duQ29udGVudCBhOmZvY3VzLXZpc2libGUge1xuICAgIG9wYWNpdHk6IDAuOTI7XG4gICAgdGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczogMnB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IGltZyB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiAxNHB4O1xuICAgIG1hcmdpbjogMC45NWVtIDA7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgcHJlLFxuLk1hcmtkb3duQ29udGVudCBibG9ja3F1b3RlLFxuLk1hcmtkb3duQ29udGVudCB0YWJsZSxcbi5NYXJrZG93bkNvbnRlbnQgaHIge1xuICAgIG1hcmdpbjogMC45NWVtIDA7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgcHJlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgYmxvY2txdW90ZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tbWQtYmxvY2txdW90ZS1ib3JkZXIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC1ibG9ja3F1b3RlLWJnKTtcbiAgICBjb2xvcjogdmFyKC0tbWQtbXV0ZWQtY29sb3IpO1xuICAgIHBhZGRpbmc6IDAuNzJlbSAwLjk2ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgYmxvY2txdW90ZSA+IDpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGNvZGUge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwLjE0ZW0gMC40MmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1kLWlubGluZS1jb2RlLWJvcmRlcik7XG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIGJhY2tncm91bmQ6IHZhcigtLW1kLWlubGluZS1jb2RlLWJnKTtcbiAgICBmb250LWZhbWlseTogdmFyKC0tbWQtY29kZS1mb250LWZhbWlseSk7XG4gICAgZm9udC1zaXplOiAwLjg4ZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgY29sb3I6IHZhcigtLW1kLWlubGluZS1jb2RlLWNvbG9yKTtcbiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHByZSBjb2RlIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICB3b3JkLWJyZWFrOiBub3JtYWw7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLk1hcmtkb3duQ29udGVudCAuY2hhdC1jb2RlLWJsb2NrIHtcbiAgICBiYWNrZ3JvdW5kOiAjMTgxYzIzO1xuICAgIGNvbG9yOiAjZjhmYWZjO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMS42O1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNDgsIDE2MywgMTg0LCAwLjM1KTtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgyLCA2LCAyMywgMC4yOCk7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLW1kLWNvZGUtZm9udC1mYW1pbHkpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IC5jaGF0LWNvZGUtYmxvY2sgY29kZSB7XG4gICAgYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgd29yZC1icmVhazogbm9ybWFsO1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdGFibGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWQtdGFibGUtYm9yZGVyKTtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYmFja2dyb3VuZDogdmFyKC0tbWQtdGFibGUtYmcpO1xuICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDE1LCAyMywgNDIsIDAuMSk7XG4gICAgZm9udC1zaXplOiAwLjkzZW07XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdGgsXG4uTWFya2Rvd25Db250ZW50IHRkIHtcbiAgICBwYWRkaW5nOiAwLjU4ZW0gMC43MmVtO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHRoIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC10YWJsZS1oZWFkLWJnKTtcbiAgICBmb250LXdlaWdodDogNjAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHRyOmxhc3QtY2hpbGQgdGQge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdHI6bnRoLWNoaWxkKGV2ZW4pIHRkIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC10YWJsZS1yb3ctYWx0LWJnKTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBociB7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpO1xuICAgIG9wYWNpdHk6IDAuODtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzIHtcbiAgICBtYXJnaW46IDAuOTVlbSAwO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1kLXRhYmxlLWJvcmRlcik7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWQtdGFibGUtYmcpIDgyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpIDE4JSk7XG4gICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDE1LCAyMywgNDIsIDAuMDgpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMThzIGVhc2UsIGJveC1zaGFkb3cgMC4xOHMgZWFzZSwgdHJhbnNmb3JtIDAuMThzIGVhc2U7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlsczpob3Zlcixcbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlsczpmb2N1cy13aXRoaW4ge1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1kLWxpbmstY29sb3IpIDI0JSwgdmFyKC0tbWQtdGFibGUtYm9yZGVyKSA3NiUpO1xuICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMTUsIDIzLCA0MiwgMC4xMik7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnkge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNzJyZW07XG4gICAgcGFkZGluZzogMC45ZW0gMS4wNWVtO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAgICAgMTgwZGVnLFxuICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWQtdGFibGUtaGVhZC1iZykgODglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpIDEyJSksXG4gICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1iZykgODIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMTglKVxuICAgICk7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE4cyBlYXNlLCBjb2xvciAwLjE4cyBlYXNlO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiBzdW1tYXJ5OjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHdpZHRoOiAwLjYycmVtO1xuICAgIGhlaWdodDogMC42MnJlbTtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgICBtYXJnaW4tdG9wOiAtMC4wNHJlbTtcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuICAgIG9wYWNpdHk6IDAuODI7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMThzIGVhc2UsIG9wYWNpdHkgMC4xOHMgZWFzZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzID4gc3VtbWFyeTpob3Zlcixcbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnk6Zm9jdXMtdmlzaWJsZSB7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgICAxODBkZWcsXG4gICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1oZWFkLWJnKSA3NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkgMjQlKSxcbiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1kLXRhYmxlLWJnKSA3NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44MikgMjYlKVxuICAgICk7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnk6Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC1saW5rLWNvbG9yKSA1MiUsIHRyYW5zcGFyZW50KTtcbiAgICBvdXRsaW5lLW9mZnNldDogLTJweDtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzID4gc3VtbWFyeTo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzW29wZW5dID4gc3VtbWFyeSB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHNbb3Blbl0gPiBzdW1tYXJ5OjpiZWZvcmUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiA6bm90KHN1bW1hcnkpIHtcbiAgICBtYXJnaW4tbGVmdDogMS4wNWVtO1xuICAgIG1hcmdpbi1yaWdodDogMS4wNWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiBzdW1tYXJ5ICsgKiB7XG4gICAgbWFyZ2luLXRvcDogMC45NWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiA6bGFzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMS4wNWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHN0cm9uZyB7XG4gICAgZm9udC13ZWlnaHQ6IDY1MDtcbn1cblxuLk1hcmtkb3duQ29udGVudCBlbSB7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4uY2l0YXRpb24ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgbWluLXdpZHRoOiAxLjRlbTtcbiAgICBtYXJnaW46IDAgMC4xZW07XG4gICAgcGFkZGluZzogMCAwLjM1ZW07XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgZm9udC1zaXplOiAwLjc0ZW07XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMS40NTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7XG4gICAgY29sb3I6IHZhcigtLW1kLWNpdGF0aW9uLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC1jaXRhdGlvbi1iZyk7XG59XG5cbi5jaXRhdGlvblJlZiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBtaW4td2lkdGg6IDEuNGVtO1xuICAgIG1hcmdpbjogMCAwLjFlbTtcbiAgICBwYWRkaW5nOiAwIDAuMzVlbTtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBmb250LXNpemU6IDAuNzRlbTtcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjQ1O1xuICAgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjtcbiAgICBjb2xvcjogdmFyKC0tbWQtY2l0YXRpb24tY29sb3IpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLW1kLWNpdGF0aW9uLWJnKTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBzdXBbZGF0YS1jaXRhdGlvbi1mb290bm90ZV0ge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBtYXJnaW46IDAgMC43ZW0gMCAwLjA4ZW07XG4gICAgZm9udC1zaXplOiAwLjcyZW07XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7XG4gICAgY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cbiJdfQ== */";
|
|
21545
|
-
|
|
21546
|
-
|
|
21547
|
-
|
|
21545
|
+
/**
|
|
21546
|
+
* Default class name used for rendered citation references outside of CSS modules.
|
|
21547
|
+
*/
|
|
21548
|
+
const DEFAULT_CITATION_REFERENCE_CLASS_NAME = 'citationRef';
|
|
21549
|
+
/**
|
|
21550
|
+
* Browser stylesheet id used when KaTeX output is rendered in a live chat component.
|
|
21551
|
+
*/
|
|
21552
|
+
const KATEX_STYLESHEET_ID = 'katex-css';
|
|
21553
|
+
/**
|
|
21554
|
+
* CDN stylesheet loaded lazily when markdown contains KaTeX markup in the browser.
|
|
21555
|
+
*/
|
|
21556
|
+
const KATEX_STYLESHEET_URL = 'https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css';
|
|
21557
|
+
/**
|
|
21558
|
+
* Explicit allowlist of HTML tags that may survive markdown rendering.
|
|
21559
|
+
*
|
|
21560
|
+
* @private utility of `renderMarkdown`
|
|
21561
|
+
*/
|
|
21562
|
+
const MARKDOWN_SANITIZER_ALLOWED_TAGS = [
|
|
21563
|
+
'a',
|
|
21564
|
+
'annotation',
|
|
21565
|
+
'b',
|
|
21566
|
+
'blockquote',
|
|
21567
|
+
'br',
|
|
21568
|
+
'code',
|
|
21569
|
+
'del',
|
|
21570
|
+
'details',
|
|
21571
|
+
'div',
|
|
21572
|
+
'em',
|
|
21573
|
+
'h1',
|
|
21574
|
+
'h2',
|
|
21575
|
+
'h3',
|
|
21576
|
+
'h4',
|
|
21577
|
+
'h5',
|
|
21578
|
+
'h6',
|
|
21579
|
+
'hr',
|
|
21580
|
+
'i',
|
|
21581
|
+
'img',
|
|
21582
|
+
'input',
|
|
21583
|
+
'li',
|
|
21584
|
+
'math',
|
|
21585
|
+
'menclose',
|
|
21586
|
+
'mfrac',
|
|
21587
|
+
'mi',
|
|
21588
|
+
'mn',
|
|
21589
|
+
'mo',
|
|
21590
|
+
'mover',
|
|
21591
|
+
'mpadded',
|
|
21592
|
+
'mphantom',
|
|
21593
|
+
'mroot',
|
|
21594
|
+
'mrow',
|
|
21595
|
+
'msqrt',
|
|
21596
|
+
'mspace',
|
|
21597
|
+
'msub',
|
|
21598
|
+
'msubsup',
|
|
21599
|
+
'msup',
|
|
21600
|
+
'mstyle',
|
|
21601
|
+
'mtable',
|
|
21602
|
+
'mtd',
|
|
21603
|
+
'mtext',
|
|
21604
|
+
'mtr',
|
|
21605
|
+
'munder',
|
|
21606
|
+
'munderover',
|
|
21607
|
+
'ol',
|
|
21608
|
+
'p',
|
|
21609
|
+
'pre',
|
|
21610
|
+
's',
|
|
21611
|
+
'semantics',
|
|
21612
|
+
'span',
|
|
21613
|
+
'strong',
|
|
21614
|
+
'sub',
|
|
21615
|
+
'summary',
|
|
21616
|
+
'sup',
|
|
21617
|
+
'table',
|
|
21618
|
+
'tbody',
|
|
21619
|
+
'td',
|
|
21620
|
+
'tfoot',
|
|
21621
|
+
'th',
|
|
21622
|
+
'thead',
|
|
21623
|
+
'tr',
|
|
21624
|
+
'u',
|
|
21625
|
+
'ul',
|
|
21626
|
+
];
|
|
21627
|
+
/**
|
|
21628
|
+
* Explicit allowlist of HTML attributes that may survive markdown rendering.
|
|
21629
|
+
*
|
|
21630
|
+
* @private utility of `renderMarkdown`
|
|
21631
|
+
*/
|
|
21632
|
+
const MARKDOWN_SANITIZER_ALLOWED_ATTRIBUTES = [
|
|
21633
|
+
'alt',
|
|
21634
|
+
'aria-hidden',
|
|
21635
|
+
'checked',
|
|
21636
|
+
'class',
|
|
21637
|
+
'colspan',
|
|
21638
|
+
'data-citation-footnote',
|
|
21639
|
+
'data-chat-progress-marker',
|
|
21640
|
+
'disabled',
|
|
21641
|
+
'encoding',
|
|
21642
|
+
'height',
|
|
21643
|
+
'href',
|
|
21644
|
+
'id',
|
|
21645
|
+
'open',
|
|
21646
|
+
'rel',
|
|
21647
|
+
'rowspan',
|
|
21648
|
+
'src',
|
|
21649
|
+
'start',
|
|
21650
|
+
'stretchy',
|
|
21651
|
+
'style',
|
|
21652
|
+
'target',
|
|
21653
|
+
'title',
|
|
21654
|
+
'type',
|
|
21655
|
+
'width',
|
|
21656
|
+
'xmlns',
|
|
21657
|
+
];
|
|
21658
|
+
/**
|
|
21659
|
+
* Attributes that may contain external URLs and therefore need protocol validation.
|
|
21660
|
+
*
|
|
21661
|
+
* @private utility of `renderMarkdown`
|
|
21662
|
+
*/
|
|
21663
|
+
const MARKDOWN_SANITIZER_URL_ATTRIBUTES = ['href', 'src'];
|
|
21664
|
+
/**
|
|
21665
|
+
* URL protocols that remain allowed after markdown sanitization.
|
|
21666
|
+
*
|
|
21667
|
+
* @private utility of `renderMarkdown`
|
|
21668
|
+
*/
|
|
21669
|
+
const MARKDOWN_SANITIZER_ALLOWED_PROTOCOLS = new Set(['http', 'https', 'mailto', 'tel']);
|
|
21670
|
+
/**
|
|
21671
|
+
* Internal `data-*` attributes that Promptbook injects into rendered markdown and must survive sanitization.
|
|
21672
|
+
*
|
|
21673
|
+
* @private utility of `renderMarkdown`
|
|
21674
|
+
*/
|
|
21675
|
+
const MARKDOWN_SANITIZER_ALLOWED_DATA_ATTRIBUTES = new Set(['data-citation-footnote', 'data-chat-progress-marker']);
|
|
21676
|
+
/**
|
|
21677
|
+
* Highest ASCII control character code that should be stripped from sanitized URLs.
|
|
21678
|
+
*
|
|
21679
|
+
* @private utility of `renderMarkdown`
|
|
21680
|
+
*/
|
|
21681
|
+
const MAX_ASCII_CONTROL_CHARACTER_CODE = 32;
|
|
21682
|
+
/**
|
|
21683
|
+
* ASCII delete character code that should be stripped from sanitized URLs.
|
|
21684
|
+
*
|
|
21685
|
+
* @private utility of `renderMarkdown`
|
|
21686
|
+
*/
|
|
21687
|
+
const ASCII_DELETE_CHARACTER_CODE = 127;
|
|
21688
|
+
/**
|
|
21689
|
+
* DOMPurify configuration used for markdown rendering and export sanitization.
|
|
21690
|
+
*
|
|
21691
|
+
* @private utility of `renderMarkdown`
|
|
21692
|
+
*/
|
|
21693
|
+
const MARKDOWN_SANITIZER_CONFIG = {
|
|
21694
|
+
ALLOWED_TAGS: [...MARKDOWN_SANITIZER_ALLOWED_TAGS],
|
|
21695
|
+
ALLOWED_ATTR: [...MARKDOWN_SANITIZER_ALLOWED_ATTRIBUTES],
|
|
21696
|
+
ALLOW_ARIA_ATTR: true,
|
|
21697
|
+
ALLOW_DATA_ATTR: false,
|
|
21698
|
+
USE_PROFILES: {
|
|
21699
|
+
html: true,
|
|
21700
|
+
mathMl: true,
|
|
21701
|
+
svg: false,
|
|
21702
|
+
},
|
|
21703
|
+
};
|
|
21704
|
+
/**
|
|
21705
|
+
* Shared browser-side DOMPurify instance.
|
|
21706
|
+
*
|
|
21707
|
+
* @private utility of `renderMarkdown`
|
|
21708
|
+
*/
|
|
21709
|
+
let browserMarkdownSanitizer = null;
|
|
21710
|
+
/**
|
|
21711
|
+
* Shared server-side DOMPurify instance.
|
|
21712
|
+
*
|
|
21713
|
+
* @private utility of `renderMarkdown`
|
|
21714
|
+
*/
|
|
21715
|
+
let serverMarkdownSanitizer = null;
|
|
21716
|
+
/**
|
|
21717
|
+
* Shared JSDOM window backing the server-side DOMPurify instance.
|
|
21718
|
+
*
|
|
21719
|
+
* @private utility of `renderMarkdown`
|
|
21720
|
+
*/
|
|
21721
|
+
let serverMarkdownSanitizerWindow = null;
|
|
21722
|
+
/**
|
|
21723
|
+
* Pattern matching CODE FENCE.
|
|
21724
|
+
*/
|
|
21725
|
+
const CODE_FENCE_REGEX = /(`{3,}|~{3,})(?:[^\n\r]*)\r?\n[\s\S]*?\r?\n\1[^\n\r]*/g;
|
|
21726
|
+
/**
|
|
21727
|
+
* Pattern matching INLINE CODE.
|
|
21728
|
+
*/
|
|
21729
|
+
const INLINE_CODE_REGEX = /(`+)([\s\S]*?)(\1)/g;
|
|
21730
|
+
/**
|
|
21731
|
+
* Prefix for CODE PLACEHOLDER.
|
|
21732
|
+
*/
|
|
21733
|
+
const CODE_PLACEHOLDER_PREFIX = '@@PROMPTBOOK_CODE_PLACEHOLDER__';
|
|
21734
|
+
/**
|
|
21735
|
+
* Pattern matching CODE PLACEHOLDER.
|
|
21736
|
+
*/
|
|
21737
|
+
const CODE_PLACEHOLDER_REGEX = new RegExp(`${CODE_PLACEHOLDER_PREFIX}(\\d+)__`, 'g');
|
|
21738
|
+
/**
|
|
21739
|
+
* Pattern matching DETAILS BLOCK.
|
|
21740
|
+
*/
|
|
21741
|
+
const DETAILS_BLOCK_REGEX = /<details[\s\S]*?<\/details\s*>/gi;
|
|
21742
|
+
/**
|
|
21743
|
+
* Prefix for DETAILS PLACEHOLDER.
|
|
21744
|
+
*/
|
|
21745
|
+
const DETAILS_PLACEHOLDER_PREFIX = '@@PROMPTBOOK_DETAILS_PLACEHOLDER__';
|
|
21746
|
+
/**
|
|
21747
|
+
* Pattern matching DETAILS PLACEHOLDER.
|
|
21748
|
+
*/
|
|
21749
|
+
const DETAILS_PLACEHOLDER_REGEX = new RegExp(`${DETAILS_PLACEHOLDER_PREFIX}(\\d+)__`, 'g');
|
|
21750
|
+
/**
|
|
21751
|
+
* Matches a Showdown-wrapped placeholder such as `<p>@@PROMPTBOOK_DETAILS_PLACEHOLDER__0__</p>`.
|
|
21752
|
+
*/
|
|
21753
|
+
const DETAILS_PLACEHOLDER_WRAPPED_REGEX = new RegExp(`<p>\\s*(${DETAILS_PLACEHOLDER_PREFIX}\\d+__)\\s*<\\/p>`, 'g');
|
|
21754
|
+
/**
|
|
21755
|
+
* Collection of math delimiter definitions.
|
|
21756
|
+
*/
|
|
21757
|
+
const MATH_DELIMITER_DEFINITIONS = [
|
|
21758
|
+
{ regex: /(^|[^\\])\$\$([\s\S]+?)\$\$/g, displayMode: true },
|
|
21759
|
+
{ regex: /(^|[^\\])\\\[([\s\S]+?)\\\]/g, displayMode: true },
|
|
21760
|
+
{ regex: /(^|[^\\])\\\(([\s\S]+?)\\\)/g, displayMode: false },
|
|
21761
|
+
{ regex: /(^|[^\\])\$([^$\n]+?)\$/g, displayMode: false },
|
|
21762
|
+
];
|
|
21763
|
+
/**
|
|
21764
|
+
* Removes whitespace and control characters that can obscure a URL protocol.
|
|
21765
|
+
*
|
|
21766
|
+
* @private utility of `renderMarkdown`
|
|
21767
|
+
*/
|
|
21768
|
+
function normalizeSanitizedUrlValue(value) {
|
|
21769
|
+
return Array.from(value.trim())
|
|
21770
|
+
.filter((character) => {
|
|
21771
|
+
const characterCode = character.charCodeAt(0);
|
|
21772
|
+
return (characterCode > MAX_ASCII_CONTROL_CHARACTER_CODE && characterCode !== ASCII_DELETE_CHARACTER_CODE);
|
|
21773
|
+
})
|
|
21774
|
+
.join('');
|
|
21775
|
+
}
|
|
21776
|
+
/**
|
|
21777
|
+
* Returns whether a sanitized URL attribute still uses an allowed protocol.
|
|
21778
|
+
*
|
|
21779
|
+
* @private utility of `renderMarkdown`
|
|
21780
|
+
*/
|
|
21781
|
+
function isAllowedSanitizedUrl(value) {
|
|
21782
|
+
const normalizedValue = normalizeSanitizedUrlValue(value);
|
|
21783
|
+
if (normalizedValue === '') {
|
|
21784
|
+
return true;
|
|
21785
|
+
}
|
|
21786
|
+
if (normalizedValue.startsWith('#') ||
|
|
21787
|
+
normalizedValue.startsWith('/') ||
|
|
21788
|
+
normalizedValue.startsWith('./') ||
|
|
21789
|
+
normalizedValue.startsWith('../') ||
|
|
21790
|
+
normalizedValue.startsWith('?') ||
|
|
21791
|
+
normalizedValue.startsWith('//')) {
|
|
21792
|
+
return true;
|
|
21793
|
+
}
|
|
21794
|
+
const schemeMatch = normalizedValue.match(/^([a-z][a-z0-9+.-]*):/i);
|
|
21795
|
+
if (!schemeMatch) {
|
|
21796
|
+
return true;
|
|
21797
|
+
}
|
|
21798
|
+
return MARKDOWN_SANITIZER_ALLOWED_PROTOCOLS.has(schemeMatch[1].toLowerCase());
|
|
21799
|
+
}
|
|
21800
|
+
/**
|
|
21801
|
+
* Applies the shared post-attribute sanitization rules to a DOMPurify instance.
|
|
21802
|
+
*
|
|
21803
|
+
* @private utility of `renderMarkdown`
|
|
21804
|
+
*/
|
|
21805
|
+
function registerMarkdownSanitizerHooks(markdownSanitizer) {
|
|
21806
|
+
markdownSanitizer.addHook('uponSanitizeAttribute', (_currentNode, hookEvent) => {
|
|
21807
|
+
if (MARKDOWN_SANITIZER_ALLOWED_DATA_ATTRIBUTES.has(hookEvent.attrName)) {
|
|
21808
|
+
hookEvent.forceKeepAttr = true;
|
|
21809
|
+
}
|
|
21810
|
+
});
|
|
21811
|
+
markdownSanitizer.addHook('afterSanitizeAttributes', (currentNode) => {
|
|
21812
|
+
if (!currentNode || currentNode.nodeType !== 1) {
|
|
21813
|
+
return;
|
|
21814
|
+
}
|
|
21815
|
+
const currentElement = currentNode;
|
|
21816
|
+
for (const attributeName of MARKDOWN_SANITIZER_URL_ATTRIBUTES) {
|
|
21817
|
+
const attributeValue = currentElement.getAttribute(attributeName);
|
|
21818
|
+
if (attributeValue && !isAllowedSanitizedUrl(attributeValue)) {
|
|
21819
|
+
currentElement.removeAttribute(attributeName);
|
|
21820
|
+
}
|
|
21821
|
+
}
|
|
21822
|
+
if (currentElement.tagName === 'A' && currentElement.getAttribute('target') === '_blank') {
|
|
21823
|
+
currentElement.setAttribute('rel', 'noopener noreferrer');
|
|
21824
|
+
}
|
|
21825
|
+
});
|
|
21826
|
+
}
|
|
21827
|
+
/**
|
|
21828
|
+
* Creates a DOMPurify instance configured for Promptbook markdown output.
|
|
21829
|
+
*
|
|
21830
|
+
* @private utility of `renderMarkdown`
|
|
21831
|
+
*/
|
|
21832
|
+
function createMarkdownSanitizer(sanitizerWindow) {
|
|
21833
|
+
const markdownSanitizer = createDOMPurify__default["default"](sanitizerWindow);
|
|
21834
|
+
registerMarkdownSanitizerHooks(markdownSanitizer);
|
|
21835
|
+
return markdownSanitizer;
|
|
21836
|
+
}
|
|
21837
|
+
/**
|
|
21838
|
+
* Lazily creates the JSDOM window used by server-side markdown sanitization.
|
|
21839
|
+
*
|
|
21840
|
+
* @private utility of `renderMarkdown`
|
|
21841
|
+
*/
|
|
21842
|
+
function getServerMarkdownSanitizerWindow() {
|
|
21843
|
+
if (!serverMarkdownSanitizerWindow) {
|
|
21844
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
21845
|
+
const { JSDOM } = require('jsdom');
|
|
21846
|
+
serverMarkdownSanitizerWindow = new JSDOM('').window;
|
|
21847
|
+
}
|
|
21848
|
+
return serverMarkdownSanitizerWindow;
|
|
21849
|
+
}
|
|
21850
|
+
/**
|
|
21851
|
+
* Returns the shared DOMPurify instance appropriate for the current runtime.
|
|
21852
|
+
*
|
|
21853
|
+
* @private utility of `renderMarkdown`
|
|
21854
|
+
*/
|
|
21855
|
+
function getMarkdownSanitizer() {
|
|
21856
|
+
if (typeof window !== 'undefined') {
|
|
21857
|
+
browserMarkdownSanitizer !== null && browserMarkdownSanitizer !== void 0 ? browserMarkdownSanitizer : (browserMarkdownSanitizer = createMarkdownSanitizer(window));
|
|
21858
|
+
return browserMarkdownSanitizer;
|
|
21859
|
+
}
|
|
21860
|
+
serverMarkdownSanitizer !== null && serverMarkdownSanitizer !== void 0 ? serverMarkdownSanitizer : (serverMarkdownSanitizer = createMarkdownSanitizer(getServerMarkdownSanitizerWindow()));
|
|
21861
|
+
return serverMarkdownSanitizer;
|
|
21862
|
+
}
|
|
21863
|
+
/**
|
|
21864
|
+
* Sanitizes rendered markdown HTML with the shared Promptbook allowlist.
|
|
21865
|
+
*
|
|
21866
|
+
* @private utility of `renderMarkdown`
|
|
21867
|
+
*/
|
|
21868
|
+
function sanitizeRenderedMarkdownHtml(html) {
|
|
21869
|
+
return getMarkdownSanitizer().sanitize(html, MARKDOWN_SANITIZER_CONFIG);
|
|
21870
|
+
}
|
|
21548
21871
|
/**
|
|
21549
21872
|
* Normalizes markdown sublists so they render correctly under ordered list items.
|
|
21550
21873
|
*
|
|
21551
21874
|
* @param markdown - Markdown content to normalize.
|
|
21552
21875
|
* @returns Markdown with normalized sublist indentation.
|
|
21553
21876
|
*
|
|
21554
|
-
* @private utility of `
|
|
21877
|
+
* @private utility of `renderMarkdown`
|
|
21555
21878
|
*/
|
|
21556
|
-
function normalizeMarkdownSublists
|
|
21879
|
+
function normalizeMarkdownSublists(markdown) {
|
|
21557
21880
|
const lines = markdown.split(/\r?\n/);
|
|
21558
21881
|
let orderedIndent = null;
|
|
21559
21882
|
let shouldIndentUnordered = false;
|
|
@@ -21596,11 +21919,13 @@
|
|
|
21596
21919
|
return normalizedLines.join('\n');
|
|
21597
21920
|
}
|
|
21598
21921
|
/**
|
|
21599
|
-
* Creates a showdown converter configured for chat markdown rendering
|
|
21922
|
+
* Creates a showdown converter configured for chat markdown rendering.
|
|
21600
21923
|
*
|
|
21601
|
-
* @private utility of `
|
|
21924
|
+
* @private utility of `renderMarkdown`
|
|
21602
21925
|
*/
|
|
21603
|
-
function createChatMarkdownConverter
|
|
21926
|
+
function createChatMarkdownConverter(options) {
|
|
21927
|
+
var _a;
|
|
21928
|
+
const citationReferenceClassName = (_a = options === null || options === void 0 ? void 0 : options.citationReferenceClassName) !== null && _a !== void 0 ? _a : DEFAULT_CITATION_REFERENCE_CLASS_NAME;
|
|
21604
21929
|
return new showdown.Converter({
|
|
21605
21930
|
flavor: 'github',
|
|
21606
21931
|
tables: true,
|
|
@@ -21642,67 +21967,16 @@
|
|
|
21642
21967
|
return match;
|
|
21643
21968
|
}
|
|
21644
21969
|
TODO_USE(citationMarker.source);
|
|
21645
|
-
|
|
21646
|
-
// We replace them with numbered superscript references
|
|
21647
|
-
return `<sup class="${styles$b.citationRef}">[${citationMarker.id}]</sup>`;
|
|
21970
|
+
return `<sup class="${citationReferenceClassName}">[${citationMarker.id}]</sup>`;
|
|
21648
21971
|
},
|
|
21649
21972
|
}),
|
|
21650
21973
|
],
|
|
21651
21974
|
});
|
|
21652
21975
|
}
|
|
21653
21976
|
/**
|
|
21654
|
-
* Pre-configured showdown converter for chat markdown
|
|
21655
|
-
*
|
|
21656
|
-
* @private utility of `MarkdownContent` component
|
|
21657
|
-
*/
|
|
21658
|
-
const chatMarkdownConverter = createChatMarkdownConverter$1();
|
|
21659
|
-
/**
|
|
21660
|
-
* Collection of math delimiter definitions.
|
|
21661
|
-
*/
|
|
21662
|
-
const mathDelimiterDefinitions = [
|
|
21663
|
-
{ regex: /(^|[^\\])\$\$([\s\S]+?)\$\$/g, displayMode: true },
|
|
21664
|
-
{ regex: /(^|[^\\])\\\[([\s\S]+?)\\\]/g, displayMode: true },
|
|
21665
|
-
{ regex: /(^|[^\\])\\\(([\s\S]+?)\\\)/g, displayMode: false },
|
|
21666
|
-
{ regex: /(^|[^\\])\$([^$\n]+?)\$/g, displayMode: false },
|
|
21667
|
-
];
|
|
21668
|
-
/**
|
|
21669
|
-
* Pattern matching CODE FENCE.
|
|
21670
|
-
*/
|
|
21671
|
-
const CODE_FENCE_REGEX$1 = /(`{3,}|~{3,})(?:[^\n\r]*)\r?\n[\s\S]*?\r?\n\1[^\n\r]*/g;
|
|
21672
|
-
/**
|
|
21673
|
-
* Pattern matching INLINE CODE.
|
|
21674
|
-
*/
|
|
21675
|
-
const INLINE_CODE_REGEX$1 = /(`+)([\s\S]*?)(\1)/g;
|
|
21676
|
-
/**
|
|
21677
|
-
* Prefix for CODE PLACEHOLDER.
|
|
21678
|
-
*/
|
|
21679
|
-
const CODE_PLACEHOLDER_PREFIX$1 = '@@PROMPTBOOK_CODE_PLACEHOLDER__';
|
|
21680
|
-
/**
|
|
21681
|
-
* Pattern matching CODE PLACEHOLDER.
|
|
21682
|
-
*/
|
|
21683
|
-
const CODE_PLACEHOLDER_REGEX$1 = new RegExp(`${CODE_PLACEHOLDER_PREFIX$1}(\\d+)__`, 'g');
|
|
21684
|
-
/**
|
|
21685
|
-
* Pattern matching DETAILS BLOCK.
|
|
21686
|
-
*/
|
|
21687
|
-
const DETAILS_BLOCK_REGEX$1 = /<details[\s\S]*?<\/details\s*>/gi;
|
|
21688
|
-
/**
|
|
21689
|
-
* Prefix for DETAILS PLACEHOLDER.
|
|
21690
|
-
*/
|
|
21691
|
-
const DETAILS_PLACEHOLDER_PREFIX$1 = '@@PROMPTBOOK_DETAILS_PLACEHOLDER__';
|
|
21692
|
-
/**
|
|
21693
|
-
* Pattern matching DETAILS PLACEHOLDER.
|
|
21694
|
-
*/
|
|
21695
|
-
const DETAILS_PLACEHOLDER_REGEX$1 = new RegExp(`${DETAILS_PLACEHOLDER_PREFIX$1}(\\d+)__`, 'g');
|
|
21696
|
-
/**
|
|
21697
|
-
* Matches a Showdown-wrapped placeholder such as `<p>@@PROMPTBOOK_DETAILS_PLACEHOLDER__0__</p>`
|
|
21698
|
-
*/
|
|
21699
|
-
const DETAILS_PLACEHOLDER_WRAPPED_REGEX$1 = new RegExp(`<p>\\s*(${DETAILS_PLACEHOLDER_PREFIX$1}\\d+__)\\s*<\\/p>`, 'g');
|
|
21700
|
-
/**
|
|
21701
|
-
* Selector used by the delegated summary click handler.
|
|
21702
|
-
*
|
|
21703
|
-
* @private utility of `MarkdownContent` component
|
|
21977
|
+
* Pre-configured showdown converter for chat markdown.
|
|
21704
21978
|
*/
|
|
21705
|
-
const
|
|
21979
|
+
const CHAT_MARKDOWN_CONVERTER = createChatMarkdownConverter();
|
|
21706
21980
|
/**
|
|
21707
21981
|
* Renders the body of one raw `<details>` block as markdown while keeping the
|
|
21708
21982
|
* outer `<details>` and optional `<summary>` markup untouched.
|
|
@@ -21710,9 +21984,9 @@
|
|
|
21710
21984
|
* @param detailsBlock - Raw `<details>...</details>` HTML captured from markdown.
|
|
21711
21985
|
* @returns `<details>` HTML whose body has been converted from markdown to HTML.
|
|
21712
21986
|
*
|
|
21713
|
-
* @private utility of `
|
|
21987
|
+
* @private utility of `renderMarkdown`
|
|
21714
21988
|
*/
|
|
21715
|
-
function renderDetailsBlock
|
|
21989
|
+
function renderDetailsBlock(detailsBlock) {
|
|
21716
21990
|
var _a, _b;
|
|
21717
21991
|
const openTagMatch = detailsBlock.match(/^<details\b[^>]*>/i);
|
|
21718
21992
|
const closeTagMatch = detailsBlock.match(/<\/details\s*>$/i);
|
|
@@ -21725,7 +21999,7 @@
|
|
|
21725
21999
|
const summaryMatch = innerContent.match(/^(\s*<summary\b[^>]*>[\s\S]*?<\/summary\s*>)([\s\S]*)$/i);
|
|
21726
22000
|
const summaryHtml = (_a = summaryMatch === null || summaryMatch === void 0 ? void 0 : summaryMatch[1]) !== null && _a !== void 0 ? _a : '';
|
|
21727
22001
|
const bodyMarkdown = ((_b = summaryMatch === null || summaryMatch === void 0 ? void 0 : summaryMatch[2]) !== null && _b !== void 0 ? _b : innerContent);
|
|
21728
|
-
const renderedBody = renderMarkdown
|
|
22002
|
+
const renderedBody = renderMarkdown(bodyMarkdown);
|
|
21729
22003
|
return `${openTag}${summaryHtml}${renderedBody}${closeTag}`;
|
|
21730
22004
|
}
|
|
21731
22005
|
/**
|
|
@@ -21734,13 +22008,13 @@
|
|
|
21734
22008
|
* @param markdown - Markdown text to mask.
|
|
21735
22009
|
* @returns Masked markdown and a restore helper.
|
|
21736
22010
|
*
|
|
21737
|
-
* @private utility of `
|
|
22011
|
+
* @private utility of `renderMarkdown`
|
|
21738
22012
|
*/
|
|
21739
|
-
function maskMarkdownCodeSegments
|
|
22013
|
+
function maskMarkdownCodeSegments(markdown) {
|
|
21740
22014
|
const segments = [];
|
|
21741
22015
|
let masked = markdown;
|
|
21742
22016
|
const addPlaceholder = (segment) => {
|
|
21743
|
-
const placeholder = `${CODE_PLACEHOLDER_PREFIX
|
|
22017
|
+
const placeholder = `${CODE_PLACEHOLDER_PREFIX}${segments.length}__`;
|
|
21744
22018
|
segments.push(segment);
|
|
21745
22019
|
return placeholder;
|
|
21746
22020
|
};
|
|
@@ -21748,51 +22022,48 @@
|
|
|
21748
22022
|
regex.lastIndex = 0;
|
|
21749
22023
|
masked = masked.replace(regex, (match) => addPlaceholder(match));
|
|
21750
22024
|
};
|
|
21751
|
-
maskWith(CODE_FENCE_REGEX
|
|
21752
|
-
maskWith(INLINE_CODE_REGEX
|
|
22025
|
+
maskWith(CODE_FENCE_REGEX);
|
|
22026
|
+
maskWith(INLINE_CODE_REGEX);
|
|
21753
22027
|
return {
|
|
21754
22028
|
masked: masked,
|
|
21755
22029
|
restore(value) {
|
|
21756
|
-
return value.replace(CODE_PLACEHOLDER_REGEX
|
|
22030
|
+
return value.replace(CODE_PLACEHOLDER_REGEX, (_match, index) => { var _a; return (_a = segments[Number(index)]) !== null && _a !== void 0 ? _a : ''; });
|
|
21757
22031
|
},
|
|
21758
22032
|
};
|
|
21759
22033
|
}
|
|
21760
22034
|
/**
|
|
21761
|
-
* Masks `<details
|
|
21762
|
-
* processes their content
|
|
21763
|
-
*
|
|
21764
|
-
* The original blocks are replaced with placeholders before Showdown runs, then restored
|
|
21765
|
-
* afterwards with their non-summary body converted through the normal markdown pipeline.
|
|
21766
|
-
* Any surrounding `<p>` wrapper that Showdown may have injected around a placeholder is
|
|
21767
|
-
* stripped so the `<details>` element remains a proper block-level element.
|
|
22035
|
+
* Masks `<details>...</details>` blocks in the markdown source so that Showdown never
|
|
22036
|
+
* processes their content.
|
|
21768
22037
|
*
|
|
21769
22038
|
* @param markdown - Markdown text that may contain raw HTML `<details>` blocks.
|
|
21770
22039
|
* @returns Masked markdown and a restore helper that returns `string_html`.
|
|
21771
22040
|
*
|
|
21772
|
-
* @private utility of `
|
|
22041
|
+
* @private utility of `renderMarkdown`
|
|
21773
22042
|
*/
|
|
21774
|
-
function maskDetailsBlocks
|
|
22043
|
+
function maskDetailsBlocks(markdown) {
|
|
21775
22044
|
const blocks = [];
|
|
21776
|
-
DETAILS_BLOCK_REGEX
|
|
21777
|
-
const masked = markdown.replace(DETAILS_BLOCK_REGEX
|
|
21778
|
-
const placeholder = `${DETAILS_PLACEHOLDER_PREFIX
|
|
21779
|
-
blocks.push(renderDetailsBlock
|
|
22045
|
+
DETAILS_BLOCK_REGEX.lastIndex = 0;
|
|
22046
|
+
const masked = markdown.replace(DETAILS_BLOCK_REGEX, (match) => {
|
|
22047
|
+
const placeholder = `${DETAILS_PLACEHOLDER_PREFIX}${blocks.length}__`;
|
|
22048
|
+
blocks.push(renderDetailsBlock(match));
|
|
21780
22049
|
return placeholder;
|
|
21781
22050
|
});
|
|
21782
22051
|
return {
|
|
21783
22052
|
masked,
|
|
21784
22053
|
restore(value) {
|
|
21785
22054
|
return value
|
|
21786
|
-
.replace(DETAILS_PLACEHOLDER_WRAPPED_REGEX
|
|
21787
|
-
.replace(DETAILS_PLACEHOLDER_REGEX
|
|
22055
|
+
.replace(DETAILS_PLACEHOLDER_WRAPPED_REGEX, '$1')
|
|
22056
|
+
.replace(DETAILS_PLACEHOLDER_REGEX, (_match, index) => { var _a; return (_a = blocks[Number(index)]) !== null && _a !== void 0 ? _a : ''; });
|
|
21788
22057
|
},
|
|
21789
22058
|
};
|
|
21790
22059
|
}
|
|
21791
22060
|
/**
|
|
21792
22061
|
* Replaces math delimiter.
|
|
22062
|
+
*
|
|
22063
|
+
* @private utility of `renderMarkdown`
|
|
21793
22064
|
*/
|
|
21794
|
-
function replaceMathDelimiter
|
|
21795
|
-
return
|
|
22065
|
+
function replaceMathDelimiter(markdown, delimiter) {
|
|
22066
|
+
return markdown.replace(delimiter.regex, (...args) => {
|
|
21796
22067
|
var _a, _b, _c;
|
|
21797
22068
|
const match = (_a = args[0]) !== null && _a !== void 0 ? _a : '';
|
|
21798
22069
|
const prefix = (_b = args[1]) !== null && _b !== void 0 ? _b : '';
|
|
@@ -21817,71 +22088,94 @@
|
|
|
21817
22088
|
*
|
|
21818
22089
|
* Supported delimiters: `$$...$$`, `\[...\]`, `\(...\)`, and `$...$`.
|
|
21819
22090
|
*
|
|
21820
|
-
* @private utility of `
|
|
22091
|
+
* @private utility of `renderMarkdown`
|
|
21821
22092
|
*/
|
|
21822
|
-
function renderMathInMarkdown
|
|
21823
|
-
const { masked, restore } = maskMarkdownCodeSegments
|
|
22093
|
+
function renderMathInMarkdown(markdown) {
|
|
22094
|
+
const { masked, restore } = maskMarkdownCodeSegments(markdown);
|
|
21824
22095
|
let processed = masked;
|
|
21825
|
-
for (const delimiter of
|
|
21826
|
-
processed = replaceMathDelimiter
|
|
22096
|
+
for (const delimiter of MATH_DELIMITER_DEFINITIONS) {
|
|
22097
|
+
processed = replaceMathDelimiter(processed, delimiter);
|
|
21827
22098
|
}
|
|
21828
22099
|
processed = processed.replace(/\\$/g, '$');
|
|
21829
22100
|
return restore(processed);
|
|
21830
22101
|
}
|
|
21831
22102
|
/**
|
|
21832
|
-
*
|
|
21833
|
-
*
|
|
21834
|
-
* TODO: [🧠] Maybe export from `@promptbook/markdown-utils`
|
|
21835
|
-
*
|
|
21836
|
-
* @param markdown - The markdown content to convert
|
|
21837
|
-
* @returns HTML string ready for rendering
|
|
22103
|
+
* Escapes HTML-sensitive text before returning fallback markdown rendering.
|
|
21838
22104
|
*
|
|
21839
|
-
* @
|
|
22105
|
+
* @private utility of `renderMarkdown`
|
|
21840
22106
|
*/
|
|
21841
|
-
function
|
|
21842
|
-
|
|
21843
|
-
|
|
21844
|
-
|
|
21845
|
-
|
|
21846
|
-
|
|
21847
|
-
|
|
21848
|
-
|
|
21849
|
-
|
|
21850
|
-
|
|
21851
|
-
|
|
21852
|
-
|
|
21853
|
-
|
|
21854
|
-
|
|
21855
|
-
|
|
21856
|
-
|
|
21857
|
-
|
|
21858
|
-
|
|
21859
|
-
|
|
21860
|
-
|
|
21861
|
-
|
|
22107
|
+
function escapeHtml$2(value) {
|
|
22108
|
+
return value.replace(/[<>&"']/g, (char) => {
|
|
22109
|
+
const entities = {
|
|
22110
|
+
'<': '<',
|
|
22111
|
+
'>': '>',
|
|
22112
|
+
'&': '&',
|
|
22113
|
+
'"': '"',
|
|
22114
|
+
"'": ''',
|
|
22115
|
+
};
|
|
22116
|
+
return entities[char] || char;
|
|
22117
|
+
});
|
|
22118
|
+
}
|
|
22119
|
+
/**
|
|
22120
|
+
* Loads KaTeX CSS in browser environments that need to display math output.
|
|
22121
|
+
*
|
|
22122
|
+
* @private utility of `renderMarkdown`
|
|
22123
|
+
*/
|
|
22124
|
+
function registerKatexStylesheet(html) {
|
|
22125
|
+
if (typeof window === 'undefined') {
|
|
22126
|
+
return;
|
|
22127
|
+
}
|
|
22128
|
+
if (!html.match(/class="katex/)) {
|
|
22129
|
+
return;
|
|
22130
|
+
}
|
|
22131
|
+
if (window.document.getElementById(KATEX_STYLESHEET_ID)) {
|
|
22132
|
+
return;
|
|
22133
|
+
}
|
|
22134
|
+
const link = window.document.createElement('link');
|
|
22135
|
+
link.id = KATEX_STYLESHEET_ID;
|
|
22136
|
+
link.rel = 'stylesheet';
|
|
22137
|
+
link.href = KATEX_STYLESHEET_URL;
|
|
22138
|
+
window.document.head.appendChild(link);
|
|
22139
|
+
}
|
|
22140
|
+
/**
|
|
22141
|
+
* Convert markdown content to HTML.
|
|
22142
|
+
*
|
|
22143
|
+
* @param markdown - The markdown content to convert.
|
|
22144
|
+
* @returns HTML string ready for rendering.
|
|
22145
|
+
*
|
|
22146
|
+
* @private internal utility of chat components and exports
|
|
22147
|
+
*/
|
|
22148
|
+
function renderMarkdown(markdown, options) {
|
|
22149
|
+
if (!markdown || typeof markdown !== 'string') {
|
|
22150
|
+
return '';
|
|
22151
|
+
}
|
|
22152
|
+
const converter = options ? createChatMarkdownConverter(options) : CHAT_MARKDOWN_CONVERTER;
|
|
22153
|
+
try {
|
|
22154
|
+
const normalizedMarkdown = normalizeMarkdownSublists(markdown);
|
|
22155
|
+
const { masked: maskedMarkdown, restore: restoreDetails } = maskDetailsBlocks(normalizedMarkdown);
|
|
22156
|
+
const processedMarkdown = renderMathInMarkdown(maskedMarkdown);
|
|
22157
|
+
const html = converter.makeHtml(processedMarkdown);
|
|
22158
|
+
registerKatexStylesheet(html);
|
|
21862
22159
|
const restoredHtml = restoreDetails(html);
|
|
21863
|
-
const sanitizedHtml = restoredHtml
|
|
21864
|
-
.replace(/<\s*(script|style|iframe|object|embed)[^>]*>[\s\S]*?<\s*\/\s*\1\s*>/gi, '')
|
|
21865
|
-
.replace(/\s+on\w+="[^"]*"/gi, '')
|
|
21866
|
-
.replace(/\s+javascript:/gi, '')
|
|
21867
|
-
.replace(/\s+data:/gi, '')
|
|
21868
|
-
.replace(/\s+vbscript:/gi, '');
|
|
22160
|
+
const sanitizedHtml = sanitizeRenderedMarkdownHtml(restoredHtml);
|
|
21869
22161
|
return sanitizedHtml;
|
|
21870
22162
|
}
|
|
21871
22163
|
catch (error) {
|
|
21872
22164
|
console.error('Error rendering markdown:', error);
|
|
21873
|
-
return markdown
|
|
21874
|
-
const entities = {
|
|
21875
|
-
'<': '<',
|
|
21876
|
-
'>': '>',
|
|
21877
|
-
'&': '&',
|
|
21878
|
-
'"': '"',
|
|
21879
|
-
"'": ''',
|
|
21880
|
-
};
|
|
21881
|
-
return entities[char] || char;
|
|
21882
|
-
});
|
|
22165
|
+
return escapeHtml$2(markdown);
|
|
21883
22166
|
}
|
|
21884
22167
|
}
|
|
22168
|
+
|
|
22169
|
+
var css_248z$b = ".MarkdownContent-module_MarkdownContent__2JuyX{--md-text-color:var(--chat-md-text-color,inherit);--md-muted-color:var(--chat-md-muted-color,currentColor);--md-link-color:var(--chat-md-link-color,#2563eb);--md-heading-color:var(--chat-heading-text-color,var(--md-text-color));--md-heading-font-family:var(\n --chat-md-heading-font-family,var(--font-poppins,\"Poppins\",system-ui,-apple-system,sans-serif)\n );--md-body-font-family:var(\n --chat-md-body-font-family,var(--font-poppins,\"Poppins\",system-ui,-apple-system,sans-serif)\n );--md-code-font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",monospace;--md-inline-code-bg:var(--chat-md-inline-code-bg,rgba(15,23,42,.08));--md-inline-code-border:var(--chat-md-inline-code-border,rgba(15,23,42,.12));--md-inline-code-color:var(--chat-md-inline-code-color,var(--md-text-color));--md-blockquote-bg:var(--chat-md-blockquote-bg,rgba(248,250,252,.92));--md-blockquote-border:var(--chat-md-blockquote-border,rgba(59,130,246,.35));--md-table-bg:var(--chat-md-table-bg,rgba(248,250,252,.92));--md-table-row-alt-bg:var(--chat-md-table-row-alt-bg,rgba(241,245,249,.9));--md-table-head-bg:var(--chat-md-table-head-bg,rgba(226,232,240,.95));--md-table-border:var(--chat-md-table-border,rgba(148,163,184,.36));--md-citation-bg:var(--chat-md-citation-bg,rgba(59,130,246,.14));--md-citation-color:var(--chat-md-citation-color,#1d4ed8);color:var(--md-text-color);font-family:var(--md-body-font-family);font-size:inherit;letter-spacing:.002em;line-height:1.65}.MarkdownContent-module_MarkdownContent__2JuyX>:first-child{margin-top:0!important}.MarkdownContent-module_MarkdownContent__2JuyX>:last-child{margin-bottom:0!important}.MarkdownContent-module_MarkdownContent__2JuyX :is(h1,h2,h3,h4,h5,h6){text-wrap:balance;color:var(--md-heading-color);font-family:var(--md-heading-font-family);font-weight:600;letter-spacing:.01em;line-height:1.24;margin:1.4em 0 .55em;position:relative}.MarkdownContent-module_MarkdownContent__2JuyX h1{font-size:1.52rem}.MarkdownContent-module_MarkdownContent__2JuyX h2{font-size:1.4rem}.MarkdownContent-module_MarkdownContent__2JuyX h3{font-size:1.26rem}.MarkdownContent-module_MarkdownContent__2JuyX h4{font-size:1.14rem}.MarkdownContent-module_MarkdownContent__2JuyX h5{font-size:1.04rem}.MarkdownContent-module_MarkdownContent__2JuyX h6{font-size:.98rem}.MarkdownContent-module_MarkdownContent__2JuyX p{text-wrap:pretty;margin:0 0 .9em}.MarkdownContent-module_MarkdownContent__2JuyX p:empty{display:none}.MarkdownContent-module_MarkdownContent__2JuyX :is(ul,ol){display:grid;gap:.35em;margin:.65em 0 1em;padding-inline-start:1.35rem}.MarkdownContent-module_MarkdownContent__2JuyX ul{list-style:disc}.MarkdownContent-module_MarkdownContent__2JuyX ol{list-style:decimal}.MarkdownContent-module_MarkdownContent__2JuyX li{line-height:1.58}.MarkdownContent-module_MarkdownContent__2JuyX li>:is(ul,ol){margin-bottom:0;margin-top:.45em}.MarkdownContent-module_MarkdownContent__2JuyX ul:has(>li>[data-chat-progress-marker]){list-style:none;padding-inline-start:0}.MarkdownContent-module_MarkdownContent__2JuyX ul:has(>li>[data-chat-progress-marker])>li{list-style:none}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker]{border-radius:999px;color:var(--md-link-color);display:inline-flex;height:1rem;margin-right:.58rem;transform-origin:center;vertical-align:text-bottom;width:1rem}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=pending]{animation:MarkdownContent-module_chatProgressMarkerSpin__TpoKr .85s linear infinite;border:2px solid color-mix(in srgb,currentColor 22%,transparent);border-top-color:currentcolor;box-sizing:border-box}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=completed]{align-items:center;background:color-mix(in srgb,currentColor 12%,transparent);border:2px solid;box-sizing:border-box;justify-content:center}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=completed]:before{border-bottom:2px solid;border-right:2px solid;box-sizing:border-box;content:\"\";display:block;height:.5rem;margin-top:-.06rem;transform:rotate(45deg);width:.26rem}@keyframes MarkdownContent-module_chatProgressMarkerSpin__TpoKr{to{transform:rotate(1turn)}}.MarkdownContent-module_MarkdownContent__2JuyX a{color:var(--md-link-color);text-decoration-color:currentColor;text-decoration-line:underline;text-decoration-thickness:1.4px;text-underline-offset:.16em;transition:opacity .2s ease,text-decoration-thickness .2s ease}.MarkdownContent-module_MarkdownContent__2JuyX a:focus-visible,.MarkdownContent-module_MarkdownContent__2JuyX a:hover{opacity:.92;text-decoration-thickness:2px}.MarkdownContent-module_MarkdownContent__2JuyX img{border-radius:14px;display:block;height:auto;margin:.95em 0;max-width:100%}.MarkdownContent-module_MarkdownContent__2JuyX blockquote,.MarkdownContent-module_MarkdownContent__2JuyX hr,.MarkdownContent-module_MarkdownContent__2JuyX pre,.MarkdownContent-module_MarkdownContent__2JuyX table{margin:.95em 0}.MarkdownContent-module_MarkdownContent__2JuyX pre{background:transparent;border:none;border-radius:12px;box-shadow:none;display:block;overflow:visible;padding:0}.MarkdownContent-module_MarkdownContent__2JuyX blockquote{background:var(--md-blockquote-bg);border:none;border-left:3px solid var(--md-blockquote-border);border-radius:12px;box-shadow:none;color:var(--md-muted-color);display:block;padding:.72em .96em}.MarkdownContent-module_MarkdownContent__2JuyX blockquote>:last-child{margin-bottom:0}.MarkdownContent-module_MarkdownContent__2JuyX code{background:var(--md-inline-code-bg);border:1px solid var(--md-inline-code-border);border-radius:8px;color:var(--md-inline-code-color);font-family:var(--md-code-font-family);font-size:.88em;line-height:1.45;margin:0;padding:.14em .42em;word-break:break-word}.MarkdownContent-module_MarkdownContent__2JuyX pre code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:normal}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg{background:#181c23;border:1px solid rgba(148,163,184,.35);border-radius:12px;box-shadow:0 6px 18px rgba(2,6,23,.28);color:#f8fafc;font-family:var(--md-code-font-family);font-size:14px;line-height:1.6;overflow-x:auto}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:normal}.MarkdownContent-module_MarkdownContent__2JuyX table{background:var(--md-table-bg);border:1px solid var(--md-table-border);border-collapse:separate;border-radius:12px;border-spacing:0;box-shadow:0 2px 8px rgba(15,23,42,.1);color:inherit;font-size:.93em;overflow:hidden;width:100%}.MarkdownContent-module_MarkdownContent__2JuyX td,.MarkdownContent-module_MarkdownContent__2JuyX th{background:none;border-bottom:1px solid var(--md-table-border);color:inherit;padding:.58em .72em;text-align:left;vertical-align:top}.MarkdownContent-module_MarkdownContent__2JuyX th{background:var(--md-table-head-bg);font-weight:600}.MarkdownContent-module_MarkdownContent__2JuyX tr:last-child td{border-bottom:none}.MarkdownContent-module_MarkdownContent__2JuyX tr:nth-child(2n) td{background:var(--md-table-row-alt-bg)}.MarkdownContent-module_MarkdownContent__2JuyX hr{border:none;border-top:1px solid var(--md-table-border);opacity:.8}.MarkdownContent-module_MarkdownContent__2JuyX details{background:color-mix(in srgb,var(--md-table-bg) 82%,hsla(0,0%,100%,.3) 18%);border:1px solid var(--md-table-border);border-radius:16px;box-shadow:0 8px 22px rgba(15,23,42,.08);margin:.95em 0;overflow:hidden;transition:border-color .18s ease,box-shadow .18s ease,transform .18s ease}.MarkdownContent-module_MarkdownContent__2JuyX details:focus-within,.MarkdownContent-module_MarkdownContent__2JuyX details:hover{border-color:color-mix(in srgb,var(--md-link-color) 24%,var(--md-table-border) 76%);box-shadow:0 12px 28px rgba(15,23,42,.12)}.MarkdownContent-module_MarkdownContent__2JuyX details>summary{align-items:center;background:linear-gradient(180deg,color-mix(in srgb,var(--md-table-head-bg) 88%,hsla(0,0%,100%,.85) 12%),color-mix(in srgb,var(--md-table-bg) 82%,hsla(0,0%,100%,.7) 18%));color:var(--md-link-color);cursor:pointer;display:flex;font-weight:600;gap:.72rem;list-style:none;padding:.9em 1.05em;transition:background .18s ease,color .18s ease;user-select:none}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:before{border-bottom:2px solid;border-right:2px solid;content:\"\";flex:0 0 auto;height:.62rem;margin-top:-.04rem;opacity:.82;transform:rotate(-45deg);transition:transform .18s ease,opacity .18s ease;width:.62rem}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:focus-visible,.MarkdownContent-module_MarkdownContent__2JuyX details>summary:hover{background:linear-gradient(180deg,color-mix(in srgb,var(--md-table-head-bg) 76%,hsla(0,0%,100%,.95) 24%),color-mix(in srgb,var(--md-table-bg) 74%,hsla(0,0%,100%,.82) 26%))}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:focus-visible{outline:2px solid color-mix(in srgb,var(--md-link-color) 52%,transparent);outline-offset:-2px}.MarkdownContent-module_MarkdownContent__2JuyX details>summary::-webkit-details-marker{display:none}.MarkdownContent-module_MarkdownContent__2JuyX details[open]>summary{border-bottom:1px solid color-mix(in srgb,var(--md-table-border) 88%,transparent)}.MarkdownContent-module_MarkdownContent__2JuyX details[open]>summary:before{opacity:1;transform:rotate(45deg)}.MarkdownContent-module_MarkdownContent__2JuyX details>:not(summary){margin-left:1.05em;margin-right:1.05em}.MarkdownContent-module_MarkdownContent__2JuyX details>summary+*{margin-top:.95em}.MarkdownContent-module_MarkdownContent__2JuyX details>:last-child{margin-bottom:1.05em}.MarkdownContent-module_MarkdownContent__2JuyX strong{font-weight:650}.MarkdownContent-module_MarkdownContent__2JuyX em{font-style:italic}.MarkdownContent-module_citationRef__fKqaT,.MarkdownContent-module_citation__11SMw{align-items:center;background:var(--md-citation-bg);border-radius:999px;color:var(--md-citation-color);display:inline-flex;font-size:.74em;font-weight:700;justify-content:center;line-height:1.45;margin:0 .1em;min-width:1.4em;padding:0 .35em;vertical-align:super}.MarkdownContent-module_MarkdownContent__2JuyX sup[data-citation-footnote]{color:currentColor;display:inline;font-size:.72em;font-weight:700;line-height:1;margin:0 .7em 0 .08em;vertical-align:super}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUNJLGlEQUFtRCxDQUNuRCx3REFBMEQsQ0FDMUQsaURBQW1ELENBQ25ELHNFQUF3RSxDQUN4RTs7S0FHQyxDQUNEOztLQUdDLENBQ0QsbUdBQTBHLENBQzFHLG9FQUEwRSxDQUMxRSw0RUFBa0YsQ0FDbEYsNEVBQThFLENBQzlFLHFFQUEyRSxDQUMzRSw0RUFBa0YsQ0FDbEYsMkRBQWlFLENBQ2pFLDBFQUFnRixDQUNoRixxRUFBMkUsQ0FDM0UsbUVBQXlFLENBQ3pFLGdFQUFzRSxDQUN0RSx5REFBMkQsQ0FFM0QsMEJBQTJCLENBQzNCLHNDQUF1QyxDQUN2QyxpQkFBa0IsQ0FFbEIscUJBQXVCLENBRHZCLGdCQUVKLENBRUEsNERBQ0ksc0JBQ0osQ0FFQSwyREFDSSx5QkFDSixDQUVBLHNFQVFJLGlCQUFrQixDQUxsQiw2QkFBOEIsQ0FDOUIseUNBQTBDLENBQzFDLGVBQWdCLENBRWhCLG9CQUFzQixDQUR0QixnQkFBaUIsQ0FKakIsb0JBQXNCLENBRHRCLGlCQVFKLENBRUEsa0RBQ0ksaUJBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLGtEQUNJLGlCQUNKLENBRUEsa0RBQ0ksaUJBQ0osQ0FFQSxrREFDSSxpQkFDSixDQUVBLGtEQUNJLGdCQUNKLENBRUEsaURBRUksZ0JBQWlCLENBRGpCLGVBRUosQ0FFQSx1REFDSSxZQUNKLENBRUEsMERBR0ksWUFBYSxDQUNiLFNBQVcsQ0FIWCxrQkFBb0IsQ0FDcEIsNEJBR0osQ0FFQSxrREFDSSxlQUNKLENBRUEsa0RBQ0ksa0JBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLDZEQUVJLGVBQWdCLENBRGhCLGdCQUVKLENBRUEsdUZBQ0ksZUFBZ0IsQ0FDaEIsc0JBQ0osQ0FFQSwwRkFDSSxlQUNKLENBRUEsMkVBTUksbUJBQW9CLENBQ3BCLDBCQUEyQixDQU4zQixtQkFBb0IsQ0FFcEIsV0FBWSxDQUNaLG1C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QXFDLENBRHJDLHNCQUFvQyxDQUxwQyxVQUFXLENBR1gsYUFBYyxDQURkLGFBQWUsQ0FFZixrQkFBb0IsQ0FJcEIsV0FBYSxDQURiLHdCQUF5QixDQUV6QixnREFBb0QsQ0FScEQsWUFTSixDQUVBLGtKQUVJLDJLQUtKLENBRUEsNkVBQ0kseUVBQTRFLENBQzVFLG1CQUNKLENBRUEsdUZBQ0ksWUFDSixDQUVBLHFFQUNJLGlGQUNKLENBRUEsNEVBRUksU0FBVSxDQURWLHVCQUVKLENBRUEscUVBQ0ksa0JBQW1CLENBQ25CLG1CQUNKLENBRUEsaUVBQ0ksZ0JBQ0osQ0FFQSxtRUFDSSxvQkFDSixDQUVBLHNEQUNJLGVBQ0osQ0FFQSxrREFDSSxpQkFDSixDQWtCQSxtRkFFSSxrQkFBbUIsQ0FXbkIsZ0NBQWlDLENBTmpDLG1CQUFvQixDQUtwQiw4QkFBK0IsQ0FYL0IsbUJBQW9CLENBT3BCLGVBQWlCLENBQ2pCLGVBQWdCLENBTmhCLHNCQUF1QixDQU92QixnQkFBaUIsQ0FMakIsYUFBZSxDQURmLGVBQWdCLENBRWhCLGVBQWlCLENBS2pCLG9CQUdKLENBRUEsMkVBT0ksa0JBQW1CLENBTm5CLGNBQWUsQ0FFZixlQUFpQixDQUNqQixlQUFnQixDQUNoQixhQUFjLENBSGQscUJBQXdCLENBSXhCLG9CQUVKIiwiZmlsZSI6Ik1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLk1hcmtkb3duQ29udGVudCB7XG4gICAgLS1tZC10ZXh0LWNvbG9yOiB2YXIoLS1jaGF0LW1kLXRleHQtY29sb3IsIGluaGVyaXQpO1xuICAgIC0tbWQtbXV0ZWQtY29sb3I6IHZhcigtLWNoYXQtbWQtbXV0ZWQtY29sb3IsIGN1cnJlbnRDb2xvcik7XG4gICAgLS1tZC1saW5rLWNvbG9yOiB2YXIoLS1jaGF0LW1kLWxpbmstY29sb3IsICMyNTYzZWIpO1xuICAgIC0tbWQtaGVhZGluZy1jb2xvcjogdmFyKC0tY2hhdC1oZWFkaW5nLXRleHQtY29sb3IsIHZhcigtLW1kLXRleHQtY29sb3IpKTtcbiAgICAtLW1kLWhlYWRpbmctZm9udC1mYW1pbHk6IHZhcihcbiAgICAgICAgLS1jaGF0LW1kLWhlYWRpbmctZm9udC1mYW1pbHksXG4gICAgICAgIHZhcigtLWZvbnQtcG9wcGlucywgJ1BvcHBpbnMnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYpXG4gICAgKTtcbiAgICAtLW1kLWJvZHktZm9udC1mYW1pbHk6IHZhcihcbiAgICAgICAgLS1jaGF0LW1kLWJvZHktZm9udC1mYW1pbHksXG4gICAgICAgIHZhcigtLWZvbnQtcG9wcGlucywgJ1BvcHBpbnMnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYpXG4gICAgKTtcbiAgICAtLW1kLWNvZGUtZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1xuICAgIC0tbWQtaW5saW5lLWNvZGUtYmc6IHZhcigtLWNoYXQtbWQtaW5saW5lLWNvZGUtYmcsIHJnYmEoMTUsIDIzLCA0MiwgMC4wOCkpO1xuICAgIC0tbWQtaW5saW5lLWNvZGUtYm9yZGVyOiB2YXIoLS1jaGF0LW1kLWlubGluZS1jb2RlLWJvcmRlciwgcmdiYSgxNSwgMjMsIDQyLCAwLjEyKSk7XG4gICAgLS1tZC1pbmxpbmUtY29kZS1jb2xvcjogdmFyKC0tY2hhdC1tZC1pbmxpbmUtY29kZS1jb2xvciwgdmFyKC0tbWQtdGV4dC1jb2xvcikpO1xuICAgIC0tbWQtYmxvY2txdW90ZS1iZzogdmFyKC0tY2hhdC1tZC1ibG9ja3F1b3RlLWJnLCByZ2JhKDI0OCwgMjUwLCAyNTIsIDAuOTIpKTtcbiAgICAtLW1kLWJsb2NrcXVvdGUtYm9yZGVyOiB2YXIoLS1jaGF0LW1kLWJsb2NrcXVvdGUtYm9yZGVyLCByZ2JhKDU5LCAxMzAsIDI0NiwgMC4zNSkpO1xuICAgIC0tbWQtdGFibGUtYmc6IHZhcigtLWNoYXQtbWQtdGFibGUtYmcsIHJnYmEoMjQ4LCAyNTAsIDI1MiwgMC45MikpO1xuICAgIC0tbWQtdGFibGUtcm93LWFsdC1iZzogdmFyKC0tY2hhdC1tZC10YWJsZS1yb3ctYWx0LWJnLCByZ2JhKDI0MSwgMjQ1LCAyNDksIDAuOSkpO1xuICAgIC0tbWQtdGFibGUtaGVhZC1iZzogdmFyKC0tY2hhdC1tZC10YWJsZS1oZWFkLWJnLCByZ2JhKDIyNiwgMjMyLCAyNDAsIDAuOTUpKTtcbiAgICAtLW1kLXRhYmxlLWJvcmRlcjogdmFyKC0tY2hhdC1tZC10YWJsZS1ib3JkZXIsIHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC4zNikpO1xuICAgIC0tbWQtY2l0YXRpb24tYmc6IHZhcigtLWNoYXQtbWQtY2l0YXRpb24tYmcsIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjE0KSk7XG4gICAgLS1tZC1jaXRhdGlvbi1jb2xvcjogdmFyKC0tY2hhdC1tZC1jaXRhdGlvbi1jb2xvciwgIzFkNGVkOCk7XG5cbiAgICBjb2xvcjogdmFyKC0tbWQtdGV4dC1jb2xvcik7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLW1kLWJvZHktZm9udC1mYW1pbHkpO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogMS42NTtcbiAgICBsZXR0ZXItc3BhY2luZzogMC4wMDJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCA+IDpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50O1xufVxuXG4uTWFya2Rvd25Db250ZW50ID4gOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1ib3R0b206IDAgIWltcG9ydGFudDtcbn1cblxuLk1hcmtkb3duQ29udGVudCA6aXMoaDEsIGgyLCBoMywgaDQsIGg1LCBoNikge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW46IDEuNGVtIDAgMC41NWVtO1xuICAgIGNvbG9yOiB2YXIoLS1tZC1oZWFkaW5nLWNvbG9yKTtcbiAgICBmb250LWZhbWlseTogdmFyKC0tbWQtaGVhZGluZy1mb250LWZhbWlseSk7XG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICBsaW5lLWhlaWdodDogMS4yNDtcbiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtO1xuICAgIHRleHQtd3JhcDogYmFsYW5jZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoMSB7XG4gICAgZm9udC1zaXplOiAxLjUycmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGgyIHtcbiAgICBmb250LXNpemU6IDEuNHJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoMyB7XG4gICAgZm9udC1zaXplOiAxLjI2cmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGg0IHtcbiAgICBmb250LXNpemU6IDEuMTRyZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgaDUge1xuICAgIGZvbnQtc2l6ZTogMS4wNHJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoNiB7XG4gICAgZm9udC1zaXplOiAwLjk4cmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHAge1xuICAgIG1hcmdpbjogMCAwIDAuOWVtO1xuICAgIHRleHQtd3JhcDogcHJldHR5O1xufVxuXG4uTWFya2Rvd25Db250ZW50IHA6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgOmlzKHVsLCBvbCkge1xuICAgIG1hcmdpbjogMC42NWVtIDAgMWVtO1xuICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAxLjM1cmVtO1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ2FwOiAwLjM1ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdWwge1xuICAgIGxpc3Qtc3R5bGU6IGRpc2M7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgb2wge1xuICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgbGkge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjU4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IGxpID4gOmlzKHVsLCBvbCkge1xuICAgIG1hcmdpbi10b3A6IDAuNDVlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHVsOmhhcyg+IGxpID4gW2RhdGEtY2hhdC1wcm9ncmVzcy1tYXJrZXJdKSB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICBwYWRkaW5nLWlubGluZS1zdGFydDogMDtcbn1cblxuLk1hcmtkb3duQ29udGVudCB1bDpoYXMoPiBsaSA+IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyXSkgPiBsaSB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBbZGF0YS1jaGF0LXByb2dyZXNzLW1hcmtlcl0ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIHdpZHRoOiAxcmVtO1xuICAgIGhlaWdodDogMXJlbTtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuNThyZW07XG4gICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgW2RhdGEtY2hhdC1wcm9ncmVzcy1tYXJrZXI9J3BlbmRpbmcnXSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXI6IDJweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDIyJSwgdHJhbnNwYXJlbnQpO1xuICAgIGJvcmRlci10b3AtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgICBhbmltYXRpb246IGNoYXRQcm9ncmVzc01hcmtlclNwaW4gMC44NXMgbGluZWFyIGluZmluaXRlO1xufVxuXG4uTWFya2Rvd25Db250ZW50IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyPSdjb21wbGV0ZWQnXSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDEyJSwgdHJhbnNwYXJlbnQpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyPSdjb21wbGV0ZWQnXTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHdpZHRoOiAwLjI2cmVtO1xuICAgIGhlaWdodDogMC41cmVtO1xuICAgIG1hcmdpbi10b3A6IC0wLjA2cmVtO1xuICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgY3VycmVudENvbG9yO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbn1cblxuQGtleWZyYW1lcyBjaGF0UHJvZ3Jlc3NNYXJrZXJTcGluIHtcbiAgICB0byB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgfVxufVxuXG4uTWFya2Rvd25Db250ZW50IGEge1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lO1xuICAgIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDEuNHB4O1xuICAgIHRleHQtdW5kZXJsaW5lLW9mZnNldDogMC4xNmVtO1xuICAgIHRleHQtZGVjb3JhdGlvbi1jb2xvcjogY3VycmVudENvbG9yO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLCB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIDAuMnMgZWFzZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBhOmhvdmVyLFxuLk1hcmtkb3duQ29udGVudCBhOmZvY3VzLXZpc2libGUge1xuICAgIG9wYWNpdHk6IDAuOTI7XG4gICAgdGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczogMnB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IGltZyB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiAxNHB4O1xuICAgIG1hcmdpbjogMC45NWVtIDA7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgcHJlLFxuLk1hcmtkb3duQ29udGVudCBibG9ja3F1b3RlLFxuLk1hcmtkb3duQ29udGVudCB0YWJsZSxcbi5NYXJrZG93bkNvbnRlbnQgaHIge1xuICAgIG1hcmdpbjogMC45NWVtIDA7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgcHJlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgYmxvY2txdW90ZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tbWQtYmxvY2txdW90ZS1ib3JkZXIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC1ibG9ja3F1b3RlLWJnKTtcbiAgICBjb2xvcjogdmFyKC0tbWQtbXV0ZWQtY29sb3IpO1xuICAgIHBhZGRpbmc6IDAuNzJlbSAwLjk2ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgYmxvY2txdW90ZSA+IDpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGNvZGUge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwLjE0ZW0gMC40MmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1kLWlubGluZS1jb2RlLWJvcmRlcik7XG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIGJhY2tncm91bmQ6IHZhcigtLW1kLWlubGluZS1jb2RlLWJnKTtcbiAgICBmb250LWZhbWlseTogdmFyKC0tbWQtY29kZS1mb250LWZhbWlseSk7XG4gICAgZm9udC1zaXplOiAwLjg4ZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgY29sb3I6IHZhcigtLW1kLWlubGluZS1jb2RlLWNvbG9yKTtcbiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHByZSBjb2RlIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICB3b3JkLWJyZWFrOiBub3JtYWw7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLk1hcmtkb3duQ29udGVudCAuY2hhdC1jb2RlLWJsb2NrIHtcbiAgICBiYWNrZ3JvdW5kOiAjMTgxYzIzO1xuICAgIGNvbG9yOiAjZjhmYWZjO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMS42O1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNDgsIDE2MywgMTg0LCAwLjM1KTtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgyLCA2LCAyMywgMC4yOCk7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLW1kLWNvZGUtZm9udC1mYW1pbHkpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IC5jaGF0LWNvZGUtYmxvY2sgY29kZSB7XG4gICAgYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgd29yZC1icmVhazogbm9ybWFsO1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdGFibGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWQtdGFibGUtYm9yZGVyKTtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYmFja2dyb3VuZDogdmFyKC0tbWQtdGFibGUtYmcpO1xuICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDE1LCAyMywgNDIsIDAuMSk7XG4gICAgZm9udC1zaXplOiAwLjkzZW07XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdGgsXG4uTWFya2Rvd25Db250ZW50IHRkIHtcbiAgICBwYWRkaW5nOiAwLjU4ZW0gMC43MmVtO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHRoIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC10YWJsZS1oZWFkLWJnKTtcbiAgICBmb250LXdlaWdodDogNjAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHRyOmxhc3QtY2hpbGQgdGQge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdHI6bnRoLWNoaWxkKGV2ZW4pIHRkIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC10YWJsZS1yb3ctYWx0LWJnKTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBociB7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpO1xuICAgIG9wYWNpdHk6IDAuODtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzIHtcbiAgICBtYXJnaW46IDAuOTVlbSAwO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1kLXRhYmxlLWJvcmRlcik7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWQtdGFibGUtYmcpIDgyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpIDE4JSk7XG4gICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDE1LCAyMywgNDIsIDAuMDgpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMThzIGVhc2UsIGJveC1zaGFkb3cgMC4xOHMgZWFzZSwgdHJhbnNmb3JtIDAuMThzIGVhc2U7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlsczpob3Zlcixcbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlsczpmb2N1cy13aXRoaW4ge1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1kLWxpbmstY29sb3IpIDI0JSwgdmFyKC0tbWQtdGFibGUtYm9yZGVyKSA3NiUpO1xuICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMTUsIDIzLCA0MiwgMC4xMik7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnkge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNzJyZW07XG4gICAgcGFkZGluZzogMC45ZW0gMS4wNWVtO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAgICAgMTgwZGVnLFxuICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWQtdGFibGUtaGVhZC1iZykgODglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpIDEyJSksXG4gICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1iZykgODIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMTglKVxuICAgICk7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE4cyBlYXNlLCBjb2xvciAwLjE4cyBlYXNlO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiBzdW1tYXJ5OjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHdpZHRoOiAwLjYycmVtO1xuICAgIGhlaWdodDogMC42MnJlbTtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgICBtYXJnaW4tdG9wOiAtMC4wNHJlbTtcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuICAgIG9wYWNpdHk6IDAuODI7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMThzIGVhc2UsIG9wYWNpdHkgMC4xOHMgZWFzZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzID4gc3VtbWFyeTpob3Zlcixcbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnk6Zm9jdXMtdmlzaWJsZSB7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgICAxODBkZWcsXG4gICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1oZWFkLWJnKSA3NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkgMjQlKSxcbiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1kLXRhYmxlLWJnKSA3NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44MikgMjYlKVxuICAgICk7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnk6Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC1saW5rLWNvbG9yKSA1MiUsIHRyYW5zcGFyZW50KTtcbiAgICBvdXRsaW5lLW9mZnNldDogLTJweDtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzID4gc3VtbWFyeTo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzW29wZW5dID4gc3VtbWFyeSB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHNbb3Blbl0gPiBzdW1tYXJ5OjpiZWZvcmUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiA6bm90KHN1bW1hcnkpIHtcbiAgICBtYXJnaW4tbGVmdDogMS4wNWVtO1xuICAgIG1hcmdpbi1yaWdodDogMS4wNWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiBzdW1tYXJ5ICsgKiB7XG4gICAgbWFyZ2luLXRvcDogMC45NWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiA6bGFzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMS4wNWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHN0cm9uZyB7XG4gICAgZm9udC13ZWlnaHQ6IDY1MDtcbn1cblxuLk1hcmtkb3duQ29udGVudCBlbSB7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4uY2l0YXRpb24ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgbWluLXdpZHRoOiAxLjRlbTtcbiAgICBtYXJnaW46IDAgMC4xZW07XG4gICAgcGFkZGluZzogMCAwLjM1ZW07XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgZm9udC1zaXplOiAwLjc0ZW07XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMS40NTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7XG4gICAgY29sb3I6IHZhcigtLW1kLWNpdGF0aW9uLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC1jaXRhdGlvbi1iZyk7XG59XG5cbi5jaXRhdGlvblJlZiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBtaW4td2lkdGg6IDEuNGVtO1xuICAgIG1hcmdpbjogMCAwLjFlbTtcbiAgICBwYWRkaW5nOiAwIDAuMzVlbTtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBmb250LXNpemU6IDAuNzRlbTtcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjQ1O1xuICAgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjtcbiAgICBjb2xvcjogdmFyKC0tbWQtY2l0YXRpb24tY29sb3IpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLW1kLWNpdGF0aW9uLWJnKTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBzdXBbZGF0YS1jaXRhdGlvbi1mb290bm90ZV0ge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBtYXJnaW46IDAgMC43ZW0gMCAwLjA4ZW07XG4gICAgZm9udC1zaXplOiAwLjcyZW07XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7XG4gICAgY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cbiJdfQ== */";
|
|
22170
|
+
var styles$b = {"MarkdownContent":"MarkdownContent-module_MarkdownContent__2JuyX","chatProgressMarkerSpin":"MarkdownContent-module_chatProgressMarkerSpin__TpoKr","chat-code-block":"MarkdownContent-module_chat-code-block__ZffFg","citation":"MarkdownContent-module_citation__11SMw","citationRef":"MarkdownContent-module_citationRef__fKqaT"};
|
|
22171
|
+
styleInject(css_248z$b);
|
|
22172
|
+
|
|
22173
|
+
/**
|
|
22174
|
+
* Selector used by the delegated summary click handler.
|
|
22175
|
+
*
|
|
22176
|
+
* @private utility of `MarkdownContent` component
|
|
22177
|
+
*/
|
|
22178
|
+
const DETAILS_SUMMARY_SELECTOR = 'summary';
|
|
21885
22179
|
/**
|
|
21886
22180
|
* Returns a stable key for a `<details>` element based on its `<summary>` text.
|
|
21887
22181
|
* Used to identify and restore open state across re-renders.
|
|
@@ -21938,7 +22232,9 @@
|
|
|
21938
22232
|
*/
|
|
21939
22233
|
const MarkdownContent = react.memo(function MarkdownContent(props) {
|
|
21940
22234
|
const { content, className, onCreateAgent } = props;
|
|
21941
|
-
const htmlContent = react.useMemo(() => renderMarkdown
|
|
22235
|
+
const htmlContent = react.useMemo(() => renderMarkdown(content, {
|
|
22236
|
+
citationReferenceClassName: styles$b.citationRef,
|
|
22237
|
+
}), [content]);
|
|
21942
22238
|
const containerRef = react.useRef(null);
|
|
21943
22239
|
const rootsRef = react.useRef([]);
|
|
21944
22240
|
/** Tracks which `<details>` elements (by summary key) are currently open */
|
|
@@ -26274,362 +26570,6 @@
|
|
|
26274
26570
|
}
|
|
26275
26571
|
// TODO: [💞] Spread into multiple files
|
|
26276
26572
|
|
|
26277
|
-
/**
|
|
26278
|
-
* Default class name used for rendered citation references outside of CSS modules.
|
|
26279
|
-
*/
|
|
26280
|
-
const DEFAULT_CITATION_REFERENCE_CLASS_NAME = 'citationRef';
|
|
26281
|
-
/**
|
|
26282
|
-
* Browser stylesheet id used when KaTeX output is rendered in a live chat component.
|
|
26283
|
-
*/
|
|
26284
|
-
const KATEX_STYLESHEET_ID = 'katex-css';
|
|
26285
|
-
/**
|
|
26286
|
-
* CDN stylesheet loaded lazily when markdown contains KaTeX markup in the browser.
|
|
26287
|
-
*/
|
|
26288
|
-
const KATEX_STYLESHEET_URL = 'https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css';
|
|
26289
|
-
/**
|
|
26290
|
-
* Pattern matching CODE FENCE.
|
|
26291
|
-
*/
|
|
26292
|
-
const CODE_FENCE_REGEX = /(`{3,}|~{3,})(?:[^\n\r]*)\r?\n[\s\S]*?\r?\n\1[^\n\r]*/g;
|
|
26293
|
-
/**
|
|
26294
|
-
* Pattern matching INLINE CODE.
|
|
26295
|
-
*/
|
|
26296
|
-
const INLINE_CODE_REGEX = /(`+)([\s\S]*?)(\1)/g;
|
|
26297
|
-
/**
|
|
26298
|
-
* Prefix for CODE PLACEHOLDER.
|
|
26299
|
-
*/
|
|
26300
|
-
const CODE_PLACEHOLDER_PREFIX = '@@PROMPTBOOK_CODE_PLACEHOLDER__';
|
|
26301
|
-
/**
|
|
26302
|
-
* Pattern matching CODE PLACEHOLDER.
|
|
26303
|
-
*/
|
|
26304
|
-
const CODE_PLACEHOLDER_REGEX = new RegExp(`${CODE_PLACEHOLDER_PREFIX}(\\d+)__`, 'g');
|
|
26305
|
-
/**
|
|
26306
|
-
* Pattern matching DETAILS BLOCK.
|
|
26307
|
-
*/
|
|
26308
|
-
const DETAILS_BLOCK_REGEX = /<details[\s\S]*?<\/details\s*>/gi;
|
|
26309
|
-
/**
|
|
26310
|
-
* Prefix for DETAILS PLACEHOLDER.
|
|
26311
|
-
*/
|
|
26312
|
-
const DETAILS_PLACEHOLDER_PREFIX = '@@PROMPTBOOK_DETAILS_PLACEHOLDER__';
|
|
26313
|
-
/**
|
|
26314
|
-
* Pattern matching DETAILS PLACEHOLDER.
|
|
26315
|
-
*/
|
|
26316
|
-
const DETAILS_PLACEHOLDER_REGEX = new RegExp(`${DETAILS_PLACEHOLDER_PREFIX}(\\d+)__`, 'g');
|
|
26317
|
-
/**
|
|
26318
|
-
* Matches a Showdown-wrapped placeholder such as `<p>@@PROMPTBOOK_DETAILS_PLACEHOLDER__0__</p>`.
|
|
26319
|
-
*/
|
|
26320
|
-
const DETAILS_PLACEHOLDER_WRAPPED_REGEX = new RegExp(`<p>\\s*(${DETAILS_PLACEHOLDER_PREFIX}\\d+__)\\s*<\\/p>`, 'g');
|
|
26321
|
-
/**
|
|
26322
|
-
* Collection of math delimiter definitions.
|
|
26323
|
-
*/
|
|
26324
|
-
const MATH_DELIMITER_DEFINITIONS = [
|
|
26325
|
-
{ regex: /(^|[^\\])\$\$([\s\S]+?)\$\$/g, displayMode: true },
|
|
26326
|
-
{ regex: /(^|[^\\])\\\[([\s\S]+?)\\\]/g, displayMode: true },
|
|
26327
|
-
{ regex: /(^|[^\\])\\\(([\s\S]+?)\\\)/g, displayMode: false },
|
|
26328
|
-
{ regex: /(^|[^\\])\$([^$\n]+?)\$/g, displayMode: false },
|
|
26329
|
-
];
|
|
26330
|
-
/**
|
|
26331
|
-
* Normalizes markdown sublists so they render correctly under ordered list items.
|
|
26332
|
-
*
|
|
26333
|
-
* @param markdown - Markdown content to normalize.
|
|
26334
|
-
* @returns Markdown with normalized sublist indentation.
|
|
26335
|
-
*
|
|
26336
|
-
* @private utility of `renderMarkdown`
|
|
26337
|
-
*/
|
|
26338
|
-
function normalizeMarkdownSublists(markdown) {
|
|
26339
|
-
const lines = markdown.split(/\r?\n/);
|
|
26340
|
-
let orderedIndent = null;
|
|
26341
|
-
let shouldIndentUnordered = false;
|
|
26342
|
-
let activeFence = null;
|
|
26343
|
-
const normalizedLines = lines.map((line) => {
|
|
26344
|
-
const trimmedLine = line.trim();
|
|
26345
|
-
const fenceMatch = trimmedLine.match(/^(```|~~~)/);
|
|
26346
|
-
if (fenceMatch) {
|
|
26347
|
-
const fence = fenceMatch[1];
|
|
26348
|
-
activeFence = activeFence === fence ? null : fence;
|
|
26349
|
-
return line;
|
|
26350
|
-
}
|
|
26351
|
-
if (activeFence) {
|
|
26352
|
-
return line;
|
|
26353
|
-
}
|
|
26354
|
-
if (trimmedLine === '') {
|
|
26355
|
-
return line;
|
|
26356
|
-
}
|
|
26357
|
-
const orderedMatch = line.match(/^(\s*)(\d+)\.\s+/);
|
|
26358
|
-
if (orderedMatch) {
|
|
26359
|
-
orderedIndent = orderedMatch[1].length;
|
|
26360
|
-
shouldIndentUnordered = true;
|
|
26361
|
-
return line;
|
|
26362
|
-
}
|
|
26363
|
-
const unorderedMatch = line.match(/^(\s*)([-+*])\s+/);
|
|
26364
|
-
if (unorderedMatch) {
|
|
26365
|
-
if (shouldIndentUnordered && orderedIndent !== null) {
|
|
26366
|
-
const currentIndent = unorderedMatch[1].length;
|
|
26367
|
-
const targetIndent = orderedIndent + 4;
|
|
26368
|
-
if (currentIndent < targetIndent) {
|
|
26369
|
-
return `${' '.repeat(targetIndent)}${line.trimStart()}`;
|
|
26370
|
-
}
|
|
26371
|
-
}
|
|
26372
|
-
return line;
|
|
26373
|
-
}
|
|
26374
|
-
orderedIndent = null;
|
|
26375
|
-
shouldIndentUnordered = false;
|
|
26376
|
-
return line;
|
|
26377
|
-
});
|
|
26378
|
-
return normalizedLines.join('\n');
|
|
26379
|
-
}
|
|
26380
|
-
/**
|
|
26381
|
-
* Creates a showdown converter configured for chat markdown rendering.
|
|
26382
|
-
*
|
|
26383
|
-
* @private utility of `renderMarkdown`
|
|
26384
|
-
*/
|
|
26385
|
-
function createChatMarkdownConverter(options) {
|
|
26386
|
-
var _a;
|
|
26387
|
-
const citationReferenceClassName = (_a = options === null || options === void 0 ? void 0 : options.citationReferenceClassName) !== null && _a !== void 0 ? _a : DEFAULT_CITATION_REFERENCE_CLASS_NAME;
|
|
26388
|
-
return new showdown.Converter({
|
|
26389
|
-
flavor: 'github',
|
|
26390
|
-
tables: true,
|
|
26391
|
-
strikethrough: true,
|
|
26392
|
-
tasklists: true,
|
|
26393
|
-
ghCodeBlocks: true,
|
|
26394
|
-
ghMentions: false,
|
|
26395
|
-
ghMentionsLink: '',
|
|
26396
|
-
openLinksInNewWindow: true,
|
|
26397
|
-
backslashEscapesHTMLTags: true,
|
|
26398
|
-
emoji: true,
|
|
26399
|
-
underline: true,
|
|
26400
|
-
completeHTMLDocument: false,
|
|
26401
|
-
metadata: false,
|
|
26402
|
-
splitAdjacentBlockquotes: true,
|
|
26403
|
-
noHeaderId: true,
|
|
26404
|
-
headerLevelStart: 1,
|
|
26405
|
-
parseImgDimensions: true,
|
|
26406
|
-
simplifiedAutoLink: true,
|
|
26407
|
-
literalMidWordUnderscores: true,
|
|
26408
|
-
literalMidWordAsterisks: false,
|
|
26409
|
-
simpleLineBreaks: true,
|
|
26410
|
-
requireSpaceBeforeHeadingText: true,
|
|
26411
|
-
ghCompatibleHeaderId: true,
|
|
26412
|
-
prefixHeaderId: 'chat-header-',
|
|
26413
|
-
rawPrefixHeaderId: false,
|
|
26414
|
-
rawHeaderId: false,
|
|
26415
|
-
smoothLivePreview: true,
|
|
26416
|
-
smartIndentationFix: true,
|
|
26417
|
-
disableForced4SpacesIndentedSublists: false,
|
|
26418
|
-
encodeEmails: true,
|
|
26419
|
-
extensions: [
|
|
26420
|
-
() => ({
|
|
26421
|
-
type: 'lang',
|
|
26422
|
-
regex: createCitationMarkerRegex(),
|
|
26423
|
-
replace: (match) => {
|
|
26424
|
-
const citationMarker = parseCitationMarker(match);
|
|
26425
|
-
if (!citationMarker) {
|
|
26426
|
-
return match;
|
|
26427
|
-
}
|
|
26428
|
-
TODO_USE(citationMarker.source);
|
|
26429
|
-
return `<sup class="${citationReferenceClassName}">[${citationMarker.id}]</sup>`;
|
|
26430
|
-
},
|
|
26431
|
-
}),
|
|
26432
|
-
],
|
|
26433
|
-
});
|
|
26434
|
-
}
|
|
26435
|
-
/**
|
|
26436
|
-
* Pre-configured showdown converter for chat markdown.
|
|
26437
|
-
*/
|
|
26438
|
-
const CHAT_MARKDOWN_CONVERTER = createChatMarkdownConverter();
|
|
26439
|
-
/**
|
|
26440
|
-
* Renders the body of one raw `<details>` block as markdown while keeping the
|
|
26441
|
-
* outer `<details>` and optional `<summary>` markup untouched.
|
|
26442
|
-
*
|
|
26443
|
-
* @param detailsBlock - Raw `<details>...</details>` HTML captured from markdown.
|
|
26444
|
-
* @returns `<details>` HTML whose body has been converted from markdown to HTML.
|
|
26445
|
-
*
|
|
26446
|
-
* @private utility of `renderMarkdown`
|
|
26447
|
-
*/
|
|
26448
|
-
function renderDetailsBlock(detailsBlock) {
|
|
26449
|
-
var _a, _b;
|
|
26450
|
-
const openTagMatch = detailsBlock.match(/^<details\b[^>]*>/i);
|
|
26451
|
-
const closeTagMatch = detailsBlock.match(/<\/details\s*>$/i);
|
|
26452
|
-
if (!openTagMatch || !closeTagMatch) {
|
|
26453
|
-
return detailsBlock;
|
|
26454
|
-
}
|
|
26455
|
-
const openTag = openTagMatch[0];
|
|
26456
|
-
const closeTag = closeTagMatch[0];
|
|
26457
|
-
const innerContent = detailsBlock.slice(openTag.length, detailsBlock.length - closeTag.length);
|
|
26458
|
-
const summaryMatch = innerContent.match(/^(\s*<summary\b[^>]*>[\s\S]*?<\/summary\s*>)([\s\S]*)$/i);
|
|
26459
|
-
const summaryHtml = (_a = summaryMatch === null || summaryMatch === void 0 ? void 0 : summaryMatch[1]) !== null && _a !== void 0 ? _a : '';
|
|
26460
|
-
const bodyMarkdown = ((_b = summaryMatch === null || summaryMatch === void 0 ? void 0 : summaryMatch[2]) !== null && _b !== void 0 ? _b : innerContent);
|
|
26461
|
-
const renderedBody = renderMarkdown(bodyMarkdown);
|
|
26462
|
-
return `${openTag}${summaryHtml}${renderedBody}${closeTag}`;
|
|
26463
|
-
}
|
|
26464
|
-
/**
|
|
26465
|
-
* Masks inline and fenced code segments so math rendering never touches them.
|
|
26466
|
-
*
|
|
26467
|
-
* @param markdown - Markdown text to mask.
|
|
26468
|
-
* @returns Masked markdown and a restore helper.
|
|
26469
|
-
*
|
|
26470
|
-
* @private utility of `renderMarkdown`
|
|
26471
|
-
*/
|
|
26472
|
-
function maskMarkdownCodeSegments(markdown) {
|
|
26473
|
-
const segments = [];
|
|
26474
|
-
let masked = markdown;
|
|
26475
|
-
const addPlaceholder = (segment) => {
|
|
26476
|
-
const placeholder = `${CODE_PLACEHOLDER_PREFIX}${segments.length}__`;
|
|
26477
|
-
segments.push(segment);
|
|
26478
|
-
return placeholder;
|
|
26479
|
-
};
|
|
26480
|
-
const maskWith = (regex) => {
|
|
26481
|
-
regex.lastIndex = 0;
|
|
26482
|
-
masked = masked.replace(regex, (match) => addPlaceholder(match));
|
|
26483
|
-
};
|
|
26484
|
-
maskWith(CODE_FENCE_REGEX);
|
|
26485
|
-
maskWith(INLINE_CODE_REGEX);
|
|
26486
|
-
return {
|
|
26487
|
-
masked: masked,
|
|
26488
|
-
restore(value) {
|
|
26489
|
-
return value.replace(CODE_PLACEHOLDER_REGEX, (_match, index) => { var _a; return (_a = segments[Number(index)]) !== null && _a !== void 0 ? _a : ''; });
|
|
26490
|
-
},
|
|
26491
|
-
};
|
|
26492
|
-
}
|
|
26493
|
-
/**
|
|
26494
|
-
* Masks `<details>...</details>` blocks in the markdown source so that Showdown never
|
|
26495
|
-
* processes their content.
|
|
26496
|
-
*
|
|
26497
|
-
* @param markdown - Markdown text that may contain raw HTML `<details>` blocks.
|
|
26498
|
-
* @returns Masked markdown and a restore helper that returns `string_html`.
|
|
26499
|
-
*
|
|
26500
|
-
* @private utility of `renderMarkdown`
|
|
26501
|
-
*/
|
|
26502
|
-
function maskDetailsBlocks(markdown) {
|
|
26503
|
-
const blocks = [];
|
|
26504
|
-
DETAILS_BLOCK_REGEX.lastIndex = 0;
|
|
26505
|
-
const masked = markdown.replace(DETAILS_BLOCK_REGEX, (match) => {
|
|
26506
|
-
const placeholder = `${DETAILS_PLACEHOLDER_PREFIX}${blocks.length}__`;
|
|
26507
|
-
blocks.push(renderDetailsBlock(match));
|
|
26508
|
-
return placeholder;
|
|
26509
|
-
});
|
|
26510
|
-
return {
|
|
26511
|
-
masked,
|
|
26512
|
-
restore(value) {
|
|
26513
|
-
return value
|
|
26514
|
-
.replace(DETAILS_PLACEHOLDER_WRAPPED_REGEX, '$1')
|
|
26515
|
-
.replace(DETAILS_PLACEHOLDER_REGEX, (_match, index) => { var _a; return (_a = blocks[Number(index)]) !== null && _a !== void 0 ? _a : ''; });
|
|
26516
|
-
},
|
|
26517
|
-
};
|
|
26518
|
-
}
|
|
26519
|
-
/**
|
|
26520
|
-
* Replaces math delimiter.
|
|
26521
|
-
*
|
|
26522
|
-
* @private utility of `renderMarkdown`
|
|
26523
|
-
*/
|
|
26524
|
-
function replaceMathDelimiter(markdown, delimiter) {
|
|
26525
|
-
return markdown.replace(delimiter.regex, (...args) => {
|
|
26526
|
-
var _a, _b, _c;
|
|
26527
|
-
const match = (_a = args[0]) !== null && _a !== void 0 ? _a : '';
|
|
26528
|
-
const prefix = (_b = args[1]) !== null && _b !== void 0 ? _b : '';
|
|
26529
|
-
const math = (_c = args[2]) !== null && _c !== void 0 ? _c : '';
|
|
26530
|
-
if (!math) {
|
|
26531
|
-
return match;
|
|
26532
|
-
}
|
|
26533
|
-
try {
|
|
26534
|
-
const rendered = katex__default["default"].renderToString(math, {
|
|
26535
|
-
displayMode: delimiter.displayMode,
|
|
26536
|
-
throwOnError: false,
|
|
26537
|
-
});
|
|
26538
|
-
return `${prefix}${rendered}`;
|
|
26539
|
-
}
|
|
26540
|
-
catch (_d) {
|
|
26541
|
-
return match;
|
|
26542
|
-
}
|
|
26543
|
-
});
|
|
26544
|
-
}
|
|
26545
|
-
/**
|
|
26546
|
-
* Renders math expressions in markdown using KaTeX for the supported delimiter pairs.
|
|
26547
|
-
*
|
|
26548
|
-
* Supported delimiters: `$$...$$`, `\[...\]`, `\(...\)`, and `$...$`.
|
|
26549
|
-
*
|
|
26550
|
-
* @private utility of `renderMarkdown`
|
|
26551
|
-
*/
|
|
26552
|
-
function renderMathInMarkdown(markdown) {
|
|
26553
|
-
const { masked, restore } = maskMarkdownCodeSegments(markdown);
|
|
26554
|
-
let processed = masked;
|
|
26555
|
-
for (const delimiter of MATH_DELIMITER_DEFINITIONS) {
|
|
26556
|
-
processed = replaceMathDelimiter(processed, delimiter);
|
|
26557
|
-
}
|
|
26558
|
-
processed = processed.replace(/\\$/g, '$');
|
|
26559
|
-
return restore(processed);
|
|
26560
|
-
}
|
|
26561
|
-
/**
|
|
26562
|
-
* Escapes HTML-sensitive text before returning fallback markdown rendering.
|
|
26563
|
-
*
|
|
26564
|
-
* @private utility of `renderMarkdown`
|
|
26565
|
-
*/
|
|
26566
|
-
function escapeHtml$2(value) {
|
|
26567
|
-
return value.replace(/[<>&"']/g, (char) => {
|
|
26568
|
-
const entities = {
|
|
26569
|
-
'<': '<',
|
|
26570
|
-
'>': '>',
|
|
26571
|
-
'&': '&',
|
|
26572
|
-
'"': '"',
|
|
26573
|
-
"'": ''',
|
|
26574
|
-
};
|
|
26575
|
-
return entities[char] || char;
|
|
26576
|
-
});
|
|
26577
|
-
}
|
|
26578
|
-
/**
|
|
26579
|
-
* Loads KaTeX CSS in browser environments that need to display math output.
|
|
26580
|
-
*
|
|
26581
|
-
* @private utility of `renderMarkdown`
|
|
26582
|
-
*/
|
|
26583
|
-
function registerKatexStylesheet(html) {
|
|
26584
|
-
if (typeof window === 'undefined') {
|
|
26585
|
-
return;
|
|
26586
|
-
}
|
|
26587
|
-
if (!html.match(/class="katex/)) {
|
|
26588
|
-
return;
|
|
26589
|
-
}
|
|
26590
|
-
if (window.document.getElementById(KATEX_STYLESHEET_ID)) {
|
|
26591
|
-
return;
|
|
26592
|
-
}
|
|
26593
|
-
const link = window.document.createElement('link');
|
|
26594
|
-
link.id = KATEX_STYLESHEET_ID;
|
|
26595
|
-
link.rel = 'stylesheet';
|
|
26596
|
-
link.href = KATEX_STYLESHEET_URL;
|
|
26597
|
-
window.document.head.appendChild(link);
|
|
26598
|
-
}
|
|
26599
|
-
/**
|
|
26600
|
-
* Convert markdown content to HTML.
|
|
26601
|
-
*
|
|
26602
|
-
* @param markdown - The markdown content to convert.
|
|
26603
|
-
* @returns HTML string ready for rendering.
|
|
26604
|
-
*
|
|
26605
|
-
* @private internal utility of chat components and exports
|
|
26606
|
-
*/
|
|
26607
|
-
function renderMarkdown(markdown, options) {
|
|
26608
|
-
if (!markdown || typeof markdown !== 'string') {
|
|
26609
|
-
return '';
|
|
26610
|
-
}
|
|
26611
|
-
const converter = options ? createChatMarkdownConverter(options) : CHAT_MARKDOWN_CONVERTER;
|
|
26612
|
-
try {
|
|
26613
|
-
const normalizedMarkdown = normalizeMarkdownSublists(markdown);
|
|
26614
|
-
const { masked: maskedMarkdown, restore: restoreDetails } = maskDetailsBlocks(normalizedMarkdown);
|
|
26615
|
-
const processedMarkdown = renderMathInMarkdown(maskedMarkdown);
|
|
26616
|
-
const html = converter.makeHtml(processedMarkdown);
|
|
26617
|
-
registerKatexStylesheet(html);
|
|
26618
|
-
const restoredHtml = restoreDetails(html);
|
|
26619
|
-
const sanitizedHtml = restoredHtml
|
|
26620
|
-
.replace(/<\s*(script|style|iframe|object|embed)[^>]*>[\s\S]*?<\s*\/\s*\1\s*>/gi, '')
|
|
26621
|
-
.replace(/\s+on\w+="[^"]*"/gi, '')
|
|
26622
|
-
.replace(/\s+javascript:/gi, '')
|
|
26623
|
-
.replace(/\s+data:/gi, '')
|
|
26624
|
-
.replace(/\s+vbscript:/gi, '');
|
|
26625
|
-
return sanitizedHtml;
|
|
26626
|
-
}
|
|
26627
|
-
catch (error) {
|
|
26628
|
-
console.error('Error rendering markdown:', error);
|
|
26629
|
-
return escapeHtml$2(markdown);
|
|
26630
|
-
}
|
|
26631
|
-
}
|
|
26632
|
-
|
|
26633
26573
|
/**
|
|
26634
26574
|
* Parses OpenAI Assistant-style citations from message content
|
|
26635
26575
|
* Matches both:
|